aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2015-01-23 17:57:13 +1000
committerinmarket <andrewh@inmarket.com.au>2015-01-23 17:57:13 +1000
commitb316263833c95cf2b8cf14fe890321d5880aa81c (patch)
tree45ed1a3919a4bf05d4de4786aba476bd6a25aec8
parentfa8167b94d13e94a6cb953e7f549a89f155f77c6 (diff)
downloaduGFX-b316263833c95cf2b8cf14fe890321d5880aa81c.tar.gz
uGFX-b316263833c95cf2b8cf14fe890321d5880aa81c.tar.bz2
uGFX-b316263833c95cf2b8cf14fe890321d5880aa81c.zip
Implement a "Toggle Button" using a checkbox with a custom draw.
Updated the widgets demo to show this.
-rw-r--r--demos/modules/gwin/widgets/main.c10
-rw-r--r--docs/releases.txt3
-rw-r--r--src/gwin/gwin_checkbox.c41
-rw-r--r--src/gwin/gwin_checkbox.h1
4 files changed, 52 insertions, 3 deletions
diff --git a/demos/modules/gwin/widgets/main.c b/demos/modules/gwin/widgets/main.c
index ea3dbfba..80cd6c02 100644
--- a/demos/modules/gwin/widgets/main.c
+++ b/demos/modules/gwin/widgets/main.c
@@ -87,7 +87,7 @@ static GHandle ghConsole;
static GHandle ghPgButtons, ghPgSliders, ghPgCheckboxes, ghPgLabels, ghPgRadios, ghPgLists, ghPgImages, ghPgProgressbars;
static GHandle ghButton1, ghButton2, ghButton3, ghButton4;
static GHandle ghSlider1, ghSlider2, ghSlider3, ghSlider4;
-static GHandle ghCheckbox1, ghCheckbox2, ghCheckDisableAll;
+static GHandle ghCheckbox1, ghCheckbox2, ghCheckbox3, ghCheckDisableAll;
static GHandle ghLabelSlider1, ghLabelSlider2, ghLabelSlider3, ghLabelSlider4, ghLabelRadio1;
static GHandle ghRadio1, ghRadio2;
static GHandle ghRadioBlack, ghRadioWhite, ghRadioYellow;
@@ -303,7 +303,7 @@ static void createWidgets(void) {
ghSlider4 = gwinSliderCreate(0, &wi);
gwinSliderSetPosition(ghSlider4, 76);
- // Checkboxes - for the 2nd checkbox we apply special drawing before making it visible
+ // Checkboxes - for the 2nd and 3rd checkbox we apply special drawing before making it visible
wi.g.parent = ghPgCheckboxes;
wi.g.width = CHECKBOX_WIDTH; wi.g.height = CHECKBOX_HEIGHT; wi.g.x = 5;
wi.g.y = 5; wi.text = "C1";
@@ -311,8 +311,11 @@ static void createWidgets(void) {
wi.customDraw = gwinCheckboxDraw_CheckOnRight;
wi.g.y += wi.g.height+1; wi.text = "C2";
ghCheckbox2 = gwinCheckboxCreate(0, &wi);
- wi.customDraw = 0; wi.g.width = DISABLEALL_WIDTH;
+ wi.customDraw = gwinCheckboxDraw_Button;
+ wi.g.y += wi.g.height+1; wi.text = "C3"; wi.g.width = BUTTON_WIDTH; wi.g.height = BUTTON_HEIGHT;
+ ghCheckbox3 = gwinCheckboxCreate(0, &wi);
wi.g.y += wi.g.height+1; wi.text = "Disable All";
+ wi.customDraw = 0; wi.g.width = DISABLEALL_WIDTH; wi.g.height = CHECKBOX_HEIGHT;
ghCheckDisableAll = gwinCheckboxCreate(0, &wi);
// Labels
@@ -478,6 +481,7 @@ static void setEnabled(bool_t ena) {
// Checkboxes we need to do individually so we don't disable the checkbox to re-enable everything
gwinSetEnabled(ghCheckbox1, ena);
gwinSetEnabled(ghCheckbox2, ena);
+ gwinSetEnabled(ghCheckbox3, ena);
//gwinSetEnabled(ghCheckDisableAll, TRUE);
}
diff --git a/docs/releases.txt b/docs/releases.txt
index 0df8cc0d..9dc4ff08 100644
--- a/docs/releases.txt
+++ b/docs/releases.txt
@@ -13,6 +13,9 @@ FEATURE: New Tabset GWIN widget
FEATURE: New keyboard driver interface with drivers for Win32 and X
FEATURE: Support for keyboard layouts for non-english keyboards
FEATURE: GDISP now supports pixmaps (in memory drawing)
+FEATURE: Rename files to improve experience in certain brain-dead IDE's
+FEATURE: Add a checkbox "Toggle Button" custom draw
+FEATURE: Add Tetris as an application demo.
*** Release 2.2 ***
diff --git a/src/gwin/gwin_checkbox.c b/src/gwin/gwin_checkbox.c
index 72d8dbdf..ff0507d9 100644
--- a/src/gwin/gwin_checkbox.c
+++ b/src/gwin/gwin_checkbox.c
@@ -16,6 +16,10 @@
#include "gwin_class.h"
+// Parameters for button custom draw
+#define TOP_FADE 50 // (TOP_FADE/255)% fade to white for top of button
+#define BOTTOM_FADE 25 // (BOTTOM_FADE/255)% fade to black for bottom of button
+
// Our checked state
#define GCHECKBOX_FLG_CHECKED (GWIN_FIRST_CONTROL_FLAG<<0)
@@ -204,4 +208,41 @@ void gwinCheckboxDraw_CheckOnRight(GWidgetObject *gw, void *param) {
#undef gcw
}
+#if GWIN_FLAT_STYLING
+ void gwinCheckboxDraw_Button(GWidgetObject *gw, void *param) {
+ const GColorSet * pcol;
+ (void) param;
+
+ if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
+ pcol = getDrawColors(gw);
+
+ gdispGFillStringBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ gdispGDrawLine(gw->g.display, gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->edge);
+ gdispGDrawLine(gw->g.display, gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->edge);
+ }
+#else
+ void gwinCheckboxDraw_Button(GWidgetObject *gw, void *param) {
+ const GColorSet * pcol;
+ fixed alpha;
+ fixed dalpha;
+ coord_t i;
+ color_t tcol, bcol;
+ (void) param;
+
+ if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
+ pcol = getDrawColors(gw);
+
+ /* Fill the box blended from variants of the fill color */
+ tcol = gdispBlendColor(White, pcol->fill, TOP_FADE);
+ bcol = gdispBlendColor(Black, pcol->fill, BOTTOM_FADE);
+ dalpha = FIXED(255)/gw->g.height;
+ for(alpha = 0, i = 0; i < gw->g.height; i++, alpha += dalpha)
+ gdispGDrawLine(gw->g.display, gw->g.x, gw->g.y+i, gw->g.x+gw->g.width-2, gw->g.y+i, gdispBlendColor(bcol, tcol, NONFIXED(alpha)));
+
+ gdispGDrawStringBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->text, gw->g.font, pcol->text, justifyCenter);
+ gdispGDrawLine(gw->g.display, gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->edge);
+ gdispGDrawLine(gw->g.display, gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->edge);
+ }
+#endif
+
#endif /* (GFX_USE_GWIN && GWIN_NEED_CHECKBOX) */
diff --git a/src/gwin/gwin_checkbox.h b/src/gwin/gwin_checkbox.h
index 3a67d487..f0a8e9f0 100644
--- a/src/gwin/gwin_checkbox.h
+++ b/src/gwin/gwin_checkbox.h
@@ -116,6 +116,7 @@ bool_t gwinCheckboxIsChecked(GHandle gh);
*/
void gwinCheckboxDraw_CheckOnLeft(GWidgetObject *gw, void *param);
void gwinCheckboxDraw_CheckOnRight(GWidgetObject *gw, void *param);
+void gwinCheckboxDraw_Button(GWidgetObject *gw, void *param);
/** @} */
#ifdef __cplusplus