32 const float inputWidth = 350.0f;
33 const float inputHeight = 40.0f;
34 const float spacing = 20.0f;
35 const float buttonWidth = 140.0f;
36 const float buttonHeight = 45.0f;
37 const float buttonSpacing = 20.0f;
39 const float startY = 150.0f;
46 "[a-zA-Z0-9_ -]+",
"Name");
49 float ipY = startY + inputHeight + spacing;
51 CreateInput(inputWidth, inputHeight, ipY,
"IP Address (e.g., 127.0.0.1)", 15,
"[0-9.]+",
"IP");
54 float portY = ipY + inputHeight + spacing;
58 _buttonsY = portY + inputHeight + spacing * 2;
60 float totalButtonWidth = buttonWidth * 2 + buttonSpacing;
61 float addButtonX = -(totalButtonWidth / 2.0f);
62 float cancelButtonX = addButtonX + buttonWidth + buttonSpacing;
65 auto createHorizontalButton = [&](
const char *label,
float posX,
unsigned int backgroundColor,
66 unsigned int hoverColor, std::function<void()> callback) {
68 button->SetSize(buttonWidth, buttonHeight);
70 button->ApplyAlignment();
73 button->GetPosition(bx, by);
74 button->SetPosition(bx + posX + (totalButtonWidth / 2.0f) - (buttonWidth / 2.0f),
_buttonsY);
76 button->SetBackgroundColor(backgroundColor);
77 button->SetHoverColor(hoverColor);
78 button->SetText(label);
79 button->SetTextSize(18);
80 button->SetTextColor(0xFFFFFFFF);
87 createHorizontalButton(
"ADD", addButtonX, 0xFF4CAF50, 0xFF66BB6A, [
this]() {
OnAddClicked(); }));
89 _menu->AddButton(createHorizontalButton(
"CANCEL", cancelButtonX, 0xFF424242, 0xFF616161,
112 const char *title =
"Add New Server";
114 int titleFontSize = 28;
115 int titleWidth =
static_cast<int>(strlen(title) * titleFontSize * 0.5f);
116 int titleX = (screenWidth - titleWidth) / 2;
134 const int fontSize = 16;
135 const int errorMargin = 15;
139 int textWidth =
static_cast<int>(
_errorMessage.length() * fontSize * 0.6);
140 int errorX = (screenWidth - textWidth) / 2;
199 const std::string &placeholder,
int maxLength,
200 const std::string ®ex,
201 const std::string &logName) {
203 input->SetSize(width, height);
205 input->ApplyAlignment();
208 input->GetPosition(x, y);
209 input->SetPosition(x, yPos);
211 input->SetPlaceholder(placeholder);
212 input->SetMaxLength(maxLength);
213 input->SetValidationRegex(regex);
214 input->SetTextSize(18);
215 input->SetBackgroundColor(0xFF2A2A2A);
216 input->SetBorderColor(0xFF505050);
217 input->SetActiveBorderColor(0xFF4CAF50);
218 input->SetTextColor(0xFFFFFFFF);
219 input->SetPlaceholderColor(0xFF808080);
220 input->SetOnTextChanged([
this, logName](
const std::string &text) {
221 LOG_INFO(
"[AddServerMenu] " + logName +
": " + text);
252 errorMsg =
"IP address cannot be empty";
257 std::regex ipRegex(R
"(^(\d{1,3}\.){3}\d{1,3}$)");
258 if (!std::regex_match(ip, ipRegex)) {
259 errorMsg =
"Invalid IP address format";
264 std::istringstream iss(ip);
266 while (std::getline(iss, octet,
'.')) {
268 int value = std::stoi(octet);
269 if (value < 0 || value > 255) {
270 errorMsg =
"IP octets must be between 0 and 255";
274 errorMsg =
"Invalid IP address";
virtual void DrawText(int fontHandle, const char *text, int x, int y, int fontSize, unsigned int color)=0
Draw text using a loaded font.