Multiple changes

- Changed default text size to 64
- Added ShowExportLayoutDialog() function
- When layout has no controls and closeWindow is triggered messageBox does not appear
- Controls rectagle height bug when deleting text fixed
- Added fade to controls preview
This commit is contained in:
Ray
2018-05-22 14:01:26 +02:00
parent 2be7c7be1a
commit 818b08ed59

View File

@ -51,7 +51,7 @@
#define MAX_ANCHOR_POINTS 8 // Maximum number of anchor points #define MAX_ANCHOR_POINTS 8 // Maximum number of anchor points
#define ANCHOR_RADIUS 20 // Default anchor radius #define ANCHOR_RADIUS 20 // Default anchor radius
#define MAX_CONTROL_TEXT_LENGTH 32 // Maximum length of control text #define MAX_CONTROL_TEXT_LENGTH 64 // Maximum length of control text
#define MAX_CONTROL_NAME_LENGTH 32 // Maximum length of control name (used on code generation) #define MAX_CONTROL_NAME_LENGTH 32 // Maximum length of control name (used on code generation)
#define GRID_LINE_SPACING 5 // Grid line spacing in pixels #define GRID_LINE_SPACING 5 // Grid line spacing in pixels
@ -147,6 +147,7 @@ static bool cancelSave = false;
// Module specific Functions Declaration // Module specific Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
static void ShowSaveLayoutDialog(void); // Show save layout dialog static void ShowSaveLayoutDialog(void); // Show save layout dialog
static void ShowExportLayoutDialog(GuiLayoutConfig config); // Show export layout dialog
static void SaveLayoutRGL(const char *fileName, bool binary); // Save gui layout project information static void SaveLayoutRGL(const char *fileName, bool binary); // Save gui layout project information
static void LoadLayoutRGL(const char *fileName); // Load gui layout project information static void LoadLayoutRGL(const char *fileName); // Load gui layout project information
static void GenerateCode(const char *fileName, GuiLayoutConfig config); // Generate C code for gui layout static void GenerateCode(const char *fileName, GuiLayoutConfig config); // Generate C code for gui layout
@ -247,8 +248,8 @@ int main()
layout.controls[i].id = 0; layout.controls[i].id = 0;
layout.controls[i].type = 0; layout.controls[i].type = 0;
layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 }; layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 };
memset(layout.controls[i].text, 0, 32); memset(layout.controls[i].text, 0, MAX_CONTROL_TEXT_LENGTH);
memset(layout.controls[i].name, 0, 32); memset(layout.controls[i].name, 0, MAX_CONTROL_NAME_LENGTH);
layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor
} }
@ -299,8 +300,8 @@ int main()
// Undo text/name editing on cancel (KEY_ESC) // Undo text/name editing on cancel (KEY_ESC)
int undoSelectedControl = -1; int undoSelectedControl = -1;
Rectangle undoLastRec; Rectangle undoLastRec;
char prevControlText[32]; char prevControlText[MAX_CONTROL_TEXT_LENGTH];
char prevControlName[32]; char prevControlName[MAX_CONTROL_NAME_LENGTH];
char loadedFileName[128] = "not_loaded_layout"; char loadedFileName[128] = "not_loaded_layout";
@ -353,7 +354,8 @@ int main()
// Show save layout message window on ESC // Show save layout message window on ESC
if (IsKeyPressed(KEY_ESCAPE) && !textEditMode && !nameEditMode) if (IsKeyPressed(KEY_ESCAPE) && !textEditMode && !nameEditMode)
{ {
if (generateWindowActive) generateWindowActive = false; if (layout.controlsCount <= 0) exitWindow = true;
else if (generateWindowActive) generateWindowActive = false;
else if (resetWindowActive) resetWindowActive = false; else if (resetWindowActive) resetWindowActive = false;
else else
{ {
@ -602,7 +604,7 @@ int main()
{ {
if (IsKeyDown(KEY_LEFT_CONTROL)) if (IsKeyDown(KEY_LEFT_CONTROL))
{ {
// Control modifier of width and height // Control modifier of width and height
if (IsKeyDown(KEY_LEFT_SHIFT)) if (IsKeyDown(KEY_LEFT_SHIFT))
{ {
if (IsKeyPressed(KEY_RIGHT)) layout.controls[selectedControl].rec.width += GRID_LINE_SPACING; if (IsKeyPressed(KEY_RIGHT)) layout.controls[selectedControl].rec.width += GRID_LINE_SPACING;
@ -694,8 +696,8 @@ int main()
{ {
layout.controls[i].type = layout.controls[i + 1].type; layout.controls[i].type = layout.controls[i + 1].type;
layout.controls[i].rec = layout.controls[i + 1].rec; layout.controls[i].rec = layout.controls[i + 1].rec;
memset(layout.controls[i].text, 0, 32); memset(layout.controls[i].text, 0, MAX_CONTROL_TEXT_LENGTH);
memset(layout.controls[i].name, 0, 32); memset(layout.controls[i].name, 0, MAX_CONTROL_NAME_LENGTH);
strcpy(layout.controls[i].text, layout.controls[i + 1].text); strcpy(layout.controls[i].text, layout.controls[i + 1].text);
strcpy(layout.controls[i].name, layout.controls[i + 1].name); strcpy(layout.controls[i].name, layout.controls[i + 1].name);
layout.controls[i].ap = layout.controls[i + 1].ap; layout.controls[i].ap = layout.controls[i + 1].ap;
@ -776,26 +778,26 @@ int main()
// Replaces characters with pressed keys or '\0' in case of backspace // Replaces characters with pressed keys or '\0' in case of backspace
// NOTE: Only allow keys in range [32..125] // NOTE: Only allow keys in range [32..125]
if (((key >= 32) && (key <= 125)) && (keyCount < 31)) if (((key >= 32) && (key <= 125)) && (keyCount < MAX_CONTROL_TEXT_LENGTH - 1))
{ {
layout.controls[selectedControl].text[keyCount] = (unsigned char)key; layout.controls[selectedControl].text[keyCount] = (unsigned char)key;
} }
if (IsKeyPressed(KEY_BACKSPACE_TEXT)) if ((keyCount > 0) && IsKeyPressed(KEY_BACKSPACE_TEXT))
{ {
layout.controls[selectedControl].text[keyCount - 1] = '\0'; layout.controls[selectedControl].text[keyCount - 1] = '\0';
framesCounterSnap = 0; framesCounterSnap = 0;
if (keyCount < 0) keyCount = 0; if (keyCount < 0) keyCount = 0;
} }
else if (IsKeyDown(KEY_BACKSPACE_TEXT)) else if ((keyCount > 0) && IsKeyDown(KEY_BACKSPACE_TEXT))
{ {
if ((framesCounterSnap > 60) && (framesCounterSnap%15) == 0) layout.controls[selectedControl].text[keyCount - 1] = '\0'; if ((framesCounterSnap > 60) && (framesCounterSnap%15) == 0) layout.controls[selectedControl].text[keyCount - 1] = '\0';
if (keyCount < 0) keyCount = 0; if (keyCount < 0) keyCount = 0;
} }
// Used to show the cursor('|') in textEditMode // Used to show the cursor('|') in textEditMode
if (keyCount < 32) framesCounter++; if (keyCount < MAX_CONTROL_TEXT_LENGTH) framesCounter++;
else if (keyCount == 32) framesCounter = 21; else if (keyCount == MAX_CONTROL_TEXT_LENGTH) framesCounter = 21;
} }
if ((nameEditMode)) if ((nameEditMode))
@ -807,20 +809,20 @@ int main()
// Replaces characters with pressed keys or '\0' in case of backspace // Replaces characters with pressed keys or '\0' in case of backspace
// NOTE: Only allow keys in range [48..57], [65..90] and [97..122] // NOTE: Only allow keys in range [48..57], [65..90] and [97..122]
if ((((key >= 48) && (key <= 57)) || ((key >= 65) && (key <= 90)) || ((key >= 97) && (key <= 122))) && (keyCount < 31)) if ((((key >= 48) && (key <= 57)) || ((key >= 65) && (key <= 90)) || ((key >= 97) && (key <= 122))) && (keyCount < MAX_CONTROL_NAME_LENGTH - 1))
{ {
layout.controls[selectedControl].name[keyCount] = (unsigned char)key; layout.controls[selectedControl].name[keyCount] = (unsigned char)key;
} }
if (IsKeyPressed(KEY_BACKSPACE_TEXT)) if ((keyCount > 0) && IsKeyPressed(KEY_BACKSPACE_TEXT))
{ {
layout.controls[selectedControl].name[keyCount - 1] = '\0'; layout.controls[selectedControl].name[keyCount - 1] = '\0';
if (keyCount < 0) keyCount = 0; if (keyCount < 0) keyCount = 0;
} }
// Used to show the cursor('|') in textEditMode // Used to show the cursor('|') in textEditMode
if (keyCount < 32) framesCounter++; if (keyCount < MAX_CONTROL_NAME_LENGTH) framesCounter++;
else if (keyCount == 32) framesCounter = 21; else if (keyCount == MAX_CONTROL_NAME_LENGTH) framesCounter = 21;
} }
// Turns off textEditMode // Turns off textEditMode
@ -832,7 +834,7 @@ int main()
else if (textEditMode && IsKeyPressed(KEY_ESCAPE)) else if (textEditMode && IsKeyPressed(KEY_ESCAPE))
{ {
textEditMode = false; textEditMode = false;
memset(layout.controls[selectedControl].text, 0, 32); memset(layout.controls[selectedControl].text, 0, MAX_CONTROL_TEXT_LENGTH);
strcpy(layout.controls[selectedControl].text, prevControlText); strcpy(layout.controls[selectedControl].text, prevControlText);
framesCounter = 0; framesCounter = 0;
} }
@ -845,7 +847,7 @@ int main()
else if (nameEditMode && IsKeyPressed(KEY_ESCAPE)) else if (nameEditMode && IsKeyPressed(KEY_ESCAPE))
{ {
nameEditMode = false; nameEditMode = false;
memset(layout.controls[selectedControl].name, 0, 32); memset(layout.controls[selectedControl].name, 0, MAX_CONTROL_NAME_LENGTH);
strcpy(layout.controls[selectedControl].name, prevControlName); strcpy(layout.controls[selectedControl].name, prevControlName);
framesCounter = 0; framesCounter = 0;
} }
@ -1287,8 +1289,8 @@ int main()
layout.controls[i].id = 0; layout.controls[i].id = 0;
layout.controls[i].type = 0; layout.controls[i].type = 0;
layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 }; layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 };
memset(layout.controls[i].text, 0, 32); memset(layout.controls[i].text, 0, MAX_CONTROL_TEXT_LENGTH);
memset(layout.controls[i].name, 0, 32); memset(layout.controls[i].name, 0, MAX_CONTROL_NAME_LENGTH);
layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor
} }
@ -1357,7 +1359,7 @@ int main()
case DROPDOWNBOX: GuiDropdownBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, listData, 3, 2); break; case DROPDOWNBOX: GuiDropdownBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, listData, 3, 2); break;
case SPINNER: GuiSpinner((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 3, 25); break; case SPINNER: GuiSpinner((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 3, 25); break;
case VALUEBOX: GuiValueBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 100); break; case VALUEBOX: GuiValueBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 100); break;
case TEXTBOX: GuiTextBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, layout.controls[i].text, 32, false); break; case TEXTBOX: GuiTextBox((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, layout.controls[i].text, MAX_CONTROL_TEXT_LENGTH, false); break;
case SLIDER: GuiSlider((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 0, 100); break; case SLIDER: GuiSlider((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 42, 0, 100); break;
case SLIDERBAR: GuiSliderBarEx((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 40, 0, 100, layout.controls[i].text, true); break; case SLIDERBAR: GuiSliderBarEx((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 40, 0, 100, layout.controls[i].text, true); break;
case PROGRESSBAR: GuiProgressBar((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 40, 0, 100); break; case PROGRESSBAR: GuiProgressBar((Rectangle){ layout.controls[i].ap->x + layout.controls[i].rec.x, layout.controls[i].ap->y + layout.controls[i].rec.y, layout.controls[i].rec.width, layout.controls[i].rec.height }, 40, 0, 100); break;
@ -1375,8 +1377,9 @@ int main()
} }
// Draws the defaultRec[selectedType] of the control selected // Draws the defaultRec[selectedType] of the control selected
if (selectedControl == -1 && !anchorMode && !tracemapEditMode && !closingWindowActive && !paletteMode && !generateWindowActive) if ((selectedControl == -1) && (focusedControl == -1 )&& !anchorMode && !tracemapEditMode && !closingWindowActive && !generateWindowActive)
{ {
GuiFade(0.4f);
switch (selectedTypeDraw) switch (selectedTypeDraw)
{ {
case WINDOWBOX: GuiWindowBox(defaultRec[selectedTypeDraw], "WINDOW BOX"); break; case WINDOWBOX: GuiWindowBox(defaultRec[selectedTypeDraw], "WINDOW BOX"); break;
@ -1402,6 +1405,8 @@ int main()
case DUMMYREC: GuiDummyRec(defaultRec[selectedTypeDraw], "DUMMY REC"); break; case DUMMYREC: GuiDummyRec(defaultRec[selectedTypeDraw], "DUMMY REC"); break;
default: break; default: break;
} }
GuiFade(1.0f);
} }
// Draw the anchorPoints // Draw the anchorPoints
@ -1576,7 +1581,7 @@ int main()
GuiLabel((Rectangle){ helpPositionX + 30, 520, 0, 0 }, "LCTRL + O - Open layout file (.rgl)"); GuiLabel((Rectangle){ helpPositionX + 30, 520, 0, 0 }, "LCTRL + O - Open layout file (.rgl)");
GuiLabel((Rectangle){ helpPositionX + 30, 540, 0, 0 }, "LCTRL + ENTER - Export layout to code"); GuiLabel((Rectangle){ helpPositionX + 30, 540, 0, 0 }, "LCTRL + ENTER - Export layout to code");
} }
// Draw right panel controls palette // Draw right panel controls palette
GuiPanel(palettePanel); GuiPanel(palettePanel);
@ -1633,18 +1638,9 @@ int main()
config.fullVariables = GuiCheckBoxEx((Rectangle){ exportWindowPos.x + 10, exportWindowPos.y + 200, 15, 15 }, config.fullVariables, "Full variables"); config.fullVariables = GuiCheckBoxEx((Rectangle){ exportWindowPos.x + 10, exportWindowPos.y + 200, 15, 15 }, config.fullVariables, "Full variables");
if (GuiButton((Rectangle){ exportWindowPos.x + 275, exportWindowPos.y + 185, 115, 30 }, "Generate Code")) if (GuiButton((Rectangle){ exportWindowPos.x + 275, exportWindowPos.y + 185, 115, 30 }, "Generate Code"))
{ {
const char *filters[] = { "*.c", "*.go", "*.lua" }; ShowExportLayoutDialog(config);
const char *fileName = tinyfd_saveFileDialog("Generate code file", config.name, 3, filters, "Code file"); generateWindowActive = false;
if (fileName != NULL)
{
char outFileName[64] = { 0 };
strcpy(outFileName, fileName);
if (GetExtension(fileName) == NULL) strcat(outFileName, ".c\0"); // No extension provided
GenerateCode(fileName, config);
generateWindowActive = false;
}
} }
} }
@ -1724,6 +1720,21 @@ static void ShowSaveLayoutDialog(void)
} }
} }
// Show save layout dialog
static void ShowExportLayoutDialog(GuiLayoutConfig config)
{
const char *filters[] = { "*.c", "*.go", "*.lua" };
const char *fileName = tinyfd_saveFileDialog("Generate code file", config.name, 3, filters, "Code file");
if (fileName != NULL)
{
char outFileName[64] = { 0 };
strcpy(outFileName, fileName);
if (GetExtension(fileName) == NULL) strcat(outFileName, ".c\0"); // No extension provided
GenerateCode(fileName, config);
}
}
// Save gui layout information // Save gui layout information
static void SaveLayoutRGL(const char *fileName, bool binary) static void SaveLayoutRGL(const char *fileName, bool binary)
{ {
@ -1804,8 +1815,8 @@ static void LoadLayoutRGL(const char *fileName)
layout.controls[i].id = 0; layout.controls[i].id = 0;
layout.controls[i].type = 0; layout.controls[i].type = 0;
layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 }; layout.controls[i].rec = (Rectangle){ 0, 0, 0, 0 };
memset(layout.controls[i].text, 0, 32); memset(layout.controls[i].text, 0, MAX_CONTROL_TEXT_LENGTH);
memset(layout.controls[i].name, 0, 32); memset(layout.controls[i].name, 0, MAX_CONTROL_NAME_LENGTH);
layout.controls[i].ap = &layout.anchors[0]; layout.controls[i].ap = &layout.anchors[0];
} }
for (int i = 0; i < MAX_ANCHOR_POINTS; i++) layout.anchors[i].hidding = false; for (int i = 0; i < MAX_ANCHOR_POINTS; i++) layout.anchors[i].hidding = false;
@ -1917,7 +1928,7 @@ static char *ExportFullVariables(int controlType, char *name, GuiLayoutConfig co
case TEXTBOX: case TEXTBOX:
{ {
if (config.fullVariables) strcpy(text, FormatText("%sSize", name)); if (config.fullVariables) strcpy(text, FormatText("%sSize", name));
else strcpy(text, "32"); else strcpy(text, "64");
} break; } break;
} }
@ -2078,8 +2089,8 @@ static void GenerateCode(const char *fileName, GuiLayoutConfig config)
case TEXTBOX: case TEXTBOX:
{ {
if (config.fullComments) fprintf(ftool, " \n\t// %s: %s\n", controlTypeNameLow[layout.controls[i].type], layout.controls[i].name); if (config.fullComments) fprintf(ftool, " \n\t// %s: %s\n", controlTypeNameLow[layout.controls[i].type], layout.controls[i].name);
if (config.fullVariables) fprintf(ftool, " int %sSize = 32;\n", layout.controls[i].name); if (config.fullVariables) fprintf(ftool, " int %sSize = 64;\n", layout.controls[i].name);
fprintf(ftool, " char %sText[32] = \"%s\";\n", layout.controls[i].name, layout.controls[i].text); fprintf(ftool, " char %sText[64] = \"%s\";\n", layout.controls[i].name, layout.controls[i].text);
} }
default: break; default: break;
} }