Support Load/Save style data

This commit is contained in:
Ray San
2018-02-20 12:36:58 +01:00
parent d7e4b5208c
commit ccb68719d9
3 changed files with 115 additions and 118 deletions

View File

@ -170,6 +170,23 @@ const char *guiStylesTextC[NUM_STYLES_C] = {
}; };
const char *guiPropertyText[NUM_PROPERTIES] = { const char *guiPropertyText[NUM_PROPERTIES] = {
"DEFAULT_BACKGROUND_COLOR",
"DEFAULT_LINES_COLOR",
"DEFAULT_TEXT_FONT",
"DEFAULT_TEXT_SIZE",
"DEFAULT_BORDER_WIDTH",
"DEFAULT_BORDER_COLOR_NORMAL",
"DEFAULT_BASE_COLOR_NORMAL",
"DEFAULT_TEXT_COLOR_NORMAL",
"DEFAULT_BORDER_COLOR_FOCUSED",
"DEFAULT_BASE_COLOR_FOCUSED",
"DEFAULT_TEXT_COLOR_FOCUSED",
"DEFAULT_BORDER_COLOR_PRESSED",
"DEFAULT_BASE_COLOR_PRESSED",
"DEFAULT_TEXT_COLOR_PRESSED",
"DEFAULT_BORDER_COLOR_DISABLED",
"DEFAULT_BASE_COLOR_DISABLED",
"DEFAULT_TEXT_COLOR_DISABLED",
"LABEL_TEXT_COLOR_NORMAL", "LABEL_TEXT_COLOR_NORMAL",
"LABEL_TEXT_COLOR_FOCUSED", "LABEL_TEXT_COLOR_FOCUSED",
"LABEL_TEXT_COLOR_PRESSED", "LABEL_TEXT_COLOR_PRESSED",
@ -313,11 +330,10 @@ const char *guiPropertyText[NUM_PROPERTIES] = {
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Declaration // Module Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
static void BtnLoadStyle(void); // Button load style function static void BtnLoadStyle(void); // Button load style function
static void BtnSaveStyle(void); // Button save style function static void BtnSaveStyle(const char *defaultName, bool binary); // Button save style function
static void SaveStyleRGST(const char *fileName); //Save style in text flie static void SaveStyleRGS(const char *fileName, bool binary); // Save raygui style file (.rgs), text or binary
static void LoadStyleRGST(const char *fileName); //Load style in text file
static int GetGuiStylePropertyIndex(int control, int property); static int GetGuiStylePropertyIndex(int control, int property);
static Color ColorBox(Rectangle bounds, Color *colorPicker, Color color); static Color ColorBox(Rectangle bounds, Color *colorPicker, Color color);
@ -393,10 +409,10 @@ int main(int argc, char *argv[])
int spinnerValue = 28; int spinnerValue = 28;
int comboNum = 2; int comboNum = 2;
const char *comboText[4] = { "Text Style (.rgst)", "Binary Style (.rgsb)" }; const char *comboText[2] = { "Style Text (.rgs)", "Style Binary (.rgs)" };
int comboActive = 0; int comboActive = 0;
char guiText[32] = "raygui_style.rgst"; char guiText[32] = "custom_style.rgs";
Color colorPickerValue = RED; Color colorPickerValue = RED;
@ -434,11 +450,11 @@ int main(int argc, char *argv[])
if (!saveColor) if (!saveColor)
{ {
colorPickerValue = GetColor(styleGeneric[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)]); colorPickerValue = GetColor(style[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)]);
saveColor = true; saveColor = true;
} }
styleGeneric[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)] = ColorToInt(colorPickerValue); style[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)] = ColorToInt(colorPickerValue);
GuiUpdateStyleComplete(); GuiUpdateStyleComplete();
} }
else if ((currentSelectedControl != -1) && (currentSelectedProperty != -1)) else if ((currentSelectedControl != -1) && (currentSelectedProperty != -1))
@ -479,17 +495,16 @@ int main(int argc, char *argv[])
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), GuiBackgroundColor()); DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), GuiBackgroundColor());
// Draw info bar top // Draw info bar top
DrawRectangle(0, 0, GetScreenWidth(), 24, GetColor(styleGeneric[DEFAULT_BASE_COLOR_NORMAL])); DrawRectangle(0, 0, GetScreenWidth(), 24, GetColor(style[DEFAULT_BASE_COLOR_NORMAL]));
DrawRectangle(0, 24, GetScreenWidth(), 1, GuiLinesColor()); DrawRectangle(0, 24, GetScreenWidth(), 1, GuiLinesColor());
DrawText("CHOOSE CONTROL", 35, 8, styleGeneric[DEFAULT_TEXT_SIZE], GetColor(styleGeneric[DEFAULT_TEXT_COLOR_NORMAL])); DrawText("CHOOSE CONTROL", 35, 8, style[DEFAULT_TEXT_SIZE], GetColor(style[DEFAULT_TEXT_COLOR_NORMAL]));
DrawText("> CHOOSE PROPERTY STYLE", 152, 8, styleGeneric[DEFAULT_TEXT_SIZE], GetColor(styleGeneric[DEFAULT_TEXT_COLOR_NORMAL])); DrawText("> CHOOSE PROPERTY STYLE", 152, 8, style[DEFAULT_TEXT_SIZE], GetColor(style[DEFAULT_TEXT_COLOR_NORMAL]));
DrawText("> STYLE VIEWER", guiPosX + 10, 8, styleGeneric[DEFAULT_TEXT_SIZE], GetColor(styleGeneric[DEFAULT_TEXT_COLOR_NORMAL])); DrawText("> STYLE VIEWER", guiPosX + 10, 8, style[DEFAULT_TEXT_SIZE], GetColor(style[DEFAULT_TEXT_COLOR_NORMAL]));
// Draw status bar bottom // Draw status bar bottom
DrawRectangle(0, GetScreenHeight() - 24, GetScreenWidth(), 24, GetColor(styleGeneric[DEFAULT_BASE_COLOR_NORMAL])); DrawRectangle(0, GetScreenHeight() - 24, GetScreenWidth(), 24, GetColor(style[DEFAULT_BASE_COLOR_NORMAL]));
DrawRectangle(0, GetScreenHeight() - 24, GetScreenWidth(), 1, GuiLinesColor()); DrawRectangle(0, GetScreenHeight() - 24, GetScreenWidth(), 1, GuiLinesColor());
DrawText(FormatText("CURRENT SELECTION: %s_%s", guiControlText[currentSelectedControl], guiStylesTextC[currentSelectedProperty]), 20, GetScreenHeight() - 16, styleGeneric[DEFAULT_TEXT_SIZE], GetColor(styleGeneric[DEFAULT_TEXT_COLOR_NORMAL])); DrawText("rGuiStyler powered by raylib (github.com/raysan5/raylib) and raygui (github.com/raysan5/raygui)", 20, GetScreenHeight() - 16, style[DEFAULT_TEXT_SIZE], GetColor(style[DEFAULT_TEXT_COLOR_NORMAL]));
DrawText(FormatText("SAVE STATUS: %s", guiText), guiPosX + 100, GetScreenHeight() - 16, styleGeneric[DEFAULT_TEXT_SIZE], GetColor(styleGeneric[DEFAULT_TEXT_COLOR_NORMAL]));
// Draw Gui controls // Draw Gui controls
currentSelectedControl = GuiListView(bounds[LISTVIEW], guiControlText, NUM_CONTROLS, currentSelectedControl); currentSelectedControl = GuiListView(bounds[LISTVIEW], guiControlText, NUM_CONTROLS, currentSelectedControl);
@ -500,19 +515,9 @@ int main(int argc, char *argv[])
{ {
case DEFAULT: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextC, NUM_STYLES_C, currentSelectedProperty); break; case DEFAULT: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextC, NUM_STYLES_C, currentSelectedProperty); break;
case LABELBUTTON: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextA, NUM_STYLES_A, currentSelectedProperty); break; case LABELBUTTON: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextA, NUM_STYLES_A, currentSelectedProperty); break;
case SLIDER: case SLIDER: case SLIDERBAR: case PROGRESSBAR: case CHECKBOX:
case SLIDERBAR:
case PROGRESSBAR:
case CHECKBOX:
case COLORPICKER: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextB, NUM_STYLES_B, currentSelectedProperty); break; case COLORPICKER: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextB, NUM_STYLES_B, currentSelectedProperty); break;
case BUTTON: case BUTTON: case TOGGLE: case COMBOBOX: case TEXTBOX: case SPINNER: case LISTVIEW:
//case IMAGEBUTTON:
case TOGGLE:
//case TOGGLEGROUP:
case COMBOBOX:
case TEXTBOX:
case SPINNER:
case LISTVIEW:
default: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextC, NUM_STYLES_C - 2, currentSelectedProperty); break; default: currentSelectedProperty = GuiListView((Rectangle){ 156, guiPosY + 3, 180, 563 }, guiStylesTextC, NUM_STYLES_C - 2, currentSelectedProperty); break;
} }
@ -526,7 +531,8 @@ int main(int argc, char *argv[])
if (GuiLabelButton(bounds[LABELBUTTON], "github.com/raysan5/raygui")) {} if (GuiLabelButton(bounds[LABELBUTTON], "github.com/raysan5/raygui")) {}
if (GuiImageButtonEx((Rectangle){ guiPosX + 251, guiPosY + 5, 113, 32 }, texIcons , (Rectangle){ 0, 0, texIcons.width/3, texIcons.height/6 }, "Load Style")) { BtnLoadStyle(); } // Draw load style button
if (GuiImageButtonEx((Rectangle){ guiPosX + 251, guiPosY + 5, 113, 32 }, texIcons , (Rectangle){ 0, 0, texIcons.width/3, texIcons.height/6 }, "Load Style")) { currentSelectedProperty = -1; BtnLoadStyle(); }
toggle = GuiToggleButton(bounds[TOGGLE], "toggle", toggle); toggle = GuiToggleButton(bounds[TOGGLE], "toggle", toggle);
@ -563,12 +569,12 @@ int main(int argc, char *argv[])
for(int i = 0; i < 12; i++) colorBoxValue[i] = ColorBox((Rectangle){ guiPosX + 303 + 20*(i%3), guiPosY + 455 + 20*(i/3), 20, 20 }, &colorPickerValue, colorBoxValue[i]); for(int i = 0; i < 12; i++) colorBoxValue[i] = ColorBox((Rectangle){ guiPosX + 303 + 20*(i%3), guiPosY + 455 + 20*(i/3), 20, 20 }, &colorPickerValue, colorBoxValue[i]);
DrawRectangleLinesEx((Rectangle){ guiPosX + 303, guiPosY + 455, 60, 80 }, 2, GetColor(styleGeneric[DEFAULT_BORDER_COLOR_NORMAL])); DrawRectangleLinesEx((Rectangle){ guiPosX + 303, guiPosY + 455, 60, 80 }, 2, GetColor(style[DEFAULT_BORDER_COLOR_NORMAL]));
GuiEnable(); GuiEnable();
// Draw Load and Save buttons // Draw save style button
if (GuiButton(bounds[BUTTON], "Save Style")) BtnSaveStyle(); if (GuiButton(bounds[BUTTON], "Save Style")) BtnSaveStyle(guiText, comboActive);
// Draw selected control rectangles // Draw selected control rectangles
if (currentSelectedControl >= 0) DrawRectangleLinesEx((Rectangle){ bounds[currentSelectedControl].x - 2, bounds[currentSelectedControl].y -2, bounds[currentSelectedControl].width + 4, bounds[currentSelectedControl].height + 4 }, 1, RED); if (currentSelectedControl >= 0) DrawRectangleLinesEx((Rectangle){ bounds[currentSelectedControl].x - 2, bounds[currentSelectedControl].y -2, bounds[currentSelectedControl].width + 4, bounds[currentSelectedControl].height + 4 }, 1, RED);
@ -596,31 +602,30 @@ int main(int argc, char *argv[])
static void BtnLoadStyle(void) static void BtnLoadStyle(void)
{ {
// Open file dialog // Open file dialog
const char *filters[] = { "*.rgst" }; const char *filters[] = { "*.rgs" };
const char *fileName = tinyfd_openFileDialog("Load raygui style text file", currentPath, 1, filters, "raygui Style Files (*.rgst)", 0); const char *fileName = tinyfd_openFileDialog("Load raygui style file", currentPath, 1, filters, "raygui Style Files (*.rgs)", 0);
if (fileName != NULL) LoadStyleRGST(fileName); if (fileName != NULL) GuiLoadStyle(fileName);
} }
// Button save style function // Button save style function
static void BtnSaveStyle(void) static void BtnSaveStyle(const char *defaultName, bool binary)
{ {
char currrentPathFile[256]; char currrentPathFile[256];
// Add sample file name to currentPath // Add sample file name to currentPath
strcpy(currrentPathFile, currentPath); strcpy(currrentPathFile, currentPath);
strcat(currrentPathFile, guiText); strcat(currrentPathFile, defaultName);
// Save file dialog // Save file dialog
const char *filters[] = { "*.rgst" }; const char *filters[] = { "*.rgs" };
const char *fileName = tinyfd_saveFileDialog("Save raygui style text file", currrentPathFile, 1, filters, "raygui Style Files (*.rgst)"); const char *fileName = tinyfd_saveFileDialog("Save raygui style text file", currrentPathFile, 1, filters, "raygui Style Files (*.rgs)");
if (fileName != NULL) if (fileName != NULL)
{ {
// TODO: Save style file (text or binary) // Save style file (text or binary)
SaveStyleRGS(fileName, binary);
SaveStyleRGST(fileName);
fileName = ""; fileName = "";
} }
} }
@ -677,85 +682,77 @@ static Color ColorBox(Rectangle bounds, Color *colorPicker, Color color)
// Draw color box // Draw color box
DrawRectangleRec(bounds, color); DrawRectangleRec(bounds, color);
DrawRectangleLinesEx(bounds, 1, GetColor(styleGeneric[DEFAULT_BORDER_COLOR_NORMAL])); DrawRectangleLinesEx(bounds, 1, GetColor(style[DEFAULT_BORDER_COLOR_NORMAL]));
return color; return color;
} }
static void SaveStyleRGST(const char *fileName) // Save raygui style file (.rgs), text or binary
static void SaveStyleRGS(const char *fileName, bool binary)
{ {
#define RGST_FILE_VERSION "2.0" if (binary)
FILE *rgstFile = fopen(fileName, "wt");
int counter = 0;
for (int i = 0; i < NUM_PROPERTIES; i++) if (styleBackup[i] != style[i]) counter++;
// Write some description comments
fprintf(rgstFile, "#\n# rgst file (v%s) - raygui style text file generated using rGuiStyler\n#\n", RGST_FILE_VERSION);
fprintf(rgstFile, "# Total number of properties: %i\n", NUM_PROPERTIES);
fprintf(rgstFile, "# Number of properties changed: %i\n#\n", counter);
// " Num properties: %i"
for (int i = 0; i < NUM_PROPERTIES; i++)
{ {
if (styleBackup[i] != style[i]) fprintf(rgstFile, "%03i 0x%08x // %s\n", i, style[i], guiPropertyText[i]); #define RGS_FILE_VERSION_BINARY 200
}
fclose(rgstFile); FILE *rgsFile = fopen(fileName, "wb");
}
static void SaveStyleRGSB(const char *fileName) if (rgsFile != NULL)
{
#define RGSB_FILE_VERSION 200
FILE *rgsbFile = fopen(fileName, "wb");
// TODO: Write some header info
// id: "RGS " - 4 bytes
// version: 200 - 2 bytes (int)
// NUM_PROPERTIES - 2 bytes
// reserved - 4 bytes
for (int i = 0; i < NUM_PROPERTIES; i++)
{
//fwrite(&i, 1, sizeof(int), rgsbFile);
fwrite(&style[i], 1, sizeof(int), rgsbFile);
}
fclose(rgsbFile);
}
static void LoadStyleRGST(const char *fileName)
{
int id = 0;
int value = 0;
int counter = 0;
char buffer[256];
FILE *rgstFile = fopen(fileName, "rt");
if (rgstFile != NULL)
{
while (!feof(rgstFile))
{ {
fgets(buffer, 256, rgstFile); // Write some header info (12 bytes)
// id: "RGS " - 4 bytes
// version: 200 - 2 bytes
// NUM_PROPERTIES - 2 bytes
// reserved - 4 bytes
if ((buffer[0] != '\n') && (buffer[0] != '#')) char signature[5] = "RGS ";
short version = RGS_FILE_VERSION_BINARY;
short numProperties = NUM_PROPERTIES;
int reserved = 0;
fwrite(signature, 1, 4, rgsFile);
fwrite(&version, 1, sizeof(short), rgsFile);
fwrite(&numProperties, 1, sizeof(short), rgsFile);
fwrite(&reserved, 1, sizeof(int), rgsFile);
short id = 0;
for (int i = 0; i < NUM_PROPERTIES; i++)
{ {
sscanf(buffer, "%d 0x%x", &id, &value); if (styleBackup[i] != style[i])
if (id < NUM_PROPERTIES) style[id] = value; // Update style property {
counter++; id = (short)i;
fwrite(&id, 1, 2, rgsFile);
fwrite(&style[i], 1, sizeof(int), rgsFile);
}
} }
fclose(rgsFile);
} }
fclose(rgstFile);
} }
else
{
#define RGS_FILE_VERSION_TEXT "2.0"
TraceLog(LOG_INFO, "[raygui] Style properties loaded: %i", counter); int counter = 0;
} FILE *rgsFile = fopen(fileName, "wt");
static void LoadStyleRGSB(const char *fileName) if (rgsFile != NULL)
{ {
for (int i = 0; i < NUM_PROPERTIES; i++) if (styleBackup[i] != style[i]) counter++;
// Write some description comments
fprintf(rgsFile, "#\n# rgst file (v%s) - raygui style text file generated using rGuiStyler\n#\n", RGS_FILE_VERSION_TEXT);
fprintf(rgsFile, "# Total number of properties: %i\n", NUM_PROPERTIES);
fprintf(rgsFile, "# Number of properties changed: %i\n", counter);
fprintf(rgsFile, "# Required base default style: %s\n#\n", "LIGHT"); // TODO: check base style
for (int i = 0; i < NUM_PROPERTIES; i++)
{
if (styleBackup[i] != style[i]) fprintf(rgsFile, "%03i 0x%08x // %s\n", i, style[i], guiPropertyText[i]);
}
fclose(rgsFile);
}
}
} }

