diff options
author | Abhishek Kumar <abhishek@kumar> | 2013-05-23 23:38:57 +0700 |
---|---|---|
committer | Abhishek Kumar <abhishek@kumar> | 2013-05-23 23:38:57 +0700 |
commit | e52cb141b71e35d3bf65222afb98e12b1935789b (patch) | |
tree | 39b6fa0bd051f274cdacc1925f262bc1a81b4c5e /demos/3rdparty/notepad-2/notepadApp.c | |
parent | 4e7c1b00caecba9e2dca16aab3ec5c16973dd93c (diff) | |
download | uGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.tar.gz uGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.tar.bz2 uGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.zip |
New Notepad-2 Demo for ChibiOS/GFX
See demos/3rdparty/notepad-2/readme.txt for more details.
Diffstat (limited to 'demos/3rdparty/notepad-2/notepadApp.c')
-rw-r--r-- | demos/3rdparty/notepad-2/notepadApp.c | 471 |
1 files changed, 471 insertions, 0 deletions
diff --git a/demos/3rdparty/notepad-2/notepadApp.c b/demos/3rdparty/notepad-2/notepadApp.c new file mode 100644 index 00000000..a89b7bf0 --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadApp.c @@ -0,0 +1,471 @@ +/* + * File: notepadApp.c + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * 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. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * 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 "ch.h" +#include "hal.h" +#include "gfx.h" + +#include "chprintf.h" + +#include "notepadApp.h" +#include "toolbarIcons.h" + +// Get the handle for a window object +#define H(obj) ((GHandle)&obj) + +// Static objects +static GListener gl; // Event listener object +static GHandle nDrawingArea; // GWindow Drawing Area +static BaseSequentialStream *gstatusConsole; // GConsole Handle to the Status Bar + +static GEventMouse curPtr; // Holder for current pointer location + +static font_t font; +static coord_t swidth, sheight; + +// The toolbar buttons - Self-Explanatory +static GButtonObject btnNew, btnOpen, btnSave; +static GButtonObject btnColorBar; +static GButtonObject btnColorBarSel; + +static GButtonObject btnPencil, btnFill, btnEraser; + +static GButtonObject btnClose; +/* static GButtonObject btnYes, btnNo; // Reserved for future use */ + +// Image object +static gdispImage toolbarImageFilmstrip; + +static color_t myColors[] = { Black, Red, Green, Blue, Cyan, Magenta, Yellow, White }; + +static color_t selColor = Black; +static int selColorIndex = 0, selPenWidth = 1, tbMode = 1; + +static NColorScheme nCurColorScheme; + +static msg_t notepadThread(void *param); + +// Custom drawing functions for the buttons +static void nbtnColorBarDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + #define ccs nCurColorScheme + + int i, j, k; + + (void)txt; + (void)pstyle; + (void)param; + (void)enabled; + + ginputGetMouseStatus(0, &curPtr); + + // Draw the toolbars according to the mode + if (tbMode == 0) { + k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); + + for (i = 0; i < 8; i++) { + j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; + + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k >= 0 && k <= 7) { + selPenWidth = k + 1; + ncoreSetPenWidth((uint8_t) selPenWidth); + } + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); + } + + gdispFillCircle(j, gh->y + 10, i + 1, myColors[selColorIndex]); + } + + } else { + k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); + + for (i = 0; i < 8; i++) { + j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; + + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k >= 0 && k <= 7) { + selColorIndex = k; + selColor = myColors[k]; + ncoreSetPenColor(selColor); + } + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + k == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selColorIndex == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selColorIndex == i ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); + } + + gdispFillCircle(j, gh->y + (NPAD_TOOLBAR_BTN_HEIGHT / 2), 3, myColors[i] ); + } + } + + + #undef ccs +} + +static void nbtnColorBarSelDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { +#define ccs nCurColorScheme + + int i, j = 0, k; + color_t ca, cb; + GEventMouse ptr; + + (void)txt; + (void)pstyle; + (void)param; + (void)enabled; + + // Get a copy of the pointer location + ginputGetMouseStatus(0, &ptr); + + // Get which button the pointer is on right now + k = (ptr.x - gh->x) / NPAD_TOOLBAR_BTN_WIDTH; + + gdispDrawBox(gh->x, gh->y, gh->width, gh->height, ccs.toolbarBgUnsel); + gdispDrawBox(gh->x + 1, gh->y + 1, gh->width - 2, gh->height - 2, ccs.toolbarBgUnsel); + + for (i = 0; i < 2; i++) { + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k == 0 || k == 1) { + tbMode = k; + j = 1; + } + + ca = (tbMode == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + ca = (tbMode == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + } + + cb = (tbMode == i ? ccs.toolbarSeparator : ccs.toolbarBgUnsel); + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, + gh->y, + NPAD_TOOLBAR_BTN_WIDTH, + NPAD_TOOLBAR_BTN_HEIGHT, + ca); + + gdispImageSetBgColor(&toolbarImageFilmstrip, ca); + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, cb); + + /* Draw both the icons */ + gwinImageDraw(gh, &toolbarImageFilmstrip, + 2 + NPAD_TOOLBAR_BTN_WIDTH * i, + 2, + NPAD_ICON_WIDTH, + NPAD_ICON_HEIGHT, + NPAD_ICON_START(3 + i), + 0); + } + + if (j) + gwinButtonDraw(H(btnColorBar)); + + #undef ccs +} + +static void nToolbarImageButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + (void)txt; (void)pstyle; (void)isenabled; + + color_t cl = isdown ? nCurColorScheme.toolbarBgActive : nCurColorScheme.toolbarBgUnsel; + + gdispImageSetBgColor(&toolbarImageFilmstrip, cl); + gdispFillArea(gh->x, gh->y, gh->width, gh->height, cl); + gwinImageDraw(gh, &toolbarImageFilmstrip, 2, 2, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START((int) param), 0); + + if (isdown || ((int)param - 5) == ncoreGetMode()) + gdispDrawBox(gh->x, gh->y, gh->width, gh->height, nCurColorScheme.toolbarSeparator); +} + +static void nCloseButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + gwinImageDraw(gh, &toolbarImageFilmstrip, 0, 0, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START(8), 0); +} + +static void initButtons(void) { + + /* Init all the button objects */ + gwinCreateButton(&btnNew, NPAD_TOOLBAR_1_X(0), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnOpen, NPAD_TOOLBAR_1_X(1), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnSave, NPAD_TOOLBAR_1_X(2), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnColorBarSel, NPAD_COLORBAR_SEL_X, NPAD_COLORBAR_SEL_Y, NPAD_COLORBAR_SEL_WIDTH, NPAD_COLORBAR_SEL_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnColorBar, NPAD_COLORBAR_X, NPAD_TOOLBAR_1_Y, NPAD_COLORBAR_WIDTH, NPAD_COLORBAR_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnPencil, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(0), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnEraser, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(1), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnFill, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(2), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnClose, swidth - 18, 0, 16, 16, font, GBTN_CUSTOM); + + /* Attach custom renders */ + gwinSetButtonCustom(H(btnNew), nToolbarImageButtonDraw, (void *)0); + gwinSetButtonCustom(H(btnOpen), nToolbarImageButtonDraw, (void *)1); + gwinSetButtonCustom(H(btnSave), nToolbarImageButtonDraw, (void *)2); + + gwinSetButtonCustom(H(btnColorBar), nbtnColorBarDraw, (void *)0); + gwinSetButtonCustom(H(btnColorBarSel), nbtnColorBarSelDraw, (void *)0); + + gwinSetButtonCustom(H(btnPencil), nToolbarImageButtonDraw, (void *)5); + gwinSetButtonCustom(H(btnEraser), nToolbarImageButtonDraw, (void *)6); + gwinSetButtonCustom(H(btnFill), nToolbarImageButtonDraw, (void *)7); + gwinSetButtonCustom(H(btnClose), nCloseButtonDraw, (void *)0); + + /* Attach listeners */ + geventAttachSource(&gl, gwinGetButtonSource(H(btnNew)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnOpen)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnSave)), 0); + + geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBar)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBarSel)), 0); + + geventAttachSource(&gl, gwinGetButtonSource(H(btnPencil)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnEraser)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnFill)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnClose)), 0); + + /* Give listeners access to touch events */ + gwinAttachButtonMouse(H(btnNew), 0); + gwinAttachButtonMouse(H(btnOpen), 0); + gwinAttachButtonMouse(H(btnSave), 0); + + gwinAttachButtonMouse(H(btnColorBar), 0); + gwinAttachButtonMouse(H(btnColorBarSel), 0); + + gwinAttachButtonMouse(H(btnPencil), 0); + gwinAttachButtonMouse(H(btnEraser), 0); + gwinAttachButtonMouse(H(btnFill), 0); + gwinAttachButtonMouse(H(btnClose), 0); + +} + +static void drawButtons(void) { + gwinButtonDraw(H(btnNew)); + gwinButtonDraw(H(btnOpen)); + gwinButtonDraw(H(btnSave)); + + gwinButtonDraw(H(btnColorBar)); + gwinButtonDraw(H(btnColorBarSel)); + + gwinButtonDraw(H(btnClose)); +} + +static void drawVButtons(void) { + gwinButtonDraw(H(btnPencil)); + gwinButtonDraw(H(btnEraser)); + gwinButtonDraw(H(btnFill)); +} + +static WORKING_AREA(waNotepadThread, NPAD_THD_WA_SIZE); +static msg_t notepadThread(void *param) { + + GEventMouse *pem; + GEventGWinButton *peb; + GHandle ghc; + + (void)param; + + /* Get the display dimensions */ + swidth = gdispGetWidth(); + sheight = gdispGetHeight(); + + font = gdispOpenFont("UI2"); + + /* Initialize the mouse */ + geventListenerInit(&gl); + ginputGetMouse(0); + + initButtons(); + + /* Configure the GIF decoder with the toolbar Icon images */ + gdispImageSetMemoryReader(&toolbarImageFilmstrip, toolbarIcons); + gdispImageOpen(&toolbarImageFilmstrip); + + /* Set clip to the entire screen */ + gdispSetClip(0, 0, swidth, sheight); + + /* Clear the screen with the window background + * Also, draw the title bars */ + gdispClear(nCurColorScheme.winBgColor); + gdispDrawBox(0, 0, swidth, sheight, nCurColorScheme.titleBarColor); + gdispFillArea(0, 0, swidth, NPAD_TITLEBAR_HEIGHT, nCurColorScheme.titleBarColor); + gdispDrawStringBox(NPAD_TITLETEXT_START_X, + NPAD_TITLETEXT_START_Y, + swidth, + NPAD_TITLEBAR_HEIGHT, + NPAD_TITLETEXT_STR, + font, + nCurColorScheme.titleTextColor, + justifyLeft); + + /* Create the drawing window, draw its border */ + gdispDrawBox(NPAD_DRAWING_AREA_START_X - 1, + NPAD_DRAWING_AREA_START_Y - 1, + NPAD_DRAWING_AREA_WIDTH + 2, + NPAD_DRAWING_AREA_HEIGHT + 2, + nCurColorScheme.drawingWinBorder); + + nDrawingArea = gwinCreateWindow(NULL, + NPAD_DRAWING_AREA_START_X, + NPAD_DRAWING_AREA_START_Y, + NPAD_DRAWING_AREA_WIDTH, + NPAD_DRAWING_AREA_HEIGHT); + + /* Create the bottom status bar console */ + ghc = gwinCreateConsole(NULL, + NPAD_STATUSBAR_START_X, + NPAD_STATUSBAR_START_Y, + NPAD_STATUSBAR_WIDTH, + NPAD_STATUSBAR_HEIGHT, + font); + + gdispImageDraw(&toolbarImageFilmstrip, + NPAD_STATUSBAR_ICON_START_X, + NPAD_STATUSBAR_ICON_START_Y, + NPAD_ICON_WIDTH, + NPAD_ICON_HEIGHT, + NPAD_ICON_START(12), + 0); + + gwinSetBgColor(ghc, nCurColorScheme.winBgColor); + gwinSetColor(ghc, Black); + + gstatusConsole = gwinGetConsoleStream(ghc); + + /* draw the buttons */ + gwinSetColor(nDrawingArea, Black); + gwinSetBgColor(nDrawingArea, White); + + gwinClear(nDrawingArea); + gwinClear(ghc); + + drawButtons(); + drawVButtons(); + + chprintf(gstatusConsole, "Welcome to ChibiOS/GFX Notepad demo."); + + ncoreSpawnDrawThread(nDrawingArea, gstatusConsole); + + while(TRUE) { + pem = (GEventMouse *) geventEventWait(&gl, TIME_INFINITE); + + /* button pressed... */ + if (pem->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pem; + + if (peb->button == H(btnNew)) { + // Reset all the settings + selColorIndex = 0; + selPenWidth = 0; + ncoreSetMode(NCORE_MODE_DRAW); + + gwinSetColor(nDrawingArea, Black); + gwinSetBgColor(nDrawingArea, White); + + // Refresh the buttons + drawButtons(); + drawVButtons(); + + gwinClear(nDrawingArea); + chprintf(gstatusConsole, "\nScreen Cleared."); + } + else if (peb->button == H(btnOpen)) { + chprintf(gstatusConsole, "\nFile Open not implemented."); + } + else if (peb->button == H(btnSave)) { + chprintf(gstatusConsole, "\nFile Save not implemented."); + } + else if (peb->button == H(btnPencil)) { + ncoreSetMode(NCORE_MODE_DRAW); + drawVButtons(); + chprintf(gstatusConsole, "\nPencil Tool Selected."); + } + else if (peb->button == H(btnEraser)) { + ncoreSetMode(NCORE_MODE_ERASE); + drawVButtons(); + chprintf(gstatusConsole, "\nEraser Tool Selected."); + } + else if (peb->button == H(btnFill)) { + ncoreSetMode(NCORE_MODE_FILL); + drawVButtons(); + chprintf(gstatusConsole, "\nFill Tool Selected."); + } + else if (peb->button == H(btnClose)) { + break; + } + } + } + + gwinDestroyWindow(ghc); + // No need to destroy the buttons as they are statically allocated + gdispCloseFont(font); + ncoreTerminateDrawThread(); + gdispImageClose(&toolbarImageFilmstrip); + + return 0; +} + +// Public methods +void nSetColorScheme(NColorScheme sch) { nCurColorScheme = sch; } +NColorScheme nGetColorScheme(void) { return nCurColorScheme; } + +Thread *nLaunchNotepadApp(void) { + + return chThdCreateStatic(waNotepadThread, + sizeof(waNotepadThread), + NPAD_THD_PRIO, + notepadThread, NULL); + +} |