aboutsummaryrefslogtreecommitdiffstats
path: root/demos/modules/gwin
diff options
context:
space:
mode:
Diffstat (limited to 'demos/modules/gwin')
-rw-r--r--demos/modules/gwin/basic/main.c14
-rw-r--r--demos/modules/gwin/console/main.c41
-rw-r--r--demos/modules/gwin/slider/gfxconf.h84
-rw-r--r--demos/modules/gwin/slider/main.c97
-rw-r--r--demos/modules/gwin/slider/readme.txt6
-rw-r--r--demos/modules/gwin/slider/result_647x490.pngbin24141 -> 0 bytes
-rw-r--r--demos/modules/gwin/widgets/main.c352
-rw-r--r--demos/modules/gwin/widgets/readme.txt4
8 files changed, 268 insertions, 330 deletions
diff --git a/demos/modules/gwin/basic/main.c b/demos/modules/gwin/basic/main.c
index 5dc1bab7..c46e6969 100644
--- a/demos/modules/gwin/basic/main.c
+++ b/demos/modules/gwin/basic/main.c
@@ -40,8 +40,14 @@ int main(void) {
gdispClear(Lime);
/* Create two windows */
- GW1 = gwinCreateWindow(NULL, 20, 10, 200, 150);
- GW2 = gwinCreateWindow(NULL, 50, 190, 150, 100);
+ {
+ GWindowInit wi;
+
+ wi.show = TRUE; wi.x = 20; wi.y = 10; wi.width = 200; wi.height = 150;
+ GW1 = gwinWindowCreate(NULL, &wi);
+ wi.show = TRUE; wi.x = 50; wi.y = 190; wi.width = 150; wi.height = 100;
+ GW2 = gwinWindowCreate(NULL, &wi);
+ }
/* Set fore- and background colors for both windows */
gwinSetColor(GW1, Black);
@@ -53,9 +59,9 @@ int main(void) {
gwinClear(GW1);
gwinClear(GW2);
- gwinDrawLine (GW1, 5, 30, 150, 110);
+ gwinDrawLine(GW1, 5, 30, 150, 110);
for(i=5, j=0; i < 200 && j < 150; i+=3, j+=i/20)
- gwinDrawPixel (GW1, i, j);
+ gwinDrawPixel(GW1, i, j);
/*
* Draw two filled circles at the same coordinate
diff --git a/demos/modules/gwin/console/main.c b/demos/modules/gwin/console/main.c
index aa3de40d..197a8ad6 100644
--- a/demos/modules/gwin/console/main.c
+++ b/demos/modules/gwin/console/main.c
@@ -28,27 +28,37 @@
*/
#include "gfx.h"
-#include "chprintf.h"
/* The handles for our three consoles */
GHandle GW1, GW2, GW3;
-/* The streams for our three consoles */
-BaseSequentialStream *S1, *S2, *S3;
-
int main(void) {
uint8_t i;
font_t font1, font2;
/* initialize and clear the display */
gfxInit();
- font1 = gdispOpenFont("UI2 Double");
- font2 = gdispOpenFont("Small");
- /* create the three console windows and set a font for each */
- GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, font1);
- GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), font2);
- GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), font2);
+ /* Set some fonts */
+ font1 = gdispOpenFont("Small");
+ font2 = gdispOpenFont("UI2 Double");
+ gwinSetDefaultFont(font1);
+
+ /* create the three console windows */
+ {
+ GWindowInit wi;
+
+ wi.show = TRUE;
+ wi.x = 0; wi.y = 0; wi.width = gdispGetWidth(); wi.height = gdispGetHeight()/2;
+ GW1 = gwinConsoleCreate(NULL, &wi);
+ wi.y = gdispGetHeight()/2; wi.width = gdispGetWidth()/2; wi.height = gdispGetHeight();
+ GW2 = gwinConsoleCreate(NULL, &wi);
+ wi.x = gdispGetWidth()/2; wi.height = gdispGetHeight();
+ GW3 = gwinConsoleCreate(NULL, &wi);
+ }
+
+ /* Use a special font for GW1 */
+ gwinSetFont(GW1, font2);
/* Set the fore- and background colors for each console */
gwinSetColor(GW1, Green);
@@ -63,24 +73,19 @@ int main(void) {
gwinClear(GW2);
gwinClear(GW3);
- /* receive the stream pointers of each console */
- S1 = gwinGetConsoleStream(GW1);
- S2 = gwinGetConsoleStream(GW2);
- S3 = gwinGetConsoleStream(GW3);
-
/* Output some data on the first console */
for(i = 0; i < 10; i++) {
- chprintf(S1, "Hello ChibiOS/GFX!\r\n");
+ gwinPrintf(GW1, "Hello ChibiOS/GFX!\r\n");
}
/* Output some data on the second console */
for(i = 0; i < 16; i++) {
- chprintf(S2, "Message Nr.: %d\r\n", i+1);
+ gwinPrintf(GW2, "Message Nr.: %d\r\n", i+1);
}
/* Output some data on the third console */
for(i = 0; i < 18; i++) {
- chprintf(S3, "Message Nr.: %d\r\n", i+1);
+ gwinPrintf(GW3, "Message Nr.: %d\r\n", i+1);
}
while(TRUE) {
diff --git a/demos/modules/gwin/slider/gfxconf.h b/demos/modules/gwin/slider/gfxconf.h
deleted file mode 100644
index b7b39a3f..00000000
--- a/demos/modules/gwin/slider/gfxconf.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
- * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _GFXCONF_H
-#define _GFXCONF_H
-
-/* The operating system to use - one of these must be defined */
-#define GFX_USE_OS_CHIBIOS TRUE
-#define GFX_USE_OS_WIN32 FALSE
-#define GFX_USE_OS_POSIX FALSE
-
-/* GFX sub-systems to turn on */
-#define GFX_USE_GDISP TRUE
-#define GFX_USE_GWIN TRUE
-#define GFX_USE_GEVENT TRUE
-#define GFX_USE_GTIMER TRUE
-#define GFX_USE_GINPUT TRUE
-
-/* Features for the GDISP sub-system. */
-#define GDISP_NEED_VALIDATION TRUE
-#define GDISP_NEED_CLIP TRUE
-#define GDISP_NEED_TEXT TRUE
-#define GDISP_NEED_CIRCLE FALSE
-#define GDISP_NEED_ELLIPSE FALSE
-#define GDISP_NEED_ARC FALSE
-#define GDISP_NEED_CONVEX_POLYGON FALSE
-#define GDISP_NEED_SCROLL FALSE
-#define GDISP_NEED_PIXELREAD FALSE
-#define GDISP_NEED_CONTROL FALSE
-#define GDISP_NEED_IMAGE FALSE
-#define GDISP_NEED_MULTITHREAD TRUE
-#define GDISP_NEED_ASYNC FALSE
-#define GDISP_NEED_MSGAPI FALSE
-
-/* Builtin Fonts */
-#define GDISP_INCLUDE_FONT_SMALL FALSE
-#define GDISP_INCLUDE_FONT_LARGER FALSE
-#define GDISP_INCLUDE_FONT_UI1 FALSE
-#define GDISP_INCLUDE_FONT_UI2 TRUE
-#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE
-
-/* GDISP image decoders */
-#define GDISP_NEED_IMAGE_NATIVE FALSE
-#define GDISP_NEED_IMAGE_GIF FALSE
-#define GDISP_NEED_IMAGE_BMP FALSE
-#define GDISP_NEED_IMAGE_JPG FALSE
-#define GDISP_NEED_IMAGE_PNG FALSE
-
-/* Features for the GWIN sub-system. */
-#define GWIN_NEED_BUTTON FALSE
-#define GWIN_NEED_CONSOLE TRUE
-#define GWIN_NEED_SLIDER TRUE
-
-/* Features for the GINPUT sub-system. */
-#define GINPUT_NEED_MOUSE TRUE
-#define GINPUT_NEED_DIAL TRUE
-
-#endif /* _GFXCONF_H */
diff --git a/demos/modules/gwin/slider/main.c b/demos/modules/gwin/slider/main.c
deleted file mode 100644
index 15dc3e26..00000000
--- a/demos/modules/gwin/slider/main.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
- * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "gfx.h"
-#include "chprintf.h"
-
-static GListener gl;
-
-#define SLIDER_WIDTH 20
-
-int main(void) {
- coord_t swidth, sheight;
- GHandle ghSliderH, ghSliderV, ghConsole;
- font_t fui2;
- GEvent * pe;
- GEventGWinSlider * pSliderEvent;
- BaseSequentialStream *consout;
-
- gfxInit(); // Initialize the display
-
- // Get the display dimensions
- swidth = gdispGetWidth();
- sheight = gdispGetHeight();
-
- // Get the font
- fui2 = gdispOpenFont("UI2");
-
- // Create out gwin windows/widgets
- ghSliderH = gwinCreateSlider(NULL, 5, 5, swidth-10, SLIDER_WIDTH);
- ghSliderV = gwinCreateSlider(NULL, 5, 10+SLIDER_WIDTH, SLIDER_WIDTH, sheight-15+SLIDER_WIDTH);
- ghConsole = gwinCreateConsole(NULL, 10+SLIDER_WIDTH, 10+SLIDER_WIDTH, swidth-15-SLIDER_WIDTH, sheight-15-SLIDER_WIDTH, fui2);
- consout = gwinGetConsoleStream(ghConsole);
-
- // Color up the console window
- gwinSetColor(ghConsole, White);
- gwinSetBgColor(ghConsole, Blue);
-
- // Assign the mouse and dials to the sliders.
-#if GINPUT_NEED_MOUSE
- gwinAttachSliderMouse(ghSliderH, 0);
- gwinAttachSliderMouse(ghSliderV, 0);
-#endif
-#if GINPUT_NEED_DIAL
- gwinAttachSliderDial(ghSliderV, 0);
- gwinAttachSliderDial(ghSliderH, 1);
-#endif
-
- // We want to listen for slider events
- geventListenerInit(&gl);
- geventAttachSource(&gl, gwinGetSliderSource(ghSliderH), 0);
- geventAttachSource(&gl, gwinGetSliderSource(ghSliderV), 0);
-
- // Draw everything on the screen
- gwinClear(ghConsole);
- gwinSliderDraw(ghSliderH);
- gwinSliderDraw(ghSliderV);
-
- while(1) {
- // Get an Event
- pe = geventEventWait(&gl, TIME_INFINITE);
-
- switch(pe->type) {
- case GEVENT_GWIN_SLIDER:
- pSliderEvent = (GEventGWinSlider *)pe;
- chprintf(consout, "%c=%d\n", pSliderEvent->slider == ghSliderH ? 'H' : 'V', pSliderEvent->position);
- break;
- }
- }
-
- return 0;
-}
diff --git a/demos/modules/gwin/slider/readme.txt b/demos/modules/gwin/slider/readme.txt
deleted file mode 100644
index 02d733e9..00000000
--- a/demos/modules/gwin/slider/readme.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This demo supports input from both a mouse/touch and/or a dial input.
-If your platform does not support one or the other, turn it off in
-gfxconf.h
-
-Note that you will need to include the drivers into your project
-makefile for whichever inputs you decide to use.
diff --git a/demos/modules/gwin/slider/result_647x490.png b/demos/modules/gwin/slider/result_647x490.png
deleted file mode 100644
index c7b12a93..00000000
--- a/demos/modules/gwin/slider/result_647x490.png
+++ /dev/null
Binary files differ
diff --git a/demos/modules/gwin/widgets/main.c b/demos/modules/gwin/widgets/main.c
index e0e4c401..bff842f4 100644
--- a/demos/modules/gwin/widgets/main.c
+++ b/demos/modules/gwin/widgets/main.c
@@ -31,37 +31,192 @@
// include our chibios logo in a .gif format
#include "image_chibios.h"
+/**
+ * This demo demonstrates many of the GWIN widgets.
+ * On the "Radio" tab try playing with the color radio buttons.
+ * On the "Checkbox" tab try playing with the "Disable All" checkbox.
+ */
+
+/* Our custom yellow style */
+static const GWidgetStyle YellowWidgetStyle = {
+ Yellow, // window background
+
+ // enabled color set
+ {
+ HTML2COLOR(0x0000FF), // text
+ HTML2COLOR(0x404040), // edge
+ HTML2COLOR(0xE0E0E0), // fill
+ HTML2COLOR(0xE0E0E0), // progress - inactive area
+ },
+
+ // disabled color set
+ {
+ HTML2COLOR(0xC0C0C0), // text
+ HTML2COLOR(0x808080), // edge
+ HTML2COLOR(0xE0E0E0), // fill
+ HTML2COLOR(0xC0E0C0), // progress - active area
+ },
+
+ // pressed color set
+ {
+ HTML2COLOR(0xFF00FF), // text
+ HTML2COLOR(0x404040), // edge
+ HTML2COLOR(0x808080), // fill
+ HTML2COLOR(0x00E000), // progress - active area
+ },
+};
+
+/* The variables we need */
static GListener gl;
static GHandle ghConsole;
static GHandle ghTabButtons, ghTabSliders, ghTabCheckboxes, ghTabLabels, ghTabRadios, ghTabImages;
static GHandle ghButton1, ghButton2, ghButton3, ghButton4;
static GHandle ghSlider1, ghSlider2, ghSlider3, ghSlider4;
-static GHandle ghCheckbox1, ghCheckbox2;
+static GHandle ghCheckbox1, ghCheckbox2, ghCheckDisableAll;
static GHandle ghLabel1;
static GHandle ghRadio1, ghRadio2;
-static GHandle ghImage1;
-
-#define ScrWidth gdispGetWidth()
-#define ScrHeight gdispGetHeight()
-
-#define TAB_HEIGHT 30
-#define BUTTON_WIDTH 50
-#define BUTTON_HEIGHT 30
-#define SLIDER_WIDTH 20
-#define CHECKBOX_WIDTH 80
-#define CHECKBOX_HEIGHT 20
-#define RADIO_WIDTH 50
-#define RADIO_HEIGHT 20
-#define GROUP_TABS 0
-#define GROUP_R1R2 1
-
-static GHandle createTab(GWidgetInit *pwi) {
- GHandle gh;
-
- gh = gwinCreateRadio(NULL, pwi, GROUP_TABS);
- gwinSetCustomDraw(gh, gwinRadioDraw_Tab, 0);
- gwinSetVisible(gh, TRUE);
- return gh;
+static GHandle ghRadioBlack, ghRadioWhite, ghRadioYellow;
+static GHandle ghImage1;
+
+/* Some useful macros */
+#define ScrWidth gdispGetWidth()
+#define ScrHeight gdispGetHeight()
+
+#define TAB_HEIGHT 30
+#define LABEL_HEIGHT 40
+#define BUTTON_WIDTH 50
+#define BUTTON_HEIGHT 30
+#define SLIDER_WIDTH 20
+#define CHECKBOX_WIDTH 80
+#define CHECKBOX_HEIGHT 20
+#define RADIO_WIDTH 50
+#define RADIO_HEIGHT 20
+#define COLOR_WIDTH 80
+#define DISABLEALL_WIDTH 100
+#define GROUP_TABS 0
+#define GROUP_YESNO 1
+#define GROUP_COLORS 2
+
+/**
+ * Create all the widgets.
+ * With the exception of the Tabs they are all created invisible.
+ */
+static void createWidgets(void) {
+ GWidgetInit wi;
+
+ wi.customDraw = 0; wi.customParam = 0; wi.customStyle = 0;
+
+ // Create the Tabs
+ wi.g.show = TRUE; wi.customDraw = gwinRadioDraw_Tab;
+ wi.g.width = ScrWidth/6; wi.g.height = TAB_HEIGHT; wi.g.y = 0;
+ wi.g.x = 0*wi.g.width; wi.text = "Buttons"; ghTabButtons = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+ wi.g.x = 1*wi.g.width; wi.text = "Sliders"; ghTabSliders = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+ wi.g.x = 2*wi.g.width; wi.text = "Checkbox"; ghTabCheckboxes = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+ wi.g.x = 3*wi.g.width; wi.text = "Radios"; ghTabRadios = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+ wi.g.x = 4*wi.g.width; wi.text = "Labels"; ghTabLabels = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+ wi.g.x = 5*wi.g.width; wi.text = "Images"; ghTabImages = gwinRadioCreate(NULL, &wi, GROUP_TABS);
+
+ // Buttons
+ wi.g.show = FALSE; wi.customDraw = 0;
+ wi.g.width = BUTTON_WIDTH; wi.g.height = BUTTON_HEIGHT; wi.g.y = TAB_HEIGHT+5;
+ wi.g.x = 0+0*(BUTTON_WIDTH+1); wi.text = "B1"; ghButton1 = gwinButtonCreate(NULL, &wi);
+ wi.g.x = 0+1*(BUTTON_WIDTH+1); wi.text = "B2"; ghButton2 = gwinButtonCreate(NULL, &wi);
+ wi.g.x = 0+2*(BUTTON_WIDTH+1); wi.text = "B3"; ghButton3 = gwinButtonCreate(NULL, &wi);
+ wi.g.x = 0+3*(BUTTON_WIDTH+1); wi.text = "B4"; ghButton4 = gwinButtonCreate(NULL, &wi);
+
+ // Horizontal Sliders
+ wi.g.width = ScrWidth/2-2; wi.g.height = SLIDER_WIDTH; wi.g.x = ScrWidth/2+1;
+ wi.g.y = ScrHeight/2-2*(SLIDER_WIDTH+1); wi.text = "S1"; ghSlider1 = gwinSliderCreate(NULL, &wi);
+ wi.g.y = ScrHeight/2-1*(SLIDER_WIDTH+1); wi.text = "S2"; ghSlider2 = gwinSliderCreate(NULL, &wi);
+
+ // Vertical Sliders
+ wi.g.width = SLIDER_WIDTH; wi.g.height = ScrHeight/2-2; wi.g.y = ScrHeight/2+1;
+ wi.g.x = 0+0*(SLIDER_WIDTH+1); wi.text = "S3"; ghSlider3 = gwinSliderCreate(NULL, &wi);
+ wi.g.x = 0+1*(SLIDER_WIDTH+1); wi.text = "S4"; ghSlider4 = gwinSliderCreate(NULL, &wi);
+
+ // Checkboxes - for the 2nd checkbox we apply special drawing before making it visible
+ wi.g.width = CHECKBOX_WIDTH; wi.g.height = CHECKBOX_HEIGHT; wi.g.x = 0;
+ wi.g.y = TAB_HEIGHT+5+0*(CHECKBOX_HEIGHT+1); wi.text = "C1"; ghCheckbox1 = gwinCheckboxCreate(NULL, &wi);
+ wi.customDraw = gwinCheckboxDraw_CheckOnRight;
+ wi.g.y = TAB_HEIGHT+5+1*(CHECKBOX_HEIGHT+1); wi.text = "C2"; ghCheckbox2 = gwinCheckboxCreate(NULL, &wi);
+ wi.customDraw = 0; wi.g.width = DISABLEALL_WIDTH;
+ wi.g.y = TAB_HEIGHT+5+2*(CHECKBOX_HEIGHT+1); wi.text = "Disable All"; ghCheckDisableAll = gwinCheckboxCreate(NULL, &wi);
+
+ // Labels
+ wi.g.width = 0; wi.g.height = LABEL_HEIGHT; // dynamic width, fixed height
+ wi.g.y = TAB_HEIGHT+5+2*(CHECKBOX_HEIGHT+1); wi.text = "Label"; ghLabel1 = gwinLabelCreate(NULL, &wi);
+
+ // Radio Buttons
+ wi.g.width = RADIO_WIDTH; wi.g.height = RADIO_HEIGHT; wi.g.y = TAB_HEIGHT+5;
+ wi.g.x = 0*wi.g.width; wi.text = "Yes"; ghRadio1 = gwinRadioCreate(NULL, &wi, GROUP_YESNO);
+ wi.g.x = 1*wi.g.width; wi.text = "No"; ghRadio2 = gwinRadioCreate(NULL, &wi, GROUP_YESNO);
+ wi.g.width = COLOR_WIDTH; wi.g.y += RADIO_HEIGHT+5;
+ wi.g.x = 0*wi.g.width; wi.text = "Black"; ghRadioBlack = gwinRadioCreate(NULL, &wi, GROUP_COLORS);
+ wi.g.x = 1*wi.g.width; wi.text = "White"; ghRadioWhite = gwinRadioCreate(NULL, &wi, GROUP_COLORS);
+ wi.g.x = 2*wi.g.width; wi.text = "Yellow"; ghRadioYellow = gwinRadioCreate(NULL, &wi, GROUP_COLORS);
+ gwinRadioPress(ghRadioWhite);
+
+ // Image
+ wi.g.x = ScrWidth-210; wi.g.y = TAB_HEIGHT + 10; wi.g.width = 200; wi.g.height = 200;
+ ghImage1 = gwinImageCreate(NULL, &wi.g);
+ gwinImageOpenMemory(ghImage1, image_chibios);
+ gwinImageCache(ghImage1);
+
+ // Console - we apply some special colors before making it visible
+ wi.g.width = ScrWidth/2-1; wi.g.height = ScrHeight/2-1;
+ wi.g.x = ScrWidth/2+1; wi.g.y = ScrHeight/2+1;
+ ghConsole = gwinConsoleCreate(NULL, &wi.g);
+ gwinSetColor(ghConsole, Yellow);
+ gwinSetBgColor(ghConsole, Black);
+}
+
+/**
+ * Set the visibility of widgets based on which tab is selected.
+ */
+static void setTab(GHandle tab) {
+ /* Make sure everything is invisible first */
+ gwinSetVisible(ghButton1, FALSE); gwinSetVisible(ghButton2, FALSE);
+ gwinSetVisible(ghButton3, FALSE); gwinSetVisible(ghButton4, FALSE);
+ gwinSetVisible(ghSlider1, FALSE); gwinSetVisible(ghSlider2, FALSE);
+ gwinSetVisible(ghSlider3, FALSE); gwinSetVisible(ghSlider4, FALSE);
+ gwinSetVisible(ghCheckbox1, FALSE); gwinSetVisible(ghCheckbox2, FALSE); gwinSetVisible(ghCheckDisableAll, FALSE);
+ gwinSetVisible(ghLabel1, FALSE);
+ gwinSetVisible(ghRadio1, FALSE); gwinSetVisible(ghRadio2, FALSE);
+ gwinSetVisible(ghRadioWhite, FALSE);gwinSetVisible(ghRadioBlack, FALSE);gwinSetVisible(ghRadioYellow, FALSE);
+ gwinSetVisible(ghImage1, FALSE);
+
+ /* Turn on widgets depending on the tab selected */
+ if (tab == ghTabButtons) {
+ gwinSetVisible(ghButton1, TRUE); gwinSetVisible(ghButton2, TRUE);
+ gwinSetVisible(ghButton3, TRUE); gwinSetVisible(ghButton4, TRUE);
+ } else if (tab == ghTabSliders) {
+ gwinSetVisible(ghSlider1, TRUE); gwinSetVisible(ghSlider2, TRUE);
+ gwinSetVisible(ghSlider3, TRUE); gwinSetVisible(ghSlider4, TRUE);
+ } else if (tab == ghTabCheckboxes) {
+ gwinSetVisible(ghCheckbox1, TRUE); gwinSetVisible(ghCheckbox2, TRUE); gwinSetVisible(ghCheckDisableAll, TRUE);
+ } else if (tab == ghTabLabels) {
+ gwinSetVisible(ghLabel1, TRUE);
+ } else if (tab == ghTabRadios) {
+ gwinSetVisible(ghRadio1, TRUE); gwinSetVisible(ghRadio2, TRUE);
+ gwinSetVisible(ghRadioWhite, TRUE); gwinSetVisible(ghRadioBlack, TRUE); gwinSetVisible(ghRadioYellow, TRUE);
+ } else if (tab == ghTabImages) {
+ gwinSetVisible(ghImage1, TRUE);
+ }
+}
+
+/**
+ * Set the enabled state of every widget (except the tabs etc)
+ */
+static void setEnabled(bool_t ena) {
+ gwinSetEnabled(ghButton1, ena); gwinSetEnabled(ghButton2, ena);
+ gwinSetEnabled(ghButton3, ena); gwinSetEnabled(ghButton4, ena);
+ gwinSetEnabled(ghSlider1, ena); gwinSetEnabled(ghSlider2, ena);
+ gwinSetEnabled(ghSlider3, ena); gwinSetEnabled(ghSlider4, ena);
+ gwinSetEnabled(ghCheckbox1, ena); gwinSetEnabled(ghCheckbox2, ena); //gwinSetEnabled(ghCheckDisableAll, TRUE);
+ gwinSetEnabled(ghLabel1, ena);
+ gwinSetEnabled(ghRadio1, ena); gwinSetEnabled(ghRadio2, ena);
+ gwinSetEnabled(ghRadioWhite, ena); gwinSetEnabled(ghRadioBlack, ena); gwinSetEnabled(ghRadioYellow, ena);
+ gwinSetEnabled(ghImage1, ena);
}
int main(void) {
@@ -69,16 +224,11 @@ int main(void) {
// Initialize the display
gfxInit();
- gdispClear(White);
// Set the widget defaults
gwinSetDefaultFont(gdispOpenFont("UI2"));
- gwinSetDefaultColor(Black);
- gwinSetDefaultBgColor(White);
-
- // We want to listen for widget events
- geventListenerInit(&gl);
- gwinAttachListener(&gl);
+ gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE);
+ gdispClear(White);
// Connect the mouse
#if GINPUT_NEED_MOUSE
@@ -86,65 +236,9 @@ int main(void) {
#endif
// Create the gwin windows/widgets
- {
- GWidgetInit wi;
-
- // Create the Tabs
- wi.g.show = FALSE; wi.g.width = ScrWidth/6; wi.g.height = TAB_HEIGHT; wi.g.y = 0;
- wi.g.x = 0*wi.g.width; wi.text = "Buttons"; ghTabButtons = createTab(&wi);
- wi.g.x = 1*wi.g.width; wi.text = "Sliders"; ghTabSliders = createTab(&wi);
- wi.g.x = 2*wi.g.width; wi.text = "Checkbox"; ghTabCheckboxes = createTab(&wi);
- wi.g.x = 3*wi.g.width; wi.text = "Labels"; ghTabLabels = createTab(&wi);
- wi.g.x = 4*wi.g.width; wi.text = "Radios"; ghTabRadios = createTab(&wi);
- wi.g.x = 5*wi.g.width; wi.text = "Images"; ghTabImages = createTab(&wi);
-
- // Buttons
- wi.g.width = BUTTON_WIDTH; wi.g.height = BUTTON_HEIGHT; wi.g.y = TAB_HEIGHT+5;
- wi.g.x = 0+0*(BUTTON_WIDTH+1); wi.text = "B1"; ghButton1 = gwinCreateButton(NULL, &wi);
- wi.g.x = 0+1*(BUTTON_WIDTH+1); wi.text = "B2"; ghButton2 = gwinCreateButton(NULL, &wi);
- wi.g.x = 0+2*(BUTTON_WIDTH+1); wi.text = "B3"; ghButton3 = gwinCreateButton(NULL, &wi);
- wi.g.x = 0+3*(BUTTON_WIDTH+1); wi.text = "B4"; ghButton4 = gwinCreateButton(NULL, &wi);
-
- // Horizontal Sliders
- wi.g.width = ScrWidth/2-2; wi.g.height = SLIDER_WIDTH; wi.g.x = ScrWidth/2+1;
- wi.g.y = ScrHeight/2-2*(SLIDER_WIDTH+1); wi.text = "S1"; ghSlider1 = gwinCreateSlider(NULL, &wi);
- wi.g.y = ScrHeight/2-1*(SLIDER_WIDTH+1); wi.text = "S2"; ghSlider2 = gwinCreateSlider(NULL, &wi);
-
- // Vertical Sliders
- wi.g.width = SLIDER_WIDTH; wi.g.height = ScrHeight/2-2; wi.g.y = ScrHeight/2+1;
- wi.g.x = 0+0*(SLIDER_WIDTH+1); wi.text = "S3"; ghSlider3 = gwinCreateSlider(NULL, &wi);
- wi.g.x = 0+1*(SLIDER_WIDTH+1); wi.text = "S4"; ghSlider4 = gwinCreateSlider(NULL, &wi);
-
- // Checkboxes - for the 2nd checkbox we apply special drawing before making it visible
- wi.g.width = CHECKBOX_WIDTH; wi.g.height = CHECKBOX_HEIGHT; wi.g.x = 0;
- wi.g.y = TAB_HEIGHT+5+0*(CHECKBOX_HEIGHT+1); wi.text = "C1"; ghCheckbox1 = gwinCreateCheckbox(NULL, &wi);
- wi.g.y = TAB_HEIGHT+5+1*(CHECKBOX_HEIGHT+1); wi.text = "C2"; ghCheckbox2 = gwinCreateCheckbox(NULL, &wi);
- gwinSetCustomDraw(ghCheckbox2, gwinCheckboxDraw_CheckOnRight, 0);
-
- // Labels
- wi.g.width = 0; // dynamic width
- wi.g.y = TAB_HEIGHT+5+2*(CHECKBOX_HEIGHT+1); wi.text = "L1"; ghLabel1 = gwinLabelCreate(NULL, &wi);
-
- // Radio Buttons
- wi.g.width = RADIO_WIDTH; wi.g.height = RADIO_HEIGHT; wi.g.y = TAB_HEIGHT+5;
- wi.g.x = 0*wi.g.width; wi.text = "Yes"; ghRadio1 = gwinCreateRadio(NULL, &wi, GROUP_R1R2);
- wi.g.x = 1*wi.g.width; wi.text = "No"; ghRadio2 = gwinCreateRadio(NULL, &wi, GROUP_R1R2);
-
- // Image
- wi.g.x = ScrWidth-210; wi.g.y = TAB_HEIGHT + 10; wi.g.width = 200; wi.g.height = 200;
- ghImage1 = gwinImageCreate(NULL, &wi);
- gwinImageOpenMemory(ghImage1, image_chibios);
- gwinImageCache(ghImage1);
-
- // Console - we apply some special colors before making it visible
- wi.g.width = ScrWidth/2-1; wi.g.height = ScrHeight/2-1;
- wi.g.x = ScrWidth/2+1; wi.g.y = ScrHeight/2+1;
- ghConsole = gwinCreateConsole(NULL, &wi.g);
- gwinSetColor(ghConsole, Yellow);
- gwinSetBgColor(ghConsole, Black);
- }
+ createWidgets();
- // Assign toggles and dials to the buttons & sliders etc.
+ // Assign toggles and dials to specific buttons & sliders etc.
#if GINPUT_NEED_TOGGLE
gwinAttachToggle(ghButton1, 0, 0);
gwinAttachToggle(ghButton2, 0, 1);
@@ -158,8 +252,12 @@ int main(void) {
gwinSetVisible(ghConsole, TRUE);
gwinClear(ghConsole);
- // Press the Buttons Tab
- gwinPressRadio(ghTabButtons);
+ // We want to listen for widget events
+ geventListenerInit(&gl);
+ gwinAttachListener(&gl);
+
+ // Press the Tab we want visible
+ gwinRadioPress(ghTabButtons);
while(1) {
// Get an Event
@@ -169,54 +267,68 @@ int main(void) {
case GEVENT_GWIN_BUTTON:
gwinPrintf(ghConsole, "Button %s\n", gwinGetText(((GEventGWinButton *)pe)->button));
break;
+
case GEVENT_GWIN_SLIDER:
gwinPrintf(ghConsole, "Slider %s=%d\n", gwinGetText(((GEventGWinSlider *)pe)->slider), ((GEventGWinSlider *)pe)->position);
break;
+
case GEVENT_GWIN_CHECKBOX:
gwinPrintf(ghConsole, "Checkbox %s=%s\n", gwinGetText(((GEventGWinCheckbox *)pe)->checkbox), ((GEventGWinCheckbox *)pe)->isChecked ? "Checked" : "UnChecked");
+
+ // If it is the Disable All checkbox then do that.
+ if (((GEventGWinCheckbox *)pe)->checkbox == ghCheckDisableAll) {
+ gwinPrintf(ghConsole, "%s All\n", ((GEventGWinCheckbox *)pe)->isChecked ? "Disable" : "Enable");
+ setEnabled(!((GEventGWinCheckbox *)pe)->isChecked);
+ }
break;
+
case GEVENT_GWIN_RADIO:
gwinPrintf(ghConsole, "Radio Group %u=%s\n", ((GEventGWinRadio *)pe)->group, gwinGetText(((GEventGWinRadio *)pe)->radio));
- // Is this the tab radio's
- if (((GEventGWinRadio *)pe)->group == GROUP_TABS) {
-
- // Do some special animation for Label1
- if (((GEventGWinRadio *)pe)->radio == ghTabLabels) {
- gwinSetBgColor(ghLabel1, gwinGetDefaultBgColor());
- gwinSetColor(ghLabel1, gwinGetDefaultColor());
- }
+ switch(((GEventGWinRadio *)pe)->group) {
+ case GROUP_TABS:
// Set control visibility depending on the tab selected
- gwinSetVisible(ghButton1, ((GEventGWinRadio *)pe)->radio == ghTabButtons);
- gwinSetVisible(ghButton2, ((GEventGWinRadio *)pe)->radio == ghTabButtons);
- gwinSetVisible(ghButton3, ((GEventGWinRadio *)pe)->radio == ghTabButtons);
- gwinSetVisible(ghButton4, ((GEventGWinRadio *)pe)->radio == ghTabButtons);
- gwinSetVisible(ghSlider1, ((GEventGWinRadio *)pe)->radio == ghTabSliders);
- gwinSetVisible(ghSlider2, ((GEventGWinRadio *)pe)->radio == ghTabSliders);
- gwinSetVisible(ghSlider3, ((GEventGWinRadio *)pe)->radio == ghTabSliders);
- gwinSetVisible(ghSlider4, ((GEventGWinRadio *)pe)->radio == ghTabSliders);
- gwinSetVisible(ghCheckbox1, ((GEventGWinRadio *)pe)->radio == ghTabCheckboxes);
- gwinSetVisible(ghCheckbox2, ((GEventGWinRadio *)pe)->radio == ghTabCheckboxes);
- gwinSetVisible(ghLabel1, ((GEventGWinRadio *)pe)->radio == ghTabLabels);
- gwinSetVisible(ghRadio1, ((GEventGWinRadio *)pe)->radio == ghTabRadios);
- gwinSetVisible(ghRadio2, ((GEventGWinRadio *)pe)->radio == ghTabRadios);
- gwinSetVisible(ghImage1, ((GEventGWinRadio *)pe)->radio == ghTabImages);
-
- // Do some special animation for Label1
+ setTab(((GEventGWinRadio *)pe)->radio);
+
+ // Do some special animation for Label1 to demonstrate auto width sizing
if (((GEventGWinRadio *)pe)->radio == ghTabLabels) {
+ gwinPrintf(ghConsole, "Change Label Text\n");
gfxSleepMilliseconds(1000);
- gwinSetBgColor(ghLabel1, Blue);
- gwinSetColor(ghLabel1, Yellow);
gwinSetText(ghLabel1, "Very Big Label", FALSE);
gfxSleepMilliseconds(1000);
- gwinSetBgColor(ghLabel1, Yellow);
- gwinSetColor(ghLabel1, Red);
- gwinSetText(ghLabel1, "L1", FALSE);
+ gwinSetText(ghLabel1, "Label", FALSE);
}
+ break;
+
+ case GROUP_COLORS:
+ {
+ const GWidgetStyle *pstyle;
+
+ gwinPrintf(ghConsole, "Change Color Scheme\n");
+
+ if (((GEventGWinRadio *)pe)->radio == ghRadioYellow)
+ pstyle = &YellowWidgetStyle;
+ else if (((GEventGWinRadio *)pe)->radio == ghRadioBlack)
+ pstyle = &BlackWidgetStyle;
+ else
+ pstyle = &WhiteWidgetStyle;
+
+ // Clear the screen to the new color - we avoid the console area as it can't redraw itself
+ #if GDISP_NEED_CLIP
+ gdispUnsetClip();
+ #endif
+ gdispFillArea(0, 0, ScrWidth, ScrHeight/2, pstyle->background);
+ gdispFillArea(0, ScrHeight/2, ScrWidth/2, ScrHeight/2, pstyle->background);
+
+ // Update the style on all controls
+ gwinSetDefaultStyle(pstyle, TRUE);
+ }
+ break;
}
break;
+
default:
gwinPrintf(ghConsole, "Unknown %d\n", pe->type);
break;
diff --git a/demos/modules/gwin/widgets/readme.txt b/demos/modules/gwin/widgets/readme.txt
index 02d733e9..b5777061 100644
--- a/demos/modules/gwin/widgets/readme.txt
+++ b/demos/modules/gwin/widgets/readme.txt
@@ -1,6 +1,8 @@
-This demo supports input from both a mouse/touch and/or a dial input.
+This demo supports input from both a mouse/touch, toggles and/or a dial input.
If your platform does not support one or the other, turn it off in
gfxconf.h
Note that you will need to include the drivers into your project
makefile for whichever inputs you decide to use.
+
+For some fun have a play with the "colors" radio group and the "Disable All" checkbox.