mirror of
https://github.com/raysan5/raygui.git
synced 2025-12-25 10:22:33 -05:00
Reorganized folders
Added README
This commit is contained in:
7370
tools/rGuiStyler/src/external/tinyfiledialogs.c
vendored
Normal file
7370
tools/rGuiStyler/src/external/tinyfiledialogs.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
325
tools/rGuiStyler/src/external/tinyfiledialogs.h
vendored
Normal file
325
tools/rGuiStyler/src/external/tinyfiledialogs.h
vendored
Normal file
@ -0,0 +1,325 @@
|
||||
/*_________
|
||||
/ \ tinyfiledialogs.h v3.3.1 [Feb 16, 2018] zlib licence
|
||||
|tiny file| Unique header file created [November 9, 2014]
|
||||
| dialogs | Copyright (c) 2014 - 2018 Guillaume Vareille http://ysengrin.com
|
||||
\____ ___/ http://tinyfiledialogs.sourceforge.net
|
||||
\| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd
|
||||
____________________________________________
|
||||
| |
|
||||
| email: tinyfiledialogs at ysengrin.com |
|
||||
|____________________________________________|
|
||||
________________________________________________________________________
|
||||
| |
|
||||
| the windows only wchar_t UTF-16 prototypes are at the end of this file |
|
||||
|________________________________________________________________________|
|
||||
|
||||
Please 1) let me know If you are using it on exotic hardware / OS / compiler
|
||||
2) leave a 1-word review on Sourceforge.
|
||||
3) upvote my stackoverflow answer/advert https://stackoverflow.com/a/47651444
|
||||
|
||||
tiny file dialogs (cross-platform C C++)
|
||||
InputBox PasswordBox MessageBox ColorPicker
|
||||
OpenFileDialog SaveFileDialog SelectFolderDialog
|
||||
Native dialog library for WINDOWS MAC OSX GTK+ QT CONSOLE & more
|
||||
SSH supported via automatic switch to console mode or X11 forwarding
|
||||
|
||||
a C file + a header (add them to your C or C++ project) with 8 functions:
|
||||
- beep
|
||||
- notify popup
|
||||
- message & question
|
||||
- input & password
|
||||
- save file
|
||||
- open file(s)
|
||||
- select folder
|
||||
- color picker
|
||||
|
||||
Complements OpenGL GLFW GLUT GLUI VTK SFML TGUI SDL Ogre Unity3d ION OpenCV
|
||||
CEGUI MathGL GLM CPW GLOW IMGUI MyGUI GLT NGL STB & GUI less programs
|
||||
|
||||
NO INIT
|
||||
NO MAIN LOOP
|
||||
NO LINKING
|
||||
NO INCLUDE
|
||||
|
||||
The dialogs can be forced into console mode
|
||||
|
||||
Windows (XP to 10) ASCII MBCS UTF-8 UTF-16
|
||||
- native code & vbs create the graphic dialogs
|
||||
- enhanced console mode can use dialog.exe from
|
||||
http://andrear.altervista.org/home/cdialog.php
|
||||
- basic console input
|
||||
|
||||
Unix (command line calls) ASCII UTF-8
|
||||
- applescript, kdialog, zenity
|
||||
- python (2 or 3) + tkinter + python-dbus (optional)
|
||||
- dialog (opens a console if needed)
|
||||
- basic console input
|
||||
The same executable can run across desktops & distributions
|
||||
|
||||
C89 & C++98 compliant: tested with C & C++ compilers
|
||||
VisualStudio MinGW-gcc GCC Clang TinyCC OpenWatcom-v2 BorlandC SunCC
|
||||
on Windows Mac Linux Bsd Solaris Minix Raspbian
|
||||
using Gnome Kde Enlightenment Mate Cinnamon Unity Lxde Lxqt Xfce
|
||||
WindowMaker IceWm Cde Jds OpenBox Awesome Jwm Xdm
|
||||
|
||||
Bindings for LUA and C# dll, Haskell
|
||||
Included in LWJGL(java), Rust, Allegrobasic
|
||||
|
||||
- License -
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef TINYFILEDIALOGS_H
|
||||
#define TINYFILEDIALOGS_H
|
||||
|
||||
/* #define TINYFD_NOLIB */
|
||||
/* On windows, define TINYFD_NOLIB here
|
||||
if you don't want to include the code creating the graphic dialogs.
|
||||
Then you won't need to link against Comdlg32.lib and Ole32.lib */
|
||||
|
||||
/* if tinydialogs.c is compiled as C++ code rather than C code,
|
||||
you may need to comment out:
|
||||
extern "C" {
|
||||
and the corresponding closing bracket near the end of this file:
|
||||
}
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern char tinyfd_version[8]; /* contains tinyfd current version number */
|
||||
extern int tinyfd_verbose; /* 0 (default) or 1 : on unix, prints the command line calls */
|
||||
extern char tinyfd_needs[]; /* info about requirements */
|
||||
|
||||
#ifdef _WIN32
|
||||
/* for UTF-16 use the functions at the end of this files */
|
||||
extern int tinyfd_winUtf8; /* 0 (default MBCS) or 1 (UTF-8)*/
|
||||
/* on windows string char can be 0:MBCS or 1:UTF-8
|
||||
unless your code is really prepared for UTF-8 on windows, leave this on MBSC.
|
||||
Or you can use the UTF-16 (wchar) prototypes at the end of ths file.*/
|
||||
#endif
|
||||
|
||||
extern int tinyfd_forceConsole; /* 0 (default) or 1 */
|
||||
/* for unix & windows: 0 (graphic mode) or 1 (console mode).
|
||||
0: try to use a graphic solution, if it fails then it uses console mode.
|
||||
1: forces all dialogs into console mode even when an X server is present,
|
||||
if the package dialog (and a console is present) or dialog.exe is installed.
|
||||
on windows it only make sense for console applications */
|
||||
|
||||
extern char tinyfd_response[1024];
|
||||
/* if you pass "tinyfd_query" as aTitle,
|
||||
the functions will not display the dialogs
|
||||
but will return 0 for console mode, 1 for graphic mode.
|
||||
tinyfd_response is then filled with the retain solution.
|
||||
possible values for tinyfd_response are (all lowercase)
|
||||
for graphic mode:
|
||||
windows_wchar windows
|
||||
applescript kdialog zenity zenity3 matedialog qarma
|
||||
python2-tkinter python3-tkinter python-dbus perl-dbus
|
||||
gxmessage gmessage xmessage xdialog gdialog
|
||||
for console mode:
|
||||
dialog whiptail basicinput */
|
||||
|
||||
void tinyfd_beep();
|
||||
|
||||
int tinyfd_notifyPopup(
|
||||
char const * const aTitle, /* NULL or "" */
|
||||
char const * const aMessage, /* NULL or "" may contain \n \t */
|
||||
char const * const aIconType); /* "info" "warning" "error" */
|
||||
/* return has only meaning for tinyfd_query */
|
||||
|
||||
int tinyfd_messageBox(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aMessage , /* NULL or "" may contain \n \t */
|
||||
char const * const aDialogType , /* "ok" "okcancel" "yesno" "yesnocancel" */
|
||||
char const * const aIconType , /* "info" "warning" "error" "question" */
|
||||
int const aDefaultButton ) ;
|
||||
/* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */
|
||||
|
||||
char const * tinyfd_inputBox(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aMessage , /* NULL or "" may NOT contain \n \t on windows */
|
||||
char const * const aDefaultInput ) ; /* "" , if NULL it's a passwordBox */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
char const * tinyfd_saveFileDialog(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aDefaultPathAndFile , /* NULL or "" */
|
||||
int const aNumOfFilterPatterns , /* 0 */
|
||||
char const * const * const aFilterPatterns , /* NULL | {"*.jpg","*.png"} */
|
||||
char const * const aSingleFilterDescription ) ; /* NULL | "text files" */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
char const * tinyfd_openFileDialog(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aDefaultPathAndFile , /* NULL or "" */
|
||||
int const aNumOfFilterPatterns , /* 0 */
|
||||
char const * const * const aFilterPatterns , /* NULL {"*.jpg","*.png"} */
|
||||
char const * const aSingleFilterDescription , /* NULL | "image files" */
|
||||
int const aAllowMultipleSelects ) ; /* 0 or 1 */
|
||||
/* in case of multiple files, the separator is | */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
char const * tinyfd_selectFolderDialog(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aDefaultPath ) ; /* NULL or "" */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
char const * tinyfd_colorChooser(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
char const * const aDefaultHexRGB , /* NULL or "#FF0000" */
|
||||
unsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */
|
||||
unsigned char aoResultRGB[3] ) ; /* { 0 , 0 , 0 } */
|
||||
/* returns the hexcolor as a string "#FF0000" */
|
||||
/* aoResultRGB also contains the result */
|
||||
/* aDefaultRGB is used only if aDefaultHexRGB is NULL */
|
||||
/* aDefaultRGB and aoResultRGB can be the same array */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
|
||||
/************ NOT CROSS PLATFORM SECTION STARTS HERE ************************/
|
||||
#ifdef _WIN32
|
||||
#ifndef TINYFD_NOLIB
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
int tinyfd_notifyPopupW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aMessage, /* NULL or L"" may contain \n \t */
|
||||
wchar_t const * const aIconType); /* L"info" L"warning" L"error" */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
int tinyfd_messageBoxW(
|
||||
wchar_t const * const aTitle , /* NULL or L"" */
|
||||
wchar_t const * const aMessage, /* NULL or L"" may contain \n \t */
|
||||
wchar_t const * const aDialogType, /* L"ok" L"okcancel" L"yesno" */
|
||||
wchar_t const * const aIconType, /* L"info" L"warning" L"error" L"question" */
|
||||
int const aDefaultButton ); /* 0 for cancel/no , 1 for ok/yes */
|
||||
/* returns 0 for cancel/no , 1 for ok/yes */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
wchar_t const * tinyfd_inputBoxW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aMessage, /* NULL or L"" may NOT contain \n nor \t */
|
||||
wchar_t const * const aDefaultInput ); /* L"" , if NULL it's a passwordBox */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
wchar_t const * tinyfd_saveFileDialogW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aDefaultPathAndFile, /* NULL or L"" */
|
||||
int const aNumOfFilterPatterns, /* 0 */
|
||||
wchar_t const * const * const aFilterPatterns, /* NULL or {L"*.jpg",L"*.png"} */
|
||||
wchar_t const * const aSingleFilterDescription); /* NULL or L"image files" */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
wchar_t const * tinyfd_openFileDialogW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aDefaultPathAndFile, /* NULL or L"" */
|
||||
int const aNumOfFilterPatterns , /* 0 */
|
||||
wchar_t const * const * const aFilterPatterns, /* NULL {L"*.jpg",L"*.png"} */
|
||||
wchar_t const * const aSingleFilterDescription, /* NULL or L"image files" */
|
||||
int const aAllowMultipleSelects ) ; /* 0 or 1 */
|
||||
/* in case of multiple files, the separator is | */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
wchar_t const * tinyfd_selectFolderDialogW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aDefaultPath); /* NULL or L"" */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
/* windows only - utf-16 version */
|
||||
wchar_t const * tinyfd_colorChooserW(
|
||||
wchar_t const * const aTitle, /* NULL or L"" */
|
||||
wchar_t const * const aDefaultHexRGB, /* NULL or L"#FF0000" */
|
||||
unsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */
|
||||
unsigned char aoResultRGB[3] ) ; /* { 0 , 0 , 0 } */
|
||||
/* returns the hexcolor as a string L"#FF0000" */
|
||||
/* aoResultRGB also contains the result */
|
||||
/* aDefaultRGB is used only if aDefaultHexRGB is NULL */
|
||||
/* aDefaultRGB and aoResultRGB can be the same array */
|
||||
/* returns NULL on cancel */
|
||||
|
||||
|
||||
#endif /*TINYFD_NOLIB*/
|
||||
#else /*_WIN32*/
|
||||
|
||||
/* unix zenity only */
|
||||
char const * tinyfd_arrayDialog(
|
||||
char const * const aTitle , /* NULL or "" */
|
||||
int const aNumOfColumns , /* 2 */
|
||||
char const * const * const aColumns, /* {"Column 1","Column 2"} */
|
||||
int const aNumOfRows, /* 2 */
|
||||
char const * const * const aCells);
|
||||
/* {"Row1 Col1","Row1 Col2","Row2 Col1","Row2 Col2"} */
|
||||
|
||||
#endif /*_WIN32 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* TINYFILEDIALOGS_H */
|
||||
|
||||
/*
|
||||
- This is not for android nor ios.
|
||||
- The code is pure C, perfectly compatible with C++.
|
||||
- the windows only wchar_t (utf-16) prototypes are in the header file
|
||||
- windows is fully supported from XP to 10 (maybe even older versions)
|
||||
- C# & LUA via dll, see example files
|
||||
- OSX supported from 10.4 to latest (maybe even older versions)
|
||||
- Avoid using " and ' in titles and messages.
|
||||
- There's one file filter only, it may contain several patterns.
|
||||
- If no filter description is provided,
|
||||
the list of patterns will become the description.
|
||||
- char const * filterPatterns[3] = { "*.obj" , "*.stl" , "*.dxf" } ;
|
||||
- On windows char defaults to MBCS, set tinyfd_winUtf8=1 to use UTF-8
|
||||
- On windows link against Comdlg32.lib and Ole32.lib
|
||||
This linking is not compulsary for console mode (see above).
|
||||
- On unix: it tries command line calls, so no such need.
|
||||
- On unix you need one of the following:
|
||||
applescript, kdialog, zenity, matedialog, shellementary, qarma,
|
||||
python (2 or 3)/tkinter/python-dbus (optional), Xdialog
|
||||
or dialog (opens terminal if running without console) or xterm.
|
||||
- One of those is already included on most (if not all) desktops.
|
||||
- In the absence of those it will use gdialog, gxmessage or whiptail
|
||||
with a textinputbox.
|
||||
- If nothing is found, it switches to basic console input,
|
||||
it opens a console if needed (requires xterm + bash).
|
||||
- Use windows separators on windows and unix separators on unix.
|
||||
- String memory is preallocated statically for all the returned values.
|
||||
- File and path names are tested before return, they are valid.
|
||||
- If you pass only a path instead of path + filename,
|
||||
make sure it ends with a separator.
|
||||
- tinyfd_forceConsole=1; at run time, forces dialogs into console mode.
|
||||
- On windows, console mode only make sense for console applications.
|
||||
- On windows, Console mode is not implemented for wchar_T UTF-16.
|
||||
- Mutiple selects are not allowed in console mode.
|
||||
- The package dialog must be installed to run in enhanced console mode.
|
||||
It is already installed on most unix systems.
|
||||
- On osx, the package dialog can be installed via
|
||||
http://macappstore.org/dialog or http://macports.org
|
||||
- On windows, for enhanced console mode,
|
||||
dialog.exe should be copied somewhere on your executable path.
|
||||
It can be found at the bottom of the following page:
|
||||
http://andrear.altervista.org/home/cdialog.php
|
||||
- If dialog is missing, it will switch to basic console input.
|
||||
- You can query the type of dialog that will be use.
|
||||
- MinGW needs gcc >= v4.9 otherwise some headers are incomplete.
|
||||
- The Hello World (and a bit more) is on the sourceforge site:
|
||||
*/
|
||||
788
tools/rGuiStyler/src/rguistyler.c
Normal file
788
tools/rGuiStyler/src/rguistyler.c
Normal file
@ -0,0 +1,788 @@
|
||||
/*******************************************************************************************
|
||||
*
|
||||
* rGuiStyler v2.0 - raygui Style Editor
|
||||
*
|
||||
* Compile this program using:
|
||||
* gcc -o rguistyler.exe rguistyler.c external/tinyfiledialogs.c -I..\.. \
|
||||
* -lraylib -lopengl32 -lgdi32 -lcomdlg32 -lole32 -std=c99 -Wall
|
||||
*
|
||||
* CONTRIBUTORS:
|
||||
* Ramon Santamaria: Supervision, review, redesign, update and maintenance...
|
||||
* Adria Arranz: Reimplementation and new features v2.0 (2018)
|
||||
* Jordi Jorba: Reimplementation and new features v2.0 (2018)
|
||||
* Sergio Martinez: Implementation and testing v1.0 (2015..2017)
|
||||
*
|
||||
* LICENSE: zlib/libpng
|
||||
*
|
||||
* Copyright (c) 2014-2018 raylib technologies (@raysan5)
|
||||
*
|
||||
* This software is provided "as-is", without any express or implied warranty. In no event
|
||||
* will the authors be held liable for any damages arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose, including commercial
|
||||
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
||||
* wrote the original software. If you use this software in a product, an acknowledgment
|
||||
* in the product documentation would be appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||
* as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
**********************************************************************************************/
|
||||
|
||||
#include "raylib.h"
|
||||
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
#define RAYGUI_STYLE_SAVE_LOAD
|
||||
#define RAYGUI_STYLE_DEFAULT_LIGHT 1
|
||||
#include "raygui.h"
|
||||
|
||||
#include "external/tinyfiledialogs.h" // Open/Save file dialogs
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <direct.h>
|
||||
#define GetCurrentDir _getcwd
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#define GetCurrentDir getcwd
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Defines and Macros
|
||||
//----------------------------------------------------------------------------------
|
||||
#define NUM_CONTROLS 13
|
||||
#define NUM_STYLES_A 4
|
||||
#define NUM_STYLES_B 8
|
||||
#define NUM_STYLES_C 14
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Types and Structures Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
typedef enum {
|
||||
DEFAULT = 0,
|
||||
LABELBUTTON,
|
||||
BUTTON,
|
||||
//IMAGEBUTTON,
|
||||
TOGGLE,
|
||||
//TOGGLEGROUP,
|
||||
SLIDER,
|
||||
SLIDERBAR,
|
||||
PROGRESSBAR,
|
||||
CHECKBOX,
|
||||
SPINNER,
|
||||
COMBOBOX,
|
||||
TEXTBOX,
|
||||
LISTVIEW,
|
||||
COLORPICKER
|
||||
} GuiControlType;
|
||||
|
||||
typedef enum {
|
||||
BORDER_COLOR_NORMAL = 0,
|
||||
BASE_COLOR_NORMAL,
|
||||
TEXT_COLOR_NORMAL,
|
||||
BORDER_COLOR_FOCUSED,
|
||||
BASE_COLOR_FOCUSED,
|
||||
TEXT_COLOR_FOCUSED,
|
||||
BORDER_COLOR_PRESSED,
|
||||
BASE_COLOR_PRESSED,
|
||||
TEXT_COLOR_PRESSED,
|
||||
BORDER_COLOR_DISABLED,
|
||||
BASE_COLOR_DISABLED,
|
||||
TEXT_COLOR_DISABLED
|
||||
} GuiStyleType;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Global Variables Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
static char currentPath[256]; // Path to current working folder
|
||||
|
||||
static int styleBackup[NUM_PROPERTIES] = { 0 };
|
||||
|
||||
// NOTE: Some styles are shared by multiple controls:
|
||||
// LABEL = LABELBUTTON
|
||||
// BUTTON = IMAGEBUTTON
|
||||
// TOGGLE = TOGGLEGROUP
|
||||
const char *guiControlText[NUM_CONTROLS] = {
|
||||
"DEFAULT",
|
||||
"LABELBUTTON",
|
||||
"BUTTON",
|
||||
//"IMAGEBUTTON",
|
||||
"TOGGLE",
|
||||
//"TOGGLEGROUP",
|
||||
"SLIDER",
|
||||
"SLIDERBAR",
|
||||
"PROGRESSBAR",
|
||||
"CHECKBOX",
|
||||
"SPINNER",
|
||||
"COMBOBOX",
|
||||
"TEXTBOX",
|
||||
"LISTVIEW",
|
||||
"COLORPICKER"
|
||||
};
|
||||
|
||||
// NOTE: Used by controls: Label, LabelButton
|
||||
const char *guiStylesTextA[NUM_STYLES_A] = {
|
||||
"TEXT_COLOR_NORMAL",
|
||||
"TEXT_COLOR_FOCUSED",
|
||||
"TEXT_COLOR_PRESSED",
|
||||
"TEXT_COLOR_DISABLED"
|
||||
};
|
||||
|
||||
//Note: Used by controls: Slider, SliderBar, ProgressBar, Checkbox, ColorPicker
|
||||
const char *guiStylesTextB[NUM_STYLES_B] = {
|
||||
"BORDER_COLOR_NORMAL",
|
||||
"BASE_COLOR_NORMAL",
|
||||
"BORDER_COLOR_FOCUSED",
|
||||
"BASE_COLOR_FOCUSED",
|
||||
"BORDER_COLOR_PRESSED",
|
||||
"BASE_COLOR_PRESSED",
|
||||
"BORDER_COLOR_DISABLED",
|
||||
"BASE_COLOR_DISABLED",
|
||||
};
|
||||
|
||||
//Note: Used by controls: Button, ImageButton, Toggle, ToggleGroup, Spinner, ComboBox, TextBox, ListView
|
||||
const char *guiStylesTextC[NUM_STYLES_C] = {
|
||||
"BORDER_COLOR_NORMAL",
|
||||
"BASE_COLOR_NORMAL",
|
||||
"TEXT_COLOR_NORMAL",
|
||||
"BORDER_COLOR_FOCUSED",
|
||||
"BASE_COLOR_FOCUSED",
|
||||
"TEXT_COLOR_FOCUSED",
|
||||
"BORDER_COLOR_PRESSED",
|
||||
"BASE_COLOR_PRESSED",
|
||||
"TEXT_COLOR_PRESSED",
|
||||
"BORDER_COLOR_DISABLED",
|
||||
"BASE_COLOR_DISABLED",
|
||||
"TEXT_COLOR_DISABLED",
|
||||
"BACKGROUND_COLOR",
|
||||
"LINES_COLOR"
|
||||
};
|
||||
|
||||
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_FOCUSED",
|
||||
"LABEL_TEXT_COLOR_PRESSED",
|
||||
"LABEL_TEXT_COLOR_DISABLED",
|
||||
"BUTTON_BORDER_WIDTH",
|
||||
"BUTTON_BORDER_COLOR_NORMAL",
|
||||
"BUTTON_BASE_COLOR_NORMAL",
|
||||
"BUTTON_TEXT_COLOR_NORMAL",
|
||||
"BUTTON_BORDER_COLOR_FOCUSED",
|
||||
"BUTTON_BASE_COLOR_FOCUSED",
|
||||
"BUTTON_TEXT_COLOR_FOCUSED",
|
||||
"BUTTON_BORDER_COLOR_PRESSED",
|
||||
"BUTTON_BASE_COLOR_PRESSED",
|
||||
"BUTTON_TEXT_COLOR_PRESSED",
|
||||
"BUTTON_BORDER_COLOR_DISABLED",
|
||||
"BUTTON_BASE_COLOR_DISABLED",
|
||||
"BUTTON_TEXT_COLOR_DISABLED",
|
||||
"TOGGLE_BORDER_WIDTH",
|
||||
"TOGGLE_BORDER_COLOR_NORMAL",
|
||||
"TOGGLE_BASE_COLOR_NORMAL",
|
||||
"TOGGLE_TEXT_COLOR_NORMAL",
|
||||
"TOGGLE_BORDER_COLOR_FOCUSED",
|
||||
"TOGGLE_BASE_COLOR_FOCUSED",
|
||||
"TOGGLE_TEXT_COLOR_FOCUSED",
|
||||
"TOGGLE_BORDER_COLOR_PRESSED",
|
||||
"TOGGLE_BASE_COLOR_PRESSED",
|
||||
"TOGGLE_TEXT_COLOR_PRESSED",
|
||||
"TOGGLE_BORDER_COLOR_DISABLED",
|
||||
"TOGGLE_BASE_COLOR_DISABLED",
|
||||
"TOGGLE_TEXT_COLOR_DISABLED",
|
||||
"TOGGLEGROUP_PADDING",
|
||||
"SLIDER_BORDER_WIDTH",
|
||||
"SLIDER_SLIDER_WIDTH",
|
||||
"SLIDER_BORDER_COLOR_NORMAL",
|
||||
"SLIDER_BASE_COLOR_NORMAL",
|
||||
"SLIDER_BORDER_COLOR_FOCUSED",
|
||||
"SLIDER_BASE_COLOR_FOCUSED",
|
||||
"SLIDER_BORDER_COLOR_PRESSED",
|
||||
"SLIDER_BASE_COLOR_PRESSED",
|
||||
"SLIDER_BORDER_COLOR_DISABLED",
|
||||
"SLIDER_BASE_COLOR_DISABLED",
|
||||
"SLIDERBAR_INNER_PADDING",
|
||||
"SLIDERBAR_BORDER_WIDTH",
|
||||
"SLIDERBAR_BORDER_COLOR_NORMAL",
|
||||
"SLIDERBAR_BASE_COLOR_NORMAL",
|
||||
"SLIDERBAR_BORDER_COLOR_FOCUSED",
|
||||
"SLIDERBAR_BASE_COLOR_FOCUSED",
|
||||
"SLIDERBAR_BORDER_COLOR_PRESSED",
|
||||
"SLIDERBAR_BASE_COLOR_PRESSED",
|
||||
"SLIDERBAR_BORDER_COLOR_DISABLED",
|
||||
"SLIDERBAR_BASE_COLOR_DISABLED",
|
||||
"PROGRESSBAR_INNER_PADDING",
|
||||
"PROGRESSBAR_BORDER_WIDTH",
|
||||
"PROGRESSBAR_BORDER_COLOR_NORMAL",
|
||||
"PROGRESSBAR_BASE_COLOR_NORMAL",
|
||||
"PROGRESSBAR_BORDER_COLOR_FOCUSED",
|
||||
"PROGRESSBAR_BASE_COLOR_FOCUSED",
|
||||
"PROGRESSBAR_BORDER_COLOR_PRESSED",
|
||||
"PROGRESSBAR_BASE_COLOR_PRESSED",
|
||||
"PROGRESSBAR_BORDER_COLOR_DISABLED",
|
||||
"PROGRESSBAR_BASE_COLOR_DISABLED",
|
||||
"SPINNER_BUTTON_PADDING",
|
||||
"SPINNER_BUTTONS_WIDTH",
|
||||
"SPINNER_BORDER_COLOR_NORMAL",
|
||||
"SPINNER_BASE_COLOR_NORMAL",
|
||||
"SPINNER_TEXT_COLOR_NORMAL",
|
||||
"SPINNER_BORDER_COLOR_FOCUSED",
|
||||
"SPINNER_BASE_COLOR_FOCUSED",
|
||||
"SPINNER_TEXT_COLOR_FOCUSED",
|
||||
"SPINNER_BORDER_COLOR_PRESSED",
|
||||
"SPINNER_BASE_COLOR_PRESSED",
|
||||
"SPINNER_TEXT_COLOR_PRESSED",
|
||||
"SPINNER_BORDER_COLOR_DISABLED",
|
||||
"SPINNER_BASE_COLOR_DISABLED",
|
||||
"SPINNER_TEXT_COLOR_DISABLED",
|
||||
"COMBOBOX_BORDER_WIDTH",
|
||||
"COMBOBOX_BUTTON_PADDING",
|
||||
"COMBOBOX_SELECTOR_WIDTH",
|
||||
"COMBOBOX_BORDER_COLOR_NORMAL",
|
||||
"COMBOBOX_BASE_COLOR_NORMAL",
|
||||
"COMBOBOX_TEXT_COLOR_NORMAL",
|
||||
"COMBOBOX_BORDER_COLOR_FOCUSED",
|
||||
"COMBOBOX_BASE_COLOR_FOCUSED",
|
||||
"COMBOBOX_TEXT_COLOR_FOCUSED",
|
||||
"COMBOBOX_BORDER_COLOR_PRESSED",
|
||||
"COMBOBOX_BASE_COLOR_PRESSED",
|
||||
"COMBOBOX_TEXT_COLOR_PRESSED",
|
||||
"COMBOBOX_BORDER_COLOR_DISABLED",
|
||||
"COMBOBOX_BASE_COLOR_DISABLED",
|
||||
"COMBOBOX_TEXT_COLOR_DISABLED",
|
||||
"CHECKBOX_BORDER_WIDTH",
|
||||
"CHECKBOX_INNER_PADDING",
|
||||
"CHECKBOX_BORDER_COLOR_NORMAL",
|
||||
"CHECKBOX_BASE_COLOR_NORMAL",
|
||||
"CHECKBOX_BORDER_COLOR_FOCUSED",
|
||||
"CHECKBOX_BASE_COLOR_FOCUSED",
|
||||
"CHECKBOX_BORDER_COLOR_PRESSED",
|
||||
"CHECKBOX_BASE_COLOR_PRESSED",
|
||||
"CHECKBOX_BORDER_COLOR_DISABLED",
|
||||
"CHECKBOX_BASE_COLOR_DISABLED",
|
||||
"TEXTBOX_BORDER_WIDTH",
|
||||
"TEXTBOX_BORDER_COLOR_NORMAL",
|
||||
"TEXTBOX_BASE_COLOR_NORMAL",
|
||||
"TEXTBOX_TEXT_COLOR_NORMAL",
|
||||
"TEXTBOX_BORDER_COLOR_FOCUSED",
|
||||
"TEXTBOX_BASE_COLOR_FOCUSED",
|
||||
"TEXTBOX_TEXT_COLOR_FOCUSED",
|
||||
"TEXTBOX_BORDER_COLOR_PRESSED",
|
||||
"TEXTBOX_BASE_COLOR_PRESSED",
|
||||
"TEXTBOX_TEXT_COLOR_PRESSED",
|
||||
"TEXTBOX_BORDER_COLOR_DISABLED",
|
||||
"TEXTBOX_BASE_COLOR_DISABLED",
|
||||
"TEXTBOX_TEXT_COLOR_DISABLED",
|
||||
"COLORPICKER_BARS_THICK",
|
||||
"COLORPICKER_BARS_PADDING",
|
||||
"COLORPICKER_BORDER_COLOR_NORMAL",
|
||||
"COLORPICKER_BASE_COLOR_NORMAL",
|
||||
"COLORPICKER_BORDER_COLOR_FOCUSED",
|
||||
"COLORPICKER_BASE_COLOR_FOCUSED",
|
||||
"COLORPICKER_BORDER_COLOR_PRESSED",
|
||||
"COLORPICKER_BASE_COLOR_PRESSED",
|
||||
"COLORPICKER_BORDER_COLOR_DISABLED",
|
||||
"COLORPICKER_BASE_COLOR_DISABLED",
|
||||
"LISTVIEW_ELEMENTS_HEIGHT",
|
||||
"LISTVIEW_ELEMENTS_PADDING",
|
||||
"LISTVIEW_BAR_WIDTH",
|
||||
"LISTVIEW_BORDER_COLOR_NORMAL",
|
||||
"LISTVIEW_BASE_COLOR_NORMAL",
|
||||
"LISTVIEW_TEXT_COLOR_NORMAL",
|
||||
"LISTVIEW_BORDER_COLOR_FOCUSED",
|
||||
"LISTVIEW_BASE_COLOR_FOCUSED",
|
||||
"LISTVIEW_TEXT_COLOR_FOCUSED",
|
||||
"LISTVIEW_BORDER_COLOR_PRESSED",
|
||||
"LISTVIEW_BASE_COLOR_PRESSED",
|
||||
"LISTVIEW_TEXT_COLOR_PRESSED",
|
||||
"LISTVIEW_BORDER_COLOR_DISABLED",
|
||||
"LISTVIEW_BASE_COLOR_DISABLED",
|
||||
"LISTVIEW_TEXT_COLOR_DISABLED"
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Module Functions Declaration
|
||||
//----------------------------------------------------------------------------------
|
||||
static void BtnLoadStyle(void); // Button load style function
|
||||
static void BtnSaveStyle(const char *defaultName, bool binary); // Button save style function
|
||||
|
||||
static void SaveStyleRGS(const char *fileName, bool binary); // Save raygui style file (.rgs), text or binary
|
||||
|
||||
static int GetGuiStylePropertyIndex(int control, int property);
|
||||
static Color ColorBox(Rectangle bounds, Color *colorPicker, Color color);
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//------------------------------------------------------------------------------------
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 720;
|
||||
const int screenHeight = 640;
|
||||
|
||||
//SetConfigFlags(FLAG_WINDOW_RESIZABLE);
|
||||
InitWindow(screenWidth, screenHeight, "rGuiStyler v2.0 - raygui style editor");
|
||||
|
||||
int dropsCount = 0;
|
||||
char **droppedFiles;
|
||||
|
||||
int framesCounter = 0;
|
||||
|
||||
int guiPosX = 336;
|
||||
int guiPosY = 36;
|
||||
Vector2 anchor01 = { 0, 0 };
|
||||
Vector2 anchor02 = { 345, 40 };
|
||||
bool saveColor = false;
|
||||
|
||||
int changedControlsCounter = 0;
|
||||
|
||||
// Define gui controls rectangles
|
||||
Rectangle bounds[NUM_CONTROLS] = {
|
||||
(Rectangle){ 0 }, // DEFAULT
|
||||
(Rectangle){ anchor02.x + 90, anchor02.y + 35, 140, 30 }, // LABELBUTTON
|
||||
(Rectangle){ anchor02.x + 175, anchor02.y + 240, 180, 30 }, // BUTTON
|
||||
//(Rectangle){ guiPosX + 251, guiPosY + 5, 113, 32 }, // IMAGEBUTTON
|
||||
(Rectangle){ anchor02.x + 11, anchor02.y + 70, 60, 30 }, // TOGGLE
|
||||
//(Rectangle){ guiPosX + 98, guiPosY + 54, 65, 30 }, // TOGGLEGROUP
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 110, 345, 20 }, // SLIDER
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 140, 345, 20 }, // SLIDERBAR
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 170, 320, 20 }, // PROGRESSBAR
|
||||
(Rectangle){ anchor02.x + 335, anchor02.y + 170, 20, 20 }, // CHECKBOX
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 200, 150, 30 }, // SPINNER
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 240, 150, 30 }, // COMBOBOX
|
||||
(Rectangle){ anchor02.x + 175, anchor02.y + 200, 180, 30 }, // TEXTBOX
|
||||
(Rectangle){ anchor01.x + 10, anchor01.y + 40, 140, 560 }, // LISTVIEW
|
||||
(Rectangle){ anchor02.x + 10, anchor02.y + 280, 240, 240 } // COLORPICKER
|
||||
};
|
||||
|
||||
// Keep a backup for style
|
||||
memcpy(styleBackup, style, NUM_PROPERTIES*sizeof(int));
|
||||
|
||||
SetTargetFPS(60);
|
||||
//------------------------------------------------------------
|
||||
|
||||
// Gui controls data
|
||||
//-----------------------------------------------------------
|
||||
bool toggle = false;
|
||||
bool toggleValue = false;
|
||||
const char *toggleGuiText[4] = { "toggle", "group", "selection", "options" };
|
||||
|
||||
float sliderValue = 50.0f;
|
||||
float sliderBarValue = 20.0f;
|
||||
float progressValue = 0.0f;
|
||||
|
||||
bool checked = false;
|
||||
|
||||
int spinnerValue = 28;
|
||||
|
||||
int comboNum = 2;
|
||||
const char *comboText[2] = { "Style Text (.rgs)", "Style Binary (.rgs)" };
|
||||
int comboActive = 0;
|
||||
|
||||
char guiText[32] = "custom_style.rgs";
|
||||
|
||||
Color colorPickerValue = RED;
|
||||
|
||||
int currentSelectedControl = -1;
|
||||
int currentSelectedProperty = -1;
|
||||
int previousSelectedProperty = -1;
|
||||
int previousSelectedControl = -1;
|
||||
|
||||
Color colorBoxValue[12];
|
||||
|
||||
for (int i = 0; i < 12; i++) colorBoxValue[i] = GetColor(style[DEFAULT_BORDER_COLOR_NORMAL + i]);
|
||||
|
||||
char colorHex[9] = "00000000";
|
||||
|
||||
Vector3 colorHSV = { 0.0f, 0.0f, 0.0f };
|
||||
|
||||
bool editFilenameText = false;
|
||||
bool editHexColorText = false;
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
framesCounter++;
|
||||
|
||||
// Check for changed controls
|
||||
if ((framesCounter%120) == 0)
|
||||
{
|
||||
changedControlsCounter = 0;
|
||||
for (int i = 0; i < NUM_PROPERTIES; i++) if (styleBackup[i] != style[i]) changedControlsCounter++;
|
||||
}
|
||||
|
||||
// Check for dropped files
|
||||
if (IsFileDropped())
|
||||
{
|
||||
currentSelectedControl = -1;
|
||||
droppedFiles = GetDroppedFiles(&dropsCount);
|
||||
|
||||
if (IsFileExtension(droppedFiles[0], ".rgs")) GuiLoadStyle(droppedFiles[0]);
|
||||
else if (IsFileExtension(droppedFiles[0], ".png")) GuiLoadStyleImage(droppedFiles[0]);
|
||||
|
||||
for (int i = 0; i < 12; i++) colorBoxValue[i] = GetColor(style[DEFAULT_BORDER_COLOR_NORMAL + i]);
|
||||
|
||||
ClearDroppedFiles();
|
||||
}
|
||||
|
||||
if ((previousSelectedControl != currentSelectedControl)) currentSelectedProperty = -1;
|
||||
|
||||
if ((currentSelectedControl == 0) && (currentSelectedProperty != -1))
|
||||
{
|
||||
if ((previousSelectedProperty != currentSelectedProperty) || (previousSelectedControl != currentSelectedControl)) saveColor = false;
|
||||
|
||||
if (!saveColor)
|
||||
{
|
||||
colorPickerValue = GetColor(style[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)]);
|
||||
saveColor = true;
|
||||
}
|
||||
|
||||
style[GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)] = ColorToInt(colorPickerValue);
|
||||
|
||||
// TODO: REVIEW: Resets all updated controls!
|
||||
GuiUpdateStyleComplete();
|
||||
}
|
||||
else if ((currentSelectedControl != -1) && (currentSelectedProperty != -1))
|
||||
{
|
||||
if ((previousSelectedProperty != currentSelectedProperty) || (previousSelectedControl != currentSelectedControl)) saveColor = false;
|
||||
|
||||
if (!saveColor)
|
||||
{
|
||||
colorPickerValue = GetColor(GuiGetStyleProperty(GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty)));
|
||||
saveColor = true;
|
||||
}
|
||||
|
||||
GuiSetStyleProperty(GetGuiStylePropertyIndex(currentSelectedControl, currentSelectedProperty), ColorToInt(colorPickerValue));
|
||||
}
|
||||
|
||||
previousSelectedProperty = currentSelectedProperty;
|
||||
previousSelectedControl = currentSelectedControl;
|
||||
|
||||
// Update progress bar automatically
|
||||
progressValue += 0.0005f;
|
||||
if (progressValue > 1.0f) progressValue = 0.0f;
|
||||
|
||||
// Get edited color from text box
|
||||
if (!editHexColorText) sprintf(colorHex, "%02X%02X%02X%02X", colorPickerValue.r, colorPickerValue.g, colorPickerValue.b, colorPickerValue.a);
|
||||
|
||||
colorHSV = ColorToHSV(colorPickerValue);
|
||||
|
||||
// Control TextBox edit mode
|
||||
if (CheckCollisionPointRec(GetMousePosition(), bounds[TEXTBOX]) && (IsKeyPressed(KEY_ENTER) || IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) editFilenameText = !editFilenameText;
|
||||
if (CheckCollisionPointRec(GetMousePosition(), (Rectangle){ anchor02.x + 290, anchor02.y + 530, 65, 20 }) && (IsKeyPressed(KEY_ENTER) || IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) editHexColorText = !editHexColorText;
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
// Draw background rectangle
|
||||
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), GetColor(GuiGetStyleProperty(DEFAULT_BACKGROUND_COLOR)));
|
||||
|
||||
// Draw info bar top
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 0, anchor01.y + 0, 720, 24 }, "CHOOSE CONTROL > CHOOSE PROPERTY STYLE > STYLE VIEWER", 35);
|
||||
|
||||
// Draw status bar bottom
|
||||
//GuiStatusBar((Rectangle){ anchor01.x + 334, anchor01.y + 616, 386, 24 }, FormatText("EDITION TIME: %02i:%02i:%02i", (framesCounter/60)/(60*60), ((framesCounter/60)/60)%60, (framesCounter/60)%60), 10);
|
||||
#if defined(RAYGUI_STYLE_DEFAULT_LIGHT)
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 0, anchor01.y + 616, 150, 24 }, "BASE STYLE: LIGHT", 10);
|
||||
#elif defined(RAYGUI_STYLE_DEFAULT_DARK)
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 0, anchor01.y + 616, 150, 24 }, "BASE STYLE: DARK", 10);
|
||||
#else
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 0, anchor01.y + 616, 150, 24 }, "BASE STYLE: UNKNOWN", 10);
|
||||
#endif
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 149, anchor01.y + 616, 186, 24 }, FormatText("CHANGED PROPERTIES: %03i", changedControlsCounter), 10);
|
||||
GuiStatusBar((Rectangle){ anchor01.x + 334, anchor01.y + 616, 386, 24 }, "powered by raylib and raygui", 226);
|
||||
|
||||
// Draw Gui controls
|
||||
currentSelectedControl = GuiListView(bounds[LISTVIEW], guiControlText, NUM_CONTROLS, currentSelectedControl);
|
||||
|
||||
if (currentSelectedControl < 0) GuiDisable();
|
||||
|
||||
switch (currentSelectedControl)
|
||||
{
|
||||
case DEFAULT: currentSelectedProperty = GuiListView((Rectangle){ anchor01.x + 155, anchor01.y + 40, 180, 560 }, guiStylesTextC, NUM_STYLES_C, currentSelectedProperty); break;
|
||||
case LABELBUTTON: currentSelectedProperty = GuiListView((Rectangle){ anchor01.x + 155, anchor01.y + 40, 180, 560 }, guiStylesTextA, NUM_STYLES_A, currentSelectedProperty); break;
|
||||
case SLIDER: case SLIDERBAR: case PROGRESSBAR: case CHECKBOX:
|
||||
case COLORPICKER: currentSelectedProperty = GuiListView((Rectangle){ anchor01.x + 155, anchor01.y + 40, 180, 560 }, guiStylesTextB, NUM_STYLES_B, currentSelectedProperty); break;
|
||||
case BUTTON: case TOGGLE: case COMBOBOX: case TEXTBOX: case SPINNER: case LISTVIEW:
|
||||
default: currentSelectedProperty = GuiListView((Rectangle){ anchor01.x + 155, anchor01.y + 40, 180, 560 }, guiStylesTextC, NUM_STYLES_C - 2, currentSelectedProperty); break;
|
||||
}
|
||||
|
||||
GuiEnable();
|
||||
|
||||
GuiWindowBox((Rectangle){ anchor02.x + 0, anchor02.y + 0, 365, 560 }, "Sample raygui controls");
|
||||
|
||||
checked = GuiCheckBox(bounds[CHECKBOX], checked);
|
||||
|
||||
if (checked) GuiDisable();
|
||||
|
||||
GuiLabel((Rectangle){ anchor02.x + 11, anchor02.y + 35, 80, 30 }, "rGuiStyler");
|
||||
|
||||
if (GuiLabelButton(bounds[LABELBUTTON], "github.com/raysan5/raygui")) {}
|
||||
|
||||
// Draw load style button
|
||||
if (GuiButton((Rectangle){ anchor02.x + 240, anchor02.y + 35, 115, 25 }, "Load Style"))
|
||||
{
|
||||
currentSelectedProperty = -1;
|
||||
BtnLoadStyle();
|
||||
for (int i = 0; i < 12; i++) colorBoxValue[i] = GetColor(style[DEFAULT_BORDER_COLOR_NORMAL + i]);
|
||||
}
|
||||
|
||||
toggle = GuiToggleButton(bounds[TOGGLE], "toggle", toggle);
|
||||
|
||||
toggleValue = GuiToggleGroup((Rectangle){ anchor02.x + 90, anchor02.y + 70, 262, 30 }, toggleGuiText, 4, toggleValue);
|
||||
|
||||
sliderValue = GuiSlider(bounds[SLIDER], sliderValue, 0, 100);
|
||||
|
||||
sliderBarValue = GuiSliderBar(bounds[SLIDERBAR], sliderBarValue, -10.0f, 40.0f);
|
||||
|
||||
progressValue = GuiProgressBar(bounds[PROGRESSBAR], progressValue, 0.0f, 1.0f);
|
||||
|
||||
spinnerValue = GuiSpinner(bounds[SPINNER], spinnerValue, 32, 35);
|
||||
|
||||
comboActive = GuiComboBox(bounds[COMBOBOX], comboText, comboNum, comboActive);
|
||||
|
||||
GuiTextBox(bounds[TEXTBOX], guiText, spinnerValue, editFilenameText);
|
||||
|
||||
colorPickerValue = GuiColorPicker(bounds[COLORPICKER], colorPickerValue);
|
||||
|
||||
// Draw labels for GuiColorPicker information (RGBA)
|
||||
GuiGroupBox((Rectangle){ anchor02.x + 290, anchor02.y + 285, 64, 75 }, "RGBA");
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 295 - 2, 20, 20 }, FormatText("R: %03i", colorPickerValue.r));
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 310 - 2, 20, 20 }, FormatText("G: %03i", colorPickerValue.g));
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 325 - 2, 20, 20 }, FormatText("B: %03i", colorPickerValue.b));
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 340 - 2, 20, 20 }, FormatText("A: %03i", colorPickerValue.a));
|
||||
|
||||
// Draw labels for GuiColorPicker information (HSV)
|
||||
GuiGroupBox((Rectangle){ anchor02.x + 290, anchor02.y + 370, 64, 60 }, "HSV");
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 380 - 2, 8, 20 }, FormatText("H: %.0f", colorHSV.x));
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 410 - 2, 8, 20 }, FormatText("S: %.0f%%", colorHSV.y*100));
|
||||
GuiLabel((Rectangle){ anchor02.x + 300 + 3, anchor02.y + 395 - 2, 8, 20 }, FormatText("V: %.0f%%", colorHSV.z*100));
|
||||
|
||||
if (GuiTextBox((Rectangle){ anchor02.x + 290, anchor02.y + 530, 65, 20 }, colorHex, 8, editHexColorText)) colorPickerValue = GetColor((int)strtoul(colorHex, NULL, 16));
|
||||
|
||||
for (int i = 0; i < 12; i++) colorBoxValue[i] = ColorBox((Rectangle){ anchor02.x + 292 + 20*(i%3), anchor02.y + 440 + 20*(i/3), 20, 20 }, &colorPickerValue, colorBoxValue[i]);
|
||||
DrawRectangleLinesEx((Rectangle){ anchor02.x + 292, anchor02.y + 440, 60, 80 }, 2, GetColor(style[DEFAULT_BORDER_COLOR_NORMAL]));
|
||||
|
||||
GuiEnable();
|
||||
|
||||
// Draw save style button
|
||||
if (GuiButton(bounds[BUTTON], "Save Style")) BtnSaveStyle(guiText, comboActive);
|
||||
|
||||
// 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);
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
ClearDroppedFiles(); // Clear internal buffers
|
||||
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------
|
||||
// Module functions
|
||||
//--------------------------------------------------------------------------------------------
|
||||
|
||||
// Button load style function
|
||||
static void BtnLoadStyle(void)
|
||||
{
|
||||
char currentPath[256];
|
||||
|
||||
// Add sample file name to currentPath
|
||||
strcpy(currentPath, GetWorkingDirectory());
|
||||
strcat(currentPath, "\\\0");
|
||||
|
||||
// Open file dialog
|
||||
const char *filters[] = { "*.rgs" };
|
||||
const char *fileName = tinyfd_openFileDialog("Load raygui style file", currentPath, 1, filters, "raygui Style Files (*.rgs)", 0);
|
||||
|
||||
if (fileName != NULL) GuiLoadStyle(fileName);
|
||||
}
|
||||
|
||||
// Button save style function
|
||||
static void BtnSaveStyle(const char *defaultName, bool binary)
|
||||
{
|
||||
char currentPathFile[256];
|
||||
|
||||
// Add sample file name to currentPath
|
||||
strcpy(currentPathFile, GetWorkingDirectory());
|
||||
strcat(currentPathFile, "\\style.rgs\0");
|
||||
|
||||
// Save file dialog
|
||||
const char *filters[] = { "*.rgs" };
|
||||
const char *fileName = tinyfd_saveFileDialog("Save raygui style text file", currentPathFile, 1, filters, "raygui Style Files (*.rgs)");
|
||||
|
||||
if (fileName != NULL)
|
||||
{
|
||||
//if (GetExtension(fileName) == NULL) strcat(fileName, ".rgs\0"); // No extension provided
|
||||
if (fileName != NULL) SaveStyleRGS(fileName, binary); // Save style file (text or binary)
|
||||
}
|
||||
}
|
||||
|
||||
static int GetGuiStylePropertyIndex(int control, int property)
|
||||
{
|
||||
int guiProp = -1;
|
||||
|
||||
switch (control)
|
||||
{
|
||||
case DEFAULT:
|
||||
{
|
||||
if (property == 12) guiProp = 0;
|
||||
else if (property == 13) guiProp = 1;
|
||||
else guiProp = DEFAULT_BORDER_COLOR_NORMAL + property;
|
||||
|
||||
} break;
|
||||
case LABELBUTTON: guiProp = LABEL_TEXT_COLOR_NORMAL + property; break;
|
||||
case BUTTON: guiProp = BUTTON_BORDER_COLOR_NORMAL + property; break;
|
||||
//case IMAGEBUTTON: guiProp = BUTTON_BORDER_COLOR_NORMAL + property; break;
|
||||
case TOGGLE: guiProp = TOGGLE_BORDER_COLOR_NORMAL + property; break;
|
||||
//case TOGGLEGROUP: guiProp = TOGGLE_BORDER_COLOR_NORMAL + property; break;
|
||||
case SLIDER: guiProp = SLIDER_BORDER_COLOR_NORMAL + property; break;
|
||||
case SLIDERBAR: guiProp = SLIDERBAR_BORDER_COLOR_NORMAL + property; break;
|
||||
case PROGRESSBAR: guiProp = PROGRESSBAR_BORDER_COLOR_NORMAL + property; break;
|
||||
case CHECKBOX: guiProp = CHECKBOX_BORDER_COLOR_NORMAL + property; break;
|
||||
case SPINNER: guiProp = SPINNER_BORDER_COLOR_NORMAL + property; break;
|
||||
case COMBOBOX: guiProp = COMBOBOX_BORDER_COLOR_NORMAL + property; break;
|
||||
case TEXTBOX: guiProp = TEXTBOX_BORDER_COLOR_NORMAL + property; break;
|
||||
case LISTVIEW: guiProp = LISTVIEW_BORDER_COLOR_NORMAL + property; break;
|
||||
case COLORPICKER: guiProp = COLORPICKER_BORDER_COLOR_NORMAL + property; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
//guiProp = LABEL_TEXT_COLOR_NORMAL + property/3; // type A
|
||||
//guiProp = SLIDER_BORDER_COLOR_NORMAL + property + property/2; // type B
|
||||
//guiProp = TOGGLE_BORDER_COLOR_NORMAL + property; // type C
|
||||
|
||||
return guiProp;
|
||||
}
|
||||
|
||||
// Color box control to save color samples from color picker
|
||||
// NOTE: It requires colorPicker pointer for updating in case of selection
|
||||
static Color ColorBox(Rectangle bounds, Color *colorPicker, Color color)
|
||||
{
|
||||
Vector2 mousePoint = GetMousePosition();
|
||||
|
||||
// Update color box
|
||||
if (CheckCollisionPointRec(mousePoint, bounds))
|
||||
{
|
||||
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) *colorPicker = (Color){ color.r, color.g, color.b, color.a };
|
||||
else if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) color = *colorPicker;
|
||||
}
|
||||
|
||||
// Draw color box
|
||||
DrawRectangleRec(bounds, color);
|
||||
DrawRectangleLinesEx(bounds, 1, GetColor(style[DEFAULT_BORDER_COLOR_NORMAL]));
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
// Save raygui style file (.rgs), text or binary
|
||||
static void SaveStyleRGS(const char *fileName, bool binary)
|
||||
{
|
||||
if (binary)
|
||||
{
|
||||
#define RGS_FILE_VERSION_BINARY 200
|
||||
|
||||
FILE *rgsFile = fopen(fileName, "wb");
|
||||
|
||||
if (rgsFile != NULL)
|
||||
{
|
||||
// Write some header info (12 bytes)
|
||||
// id: "RGS " - 4 bytes
|
||||
// version: 200 - 2 bytes
|
||||
// reserved - 2 bytes
|
||||
// total properties - 2 bytes
|
||||
// changed properties - 2 bytes
|
||||
|
||||
char signature[5] = "RGS ";
|
||||
short version = RGS_FILE_VERSION_BINARY;
|
||||
short reserved = 0;
|
||||
short numProperties = NUM_PROPERTIES;
|
||||
short changedProperties = 0;
|
||||
|
||||
for (int i = 0; i < NUM_PROPERTIES; i++) if (styleBackup[i] != style[i]) changedProperties++;
|
||||
|
||||
fwrite(signature, 1, 4, rgsFile);
|
||||
fwrite(&version, 1, sizeof(short), rgsFile);
|
||||
fwrite(&reserved, 1, sizeof(short), rgsFile);
|
||||
fwrite(&numProperties, 1, sizeof(short), rgsFile);
|
||||
fwrite(&changedProperties, 1, sizeof(short), rgsFile);
|
||||
|
||||
short id = 0;
|
||||
|
||||
for (int i = 0; i < NUM_PROPERTIES; i++)
|
||||
{
|
||||
if (styleBackup[i] != style[i])
|
||||
{
|
||||
id = (short)i;
|
||||
|
||||
fwrite(&id, 1, 2, rgsFile);
|
||||
fwrite(&style[i], 1, sizeof(int), rgsFile);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(rgsFile);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#define RGS_FILE_VERSION_TEXT "2.0"
|
||||
|
||||
int counter = 0;
|
||||
FILE *rgsFile = fopen(fileName, "wt");
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
tools/rGuiStyler/src/rguistyler.ico
Normal file
BIN
tools/rGuiStyler/src/rguistyler.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 102 KiB |
27
tools/rGuiStyler/src/rguistyler.rc
Normal file
27
tools/rGuiStyler/src/rguistyler.rc
Normal file
@ -0,0 +1,27 @@
|
||||
GLFW_ICON ICON "rguistyler.ico"
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION 2,0,0,0
|
||||
PRODUCTVERSION 2,0,0,0
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
//BLOCK "080904E4" // English UK
|
||||
BLOCK "040904E4" // English US
|
||||
BEGIN
|
||||
//VALUE "CompanyName", "My Company Name"
|
||||
VALUE "FileDescription", "rGuiStyler - raygui styles editor"
|
||||
VALUE "FileVersion", "2.0"
|
||||
VALUE "InternalName", "rguistyler"
|
||||
VALUE "LegalCopyright", "(c) 2018 raylib technologies (@raysan5)"
|
||||
//VALUE "OriginalFilename", "raylib_app.exe"
|
||||
VALUE "ProductName", "rGuiStyler"
|
||||
VALUE "ProductVersion", "2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
//VALUE "Translation", 0x809, 1252 // English UK
|
||||
VALUE "Translation", 0x409, 1252 // English US
|
||||
END
|
||||
END
|
||||
BIN
tools/rGuiStyler/src/rguistyler_icon
Normal file
BIN
tools/rGuiStyler/src/rguistyler_icon
Normal file
Binary file not shown.
Reference in New Issue
Block a user