View File

@ -1,8 +1,8 @@
GLFW_ICON ICON "rguistyler.ico" GLFW_ICON ICON "rguistyler.ico"
1 VERSIONINFO 1 VERSIONINFO
FILEVERSION 1,6,0,0 FILEVERSION 2,0,0,0
PRODUCTVERSION 1,6,0,0 PRODUCTVERSION 2,0,0,0
BEGIN BEGIN
BLOCK "StringFileInfo" BLOCK "StringFileInfo"
BEGIN BEGIN
@ -11,12 +11,12 @@ BEGIN
BEGIN BEGIN
//VALUE "CompanyName", "My Company Name" //VALUE "CompanyName", "My Company Name"
VALUE "FileDescription", "rGuiStyler - raygui styles editor" VALUE "FileDescription", "rGuiStyler - raygui styles editor"
VALUE "FileVersion", "1.0" VALUE "FileVersion", "2.0"
VALUE "InternalName", "rguistyler" VALUE "InternalName", "rguistyler"
VALUE "LegalCopyright", "(c) 2017 Ramon Santamaria - @raysan5" VALUE "LegalCopyright", "(c) 2018 @raysan5 @JordiKoro @Adri102502"
//VALUE "OriginalFilename", "raylib_app.exe" //VALUE "OriginalFilename", "raylib_app.exe"
VALUE "ProductName", "rGuiStyler" VALUE "ProductName", "rGuiStyler"
VALUE "ProductVersion", "1.0" VALUE "ProductVersion", "2.0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

Binary file not shown.