Reviewed variables naming

- Removed useless code
- Reorganized some code
This commit is contained in:
Ray
2018-05-04 14:13:22 +02:00
parent d86dc0b7f2
commit d7a7edd1c1

View File

@ -121,6 +121,7 @@ const char *controlTypeNameShort[] = { "wdwbox", "grpbox", "lne", "pnl", "lbl",
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module specific Functions Declaration // Module specific Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
static void ShowSaveLayoutDialog(void); // Show save 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
@ -134,48 +135,49 @@ int main()
// Initialization // Initialization
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
SetConfigFlags(FLAG_WINDOW_RESIZABLE); SetConfigFlags(FLAG_WINDOW_RESIZABLE);
InitWindow(screenWidth, screenHeight, "rGuiLayout v1.0 - raygui layout editor"); InitWindow(screenWidth, screenHeight, "rGuiLayout v1.0 - not_saved_layout");
SetExitKey(0); SetExitKey(0);
// General app variables
Vector2 mouse;
bool exitWindow = false; // Exit window flag
bool snapMode = false; // Snap mode flag (KEY_S)
bool showGrid = true; // Show grid flag (KEY_G)
bool controlLockMode = false; // Control edition locked mode
bool controlDrag = false; // Control drag mode
bool controlGlobalPos = false; // Control global position mode
bool textEditMode = false; // Control text edit mode (KEY_T)
bool nameEditMode = false; // Controlo name edit mode (KEY_N)
int framesCounter = 0;
int framesCounterSnap = 0;
int selectedControl = -1; int selectedControl = -1;
int storedControl = -1;
int selectedType = WINDOWBOX; int selectedType = WINDOWBOX;
int selectedTypeDraw = LABEL; int selectedTypeDraw = LABEL;
Vector2 panControlOffset = { 0 };
Vector2 prevControlPosition = { 0 };
Vector2 mouse; const char *listData[3] = { "ONE", "TWO", "THREE" }; // ToggleGroup, ComboBox, DropdownBox default data
bool snapMode = false; const char *listViewData[4] = { "WINDOWBOX", "GROUPBOX", "LINE", "PANEL" }; // ListView default data
bool showGrid = true;
bool controlCollision = false; // Checks if the mouse is colliding with a control or list
bool controlDrag = false; // Allows the control to be moved with the mouse without detecting collision every frame
bool textEditMode = false; // Anchors control variables
bool nameEditMode = false; AnchorPoint auxAnchor = { 9, 0, 0, 0 };
int framesCounter = 0;
int saveControlSelected = -1;
char previewText[8] = "TEXTBOX";
bool anchorMode = false; bool anchorMode = false;
bool anchorLinkMode = false; bool anchorLinkMode = false;
bool anchorLockMode = false;
bool anchorPosEditMode = false;
int selectedAnchor = -1; int selectedAnchor = -1;
int linkedAnchor = -1; int linkedAnchor = -1;
int storedAnchor = -1;
AnchorPoint auxAnchor = { 9, 0, 0, 0}; // Help panel variables
bool anchorNewPos = false; int helpPositionX = -300;
bool lockAnchorMode = false;
int saveAnchorSelected = -1;
int snapFrameCounter = 0;
bool lockMode = false;
bool globalReference = false;
int helpPosX = -300;
int helpCounter = 0; int helpCounter = 0;
int startPosXHelp = -300; int helpStartPositionX = -300;
int deltaPosXHelp = 0; int helpDeltaPositionX = 0;
int fileCount = 0; // Rectangles used on controls preview drawing
char **droppedFiles = { 0 };
// Used to draw the preview of selectedControl
Rectangle defaultRec[21] = { Rectangle defaultRec[21] = {
(Rectangle){ 0, 0, 125, 50}, // WINDOWBOX (Rectangle){ 0, 0, 125, 50}, // WINDOWBOX
(Rectangle){ 0, 0, 125, 30}, // GROUPBOX (Rectangle){ 0, 0, 125, 30}, // GROUPBOX
@ -200,70 +202,6 @@ int main()
(Rectangle){ 0, 0, 125, 30 } // DUMMYREC (Rectangle){ 0, 0, 125, 30 } // DUMMYREC
}; };
// List view required variables
Rectangle listViewControls = { -200, 0, 140, 500 };
Rectangle listViewControlsCounter = { GetScreenWidth() + 140, 0, 140, 500 };
int counterListViewControlsCounter = 0;
int startPosXListViewControlsCounter = GetScreenWidth() + 140;
int deltaPosXListViewControlsCounter = 0;
// ToggleGroup, ComboBox, DropdownBox use this data
const char *list[3] = { "ONE", "TWO", "THREE" };
const char *guiControls[21] = {
"WINDOWBOX",
"GROUPBOX",
"LINE",
"PANEL",
"LABEL",
"BUTTON",
"TOGGLE",
"TOGGLEGROUP",
"CHECKBOX",
"COMBOBOX",
"DROPDOWNBOX",
"SPINNER",
"VALUEBOX",
"TEXTBOX",
"SLIDER",
"SLIDERBAR",
"PROGRESSBAR",
"STATUSBAR",
"LISTVIEW",
"COLORPICKER",
"DUMMYREC"
};
const char *guiControlsCounter[16] = {
"Control 000",
"Control 001",
"Control 002",
"Control 003",
"Control 004",
"Control 005",
"Control 006",
"Control 007",
"Control 008",
"Control 009",
"Control 010",
"Control 011",
"Control 012",
"Control 013",
"Control 014",
"Control 015",
};
Texture2D tracemap = { 0 };
Rectangle tracemapRec = { 0 };
bool tracemapEditMode = false;
float tracemapFade = 0.5f;
Vector2 panOffset = { 0 };
Vector2 prevPosition = { 0 };
char prevControlText[32];
char prevControlName[32];
// Initialize anchor points to default values // Initialize anchor points to default values
for (int i = 0; i < MAX_ANCHOR_POINTS; i++) for (int i = 0; i < MAX_ANCHOR_POINTS; i++)
{ {
@ -287,15 +225,6 @@ int main()
layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor layout.controls[i].ap = &layout.anchors[0]; // By default, set parent anchor
} }
// Very basic undo system (only for last selected rectangle changes)
int undoSelectedControl = -1;
Rectangle undoLastRec; // Update when a control is selected
//if (CTRL+Z) currentSelectedRec = undoLastRec;
bool exitWindow = false;
bool ultimateMessage = false;
// Define palette variables // Define palette variables
Rectangle palettePanel = { GetScreenWidth() + 130, 20, 135, 870 }; Rectangle palettePanel = { GetScreenWidth() + 130, 20, 135, 870 };
bool paletteMode = false; bool paletteMode = false;
@ -304,7 +233,6 @@ int main()
int paletteEasingOut = PALETTE_EASING_FRAMES; int paletteEasingOut = PALETTE_EASING_FRAMES;
int paletteStartPosX = GetScreenWidth() + 130; int paletteStartPosX = GetScreenWidth() + 130;
// Define palette rectangles // Define palette rectangles
Rectangle paletteRecs[21] = { Rectangle paletteRecs[21] = {
(Rectangle){ palettePanel.x + 5, palettePanel.y + 5, 125, 50 }, // WindowBox (Rectangle){ palettePanel.x + 5, palettePanel.y + 5, 125, 50 }, // WindowBox
@ -330,7 +258,24 @@ int main()
(Rectangle){ palettePanel.x + 5, palettePanel.y + 835, 125, 30 } // DummyRec (Rectangle){ palettePanel.x + 5, palettePanel.y + 835, 125, 30 } // DummyRec
}; };
// Export options window variables // Tracemap (background image for reference) variables
Texture2D tracemap = { 0 };
Rectangle tracemapRec = { 0 };
bool tracemapEditMode = false;
float tracemapFade = 0.5f;
// Very basic undo system
// Undo last-selected rectangle changes
// Undo text/name editing on cancel (KEY_ESC)
int undoSelectedControl = -1;
Rectangle undoLastRec;
char prevControlText[32];
char prevControlName[32];
// Close layout window variables
bool ultimateMessage = false;
// Generate code options window variables
Vector2 exportWindowPos = { 50, 50 }; Vector2 exportWindowPos = { 50, 50 };
bool generateWindowActive = false; bool generateWindowActive = false;
int toolNameSize = 32; int toolNameSize = 32;
@ -338,14 +283,14 @@ int main()
int companySize = 32; int companySize = 32;
int toolDescriptionSize = 32; int toolDescriptionSize = 32;
// Generate code configuration
GuiLayoutConfig config; GuiLayoutConfig config;
memset(&config, 0, sizeof(GuiLayoutConfig)); memset(&config, 0, sizeof(GuiLayoutConfig));
config.width = 800; config.width = 800;
config.height = 600; config.height = 600;
strcpy(config.name, "file_name"); strcpy(config.name, "layout_file_name");
strcpy(config.version, "1.0-dev"); strcpy(config.version, "1.0-dev");
strcpy(config.company, "raylib tech"); strcpy(config.company, "raylib technologies");
strcpy(config.description, "tool description"); strcpy(config.description, "tool description");
config.defineRecs = false; config.defineRecs = false;
config.exportAnchors = false; config.exportAnchors = false;
@ -362,34 +307,30 @@ int main()
{ {
// Update // Update
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
if (IsKeyPressed(KEY_ESCAPE) && !textEditMode && !nameEditMode)/* || WindowShouldClose()*/ framesCounterSnap++;
mouse = GetMousePosition();
if (WindowShouldClose()) exitWindow = true;
// Show save layout message window on ESC
if (IsKeyPressed(KEY_ESCAPE) && !textEditMode && !nameEditMode)
{ {
ultimateMessage = !ultimateMessage; ultimateMessage = !ultimateMessage;
selectedControl = -1; selectedControl = -1;
lockMode = false; controlLockMode = false;
} }
if (WindowShouldClose()) ultimateMessage = true;
mouse = GetMousePosition();
snapFrameCounter++;
// Enables or disables snapMode if not in textEditMode // Enables or disables snapMode if not in textEditMode
if (IsKeyPressed(KEY_S) && (!textEditMode) && (!nameEditMode)) snapMode = !snapMode; if (IsKeyPressed(KEY_S) && (!textEditMode) && (!nameEditMode)) snapMode = !snapMode;
// Enables or disables position reference information(anchor reference or global reference) // Enables or disables position reference information(anchor reference or global reference)
if (IsKeyPressed(KEY_F) && (!textEditMode) && (!nameEditMode)) globalReference = !globalReference; if (IsKeyPressed(KEY_F) && (!textEditMode) && (!nameEditMode)) controlGlobalPos = !controlGlobalPos;
// Checks if the defaultRec[selectedType] is colliding with the list of the controls // Toggle help info
if (CheckCollisionPointRec(mouse, listViewControls)) controlCollision = true;
else if (CheckCollisionPointRec(mouse, listViewControlsCounter)) controlCollision = true;
// Toggle on help info
if (IsKeyPressed(KEY_TAB)) if (IsKeyPressed(KEY_TAB))
{ {
startPosXHelp = helpPosX; helpStartPositionX = helpPositionX;
deltaPosXHelp = 0 - startPosXHelp; helpDeltaPositionX = 0 - helpStartPositionX;
helpCounter = 0; helpCounter = 0;
} }
@ -397,19 +338,19 @@ int main()
{ {
helpCounter++; helpCounter++;
if (helpCounter >= 60) helpCounter = 60; if (helpCounter >= 60) helpCounter = 60;
helpPosX = (int)EaseCubicInOut(helpCounter, startPosXHelp, deltaPosXHelp, 60); helpPositionX = (int)EaseCubicInOut(helpCounter, helpStartPositionX, helpDeltaPositionX, 60);
} }
else if (IsKeyReleased(KEY_TAB)) else if (IsKeyReleased(KEY_TAB))
{ {
startPosXHelp = helpPosX; helpStartPositionX = helpPositionX;
deltaPosXHelp = -300 - startPosXHelp; helpDeltaPositionX = -300 - helpStartPositionX;
helpCounter = 0; helpCounter = 0;
} }
else else
{ {
helpCounter++; helpCounter++;
if (helpCounter >= 60) helpCounter = 60; if (helpCounter >= 60) helpCounter = 60;
helpPosX = (int)EaseCubicInOut(helpCounter, startPosXHelp, deltaPosXHelp, 60); helpPositionX = (int)EaseCubicInOut(helpCounter, helpStartPositionX, helpDeltaPositionX, 60);
} }
// Controls palette selector logic // Controls palette selector logic
@ -456,7 +397,7 @@ int main()
} }
// Create new control // Create new control
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && (selectedControl == -1) && !controlCollision && !anchorMode && !tracemapEditMode && !ultimateMessage && !paletteMode && !generateWindowActive) if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && (selectedControl == -1) && !anchorMode && !tracemapEditMode && !ultimateMessage && !paletteMode && !generateWindowActive)
{ {
// Add new control (button) // Add new control (button)
layout.controls[layout.controlsCount].id = layout.controlsCount; layout.controls[layout.controlsCount].id = layout.controlsCount;
@ -509,7 +450,7 @@ int main()
} }
// Change controls layer order (position inside array) // Change controls layer order (position inside array)
if (IsKeyDown(KEY_LEFT_ALT) && !lockMode) if (IsKeyDown(KEY_LEFT_ALT) && !controlLockMode)
{ {
if ((IsKeyPressed(KEY_UP)) && (selectedControl < layout.controlsCount - 1)) if ((IsKeyPressed(KEY_UP)) && (selectedControl < layout.controlsCount - 1))
{ {
@ -531,13 +472,13 @@ int main()
} }
} }
if (!(controlDrag || lockMode || tracemapEditMode || lockAnchorMode || ultimateMessage || paletteMode || generateWindowActive)) if (!(controlDrag || controlLockMode || tracemapEditMode || anchorLockMode || ultimateMessage || paletteMode || generateWindowActive))
{ {
// Check selected control (on mouse hover) // Check selected control (on mouse hover)
for (int i = layout.controlsCount; i >= 0; i--) for (int i = layout.controlsCount; i >= 0; i--)
{ {
if (controlDrag || lockMode || tracemapEditMode || lockAnchorMode) break; if (controlDrag || controlLockMode || tracemapEditMode || anchorLockMode) break;
if ((layout.controls[i].type == WINDOWBOX) && (!layout.controls[i].ap->hidding) && (CheckCollisionPointRec(mouse, (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, 24 }))) if ((layout.controls[i].type == WINDOWBOX) && (!layout.controls[i].ap->hidding) && (CheckCollisionPointRec(mouse, (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, 24 })))
{ {
selectedControl = i; selectedControl = i;
@ -564,25 +505,22 @@ int main()
if (selectedControl != -1 && !textEditMode && !nameEditMode && !anchorMode) if (selectedControl != -1 && !textEditMode && !nameEditMode && !anchorMode)
{ {
// Disables the defaultRec[selectedType]
controlCollision = true;
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
{ {
controlDrag = true; controlDrag = true;
panOffset = mouse; panControlOffset = mouse;
prevPosition = (Vector2){ layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y }; prevControlPosition = (Vector2){ layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y };
} }
else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON))
{ {
controlDrag = false; controlDrag = false;
} }
if (controlDrag && !lockMode) if (controlDrag && !controlLockMode)
{ {
layout.controls[selectedControl].rec.x = prevPosition.x + (mouse.x - panOffset.x); layout.controls[selectedControl].rec.x = prevControlPosition.x + (mouse.x - panControlOffset.x);
layout.controls[selectedControl].rec.y = prevPosition.y + (mouse.y - panOffset.y); layout.controls[selectedControl].rec.y = prevControlPosition.y + (mouse.y - panControlOffset.y);
// Snap to grid position and size // Snap to grid position and size
@ -617,11 +555,11 @@ int main()
} }
else else
{ {
if (IsKeyDown(KEY_RIGHT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.width += GRID_LINE_SPACING; if (IsKeyDown(KEY_RIGHT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.width += GRID_LINE_SPACING;
else if (IsKeyDown(KEY_LEFT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.width -= GRID_LINE_SPACING; else if (IsKeyDown(KEY_LEFT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.width -= GRID_LINE_SPACING;
if (IsKeyDown(KEY_UP) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.height -= GRID_LINE_SPACING; if (IsKeyDown(KEY_UP) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.height -= GRID_LINE_SPACING;
else if (IsKeyDown(KEY_DOWN) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.height += GRID_LINE_SPACING; else if (IsKeyDown(KEY_DOWN) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.height += GRID_LINE_SPACING;
} }
} }
else else
@ -637,11 +575,11 @@ int main()
} }
else else
{ {
if (IsKeyDown(KEY_RIGHT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.x += GRID_LINE_SPACING; if (IsKeyDown(KEY_RIGHT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.x += GRID_LINE_SPACING;
else if (IsKeyDown(KEY_LEFT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.x -= GRID_LINE_SPACING; else if (IsKeyDown(KEY_LEFT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.x -= GRID_LINE_SPACING;
if (IsKeyDown(KEY_UP) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.y -= GRID_LINE_SPACING; if (IsKeyDown(KEY_UP) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.y -= GRID_LINE_SPACING;
else if (IsKeyDown(KEY_DOWN) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.y += GRID_LINE_SPACING; else if (IsKeyDown(KEY_DOWN) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.controls[selectedControl].rec.y += GRID_LINE_SPACING;
} }
} }
@ -719,10 +657,6 @@ int main()
} }
else else
{ {
// Check mouse hover a list view
if (!CheckCollisionPointRec(mouse, listViewControls)) controlCollision = false;
if (!CheckCollisionPointRec(mouse, listViewControlsCounter)) controlCollision = false;
// Updates the selectedType with the MouseWheel // Updates the selectedType with the MouseWheel
selectedType -= GetMouseWheelMove(); selectedType -= GetMouseWheelMove();
@ -778,7 +712,7 @@ int main()
if (textEditMode) if (textEditMode)
{ {
// Locks the selectedControl for text editing // Locks the selectedControl for text editing
selectedControl = saveControlSelected; selectedControl = storedControl;
int key = GetKeyPressed(); int key = GetKeyPressed();
int keyCount = strlen(layout.controls[selectedControl].text); // Keeps track of text length int keyCount = strlen(layout.controls[selectedControl].text); // Keeps track of text length
@ -803,7 +737,7 @@ int main()
if ((nameEditMode)) if ((nameEditMode))
{ {
// Locks the selectedControl for text editing // Locks the selectedControl for text editing
selectedControl = saveControlSelected; selectedControl = storedControl;
int key = GetKeyPressed(); int key = GetKeyPressed();
int keyCount = strlen(layout.controls[selectedControl].name); // Keeps track of name length int keyCount = strlen(layout.controls[selectedControl].name); // Keeps track of name length
@ -855,7 +789,7 @@ int main()
((layout.controls[selectedControl].type == LABEL) || (layout.controls[selectedControl].type == TEXTBOX) || (layout.controls[selectedControl].type == BUTTON) || (layout.controls[selectedControl].type == TOGGLE) || (layout.controls[selectedControl].type == GROUPBOX) || (layout.controls[selectedControl].type == WINDOWBOX) || (layout.controls[selectedControl].type == STATUSBAR) || (layout.controls[selectedControl].type == DUMMYREC))) ((layout.controls[selectedControl].type == LABEL) || (layout.controls[selectedControl].type == TEXTBOX) || (layout.controls[selectedControl].type == BUTTON) || (layout.controls[selectedControl].type == TOGGLE) || (layout.controls[selectedControl].type == GROUPBOX) || (layout.controls[selectedControl].type == WINDOWBOX) || (layout.controls[selectedControl].type == STATUSBAR) || (layout.controls[selectedControl].type == DUMMYREC)))
{ {
textEditMode = true; textEditMode = true;
saveControlSelected = selectedControl; storedControl = selectedControl;
strcpy(prevControlText, layout.controls[selectedControl].text); strcpy(prevControlText, layout.controls[selectedControl].text);
} }
@ -864,21 +798,21 @@ int main()
{ {
nameEditMode = true; nameEditMode = true;
strcpy(prevControlName, layout.controls[selectedControl].name); strcpy(prevControlName, layout.controls[selectedControl].name);
saveControlSelected = selectedControl; storedControl = selectedControl;
} }
// Selected control lock logic // Selected control lock logic
if (lockMode) selectedControl = saveControlSelected; if (controlLockMode) selectedControl = storedControl;
if (IsKeyPressed(KEY_SPACE) && !nameEditMode && !textEditMode && (selectedControl != -1) && !lockMode && !anchorMode) if (IsKeyPressed(KEY_SPACE) && !nameEditMode && !textEditMode && (selectedControl != -1) && !controlLockMode && !anchorMode)
{ {
lockMode = true; controlLockMode = true;
saveControlSelected = selectedControl; storedControl = selectedControl;
} }
else if (IsKeyPressed(KEY_SPACE) && (selectedControl != -1)) lockMode = false; else if (IsKeyPressed(KEY_SPACE) && (selectedControl != -1)) controlLockMode = false;
// Checks if mouse is over an anchor // Checks if mouse is over an anchor
if (!(anchorLinkMode || controlDrag || lockAnchorMode)) if (!(anchorLinkMode || controlDrag || anchorLockMode))
{ {
for (int i = 1; i < MAX_ANCHOR_POINTS; i++) for (int i = 1; i < MAX_ANCHOR_POINTS; i++)
{ {
@ -897,9 +831,9 @@ int main()
} }
// Selected control lock logic // Selected control lock logic
if (lockAnchorMode) if (anchorLockMode)
{ {
selectedAnchor = saveAnchorSelected; selectedAnchor = storedAnchor;
anchorMode = true; anchorMode = true;
if (snapMode) if (snapMode)
@ -914,11 +848,11 @@ int main()
} }
else else
{ {
if (IsKeyDown(KEY_RIGHT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].x+= GRID_LINE_SPACING; if (IsKeyDown(KEY_RIGHT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].x+= GRID_LINE_SPACING;
else if (IsKeyDown(KEY_LEFT) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].x-= GRID_LINE_SPACING; else if (IsKeyDown(KEY_LEFT) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].x-= GRID_LINE_SPACING;
if (IsKeyDown(KEY_UP) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].y-= GRID_LINE_SPACING; if (IsKeyDown(KEY_UP) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].y-= GRID_LINE_SPACING;
else if (IsKeyDown(KEY_DOWN) && ((snapFrameCounter%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].y+= GRID_LINE_SPACING; else if (IsKeyDown(KEY_DOWN) && ((framesCounterSnap%MOVEMENT_FRAME_SPEED) == 0)) layout.anchors[selectedAnchor].y+= GRID_LINE_SPACING;
} }
} }
else else
@ -946,7 +880,7 @@ int main()
if (anchorMode) if (anchorMode)
{ {
// On mouse click anchor is created // On mouse click anchor is created
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && !controlCollision && (selectedAnchor == -1) && (selectedControl == -1)) if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && (selectedAnchor == -1) && (selectedControl == -1))
{ {
for (int i = 1; i < MAX_ANCHOR_POINTS; i++) for (int i = 1; i < MAX_ANCHOR_POINTS; i++)
{ {
@ -961,12 +895,12 @@ int main()
} }
} }
if (IsKeyPressed(KEY_SPACE) && !nameEditMode && !textEditMode && (selectedAnchor != -1) && !lockAnchorMode && anchorMode) if (IsKeyPressed(KEY_SPACE) && !nameEditMode && !textEditMode && (selectedAnchor != -1) && !anchorLockMode && anchorMode)
{ {
lockAnchorMode = true; anchorLockMode = true;
saveAnchorSelected = selectedAnchor; storedAnchor = selectedAnchor;
} }
else if (IsKeyPressed(KEY_SPACE) && (selectedAnchor != -1)) lockAnchorMode = false; else if (IsKeyPressed(KEY_SPACE) && (selectedAnchor != -1)) anchorLockMode = false;
if (selectedAnchor > 0) if (selectedAnchor > 0)
{ {
@ -987,16 +921,16 @@ int main()
layout.anchors[selectedAnchor].enabled = false; layout.anchors[selectedAnchor].enabled = false;
layout.anchors[selectedAnchor].hidding = false; layout.anchors[selectedAnchor].hidding = false;
anchorMode = false; anchorMode = false;
lockAnchorMode = false; anchorLockMode = false;
} }
if (!lockAnchorMode) if (!anchorLockMode)
{ {
// Allows to drag an anchor without losing collision // Allows to drag an anchor without losing collision
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && IsKeyDown(KEY_A)) if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && IsKeyDown(KEY_A))
{ {
controlDrag = true; controlDrag = true;
anchorNewPos = true; anchorPosEditMode = true;
for (int i = 0; i < layout.controlsCount; i++) for (int i = 0; i < layout.controlsCount; i++)
{ {
@ -1012,7 +946,7 @@ int main()
if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON))
{ {
if (anchorNewPos) if (anchorPosEditMode)
{ {
for (int i = 0; i < layout.controlsCount; i++) for (int i = 0; i < layout.controlsCount; i++)
{ {
@ -1026,7 +960,7 @@ int main()
} }
} }
anchorNewPos = false; anchorPosEditMode = false;
} }
controlDrag = false; controlDrag = false;
@ -1052,7 +986,7 @@ int main()
// Links the selected control to the current anchor // Links the selected control to the current anchor
if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON)) if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON))
{ {
if (selectedControl != -1 && !lockMode) if (selectedControl != -1 && !controlLockMode)
{ {
layout.controls[selectedControl].rec.x += layout.controls[selectedControl].ap->x; layout.controls[selectedControl].rec.x += layout.controls[selectedControl].ap->x;
layout.controls[selectedControl].rec.y += layout.controls[selectedControl].ap->y; layout.controls[selectedControl].rec.y += layout.controls[selectedControl].ap->y;
@ -1109,16 +1043,18 @@ int main()
// Drop files logic // Drop files logic
if (IsFileDropped()) if (IsFileDropped())
{ {
char name[256]; int fileCount = 0;
char **droppedFiles = { 0 };
char droppedFileName[256];
droppedFiles = GetDroppedFiles(&fileCount); droppedFiles = GetDroppedFiles(&fileCount);
strcpy(name, droppedFiles[0]); strcpy(droppedFileName, droppedFiles[0]);
if (IsFileExtension(name, ".rgl")) LoadLayoutRGL(name); if (IsFileExtension(droppedFileName, ".rgl")) LoadLayoutRGL(droppedFileName);
else if (IsFileExtension(name, ".rgs")) GuiLoadStyle(name); else if (IsFileExtension(droppedFileName, ".rgs")) GuiLoadStyle(droppedFileName);
else if (IsFileExtension(name, ".png")) else if (IsFileExtension(droppedFileName, ".png"))
{ {
if (tracemap.id > 0) UnloadTexture(tracemap); if (tracemap.id > 0) UnloadTexture(tracemap);
tracemap = LoadTexture(name); tracemap = LoadTexture(droppedFileName);
SetTextureFilter(tracemap, FILTER_BILINEAR); SetTextureFilter(tracemap, FILTER_BILINEAR);
@ -1145,20 +1081,10 @@ int main()
layout.controlsCount++; layout.controlsCount++;
} }
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_S)) // Save layout file dialog logic
{ if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_S)) ShowSaveLayoutDialog();
// Save file dialog
const char *filters[] = { "*.rgl" };
char *fileName = tinyfd_saveFileDialog("Save raygui layout text file", "", 1, filters, "raygui Layout Files (*.rgl)");
// Save layout.controls file (text or binary)
if (fileName != NULL)
{
if (GetExtension(fileName) == NULL) strcat(fileName, ".rgl\0"); // No extension provided
SaveLayoutRGL(fileName, false);
}
}
// Open laout file dialog logic
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_O)) if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_O))
{ {
// Open file dialog // Open file dialog
@ -1168,15 +1094,10 @@ int main()
if (fileName != NULL) LoadLayoutRGL(fileName); if (fileName != NULL) LoadLayoutRGL(fileName);
} }
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_ENTER)) // Activate code generation export window
{ if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_ENTER)) generateWindowActive = true;
// Save file dialog
// TODO: Support additional languages (.lua, .go...) code generation
generateWindowActive = true; if (generateWindowActive) // Keep window in the middle of screen
}
if (generateWindowActive)
{ {
exportWindowPos.x = GetScreenWidth()/2 - 200; exportWindowPos.x = GetScreenWidth()/2 - 200;
exportWindowPos.y = GetScreenHeight()/2 - 112; exportWindowPos.y = GetScreenHeight()/2 - 112;
@ -1196,14 +1117,14 @@ int main()
// Moves the texture with the mouse // Moves the texture with the mouse
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
{ {
panOffset = mouse; panControlOffset = mouse;
prevPosition = (Vector2){ tracemapRec.x, tracemapRec.y }; prevControlPosition = (Vector2){ tracemapRec.x, tracemapRec.y };
} }
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
{ {
tracemapRec.x = prevPosition.x + (mouse.x - panOffset.x); tracemapRec.x = prevControlPosition.x + (mouse.x - panControlOffset.x);
tracemapRec.y = prevPosition.y + (mouse.y - panOffset.y); tracemapRec.y = prevControlPosition.y + (mouse.y - panControlOffset.y);
if (snapMode) if (snapMode)
{ {
@ -1327,10 +1248,10 @@ int main()
case LABEL: GuiLabel((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); break; case LABEL: GuiLabel((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); break;
case BUTTON: GuiButton((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); break; case BUTTON: GuiButton((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); break;
case TOGGLE: GuiToggleButton((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, false); break; case TOGGLE: GuiToggleButton((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, false); break;
case TOGGLEGROUP: GuiToggleGroup((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 }, list, 3, 1); break; case TOGGLEGROUP: GuiToggleGroup((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, 1); break;
case CHECKBOX: GuiCheckBox((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 }, false); break; case CHECKBOX: GuiCheckBox((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 }, false); break;
case COMBOBOX: GuiComboBox((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 }, list, 3, 1); break; case COMBOBOX: GuiComboBox((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, 1); 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 }, list, 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, 32, false); break;
@ -1338,7 +1259,7 @@ int main()
case SLIDERBAR: GuiSliderBar((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 SLIDERBAR: GuiSliderBar((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; 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 STATUSBAR: GuiStatusBar((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, 15); break; case STATUSBAR: GuiStatusBar((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, 15); break;
case LISTVIEW: GuiListView((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 }, guiControls, 14, 1); break; case LISTVIEW: GuiListView((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 }, listViewData, 4, 1); break;
case COLORPICKER: GuiColorPicker((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 }, RED); break; case COLORPICKER: GuiColorPicker((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 }, RED); break;
case DUMMYREC: GuiDummyRec((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); break; case DUMMYREC: GuiDummyRec((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); break;
default: break; default: break;
@ -1362,18 +1283,18 @@ int main()
case LABEL: GuiLabel(defaultRec[selectedTypeDraw], "TEXT SAMPLE"); break; case LABEL: GuiLabel(defaultRec[selectedTypeDraw], "TEXT SAMPLE"); break;
case BUTTON: GuiButton(defaultRec[selectedTypeDraw], "BUTTON"); break; case BUTTON: GuiButton(defaultRec[selectedTypeDraw], "BUTTON"); break;
case TOGGLE: GuiToggleButton(defaultRec[selectedTypeDraw], "TOGGLE", false); break; case TOGGLE: GuiToggleButton(defaultRec[selectedTypeDraw], "TOGGLE", false); break;
case TOGGLEGROUP: GuiToggleGroup(defaultRec[selectedTypeDraw], list, 3, 1); break; case TOGGLEGROUP: GuiToggleGroup(defaultRec[selectedTypeDraw], listData, 3, 1); break;
case CHECKBOX: GuiCheckBox(defaultRec[selectedTypeDraw], false); break; case CHECKBOX: GuiCheckBox(defaultRec[selectedTypeDraw], false); break;
case COMBOBOX: GuiComboBox(defaultRec[selectedTypeDraw], list, 3, 1); break; case COMBOBOX: GuiComboBox(defaultRec[selectedTypeDraw], listData, 3, 1); break;
case DROPDOWNBOX: GuiDropdownBox(defaultRec[selectedTypeDraw], list, 3, 2); break; case DROPDOWNBOX: GuiDropdownBox(defaultRec[selectedTypeDraw], listData, 3, 2); break;
case SPINNER: GuiSpinner(defaultRec[selectedTypeDraw], 42, 3, 25); break; case SPINNER: GuiSpinner(defaultRec[selectedTypeDraw], 42, 3, 25); break;
case VALUEBOX: GuiValueBox(defaultRec[selectedTypeDraw], 42, 100); break; case VALUEBOX: GuiValueBox(defaultRec[selectedTypeDraw], 42, 100); break;
case TEXTBOX: GuiTextBox(defaultRec[selectedTypeDraw], previewText, 7, false); break; case TEXTBOX: GuiTextBox(defaultRec[selectedTypeDraw], "TEXTBOX", 7, false); break;
case SLIDER: GuiSlider(defaultRec[selectedTypeDraw], 42, 0, 100); break; case SLIDER: GuiSlider(defaultRec[selectedTypeDraw], 42, 0, 100); break;
case SLIDERBAR: GuiSliderBar(defaultRec[selectedTypeDraw], 40, 0, 100); break; case SLIDERBAR: GuiSliderBar(defaultRec[selectedTypeDraw], 40, 0, 100); break;
case PROGRESSBAR: GuiProgressBar(defaultRec[selectedTypeDraw], 40, 0, 100); break; case PROGRESSBAR: GuiProgressBar(defaultRec[selectedTypeDraw], 40, 0, 100); break;
case STATUSBAR: GuiStatusBar(defaultRec[selectedTypeDraw], "STATUS BAR", 15); break; case STATUSBAR: GuiStatusBar(defaultRec[selectedTypeDraw], "STATUS BAR", 15); break;
case LISTVIEW: GuiListView(defaultRec[selectedTypeDraw], guiControls, 14, 1); break; case LISTVIEW: GuiListView(defaultRec[selectedTypeDraw], listViewData, 4, 1); break;
case COLORPICKER: GuiColorPicker(defaultRec[selectedTypeDraw], RED); break; case COLORPICKER: GuiColorPicker(defaultRec[selectedTypeDraw], RED); break;
case DUMMYREC: GuiDummyRec(defaultRec[selectedTypeDraw], "DUMMY REC"); break; case DUMMYREC: GuiDummyRec(defaultRec[selectedTypeDraw], "DUMMY REC"); break;
default: break; default: break;
@ -1385,7 +1306,7 @@ int main()
{ {
if ((layout.anchors[i].enabled) && (layout.anchors[i].x != 0) && (layout.anchors[i].y != 0)) if ((layout.anchors[i].enabled) && (layout.anchors[i].x != 0) && (layout.anchors[i].y != 0))
{ {
if (layout.anchors[i].id == selectedAnchor && anchorNewPos) if (layout.anchors[i].id == selectedAnchor && anchorPosEditMode)
{ {
// Draw the anchor that is currently moving // Draw the anchor that is currently moving
DrawCircle(layout.anchors[i].x, layout.anchors[i].y, ANCHOR_RADIUS, Fade(ORANGE, 0.5f)); DrawCircle(layout.anchors[i].x, layout.anchors[i].y, ANCHOR_RADIUS, Fade(ORANGE, 0.5f));
@ -1496,7 +1417,7 @@ int main()
// Draw Rectangle Info // Draw Rectangle Info
if (selectedControl != -1) if (selectedControl != -1)
{ {
if (!globalReference) DrawText(FormatText("[%i, %i, %i, %i]", layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height), layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y - 30, 20, MAROON); if (!controlGlobalPos) DrawText(FormatText("[%i, %i, %i, %i]", layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height), layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y - 30, 20, MAROON);
else DrawText(FormatText("[%i, %i, %i, %i]", layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height), layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y - 30, 20, RED); else DrawText(FormatText("[%i, %i, %i, %i]", layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height), layout.controls[selectedControl].rec.x + layout.controls[selectedControl].ap->x, layout.controls[selectedControl].rec.y + layout.controls[selectedControl].ap->y - 30, 20, RED);
} }
@ -1508,30 +1429,30 @@ int main()
{ {
for (int i = layout.controlsCount - 1; i >= 0; i--) DrawText(FormatText("[%i]", layout.controls[i].id), layout.controls[i].rec.x + layout.controls[i].ap->x + layout.controls[i].rec.width, layout.controls[i].rec.y + layout.controls[i].ap->y - 10, 10, BLUE); for (int i = layout.controlsCount - 1; i >= 0; i--) DrawText(FormatText("[%i]", layout.controls[i].id), layout.controls[i].rec.x + layout.controls[i].ap->x + layout.controls[i].rec.width, layout.controls[i].rec.y + layout.controls[i].ap->y - 10, 10, BLUE);
} }
// Draw the help list (by default is out of screen) // Draw the help listData (by default is out of screen)
if (helpPosX > -280) if (helpPositionX > -280)
{ {
DrawRectangleRec((Rectangle){ helpPosX + 20, 20, 275, 390 }, GetColor(style[DEFAULT_BACKGROUND_COLOR])); DrawRectangleRec((Rectangle){ helpPositionX + 20, 20, 275, 390 }, GetColor(style[DEFAULT_BACKGROUND_COLOR]));
GuiGroupBox((Rectangle){ helpPosX + 20, 20, 275, 390 }, "Shortcuts"); GuiGroupBox((Rectangle){ helpPositionX + 20, 20, 275, 390 }, "Shortcuts");
GuiLabel((Rectangle){ helpPosX + 30, 30, 0, 0 }, "G - Show/hide grid"); GuiLabel((Rectangle){ helpPositionX + 30, 30, 0, 0 }, "G - Show/hide grid");
GuiLabel((Rectangle){ helpPosX + 30, 50, 0, 0 }, "S - Toggle snap"); GuiLabel((Rectangle){ helpPositionX + 30, 50, 0, 0 }, "S - Toggle snap");
GuiLabel((Rectangle){ helpPosX + 30, 70, 0, 0 }, "R - Resize to grid"); GuiLabel((Rectangle){ helpPositionX + 30, 70, 0, 0 }, "R - Resize to grid");
GuiLabel((Rectangle){ helpPosX + 30, 90, 0, 0 }, "A - Anchor mode"); GuiLabel((Rectangle){ helpPositionX + 30, 90, 0, 0 }, "A - Anchor mode");
GuiLabel((Rectangle){ helpPosX + 30, 110, 0, 0 }, "F - Reference position(global/anchor)"); GuiLabel((Rectangle){ helpPositionX + 30, 110, 0, 0 }, "F - Reference position(global/anchor)");
GuiLabel((Rectangle){ helpPosX + 30, 130, 0, 0 }, "H - Hide controls of selected anchor"); GuiLabel((Rectangle){ helpPositionX + 30, 130, 0, 0 }, "H - Hide controls of selected anchor");
GuiLabel((Rectangle){ helpPosX + 30, 150, 0, 0 }, "U - Unlink anchor"); GuiLabel((Rectangle){ helpPositionX + 30, 150, 0, 0 }, "U - Unlink anchor");
GuiLabel((Rectangle){ helpPosX + 30, 170, 0, 0 }, "Space - Lock/unlock control"); GuiLabel((Rectangle){ helpPositionX + 30, 170, 0, 0 }, "Space - Lock/unlock control");
GuiLabel((Rectangle){ helpPosX + 30, 190, 0, 0 }, "T - Enter text mode(if possible)"); GuiLabel((Rectangle){ helpPositionX + 30, 190, 0, 0 }, "T - Enter text mode(if possible)");
GuiLabel((Rectangle){ helpPosX + 30, 210, 0, 0 }, "Enter - Exit text mode"); GuiLabel((Rectangle){ helpPositionX + 30, 210, 0, 0 }, "Enter - Exit text mode");
GuiLabel((Rectangle){ helpPosX + 30, 230, 0, 0 }, "Delete - Delete a control"); GuiLabel((Rectangle){ helpPositionX + 30, 230, 0, 0 }, "Delete - Delete a control");
GuiLabel((Rectangle){ helpPosX + 30, 250, 0, 0 }, "Arrows - Modify position(+ shift smooth)"); GuiLabel((Rectangle){ helpPositionX + 30, 250, 0, 0 }, "Arrows - Modify position(+ shift smooth)");
GuiLabel((Rectangle){ helpPosX + 30, 270, 0, 0 }, "L. Ctrl + Arrows - Modify scale(+ shift smooth)"); GuiLabel((Rectangle){ helpPositionX + 30, 270, 0, 0 }, "L. Ctrl + Arrows - Modify scale(+ shift smooth)");
GuiLabel((Rectangle){ helpPosX + 30, 290, 0, 0 }, "L. Alt + Arrows(Up/Down) - Changes drawing order"); GuiLabel((Rectangle){ helpPositionX + 30, 290, 0, 0 }, "L. Alt + Arrows(Up/Down) - Changes drawing order");
GuiLabel((Rectangle){ helpPosX + 30, 310, 0, 0 }, "L. Ctrl + Enter - Export layout controls to code"); GuiLabel((Rectangle){ helpPositionX + 30, 310, 0, 0 }, "L. Ctrl + Enter - Export layout controls to code");
GuiLabel((Rectangle){ helpPosX + 30, 330, 0, 0 }, "L. Ctrl + S - Save layout.controls(.rgl)"); GuiLabel((Rectangle){ helpPositionX + 30, 330, 0, 0 }, "L. Ctrl + S - Save layout.controls(.rgl)");
GuiLabel((Rectangle){ helpPosX + 30, 350, 0, 0 }, "L. Ctrl + O - Open layout.controls(.rgl)"); GuiLabel((Rectangle){ helpPositionX + 30, 350, 0, 0 }, "L. Ctrl + O - Open layout.controls(.rgl)");
GuiLabel((Rectangle){ helpPosX + 30, 370, 0, 0 }, "L. Ctrl + D - Duplicate selected control"); GuiLabel((Rectangle){ helpPositionX + 30, 370, 0, 0 }, "L. Ctrl + D - Duplicate selected control");
GuiLabel((Rectangle){ helpPosX + 30, 390, 0, 0 }, "L. Ctrl + N - Rename control"); GuiLabel((Rectangle){ helpPositionX + 30, 390, 0, 0 }, "L. Ctrl + N - Rename control");
} }
// Draw right panel controls palette // Draw right panel controls palette
@ -1545,17 +1466,17 @@ int main()
GuiButton(paletteRecs[5], "Button"); GuiButton(paletteRecs[5], "Button");
GuiToggleButton(paletteRecs[6], "Toggle", false); GuiToggleButton(paletteRecs[6], "Toggle", false);
GuiCheckBox(paletteRecs[8], false); GuiCheckBox(paletteRecs[8], false);
GuiToggleGroup(paletteRecs[7], list, 3, 0); GuiToggleGroup(paletteRecs[7], listData, 3, 0);
GuiComboBox(paletteRecs[9], list, 3, 0); GuiComboBox(paletteRecs[9], listData, 3, 0);
GuiDropdownBox(paletteRecs[10], list, 3, 0); GuiDropdownBox(paletteRecs[10], listData, 3, 0);
GuiSpinner(paletteRecs[11], 42, 100, 25); GuiSpinner(paletteRecs[11], 42, 100, 25);
GuiValueBox(paletteRecs[12], 42, 100); GuiValueBox(paletteRecs[12], 42, 100);
GuiTextBox(paletteRecs[13], previewText, 7, false); GuiTextBox(paletteRecs[13], "TEXTBOX", 7, false);
GuiSlider(paletteRecs[14], 42, 0, 100); GuiSlider(paletteRecs[14], 42, 0, 100);
GuiSliderBar(paletteRecs[15], 42, 0, 100); GuiSliderBar(paletteRecs[15], 42, 0, 100);
GuiProgressBar(paletteRecs[16], 42, 0, 100); GuiProgressBar(paletteRecs[16], 42, 0, 100);
GuiStatusBar(paletteRecs[17], "StatusBar", 10); GuiStatusBar(paletteRecs[17], "StatusBar", 10);
GuiListView(paletteRecs[18], list, 3, 1); GuiListView(paletteRecs[18], listData, 3, 1);
GuiColorPicker(paletteRecs[19], RED); GuiColorPicker(paletteRecs[19], RED);
GuiDummyRec(paletteRecs[20], "DummyRec"); GuiDummyRec(paletteRecs[20], "DummyRec");
@ -1566,7 +1487,7 @@ int main()
// Draw export options window // Draw export options window
if (generateWindowActive) if (generateWindowActive)
{ {
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(WHITE, 0.8f)); DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(WHITE, 0.7f));
generateWindowActive = !GuiWindowBox((Rectangle){ exportWindowPos.x, exportWindowPos.y, 400, 225 }, "Generate Code Options - layout"); generateWindowActive = !GuiWindowBox((Rectangle){ exportWindowPos.x, exportWindowPos.y, 400, 225 }, "Generate Code Options - layout");
GuiLabel((Rectangle){ exportWindowPos.x + 10, exportWindowPos.y + 35, 65, 25 }, "Name:"); GuiLabel((Rectangle){ exportWindowPos.x + 10, exportWindowPos.y + 35, 65, 25 }, "Name:");
@ -1597,7 +1518,7 @@ int main()
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" }; const char *filters[] = { "*.c", "*.go", "*.lua" };
const char *fileName = tinyfd_saveFileDialog("Generate code file", "layout.c", 3, filters, "Code file"); const char *fileName = tinyfd_saveFileDialog("Generate code file", "tool_layout.c", 3, filters, "Code file");
if (fileName != NULL) if (fileName != NULL)
{ {
@ -1614,26 +1535,20 @@ int main()
if (selectedControl != -1) GuiStatusBar((Rectangle){ 348, GetScreenHeight() - 24, GetScreenWidth() - 348, 24}, FormatText("SELECTED CONTROL: #%03i | %s | REC(%i, %i, %i, %i) | %s", selectedControl, controlTypeName[layout.controls[selectedControl].type], layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height, layout.controls[selectedControl].name), 15); if (selectedControl != -1) GuiStatusBar((Rectangle){ 348, GetScreenHeight() - 24, GetScreenWidth() - 348, 24}, FormatText("SELECTED CONTROL: #%03i | %s | REC(%i, %i, %i, %i) | %s", selectedControl, controlTypeName[layout.controls[selectedControl].type], layout.controls[selectedControl].rec.x, layout.controls[selectedControl].rec.y, layout.controls[selectedControl].rec.width, layout.controls[selectedControl].rec.height, layout.controls[selectedControl].name), 15);
else GuiStatusBar((Rectangle){ 348, GetScreenHeight() - 24, GetScreenWidth() - 348, 24}, "", 15); else GuiStatusBar((Rectangle){ 348, GetScreenHeight() - 24, GetScreenWidth() - 348, 24}, "", 15);
// Draw ending message window (save)
if (ultimateMessage) if (ultimateMessage)
{ {
if (GuiWindowBox((Rectangle){ GetScreenWidth()/2 - 125, GetScreenHeight()/2 - 50, 250, 100 }, "rGuiLayout")) ultimateMessage = false; DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(WHITE, 0.7f));
ultimateMessage = !GuiWindowBox((Rectangle){ GetScreenWidth()/2 - 125, GetScreenHeight()/2 - 50, 250, 100 }, "Closing rGuiLayout");
GuiLabel((Rectangle){ GetScreenWidth()/2 - 95, GetScreenHeight()/2 - 60, 200, 100 }, "Do you want to save before quitting?"); GuiLabel((Rectangle){ GetScreenWidth()/2 - 95, GetScreenHeight()/2 - 60, 200, 100 }, "Do you want to save before quitting?");
if (GuiButton((Rectangle){ GetScreenWidth()/2 - 94, GetScreenHeight()/2 + 10, 85, 25 }, "Yes")) if (GuiButton((Rectangle){ GetScreenWidth()/2 - 94, GetScreenHeight()/2 + 10, 85, 25 }, "Yes"))
{ {
// Save file dialog ShowSaveLayoutDialog();
const char *filters[] = { "*.rgl" };
char *fileName = tinyfd_saveFileDialog("Save raygui layout text file", "", 1, filters, "raygui Layout Files (*.rgl)");
// Save layout.controls file (text or binary)
if (fileName != NULL)
{
if (GetExtension(fileName) == NULL) strcat(fileName, ".rgl\0"); // No extension provided
SaveLayoutRGL(fileName, false);
}
exitWindow = true; exitWindow = true;
} }
else if (GuiButton((Rectangle){ GetScreenWidth()/2 + 20, GetScreenHeight()/2 + 10, 85, 25 }, "No")) { exitWindow = true; } else if (GuiButton((Rectangle){ GetScreenWidth()/2 + 10, GetScreenHeight()/2 + 10, 85, 25 }, "No")) { exitWindow = true; }
} }
EndDrawing(); EndDrawing();
@ -1654,6 +1569,22 @@ int main()
// Module specific Functions Definition // Module specific Functions Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Show save layout dialog
static void ShowSaveLayoutDialog(void)
{
const char *filters[] = { "*.rgl" };
const char *fileName = tinyfd_saveFileDialog("Save raygui layout text file", "", 1, filters, "raygui Layout Files (*.rgl)");
// Save layout.controls file (text or binary)
if (fileName != NULL)
{
char outFileName[64] = { 0 };
strcpy(outFileName, fileName);
if (GetExtension(fileName) == NULL) strcat(outFileName, ".rgl\0"); // No extension provided
SaveLayoutRGL(outFileName, false);
}
}
// Save gui layout information // Save gui layout information
static void SaveLayoutRGL(const char *fileName, bool binary) static void SaveLayoutRGL(const char *fileName, bool binary)
{ {