diff --git a/demos/modules/gwin/widgets/main.c b/demos/modules/gwin/widgets/main.c index 7845ba69..2102d3a2 100644 --- a/demos/modules/gwin/widgets/main.c +++ b/demos/modules/gwin/widgets/main.c @@ -1,22 +1,29 @@ /* - ChibiOS/GFX - Copyright (C) 2012, 2013 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu + * 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 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 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" @@ -31,7 +38,7 @@ static GHandle ghCheckbox1, ghCheckbox2; #define BUTTON_WIDTH 50 #define BUTTON_HEIGHT 30 -#define SLIDER_WIDTH 10 +#define SLIDER_WIDTH 20 #define CHECKBOX_WIDTH 80 #define CHECKBOX_HEIGHT 20 @@ -42,48 +49,51 @@ int main(void) { gfxInit(); gdispClear(White); - // Set the font + // Set the font and defalt colors gwinSetDefaultFont(gdispOpenFont("UI2")); + gwinSetDefaultColor(Black); + gwinSetDefaultBgColor(White); // Create out gwin windows/widgets + ghConsole = gwinCreateConsole(NULL, ScrWidth/2+1, ScrHeight/2+1, ScrWidth/2-1, ScrHeight/2-1); ghButton1 = gwinCreateButton(NULL, 0+0*(BUTTON_WIDTH+1), 0, BUTTON_WIDTH, BUTTON_HEIGHT); ghButton2 = gwinCreateButton(NULL, 0+1*(BUTTON_WIDTH+1), 0, BUTTON_WIDTH, BUTTON_HEIGHT); ghButton3 = gwinCreateButton(NULL, 0+2*(BUTTON_WIDTH+1), 0, BUTTON_WIDTH, BUTTON_HEIGHT); ghButton4 = gwinCreateButton(NULL, 0+3*(BUTTON_WIDTH+1), 0, BUTTON_WIDTH, BUTTON_HEIGHT); - ghConsole = gwinCreateConsole(NULL, ScrWidth/2+1, ScrHeight/2+1, ScrWidth/2-1, ScrHeight/2-1); ghSlider1 = gwinCreateSlider(NULL, ScrWidth/2+1, ScrHeight/2-2*(SLIDER_WIDTH+1), ScrWidth/2-2, SLIDER_WIDTH); ghSlider2 = gwinCreateSlider(NULL, ScrWidth/2+1, ScrHeight/2-1*(SLIDER_WIDTH+1), ScrWidth/2-2, SLIDER_WIDTH); - ghSlider3 = gwinCreateSlider(NULL, 0+1*(SLIDER_WIDTH+1), ScrHeight/2+1, SLIDER_WIDTH, ScrHeight/2-2); + ghSlider3 = gwinCreateSlider(NULL, 0+0*(SLIDER_WIDTH+1), ScrHeight/2+1, SLIDER_WIDTH, ScrHeight/2-2); ghSlider4 = gwinCreateSlider(NULL, 0+1*(SLIDER_WIDTH+1), ScrHeight/2+1, SLIDER_WIDTH, ScrHeight/2-2); ghCheckbox1 = gwinCreateCheckbox(NULL, 0, BUTTON_HEIGHT+1, CHECKBOX_WIDTH, CHECKBOX_HEIGHT); ghCheckbox2 = gwinCreateCheckbox(NULL, 0, BUTTON_HEIGHT+1+1*(CHECKBOX_HEIGHT+1), CHECKBOX_WIDTH, CHECKBOX_HEIGHT); - // Color everything + // Color everything and set special drawing for some widgets gwinSetColor(ghConsole, Yellow); gwinSetBgColor(ghConsole, Black); + gwinSetCustomDraw(ghCheckbox2, gwinCheckboxDraw_CheckOnRight, 0); // Set the text on all the controls gwinSetText(ghButton1, "B1", FALSE); - gwinSetText(ghButton2, "B2", FALSE); - gwinSetText(ghButton3, "B3", FALSE); - gwinSetText(ghButton4, "B4", FALSE); - gwinSetText(ghSlider1, "S1", FALSE); - gwinSetText(ghSlider2, "S2", FALSE); - gwinSetText(ghSlider3, "S3", FALSE); - gwinSetText(ghSlider4, "S4", FALSE); - gwinSetText(ghCheckbox1, "C1", FALSE); - gwinSetText(ghCheckbox2, "C2", FALSE); + gwinSetText(ghButton2, "B2", FALSE); + gwinSetText(ghButton3, "B3", FALSE); + gwinSetText(ghButton4, "B4", FALSE); + gwinSetText(ghSlider1, "S1", FALSE); + gwinSetText(ghSlider2, "S2", FALSE); + gwinSetText(ghSlider3, "S3", FALSE); + gwinSetText(ghSlider4, "S4", FALSE); + gwinSetText(ghCheckbox1, "C1", FALSE); + gwinSetText(ghCheckbox2, "C2", FALSE); // Assign the mouse and dials to the buttons & sliders etc. #if GINPUT_NEED_MOUSE - gwinAttachMouse(ghSlider1, 0); - gwinAttachMouse(ghSlider2, 0); - gwinAttachMouse(ghSlider3, 0); - gwinAttachMouse(ghSlider4, 0); gwinAttachMouse(ghButton1, 0); gwinAttachMouse(ghButton2, 0); gwinAttachMouse(ghButton3, 0); gwinAttachMouse(ghButton4, 0); + gwinAttachMouse(ghSlider1, 0); + gwinAttachMouse(ghSlider2, 0); + gwinAttachMouse(ghSlider3, 0); + gwinAttachMouse(ghSlider4, 0); gwinAttachMouse(ghCheckbox1, 0); gwinAttachMouse(ghCheckbox2, 0); #endif @@ -94,29 +104,29 @@ int main(void) { // We want to listen for widget events geventListenerInit(&gl); - gwinAttachListener(ghSlider1, &gl, 0); - gwinAttachListener(ghSlider2, &gl, 0); - gwinAttachListener(ghSlider3, &gl, 0); - gwinAttachListener(ghSlider4, &gl, 0); gwinAttachListener(ghButton1, &gl, 0); gwinAttachListener(ghButton2, &gl, 0); gwinAttachListener(ghButton3, &gl, 0); gwinAttachListener(ghButton4, &gl, 0); + gwinAttachListener(ghSlider1, &gl, 0); + gwinAttachListener(ghSlider2, &gl, 0); + gwinAttachListener(ghSlider3, &gl, 0); + gwinAttachListener(ghSlider4, &gl, 0); gwinAttachListener(ghCheckbox1, &gl, 0); gwinAttachListener(ghCheckbox2, &gl, 0); // Draw everything on the screen - gwinClear(ghConsole); - gwinDraw(ghSlider1); - gwinDraw(ghSlider2); - gwinDraw(ghSlider3); - gwinDraw(ghSlider4); - gwinDraw(ghButton1); - gwinDraw(ghButton2); - gwinDraw(ghButton3); - gwinDraw(ghButton4); - gwinDraw(ghCheckbox1); - gwinDraw(ghCheckbox2); + gwinClear(ghConsole); + gwinDraw(ghButton1); + gwinDraw(ghButton2); + gwinDraw(ghButton3); + gwinDraw(ghButton4); + gwinDraw(ghSlider1); + gwinDraw(ghSlider2); + gwinDraw(ghSlider3); + gwinDraw(ghSlider4); + gwinDraw(ghCheckbox1); + gwinDraw(ghCheckbox2); while(1) { // Get an Event diff --git a/include/gwin/gwin.h b/include/gwin/gwin.h index e7c164dc..7a6aba09 100644 --- a/include/gwin/gwin.h +++ b/include/gwin/gwin.h @@ -127,6 +127,22 @@ const char *gwinGetClassName(GHandle gh); */ #define gwinGetHeight(gh) ((gh)->height) +/** + * @brief Set the default foreground color for all new GWIN windows + * + * @param[in] gh The window + * @param[in] clr The color to be set + */ +void gwinSetDefaultColor(color_t clr); + +/** + * @brief Set the default background color for all new GWIN windows + * + * @param[in] gh The window + * @param[in] bgclr The background color + */ +void gwinSetDefaultBgColor(color_t bgclr); + /** * @brief Set foreground color * @details Set the color which will be used to draw diff --git a/src/gwin/gwidget.c b/src/gwin/gwidget.c index 464210b7..3f23140c 100644 --- a/src/gwin/gwidget.c +++ b/src/gwin/gwidget.c @@ -39,7 +39,7 @@ static void gwidgetCallback(void *param, GEvent *pe) { case GEVENT_TOUCH: // Are we captured? if ((gw->g.flags & GWIN_FLG_MOUSECAPTURE)) { - if (pme->meta == GMETA_MOUSE_UP) { + if ((pme->last_buttons & ~pme->current_buttons & GINPUT_MOUSE_BTN_LEFT)) { gw->g.flags &= ~GWIN_FLG_MOUSECAPTURE; if (wvmt->MouseUp) wvmt->MouseUp(gw, pme->x - gw->g.x, pme->y - gw->g.y); @@ -48,7 +48,7 @@ static void gwidgetCallback(void *param, GEvent *pe) { wvmt->MouseMove(gw, pme->x - gw->g.x, pme->y - gw->g.y); // We are not captured - look for mouse downs over the widget - } else if (pme->meta == GMETA_MOUSE_DOWN + } else if ((~pme->last_buttons & pme->current_buttons & GINPUT_MOUSE_BTN_LEFT) && pme->x >= gw->g.x && pme->x < gw->g.x + gw->g.width && pme->y >= gw->g.y && pme->y < gw->g.y + gw->g.height) { gw->g.flags |= GWIN_FLG_MOUSECAPTURE; diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index fcbaa397..163e821d 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -18,6 +18,8 @@ static const gwinVMT basegwinVMT = { }; static font_t defaultFont; +static color_t defaultFgColor = White; +static color_t defaultBgColor = Black; // Internal routine for use by GWIN components only // Initialise a window creating it dynamicly if required. @@ -47,8 +49,8 @@ GHandle _gwinInit(GWindowObject *pgw, coord_t x, coord_t y, coord_t width, coord pgw->y = y; pgw->width = width; pgw->height = height; - pgw->color = White; - pgw->bgcolor = Black; + pgw->color = defaultFgColor; + pgw->bgcolor = defaultBgColor; #if GDISP_NEED_TEXT pgw->font = defaultFont; #endif @@ -74,6 +76,14 @@ const char *gwinGetClassName(GHandle gh) { return gh->vmt->classname; } +void gwinSetDefaultColor(color_t clr) { + defaultFgColor = clr; +} + +void gwinSetDefaultBgColor(color_t bgclr) { + defaultBgColor = bgclr; +} + #if GDISP_NEED_TEXT void gwinSetDefaultFont(font_t font) { defaultFont = font; diff --git a/src/gwin/slider.c b/src/gwin/slider.c index f18c665b..a0289d3d 100644 --- a/src/gwin/slider.c +++ b/src/gwin/slider.c @@ -107,10 +107,21 @@ static void MouseUp(GWidgetObject *gw, coord_t x, coord_t y) { #endif // Set the new position - if (gh->width < gh->height) - gsw->pos = (uint16_t)((uint32_t)(gh->height-1-y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); - else - gsw->pos = (uint16_t)((uint32_t)(x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); + if (gh->width < gh->height) { + if (y > gh->height-GWIN_SLIDER_DEAD_BAND) + gsw->pos = gsw->min; + else if (y < GWIN_SLIDER_DEAD_BAND) + gsw->pos = gsw->max; + else + gsw->pos = (uint16_t)((int32_t)(gh->height-1-y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); + } else { + if (x > gh->width-GWIN_SLIDER_DEAD_BAND) + gsw->pos = gsw->max; + else if (x < GWIN_SLIDER_DEAD_BAND) + gsw->pos = gsw->min; + else + gsw->pos = (uint16_t)((int32_t)(x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); + } ResetDisplayPos(gsw); gwinDraw(gh);