Start of game browser.

This commit is contained in:
Scott Duensing 2022-03-05 19:06:31 -06:00
parent 41df0f0e54
commit 185391ef2a
31 changed files with 758 additions and 393 deletions

View file

@ -70,6 +70,7 @@ HEADERS = \
$$SHARED/primes.h \
$$SHARED/packet.h \
$$SHARED/packets.h \
src/browser.h \
src/config.h \
$$SHARED/util.h \
src/file.h \
@ -125,6 +126,7 @@ SOURCES = \
$$SHARED/thirdparty/tiny-AES-c/aes.c \
$$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \
$$SHARED/memory.c \
src/browser.c \
src/file.c \
src/gui/msgbox.c \
src/gui/timer.c \

255
client/src/browser.c Normal file
View file

@ -0,0 +1,255 @@
/*
* Kangaroo Punch MultiPlayer Game Server Mark II
* Copyright (C) 2020-2021 Scott Duensing
*
* This program 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.
*
* This program 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 <https://www.gnu.org/licenses/>.
*
*/
#include "browser.h"
#include "taglist.h"
#include "msgbox.h"
#include "window.h"
#include "picture.h"
#include "button.h"
#include "frame.h"
#include "listbox.h"
#include "network.h"
static WindowT *_winBrowser = NULL;
static ButtonT *_btnBoxTab = NULL;
static ButtonT *_btnDescriptionTab = NULL;
static ButtonT *_btnInfoTab = NULL;
static ButtonT *_btnScreensTab = NULL;
static ButtonT *_btnSearchTab = NULL;
static uint8_t _channel = 0;
static FrameT *_fraBox = NULL;
static FrameT *_fraDescription = NULL;
static FrameT *_fraInfo = NULL;
static FrameT *_fraScreens = NULL;
static FrameT *_fraSearch = NULL;
static ListboxT *_lstDescription = NULL;
static ListboxT *_lstInfo = NULL;
static PictureT *_picBanner = NULL;
static PictureT *_picBox1 = NULL;
static PictureT *_picBox2 = NULL;
static PictureT *_picThumb1 = NULL;
static PictureT *_picThumb2 = NULL;
static PictureT *_picThumb3 = NULL;
static PictureT *_picThumb4 = NULL;
static PictureT *_picThumb5 = NULL;
static PictureT *_picThumb6 = NULL;
static void btnTabClick(WidgetT *widget);
static void packetHandler(PacketDecodeDataT *packet);
void browserShow(void) {
TagItemT uiBrowser[] = {
T_START,
T_WINDOW, O(_winBrowser),
T_TITLE, P("Game Browser"),
T_WIDTH, 525, T_HEIGHT, 323,
// SEARCH
T_BUTTON, O(_btnSearchTab),
T_X, 5, T_Y, 5,
T_TITLE, P("Search"),
T_CLICK, P(btnTabClick),
T_BUTTON, T_DONE,
T_FRAME, O(_fraSearch),
T_X, 5, T_Y, 32,
T_WIDTH, 500, T_HEIGHT, 250,
T_TITLE, P("Search"),
T_VISIBLE, T_FALSE,
T_FRAME, T_DONE,
// GAME
T_BUTTON, O(_btnDescriptionTab),
T_X, 78, T_Y, 5,
T_TITLE, P("Game"),
T_CLICK, P(btnTabClick),
T_BUTTON, T_DONE,
T_FRAME, O(_fraDescription),
T_X, 5, T_Y, 32,
T_WIDTH, 500, T_HEIGHT, 250,
T_TITLE, P("Description"),
T_VISIBLE, T_FALSE,
T_PICTURE, O(_picBanner),
T_X, 1, // 490PX wide
T_FILENAME, P("banner.png"),
T_PICTURE, T_DONE,
T_LISTBOX, O(_lstDescription),
T_X, 1, T_Y, 105,
T_WIDTH, 493, T_HEIGHT, 124, // Works out to 57 characters wide, 8 high.
T_LISTBOX, T_DONE,
T_FRAME, T_DONE,
// SCREENSHOTS
T_BUTTON, O(_btnScreensTab),
T_X, 135, T_Y, 5,
T_TITLE, P("Screens"),
T_CLICK, P(btnTabClick),
T_BUTTON, T_DONE,
T_FRAME, O(_fraScreens),
T_X, 5, T_Y, 32,
T_WIDTH, 500, T_HEIGHT, 250,
T_TITLE, P("Screenshots"),
T_VISIBLE, T_FALSE,
T_PICTURE, O(_picThumb1), // Thumbs are 160x100
T_X, 1, T_Y, 5,
T_FILENAME, P("thumb1.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picThumb2),
T_X, 167, T_Y, 5,
T_FILENAME, P("thumb2.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picThumb3),
T_X, 333, T_Y, 5,
T_FILENAME, P("thumb3.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picThumb4),
T_X, 1, T_Y, 116,
T_FILENAME, P("thumb4.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picThumb5),
T_X, 167, T_Y, 116,
T_FILENAME, P("thumb5.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picThumb6),
T_X, 333, T_Y, 116,
T_FILENAME, P("thumb6.png"),
T_PICTURE, T_DONE,
T_FRAME, T_DONE,
// BOX
T_BUTTON, O(_btnBoxTab),
T_X, 216, T_Y, 5,
T_TITLE, P("Box"),
T_CLICK, P(btnTabClick),
T_BUTTON, T_DONE,
T_FRAME, O(_fraBox),
T_X, 5, T_Y, 32,
T_WIDTH, 500, T_HEIGHT, 250,
T_TITLE, P("Packaging"),
T_VISIBLE, T_FALSE,
T_PICTURE, O(_picBox1), // Thumbs are 240x210
T_X, 1, T_Y, 5,
T_FILENAME, P("box1.png"),
T_PICTURE, T_DONE,
T_PICTURE, O(_picBox2),
T_X, 250, T_Y, 5,
T_FILENAME, P("box2.png"),
T_PICTURE, T_DONE,
T_FRAME, T_DONE,
// INFO
T_BUTTON, O(_btnInfoTab),
T_X, 265, T_Y, 5,
T_TITLE, P("Info"),
T_CLICK, P(btnTabClick),
T_BUTTON, T_DONE,
T_FRAME, O(_fraInfo),
T_X, 5, T_Y, 32,
T_WIDTH, 500, T_HEIGHT, 250,
T_TITLE, P("Information"),
T_VISIBLE, T_TRUE,
T_LISTBOX, O(_lstInfo),
T_X, 1, T_Y, 5,
T_WIDTH, 493, T_HEIGHT, 220, // Works out to 57 characters wide, 15 high.
T_LISTBOX, T_DONE,
T_FRAME, T_DONE,
T_WINDOW, T_DONE,
T_END
};
tagListRun(uiBrowser);
_channel = netChannelGet(packetHandler);
guiDebugAreaShow(W(_btnSearchTab));
guiDebugAreaShow(W(_btnDescriptionTab));
guiDebugAreaShow(W(_btnScreensTab));
guiDebugAreaShow(W(_btnBoxTab));
guiDebugAreaShow(W(_btnInfoTab));
// 123456789012345678901234567890123456789012345678901234567
listboxItemAdd(_lstDescription, "The Post-Terran Minerals Corporation (PTMC) digs up");
listboxItemAdd(_lstDescription, "minerals on all nine planets of the solar system,");
listboxItemAdd(_lstDescription, "employing humans and robots to do its job. Unfortunately,");
listboxItemAdd(_lstDescription, "the mining robots are now being controlled by a hacker,");
listboxItemAdd(_lstDescription, "and have taken the human workers hostage. The PTMC has");
listboxItemAdd(_lstDescription, "tried to get the robots back under their control, but");
listboxItemAdd(_lstDescription, "communication with the mining stations has been lost. In");
listboxItemAdd(_lstDescription, "desperation, the PTMC modifies a Pyro-GX ship for combat");
listboxItemAdd(_lstDescription, "and hires a mercenary, codenamed 'Material Defender', to");
listboxItemAdd(_lstDescription, "fly it. The mission is to destroy the infected mines and");
listboxItemAdd(_lstDescription, "rescue human hostages, destroying any hostile robot that");
listboxItemAdd(_lstDescription, "gets in the way.");
listboxItemAdd(_lstInfo, "123456789012345678901234567890123456789012345678901234567");
listboxItemAdd(_lstInfo, "2");
listboxItemAdd(_lstInfo, "3");
listboxItemAdd(_lstInfo, "4");
listboxItemAdd(_lstInfo, "5");
listboxItemAdd(_lstInfo, "6");
listboxItemAdd(_lstInfo, "7");
listboxItemAdd(_lstInfo, "8");
listboxItemAdd(_lstInfo, "9");
listboxItemAdd(_lstInfo, "10");
listboxItemAdd(_lstInfo, "11");
listboxItemAdd(_lstInfo, "12");
listboxItemAdd(_lstInfo, "13");
listboxItemAdd(_lstInfo, "14");
listboxItemAdd(_lstInfo, "15");
listboxItemAdd(_lstInfo, "16");
listboxItemAdd(_lstInfo, "17");
}
static void btnTabClick(WidgetT *widget) {
widgetVisibleSet(W(_fraBox), 0);
widgetVisibleSet(W(_fraDescription), 0);
widgetVisibleSet(W(_fraInfo), 0);
widgetVisibleSet(W(_fraScreens), 0);
widgetVisibleSet(W(_fraSearch), 0);
if (widget == W(_btnBoxTab)) widgetVisibleSet(W(_fraBox), 1);
if (widget == W(_btnDescriptionTab)) widgetVisibleSet(W(_fraDescription), 1);
if (widget == W(_btnInfoTab)) widgetVisibleSet(W(_fraInfo), 1);
if (widget == W(_btnScreensTab)) widgetVisibleSet(W(_fraScreens), 1);
if (widget == W(_btnSearchTab)) widgetVisibleSet(W(_fraSearch), 1);
}
static void packetHandler(PacketDecodeDataT *packet) {
}

31
client/src/browser.h Normal file
View file

@ -0,0 +1,31 @@
/*
* Kangaroo Punch MultiPlayer Game Server Mark II
* Copyright (C) 2020-2021 Scott Duensing
*
* This program 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.
*
* This program 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 <https://www.gnu.org/licenses/>.
*
*/
#ifndef BROWSER_H
#define BROWSER_H
#include "os.h"
void browserShow(void);
#endif // BROWSER_H

View file

@ -85,7 +85,7 @@ static void buttonMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
ButtonT *buttonNew(uint16_t x, uint16_t y, char *title, widgetCallback callback) {
ButtonT *button = (ButtonT *)malloc(sizeof(ButtonT));
WidgetT *widget = NULL;
uint16_t h = fontHeightGet(_guiFont) + (_guiMetric[METRIC_BUTTON_VERTICAL_PADDING] * 2) + (_guiMetric[METRIC_BUTTON_BEZEL_SIZE] * 2);
uint16_t h = fontHeightGet(__guiFont) + (__guiMetric[METRIC_BUTTON_VERTICAL_PADDING] * 2) + (__guiMetric[METRIC_BUTTON_BEZEL_SIZE] * 2);
if (!button) return NULL;
@ -116,19 +116,19 @@ static void buttonPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
active = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE);
if (enabled) {
highlight = active ? _guiColor[COLOR_BUTTON_SHADOW] : _guiColor[COLOR_BUTTON_HIGHLIGHT];
shadow = active ? _guiColor[COLOR_BUTTON_HIGHLIGHT] : _guiColor[COLOR_BUTTON_SHADOW];
background = _guiColor[COLOR_BUTTON_BACKGROUND];
text = _guiColor[COLOR_BUTTON_TEXT];
highlight = active ? __guiColor[COLOR_BUTTON_SHADOW] : __guiColor[COLOR_BUTTON_HIGHLIGHT];
shadow = active ? __guiColor[COLOR_BUTTON_HIGHLIGHT] : __guiColor[COLOR_BUTTON_SHADOW];
background = __guiColor[COLOR_BUTTON_BACKGROUND];
text = __guiColor[COLOR_BUTTON_TEXT];
} else {
highlight = active ? _guiColor[COLOR_BUTTON_SHADOW_DISABLED] : _guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED];
shadow = active ? _guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] : _guiColor[COLOR_BUTTON_SHADOW_DISABLED];
background = _guiColor[COLOR_BUTTON_BACKGROUND_DISABLED];
text = _guiColor[COLOR_BUTTON_TEXT_DISABLED];
highlight = active ? __guiColor[COLOR_BUTTON_SHADOW_DISABLED] : __guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED];
shadow = active ? __guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] : __guiColor[COLOR_BUTTON_SHADOW_DISABLED];
background = __guiColor[COLOR_BUTTON_BACKGROUND_DISABLED];
text = __guiColor[COLOR_BUTTON_TEXT_DISABLED];
}
// Draw bezel.
for (i=0; i<_guiMetric[METRIC_BUTTON_BEZEL_SIZE]; i++) {
for (i=0; i<__guiMetric[METRIC_BUTTON_BEZEL_SIZE]; i++) {
surfaceHighlightFrameDraw(pos.x + i, pos.y + i, pos.x + pos.w - i, pos.y + pos.h - i, highlight, shadow);
}
@ -136,13 +136,13 @@ static void buttonPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
surfaceRectangleFilledDraw(pos.x + i, pos.y + i, pos.x + pos.w - i, pos.y + pos.h - i, background);
// Draw title (depends on x from above).
fontRender(_guiFont, b->title, text, background, pos.x + i + _guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] + active, pos.y + i + _guiMetric[METRIC_BUTTON_VERTICAL_PADDING] + active);
fontRender(__guiFont, b->title, text, background, pos.x + i + __guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] + active, pos.y + i + __guiMetric[METRIC_BUTTON_VERTICAL_PADDING] + active);
}
void buttonTitleSet(ButtonT *button, char *title) {
if (button->title) free(button->title);
button->title = strdup(title);
button->base.pos.w = (strlen(title) * fontWidthGet(_guiFont)) + (_guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] * 2) + (_guiMetric[METRIC_BUTTON_BEZEL_SIZE] * 2);
button->base.pos.w = (strlen(title) * fontWidthGet(__guiFont)) + (__guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] * 2) + (__guiMetric[METRIC_BUTTON_BEZEL_SIZE] * 2);
GUI_SET_FLAG((WidgetT *)button, WIDGET_FLAG_DIRTY);
}

View file

@ -72,7 +72,7 @@ static void checkboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint1
CheckboxT *checkboxNew(uint16_t x, uint16_t y, char *title) {
CheckboxT *checkbox = (CheckboxT *)malloc(sizeof(CheckboxT));
WidgetT *widget = NULL;
uint16_t h = fontHeightGet(_guiFont);
uint16_t h = fontHeightGet(__guiFont);
if (!checkbox) return NULL;
@ -101,21 +101,21 @@ static void checkboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
active = checkboxValueGet(c);
if (enabled) {
highlight = active ? _guiColor[COLOR_CHECKBOX_SHADOW] : _guiColor[COLOR_CHECKBOX_HIGHLIGHT];
shadow = active ? _guiColor[COLOR_CHECKBOX_HIGHLIGHT] : _guiColor[COLOR_CHECKBOX_SHADOW];
fill = active ? _guiColor[COLOR_CHECKBOX_ACTIVE] : _guiColor[COLOR_CHECKBOX_INACTIVE];
text = _guiColor[COLOR_CHECKBOX_TEXT];
background = _guiColor[COLOR_WINDOW_BACKGROUND];
highlight = active ? __guiColor[COLOR_CHECKBOX_SHADOW] : __guiColor[COLOR_CHECKBOX_HIGHLIGHT];
shadow = active ? __guiColor[COLOR_CHECKBOX_HIGHLIGHT] : __guiColor[COLOR_CHECKBOX_SHADOW];
fill = active ? __guiColor[COLOR_CHECKBOX_ACTIVE] : __guiColor[COLOR_CHECKBOX_INACTIVE];
text = __guiColor[COLOR_CHECKBOX_TEXT];
background = __guiColor[COLOR_WINDOW_BACKGROUND];
} else {
highlight = active ? _guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] : _guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED];
shadow = active ? _guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] : _guiColor[COLOR_CHECKBOX_SHADOW_DISABLED];
fill = active ? _guiColor[COLOR_CHECKBOX_ACTIVE_DISABLED] : _guiColor[COLOR_CHECKBOX_INACTIVE_DISABLED];
text = _guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
background = _guiColor[COLOR_WINDOW_BACKGROUND];
highlight = active ? __guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] : __guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED];
shadow = active ? __guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] : __guiColor[COLOR_CHECKBOX_SHADOW_DISABLED];
fill = active ? __guiColor[COLOR_CHECKBOX_ACTIVE_DISABLED] : __guiColor[COLOR_CHECKBOX_INACTIVE_DISABLED];
text = __guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
background = __guiColor[COLOR_WINDOW_BACKGROUND];
}
// Checkbox is 10x10 pixels. Find offset based on font height.
o = (_guiFont->height - 10) * 0.5;
o = (__guiFont->height - 10) * 0.5;
// Draw outline of checkbox.
surfaceHighlightFrameDraw(pos.x, pos.y + o, pos.x + 10, pos.y + 10 + o, highlight, shadow);
@ -124,14 +124,14 @@ static void checkboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
surfaceRectangleFilledDraw(pos.x + 1, pos.y + o + 1, pos.x + 9, pos.y + + o + 9, fill);
// Draw title.
fontRender(_guiFont, c->title, text, background, pos.x + 10 + _guiMetric[METRIC_CHECKBOX_PADDING], pos.y);
fontRender(__guiFont, c->title, text, background, pos.x + 10 + __guiMetric[METRIC_CHECKBOX_PADDING], pos.y);
}
void checkboxTitleSet(CheckboxT *checkbox, char *title) {
if (checkbox->title) free(checkbox->title);
checkbox->title = strdup(title);
checkbox->base.pos.w = (strlen(title) * fontWidthGet(_guiFont)) + 10 + _guiMetric[METRIC_CHECKBOX_PADDING];
checkbox->base.pos.w = (strlen(title) * fontWidthGet(__guiFont)) + 10 + __guiMetric[METRIC_CHECKBOX_PADDING];
GUI_SET_FLAG((WidgetT *)checkbox, WIDGET_FLAG_DIRTY);
}

View file

@ -65,5 +65,5 @@ static void desktopPaint(WidgetT *desktop, uint8_t enabled, RectT pos) {
(void)pos;
(void)enabled;
surfaceClear(_guiColor[COLOR_DESKTOP]);
surfaceClear(__guiColor[COLOR_DESKTOP]);
}

View file

@ -67,10 +67,10 @@ static void framePaint(WidgetT *widget, uint8_t enabled, RectT pos) {
FrameT *f = (FrameT *)widget;
// Draw frame.
surfaceHighlightFrameDraw(pos.x, pos.y + (fontHeightGet(_guiFont) * 0.5), pos.x + pos.w, pos.y + pos.h, _guiColor[COLOR_FRAME_SHADOW], _guiColor[COLOR_FRAME_HIGHLIGHT]);
surfaceHighlightFrameDraw(pos.x, pos.y + (fontHeightGet(__guiFont) * 0.5), pos.x + pos.w, pos.y + pos.h, __guiColor[COLOR_FRAME_SHADOW], __guiColor[COLOR_FRAME_HIGHLIGHT]);
// Draw title.
fontRender(_guiFont, f->title, _guiColor[COLOR_FRAME_TEXT], _guiColor[COLOR_WINDOW_BACKGROUND], pos.x + 10, pos.y);
fontRender(__guiFont, f->title, __guiColor[COLOR_FRAME_TEXT], __guiColor[COLOR_WINDOW_BACKGROUND], pos.x + 10, pos.y);
}

View file

@ -25,6 +25,7 @@
#include "widget.h"
#include "desktop.h"
#include "window.h"
#include "msgbox.h"
typedef struct PendingEventsS {
@ -33,13 +34,32 @@ typedef struct PendingEventsS {
} PendingEventsT;
int16_t _guiMetric[METRIC_COUNT];
ColorT _guiColor[COLOR_COUNT];
FontT *_guiFont = NULL;
WidgetT *_guiDragWidget = NULL;
// Widget Magic Debug Info. Don't forget to change MagicE!
char *__guiMagicDebugNames[MAGIC_COUNT] = {
"Unknown",
"Desktop",
"Window",
"Button",
"Label",
"Checkbox",
"RadioButton",
"Picture",
"Frame",
"Textbox",
"Updown",
"Listbox",
"Terminal",
"Timer"
};
int16_t __guiMetric[METRIC_COUNT];
ColorT __guiColor[COLOR_COUNT];
FontT *__guiFont = NULL;
WidgetT *__guiDragWidget = NULL;
uint16_t _guiDragOffsetX = 0;
uint16_t _guiDragOffsetY = 0;
WindowT *_guiActiveWindow = NULL;
uint16_t __guiDragOffsetY = 0;
WindowT *__guiActiveWindow = NULL;
static DesktopT *_guiDesktop = NULL;
@ -59,23 +79,7 @@ static uint32_t _guiTimerQuarterSecondOn = 0;
static uint32_t _guiTimerHalfSecondOn = 0;
static uint32_t _guiTimerSecondOn = 0;
static PendingEventsT **_guiPendingEvents = NULL;
// Widget Magic Debug Info. Don't forget to change MagicE!
static char *_magicDebugNames[MAGIC_COUNT] = {
"Unknown",
"Desktop",
"Window",
"Button",
"Label",
"Checkbox",
"RadioButton",
"Picture",
"Frame",
"Textbox",
"Updown",
"Listbox",
"Terminal"
};
static void **_guiPendingFrees = NULL;
static void guiDeleteList(void);
@ -161,6 +165,13 @@ void guiComposite() {
}
}
}
// Process any pending delayed free events.
while (arrlen(_guiPendingFrees)) {
DEL(_guiPendingFrees[0]);
arrdel(_guiPendingFrees, 0);
}
arrfree(_guiPendingFrees);
}
@ -169,7 +180,7 @@ void guiDebugAreaShow(WidgetT *widget) {
guiWidgetBoundsDrawableOnScreenGet(widget, &r);
logWrite("%s: Size %dx%d Area %dx%d TL %dx%d BR %dx%d\n",
_magicDebugNames[widget->magic],
__guiMagicDebugNames[widget->magic],
widget->pos.w, widget->pos.h,
r.w, r.h,
widget->margin.x, widget->margin.y,
@ -187,7 +198,7 @@ void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth) {
logWrite("%s %s P:%dx%d-%dx%d M:%dx%d-%dx%d C:%dx%d-%dx%d F:%d\n",
line,
_magicDebugNames[widget->magic],
__guiMagicDebugNames[widget->magic],
widget->pos.x, widget->pos.y, widget->pos.w, widget->pos.h,
widget->margin.x, widget->margin.y, widget->margin.w, widget->margin.h,
widget->clip.x, widget->clip.y, widget->clip.w, widget->clip.h,
@ -202,6 +213,13 @@ void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth) {
}
void guiDelayedFree(void **pointer) {
// Delayed Free allows freeing of data that may be in use by the
// GUI system at a safe time. (After compositing.)
arrput(_guiPendingFrees, *pointer);
}
void guiDelete(WidgetT **widget) {
// Since deleting happens in widget events, it's not safe to do it
// immediately. Instead, we make a list of what to delete and
@ -316,6 +334,7 @@ void guiFocusSet(WidgetT *widget) {
}
// Change focus.
_guiFocused = widget;
logWrite("Focus is now on %s\n", __guiMagicDebugNames[widget->magic]);
// Tell new control it has focus.
if (_guiFocused) {
if (_guiFocused->focusMethod) _guiFocused->focusMethod(_guiFocused, 1);
@ -390,12 +409,12 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
sy = r.y;
guiMousePositionOnWidgetGet(widget, mouse, &mx, &my);
//logWrite("Mouse %dx%d Widget %s %dx%d Screen %dx%d\n", mouse->x, mouse->y, _magicDebugNames[widget->magic], mx, my, sx, sy);
//logWrite("Mouse %dx%d Widget %s %dx%d Screen %dx%d\n", mouse->x, mouse->y, __guiMagicDebugNames[widget->magic], mx, my, sx, sy);
// Serious hack to make window dragging work better.
// This is because it's possible to move the mouse faster than METRIC_WINDOW_TITLE_GRAB_HEIGHT pixels
// which causes it to switch widgets. So this prevents that.
if (widget->magic == MAGIC_WINDOW && widget == _guiDragWidget && mouse->buttonLeft && mouse->buttonLeftWasDown) {
if (widget->magic == MAGIC_WINDOW && widget == __guiDragWidget && mouse->buttonLeft && mouse->buttonLeftWasDown) {
widget->mouseEventMethod(widget, mouse, mx, my, MOUSE_EVENT_LEFT_HOLD);
return 1;
}
@ -408,8 +427,8 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
}
}
// Is the mouse inside this widget?
if (mouse->x >= sx && mouse->y >= sy && mouse->x < sx + widget->pos.w && mouse->y < sy + widget->pos.h) {
// Is the mouse inside this widget? (Ignore frames.)
if (mouse->x >= sx && mouse->y >= sy && mouse->x < sx + widget->pos.w && mouse->y < sy + widget->pos.h && widget->magic != MAGIC_FRAME) {
// Is this the same widget we were over before?
if (_guiLastWidgetLeft != widget) {
@ -444,8 +463,8 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
// Is there an event?
if (event != MOUSE_EVENT_NONE) {
// Does it belong to the active window? Or does it target a window? A desktop?
if (widget->window == _guiActiveWindow || widget->magic == MAGIC_WINDOW || widget->magic == MAGIC_DESKTOP) {
// Does it belong to the active window? Or does it target a window? A desktop? Something on the desktop?
if (widget->window == __guiActiveWindow || widget->magic == MAGIC_WINDOW || widget->magic == MAGIC_DESKTOP || widget->window == NULL) {
// Is there a mouse handler?
if (widget->mouseEventMethod) {
if (!GUI_GET_FLAG(widget, WIDGET_FLAG_DISABLED) && !GUI_GET_FLAG(widget, WIDGET_FLAG_HIDDEN)) {
@ -505,7 +524,6 @@ static void guiPaintChildren(WidgetT *widget) {
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
}
}
}
// Paint all children.
len = arrlenu(widget->children);
@ -514,6 +532,7 @@ static void guiPaintChildren(WidgetT *widget) {
guiPaintChildren(widget->children[x]);
}
}
}
}
@ -556,116 +575,117 @@ WidgetT *guiRootGet(void) {
void guiShutdown(void) {
// Unload fonts.
fontUnload(&_guiFont);
// Delete all widgets in GUI tree.
guiDelete((WidgetT **)&_guiDesktop);
guiDeleteList();
// Unload font.
fontUnload(&__guiFont);
}
DesktopT *guiStartup(void) {
_guiMetric[METRIC_BUTTON_BEZEL_SIZE] = 2;
_guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] = 8;
_guiMetric[METRIC_BUTTON_VERTICAL_PADDING] = 2;
__guiMetric[METRIC_BUTTON_BEZEL_SIZE] = 2;
__guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] = 8;
__guiMetric[METRIC_BUTTON_VERTICAL_PADDING] = 2;
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] = 4; // Does not include highlight or shadow lines.
_guiMetric[METRIC_WINDOW_TITLE_HEIGHT] = 17; // Does not include highlight or shadow lines.
_guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT] = _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + _guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 5; // Border, highlights, titlebar.
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] = 4; // Does not include highlight or shadow lines.
__guiMetric[METRIC_WINDOW_TITLE_HEIGHT] = 17; // Does not include highlight or shadow lines.
__guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT] = __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + __guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 5; // Border, highlights, titlebar.
_guiMetric[METRIC_CHECKBOX_PADDING] = 6; // Makes the 10 wide checkbox fill two character cells by padding it out to 16.
__guiMetric[METRIC_CHECKBOX_PADDING] = 6; // Makes the 10 wide checkbox fill two character cells by padding it out to 16.
_guiMetric[METRIC_RADIOBUTTON_PADDING] = 6; // Makes the 10 wide radio button fill two character cells by padding it out to 16.
__guiMetric[METRIC_RADIOBUTTON_PADDING] = 6; // Makes the 10 wide radio button fill two character cells by padding it out to 16.
_guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] = 2;
_guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] = 2;
_guiMetric[METRIC_TEXTBOX_PADDING] = 6; // Matches other label / widget padding.
__guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] = 2;
__guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] = 2;
__guiMetric[METRIC_TEXTBOX_PADDING] = 6; // Matches other label / widget padding.
_guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] = 2;
_guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] = 2;
_guiMetric[METRIC_UPDOWN_PADDING] = 6; // Matches other label / widget padding.
_guiMetric[METRIC_UPDOWN_ARROW_PADDING] = 2;
__guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] = 2;
__guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] = 2;
__guiMetric[METRIC_UPDOWN_PADDING] = 6; // Matches other label / widget padding.
__guiMetric[METRIC_UPDOWN_ARROW_PADDING] = 2;
_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] = 2;
_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] = 2;
__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] = 2;
__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] = 2;
_guiColor[COLOR_BUTTON_BACKGROUND] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_BUTTON_SHADOW] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_BUTTON_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_BUTTON_BACKGROUND] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_BUTTON_SHADOW] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_BUTTON_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_BUTTON_BACKGROUND_DISABLED] = vbeColorMake(124, 126, 124);
_guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
_guiColor[COLOR_BUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_BUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
__guiColor[COLOR_BUTTON_BACKGROUND_DISABLED] = vbeColorMake(124, 126, 124);
__guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
__guiColor[COLOR_BUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_BUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
_guiColor[COLOR_DESKTOP] = vbeColorMake( 51, 153, 255);
__guiColor[COLOR_DESKTOP] = vbeColorMake( 51, 153, 255);
_guiColor[COLOR_WINDOW_BACKGROUND] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_WINDOW_SHADOW] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_WINDOW_TITLE_ACTIVE] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_WINDOW_TITLE_INACTIVE] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_WINDOW_BACKGROUND] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_WINDOW_SHADOW] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_WINDOW_TITLE_ACTIVE] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_WINDOW_TITLE_INACTIVE] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_CHECKBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_CHECKBOX_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_CHECKBOX_ACTIVE] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_CHECKBOX_INACTIVE] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_CHECKBOX_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
_guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_CHECKBOX_ACTIVE_DISABLED] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_CHECKBOX_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
_guiColor[COLOR_CHECKBOX_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
__guiColor[COLOR_CHECKBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_CHECKBOX_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_CHECKBOX_ACTIVE] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_CHECKBOX_INACTIVE] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_CHECKBOX_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
__guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_CHECKBOX_ACTIVE_DISABLED] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_CHECKBOX_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
__guiColor[COLOR_CHECKBOX_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
_guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_RADIOBUTTON_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_RADIOBUTTON_ACTIVE] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_RADIOBUTTON_INACTIVE] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_RADIOBUTTON_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
_guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_RADIOBUTTON_ACTIVE_DISABLED] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_RADIOBUTTON_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
_guiColor[COLOR_RADIOBUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
__guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_RADIOBUTTON_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_RADIOBUTTON_ACTIVE] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_RADIOBUTTON_INACTIVE] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_RADIOBUTTON_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
__guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_RADIOBUTTON_ACTIVE_DISABLED] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_RADIOBUTTON_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
__guiColor[COLOR_RADIOBUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
_guiColor[COLOR_FRAME_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_FRAME_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_FRAME_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_FRAME_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_FRAME_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_FRAME_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_TEXTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_TEXTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_TEXTBOX_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_TEXTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_TEXTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_TEXTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_TEXTBOX_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_TEXTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_UPDOWN_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_UPDOWN_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_UPDOWN_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_UPDOWN_BACKGROUND] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
_guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_UPDOWN_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_UPDOWN_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_UPDOWN_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_UPDOWN_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_UPDOWN_BACKGROUND] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
__guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_UPDOWN_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
_guiColor[COLOR_LISTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_LISTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_LISTBOX_TEXT] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_LISTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_LISTBOX_SELECTED_TEXT] = vbeColorMake(248, 252, 248);
_guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND] = vbeColorMake( 0, 0, 0);
_guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
_guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
__guiColor[COLOR_LISTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_LISTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_LISTBOX_TEXT] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_LISTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_LISTBOX_SELECTED_TEXT] = vbeColorMake(248, 252, 248);
__guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND] = vbeColorMake( 0, 0, 0);
__guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
__guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
__guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
// Load font. ***TODO*** This should probably be provided by an API call to remove it from in here.
_guiFont = fontLoad(cacheFilenameGet("gui:vga8x14.dat"));
__guiFont = fontLoad(cacheFilenameGet("gui:vga8x14.dat"));
// Create desktop and return it. Remember it for later.
_guiDesktop = desktopNew();

View file

@ -180,19 +180,21 @@ typedef struct WidgetS WidgetT;
typedef struct WindowS WindowT;
extern int16_t _guiMetric[METRIC_COUNT];
extern ColorT _guiColor[COLOR_COUNT];
extern FontT *_guiFont;
extern WidgetT *_guiDragWidget;
extern int16_t __guiMetric[METRIC_COUNT];
extern ColorT __guiColor[COLOR_COUNT];
extern FontT *__guiFont;
extern WidgetT *__guiDragWidget;
extern uint16_t _guiDragOffsetX;
extern uint16_t _guiDragOffsetY;
extern WindowT *_guiActiveWindow;
extern uint16_t __guiDragOffsetY;
extern WindowT *__guiActiveWindow;
extern char *__guiMagicDebugNames[MAGIC_COUNT];
void guiAttach(WidgetT *parent, WidgetT *child);
void guiComposite(void);
void guiDebugAreaShow(WidgetT *widget);
void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth);
void guiDelayedFree(void **pointer);
void guiDelete(WidgetT **widget);
WidgetT *guiFocusGet(void);
void guiFocusSet(WidgetT *widget);

View file

@ -180,6 +180,24 @@ void imageRender(ImageT *image, uint16_t x, uint16_t y) {
}
void imageRenderHalf(ImageT *image, uint16_t x, uint16_t y) {
uint16_t x1;
uint16_t y1;
uint16_t x2 = image->width / 2;
uint16_t y2 = image->height / 2;
// Clip on right and bottom
if (x + x2 > surfaceWidthGet()) x2 -= x + x2 - surfaceWidthGet();
if (y + y2 > surfaceHeightGet()) y2 -= y + y2 - surfaceHeightGet();
for (y1=0; y1<y2; y1++) {
for (x1=0; x1<x2; x1++) {
surfacePutPixel(x + x1, y + y1, image->pixels[x1 * 2][y1 * 2]);
}
}
}
void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha) {
uint16_t x1;
uint16_t y1;

View file

@ -43,6 +43,7 @@ uint8_t imageInfoGet(char *filename, uint16_t *width, uint16_t *height);
ImageT *imageLoad(char *filename);
ColorT imagePixelGet(ImageT *image, uint16_t x, uint16_t y);
void imageRender(ImageT *image, uint16_t x, uint16_t y);
void imageRenderHalf(ImageT *image, uint16_t x, uint16_t y);
void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha);
void imageUnload(ImageT **image);
uint16_t imageWidthGet(ImageT *image);

View file

@ -63,8 +63,8 @@ WidgetT *labelInit(WidgetT *widget, char *title) {
l->base.paintMethod = labelPaint;
l->base.mouseEventMethod = labelMouseEvent;
l->title = NULL;
l->background = _guiColor[COLOR_WINDOW_BACKGROUND];
l->foreground = _guiColor[COLOR_LABEL_TEXT_INACTIVE];
l->background = __guiColor[COLOR_WINDOW_BACKGROUND];
l->foreground = __guiColor[COLOR_LABEL_TEXT_INACTIVE];
l->clicked = NULL;
labelTitleSet(l, title);
@ -103,7 +103,7 @@ static void labelMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_t
LabelT *labelNew(uint16_t x, uint16_t y, char *title) {
LabelT *label = (LabelT *)malloc(sizeof(LabelT));
WidgetT *widget = NULL;
uint16_t h = fontHeightGet(_guiFont);
uint16_t h = fontHeightGet(__guiFont);
if (!label) return NULL;
@ -125,13 +125,13 @@ static void labelPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
ColorT text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? l->active : l->foreground;
// Draw title.
fontRender(_guiFont, l->title, text, l->background, pos.x, pos.y);
fontRender(__guiFont, l->title, text, l->background, pos.x, pos.y);
}
void labelTitleSet(LabelT *label, char *title) {
if (label->title) free(label->title);
label->title = strdup(title);
label->base.pos.w = (strlen(title) * fontWidthGet(_guiFont));
label->base.pos.w = (strlen(title) * fontWidthGet(__guiFont));
GUI_SET_FLAG((WidgetT *)label, WIDGET_FLAG_DIRTY);
}

View file

@ -30,6 +30,7 @@ static uint16_t _valueTop = 0;
static uint16_t _valueBottom = 0;
static uint16_t _arrowWidth = 0;
static uint16_t _arrowStart = 0;
static uint8_t _hasTitle = 0;
static void listboxDel(WidgetT **widget);
@ -185,25 +186,29 @@ static void listboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16
len = arrlenu(l->values);
// Clicked item in listbox.
valueStart = 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING];
valueStart = 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING];
if (x > valueStart && x < valueStart + _valueWidth - 1 && y > _valueTop + 1 && y < _valueBottom - 1) {
o = (y - _valueTop) / fontHeightGet(_guiFont);
o = (y - _valueTop) / fontHeightGet(__guiFont);
if (o < len) l->selected = o;
if (_hasTitle) {
if (l->selected > _visibleY - 2) l->selected = _visibleY - 2; // Two because 1 is to correct _visibleY and the other 1 is because selected is zero based.
} else {
if (l->selected > _visibleY - 1) l->selected = _visibleY - 1; // One is because selected is zero based.
}
GUI_SET_FLAG(widget, WIDGET_FLAG_DIRTY);
}
_arrowStart += 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Left of up arrow
o = _valueTop + 1 + _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of arrows
_arrowStart += 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Left of up arrow
o = _valueTop + 1 + __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of arrows
// Did they click the up arrow?
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(_guiFont) && y >= o && y <= o + fontHeightGet(_guiFont)) {
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(__guiFont) && y >= o && y <= o + fontHeightGet(__guiFont)) {
listboxScrollUp(l);
}
// Did they click the down arrow?
o = _valueBottom - 1 - _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of down arrow
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(_guiFont) && y >= o - fontHeightGet(_guiFont) && y <= o) {
o = _valueBottom - 1 - __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of down arrow
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(__guiFont) && y >= o - fontHeightGet(__guiFont) && y <= o) {
listboxScrollDown(l);
}
@ -248,55 +253,59 @@ static void listboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
// How many items can we draw?
items = len - l->offset;
if (_hasTitle) {
if (items > _visibleY - 1) items = _visibleY - 1;
} else {
if (items > _visibleY) items = _visibleY;
}
// Draw title.
fontRender(_guiFont, l->title, _guiColor[COLOR_LISTBOX_TEXT], _guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y);
// Draw title, if it exists.
if (_hasTitle) fontRender(__guiFont, l->title, __guiColor[COLOR_LISTBOX_TEXT], __guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y);
// Draw outline of listbox.
surfaceHighlightFrameDraw(pos.x, _valueTop, pos.x + _valueWidth, _valueBottom, _guiColor[COLOR_LISTBOX_SHADOW], _guiColor[COLOR_LISTBOX_HIGHLIGHT]);
surfaceHighlightFrameDraw(pos.x, _valueTop, pos.x + _valueWidth, _valueBottom, __guiColor[COLOR_LISTBOX_SHADOW], __guiColor[COLOR_LISTBOX_HIGHLIGHT]);
// Draw background of listbox.
surfaceRectangleFilledDraw(pos.x + 1, _valueTop + 1, pos.x + _valueWidth - 1, _valueBottom - 1, _guiColor[COLOR_LISTBOX_BACKGROUND]);
surfaceRectangleFilledDraw(pos.x + 1, _valueTop + 1, pos.x + _valueWidth - 1, _valueBottom - 1, __guiColor[COLOR_LISTBOX_BACKGROUND]);
// Draw listbox contents.
o = _valueTop + 1 + _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING];
o = _valueTop + 1 + __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING];
for (i=0; i<items; i++) {
if (i == l->selected) {
surfaceRectangleFilledDraw(pos.x + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o, pos.x + _valueWidth - _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o + fontHeightGet(_guiFont) - 1, _guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND]);
fontRender(_guiFont, l->values[l->offset + i], _guiColor[COLOR_LISTBOX_SELECTED_TEXT], _guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND], pos.x + 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o);
surfaceRectangleFilledDraw(pos.x + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o, pos.x + _valueWidth - __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o + fontHeightGet(__guiFont) - 1, __guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND]);
fontRender(__guiFont, l->values[l->offset + i], __guiColor[COLOR_LISTBOX_SELECTED_TEXT], __guiColor[COLOR_LISTBOX_SELECTED_BACKGROUND], pos.x + 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o);
} else {
fontRender(_guiFont, l->values[l->offset + i], _guiColor[COLOR_LISTBOX_TEXT], _guiColor[COLOR_LISTBOX_BACKGROUND], pos.x + 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o);
fontRender(__guiFont, l->values[l->offset + i], __guiColor[COLOR_LISTBOX_TEXT], __guiColor[COLOR_LISTBOX_BACKGROUND], pos.x + 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING], o);
}
o += fontHeightGet(_guiFont);
o += fontHeightGet(__guiFont);
}
// Draw outline of arrows.
surfaceHighlightFrameDraw(_arrowStart, _valueTop, _arrowStart + _arrowWidth, _valueBottom, _guiColor[COLOR_LISTBOX_SHADOW], _guiColor[COLOR_LISTBOX_HIGHLIGHT]);
surfaceHighlightFrameDraw(_arrowStart, _valueTop, _arrowStart + _arrowWidth, _valueBottom, __guiColor[COLOR_LISTBOX_SHADOW], __guiColor[COLOR_LISTBOX_HIGHLIGHT]);
// Draw background of arrows.
surfaceRectangleFilledDraw(_arrowStart + 1, _valueTop + 1, _arrowStart + _arrowWidth - 1, _valueBottom - 1, _guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND]);
surfaceRectangleFilledDraw(_arrowStart + 1, _valueTop + 1, _arrowStart + _arrowWidth - 1, _valueBottom - 1, __guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND]);
// Draw up arrow
_arrowStart += _halfFont + 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Center of up arrow
o = _valueTop + 1 + _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of up arrow
color = l->offset + l->selected > 0 ? _guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] : _guiColor[COLOR_LISTBOX_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(_guiFont); i++) {
_arrowStart += _halfFont + 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Center of up arrow
o = _valueTop + 1 + __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of up arrow
color = l->offset + l->selected > 0 ? __guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] : __guiColor[COLOR_LISTBOX_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(__guiFont); i++) {
surfaceLineDraw(_arrowStart - i * 0.5, o + i, _arrowStart + i * 0.5, o + i, color);
}
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_LISTBOX_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o + fontHeightGet(_guiFont), _arrowStart + _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_LISTBOX_SHADOW]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_LISTBOX_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_LISTBOX_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o + fontHeightGet(__guiFont), _arrowStart + _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_LISTBOX_SHADOW]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_LISTBOX_HIGHLIGHT]);
// Draw down arrow
o = _valueBottom - 1 - _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of down arrow
color = l->offset + l->selected < len - 1 ? _guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : _guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(_guiFont); i++) {
o = _valueBottom - 1 - __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of down arrow
color = l->offset + l->selected < len - 1 ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(__guiFont); i++) {
surfaceLineDraw(_arrowStart - i * 0.5, o - i, _arrowStart + i * 0.5, o - i, color);
}
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o - fontHeightGet(_guiFont), _arrowStart + _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o - fontHeightGet(__guiFont), _arrowStart + _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
}
@ -304,7 +313,7 @@ static void listboxScrollDown(ListboxT *listbox) {
int16_t len = arrlenu(listbox->values);
// Can we increment?
if (listbox->selected < _visibleY - 2) {
if (listbox->selected < _visibleY - (_hasTitle ? 2 : 1)) {
// Is it off the end of the list?
if (listbox->offset + listbox->selected < len - 1) {
listbox->selected++;
@ -346,18 +355,18 @@ static void listboxSizesRecalculate(ListboxT *listbox) {
// arrowStart is x+1+valueWidth
// Set global stuff that isn't actually part of the widget state.
_halfFont = fontHeightGet(_guiFont) * 0.5;
_arrowWidth = 2 + (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) + fontHeightGet(_guiFont); // Arrow width = font height
_valueWidth = listbox->base.pos.w - 1 - 1 - (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) - _arrowWidth;
_valueHeight = listbox->base.pos.h - 2 - (_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2);
_valueTop = fontHeightGet(_guiFont) + 1;
_hasTitle = (listbox->title != NULL);
_halfFont = fontHeightGet(__guiFont) * 0.5;
_arrowWidth = 2 + (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) + fontHeightGet(__guiFont); // Arrow width = font height
_valueWidth = listbox->base.pos.w - 1 - 1 - (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) - _arrowWidth;
_valueHeight = listbox->base.pos.h - 2 - (__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2);
_valueTop = (fontHeightGet(__guiFont) + 1) * _hasTitle;
_valueBottom = _valueHeight;
_arrowStart = 2 + _valueWidth;
// Figure out how many characters we have room to display.
_visibleX = (_valueWidth - 2 + (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2)) / fontWidthGet(_guiFont);
_visibleY = (_valueHeight - 2 + (_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2)) / fontHeightGet(_guiFont);
_visibleX = (_valueWidth - 2 + (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2)) / fontWidthGet(__guiFont);
_visibleY = (_valueHeight - 2 + (__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2)) / fontHeightGet(__guiFont);
}

View file

@ -43,16 +43,17 @@
#define ICN_SIZE 32
static msgBoxCallback _cbOne = NULL;
static msgBoxCallback _cbTwo = NULL;
static msgBoxCallback _cbThree = NULL;
static WindowT *_winDialog = NULL;
static PictureT *_picIcon = NULL;
static LabelT *_lblText = NULL;
static ButtonT *_btnOne = NULL;
static ButtonT *_btnTwo = NULL;
static ButtonT *_btnThree = NULL;
typedef struct MessageBoxContextS {
msgBoxCallback cbOne;
msgBoxCallback cbTwo;
msgBoxCallback cbThree;
WindowT *winDialog;
PictureT *picIcon;
LabelT *lblText;
ButtonT *btnOne;
ButtonT *btnTwo;
ButtonT *btnThree;
} MessageBoxContextT;
//***TODO*** This depends on the cache system which isn't really part of the GUI.
@ -69,18 +70,24 @@ static void btnMsgBox(WidgetT *widget);
static void btnMsgBox(WidgetT *widget) {
MessageBoxContextT *context = guiUserDataGet(widget);
// Remove us from the display.
guiDelete(D(_winDialog));
guiDelete(D(context->winDialog));
// Call whoever wanted called.
if (widget == W(_btnOne)) {
if (_cbOne) _cbOne(MSGBOX_BUTTON_ONE);
if (widget == W(context->btnOne)) {
if (context->cbOne) context->cbOne(MSGBOX_BUTTON_ONE);
}
if (widget == W(_btnTwo)) {
if (_cbTwo) _cbTwo(MSGBOX_BUTTON_TWO);
if (widget == W(context->btnTwo)) {
if (context->cbTwo) context->cbTwo(MSGBOX_BUTTON_TWO);
}
if (widget == W(_btnThree)) {
if (_cbThree) _cbThree(MSGBOX_BUTTON_THREE);
if (widget == W(context->btnThree)) {
if (context->cbThree) context->cbThree(MSGBOX_BUTTON_THREE);
}
// Delayed Free allows freeing of data that may be in use by the GUI system at a safe time.
guiDelayedFree((void **)&context);
}
@ -102,37 +109,40 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
uint16_t cursorH = 0;
char *token = NULL;
char *text = NULL;
MessageBoxContextT *context = NULL;
NEW(MessageBoxContextT, context);
// Null these for later.
_btnOne = NULL;
_btnTwo = NULL;
_btnThree = NULL;
context->btnOne = NULL;
context->btnTwo = NULL;
context->btnThree = NULL;
// Remember callbacks for later.
_cbOne = callbackOne;
_cbTwo = callbackTwo;
_cbThree = callbackThree;
context->cbOne = callbackOne;
context->cbTwo = callbackTwo;
context->cbThree = callbackThree;
// Calculate size of dialog box window.
// Initial minimum window width is the left and right margins + font width * (title length + 3).
w = WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * (strlen(title) + 3));
w = WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * (strlen(title) + 3));
// Initial minimum window height is the top and bottom margins + font height + button height + (padding * 2).
h = WIN_MARGIN_TOP + WIN_MARGIN_BOTTOM + fontHeightGet(_guiFont) + (BTN_MARGIN_TOP + BTN_MARGIN_BOTTOM + fontHeightGet(_guiFont)) + (MSG_PADDING * 2);
h = WIN_MARGIN_TOP + WIN_MARGIN_BOTTOM + fontHeightGet(__guiFont) + (BTN_MARGIN_TOP + BTN_MARGIN_BOTTOM + fontHeightGet(__guiFont)) + (MSG_PADDING * 2);
// Count lines of text and add up height. Find widest line.
text = strdup(message);
token = strtok(text, "\n");
while (token) {
textH += fontHeightGet(_guiFont);
textH += fontHeightGet(__guiFont);
if (strlen(token) > textW) {
textW = strlen(token);
}
token = strtok(NULL, "\n");
}
free(text);
textW *= fontWidthGet(_guiFont);
textW *= fontWidthGet(__guiFont);
// Initial cursor move and window sizing are based on text height.
cursorH = textH;
@ -155,16 +165,16 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
if (newW > w) w = newW;
// Do we need to make the dialog wider to contain the buttons?
newW = WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonOne));
if (buttonTwo) newW += MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonTwo));
if (buttonThree) newW += MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonThree));
newW = WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonOne));
if (buttonTwo) newW += MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonTwo));
if (buttonThree) newW += MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonThree));
if (newW > w) w = newW;
// Draw dialog.
h -= 5; // Height is off for some reason. At least, to me, it doesn't look right.
_winDialog = windowNew(vbeDisplayWidthGet() / 2 - w / 2, vbeDisplayHeightGet() / 2 - h / 2, w, h, title);
guiAttach(guiRootGet(), W(_winDialog));
context->winDialog = windowNew(vbeDisplayWidthGet() / 2 - w / 2, vbeDisplayHeightGet() / 2 - h / 2, w, h, title);
guiAttach(guiRootGet(), W(context->winDialog));
// Initial x cursor is the (implied window left margin +) padding
x = MSG_PADDING;
@ -174,8 +184,8 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
// Load proper icon, if desired.
if (icon > MSGBOX_ICON_NONE && icon < MSGBOX_ICON_COUNT) {
_picIcon = pictureNew(x, y, cacheFilenameGet(_iconFiles[icon - 1]));
guiAttach(W(_winDialog), W(_picIcon));
context->picIcon = pictureNew(x, y, cacheFilenameGet(_iconFiles[icon - 1]));
guiAttach(W(context->winDialog), W(context->picIcon));
}
// Draw message text.
@ -184,33 +194,36 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
text = strdup(message);
token = strtok(text, "\n");
while (token) {
_lblText = labelNew(x, t, token);
guiAttach(W(_winDialog), W(_lblText));
t += fontHeightGet(_guiFont);
context->lblText = labelNew(x, t, token);
guiAttach(W(context->winDialog), W(context->lblText));
t += fontHeightGet(__guiFont);
token = strtok(NULL, "\n");
}
free(text);
// Move to where buttons belong.
x = w - (WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonOne)));
x = w - (WIN_MARGIN_LEFT + WIN_MARGIN_RIGHT + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonOne)));
y += cursorH + MSG_PADDING;
// We always have at least one button.
_btnOne = buttonNew(x, y, buttonOne, btnMsgBox);
guiAttach(W(_winDialog), W(_btnOne));
context->btnOne = buttonNew(x, y, buttonOne, btnMsgBox);
guiUserDataSet(W(context->btnOne), context);
guiAttach(W(context->winDialog), W(context->btnOne));
// Two buttons?
if (buttonTwo) {
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonTwo)));
_btnTwo = buttonNew(x, y, buttonTwo, btnMsgBox);
guiAttach(W(_winDialog), W(_btnTwo));
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonTwo)));
context->btnTwo = buttonNew(x, y, buttonTwo, btnMsgBox);
guiUserDataSet(W(context->btnTwo), context);
guiAttach(W(context->winDialog), W(context->btnTwo));
}
// Three buttons?
if (buttonThree) {
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonThree)));
_btnThree = buttonNew(x, y, buttonThree, btnMsgBox);
guiAttach(W(_winDialog), W(_btnThree));
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonThree)));
context->btnThree = buttonNew(x, y, buttonThree, btnMsgBox);
guiUserDataSet(W(context->btnThree), context);
guiAttach(W(context->winDialog), W(context->btnThree));
}
}

View file

@ -47,6 +47,7 @@ WidgetT *pictureInit(WidgetT *widget, char *filename) {
l->base.mouseEventMethod = pictureMouseEvent;
l->filename = strdup(filename);
l->clicked = NULL;
l->zoom = PICTURE_FULL;
l->image = imageLoad(l->filename);
if (!l->image) {
@ -104,5 +105,19 @@ PictureT *pictureNew(uint16_t x, uint16_t y, char *filename) {
static void picturePaint(WidgetT *widget, uint8_t enabled, RectT pos) {
PictureT *p = (PictureT *)widget;
switch (p->zoom) {
case PICTURE_FULL:
imageRender(p->image, pos.x, pos.y);
break;
case PICTURE_HALF:
imageRenderHalf(p->image, pos.x, pos.y);
break;
}
}
void pictureZoomSet(PictureT *picture, PictureZoomT zoom) {
picture->zoom = zoom;
GUI_SET_FLAG(W(picture), WIDGET_FLAG_DIRTY);
}

View file

@ -27,17 +27,25 @@
#include "image.h"
typedef enum PictureZoomE {
PICTURE_FULL = 0,
PICTURE_HALF
} PictureZoomT;
typedef struct PictureS {
WidgetT base; // Must be first in every widget
char *filename;
widgetCallback clicked;
ImageT *image;
int8_t zoom;
} PictureT;
void pictureClickHandlerSet(PictureT *picture, widgetCallback callback);
WidgetT *pictureInit(WidgetT *widget, char *filename);
PictureT *pictureNew(uint16_t x, uint16_t y, char *filename);
void pictureZoomSet(PictureT *picture, PictureZoomT zoom);
#endif // PICTURE_H

View file

@ -53,7 +53,7 @@ WidgetT *radioInit(WidgetT *widget, char *title, uint16_t group) {
radioTitleSet(r, title);
// Width is set in radioSetTitle
r->base.pos.h = fontHeightGet(_guiFont);
r->base.pos.h = fontHeightGet(__guiFont);
return widget;
}
@ -107,21 +107,21 @@ static void radioPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
active = (radioSelectedGet(r) == r);
if (enabled) {
highlight = active ? _guiColor[COLOR_RADIOBUTTON_SHADOW] : _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT];
shadow = active ? _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] : _guiColor[COLOR_RADIOBUTTON_SHADOW];
fill = active ? _guiColor[COLOR_RADIOBUTTON_ACTIVE] : _guiColor[COLOR_RADIOBUTTON_INACTIVE];
text = _guiColor[COLOR_CHECKBOX_TEXT];
background = _guiColor[COLOR_WINDOW_BACKGROUND];
highlight = active ? __guiColor[COLOR_RADIOBUTTON_SHADOW] : __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT];
shadow = active ? __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] : __guiColor[COLOR_RADIOBUTTON_SHADOW];
fill = active ? __guiColor[COLOR_RADIOBUTTON_ACTIVE] : __guiColor[COLOR_RADIOBUTTON_INACTIVE];
text = __guiColor[COLOR_CHECKBOX_TEXT];
background = __guiColor[COLOR_WINDOW_BACKGROUND];
} else {
highlight = active ? _guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] : _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED];
shadow = active ? _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] : _guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED];
fill = active ? _guiColor[COLOR_RADIOBUTTON_ACTIVE_DISABLED] : _guiColor[COLOR_RADIOBUTTON_INACTIVE_DISABLED];
text = _guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
background = _guiColor[COLOR_WINDOW_BACKGROUND];
highlight = active ? __guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] : __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED];
shadow = active ? __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] : __guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED];
fill = active ? __guiColor[COLOR_RADIOBUTTON_ACTIVE_DISABLED] : __guiColor[COLOR_RADIOBUTTON_INACTIVE_DISABLED];
text = __guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
background = __guiColor[COLOR_WINDOW_BACKGROUND];
}
// Radio button is 10x10 pixels. Find offset based on font height.
o = (_guiFont->height - 10) * 0.5;
o = (__guiFont->height - 10) * 0.5;
// Draw outline of radio button.
surfaceLineDraw(pos.x, pos.y + o + 5, pos.x + 5, pos.y + o, highlight);
@ -136,7 +136,7 @@ static void radioPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
}
// Draw title.
fontRender(_guiFont, r->title, text, background, pos.x + 10 + _guiMetric[METRIC_RADIOBUTTON_PADDING], pos.y);
fontRender(__guiFont, r->title, text, background, pos.x + 10 + __guiMetric[METRIC_RADIOBUTTON_PADDING], pos.y);
}
@ -210,6 +210,6 @@ void radioSelectedSet(RadioT *radio) {
void radioTitleSet(RadioT *radio, char *title) {
if (radio->title) free(radio->title);
radio->title = strdup(title);
radio->base.pos.w = (strlen(title) * fontWidthGet(_guiFont)) + 10 + _guiMetric[METRIC_RADIOBUTTON_PADDING];
radio->base.pos.w = (strlen(title) * fontWidthGet(__guiFont)) + 10 + __guiMetric[METRIC_RADIOBUTTON_PADDING];
GUI_SET_FLAG((WidgetT *)radio, WIDGET_FLAG_DIRTY);
}

View file

@ -110,6 +110,7 @@ static void tagListWidgetAttributeHandle(void) {
uint8_t enabled;
uint8_t visible;
char mask;
PictureZoomT zoom;
// Process generated lists in reverse.
while (arrlen(_widgetList) > 0) {
@ -147,6 +148,7 @@ static void tagListWidgetAttributeHandle(void) {
enabled = 1;
visible = 1;
mask = 0;
zoom = PICTURE_FULL;
// Parse provided attributes.
for (i=0; i<arrlen(w->tagList); i+=2) {
@ -256,6 +258,9 @@ static void tagListWidgetAttributeHandle(void) {
pos.y = v;
break;
case T_ZOOM:
zoom = v;
break;
}
}
@ -316,6 +321,7 @@ static void tagListWidgetAttributeHandle(void) {
case T_PICTURE:
widget = W(pictureNew(pos.x, pos.y, filename));
pictureZoomSet((PictureT *)widget, zoom);
if (click != NULL) pictureClickHandlerSet((PictureT *)widget, click);
break;

View file

@ -85,6 +85,7 @@ enum TagItemsE {
T_WIDTH,
T_X,
T_Y,
T_ZOOM,
T_META_END_OF_ATTRIBUTES
};

View file

@ -539,7 +539,7 @@ WidgetT *terminalInit(WidgetT *widget, uint16_t cols, uint16_t rows) {
t->base.paintMethod = terminalPaint;
t->base.keyboardEventMethod = terminalKeyboardEvent;
t->base.mouseEventMethod = terminalMouseEvent;
t->font = _guiFont; // Default font. Also see terminalNew.
t->font = __guiFont; // Default font. Also see terminalNew.
t->cols = cols;
t->rows = rows;
t->cursorX = 1;
@ -641,8 +641,8 @@ TerminalT *terminalNew(uint16_t x, uint16_t y, uint16_t cols, uint16_t rows) {
if (!terminal) return NULL;
// Default font. Also see terminalInit.
w = fontWidthGet(_guiFont) * cols;
h = fontHeightGet(_guiFont) * rows;
w = fontWidthGet(__guiFont) * cols;
h = fontHeightGet(__guiFont) * rows;
widget = widgetInit(W(terminal), MAGIC_TERMINAL, x, y, w, h, 0, 0, 0, 0);
if (!widget) {

View file

@ -226,14 +226,14 @@ static void textboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16
// Allow dragging/positioning text cursor with mouse.
if (event == MOUSE_EVENT_LEFT_HOLD) {
// Where's the text display?
textArea.x = (strlen(t->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_TEXTBOX_PADDING] + 2 + _guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
textArea.y = 2 + _guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
textArea.w = textArea.x + t->visible * fontWidthGet(_guiFont);
textArea.h = textArea.y + fontHeightGet(_guiFont);
textArea.x = (strlen(t->title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_TEXTBOX_PADDING] + 2 + __guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
textArea.y = 2 + __guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
textArea.w = textArea.x + t->visible * fontWidthGet(__guiFont);
textArea.h = textArea.y + fontHeightGet(__guiFont);
// Is the pointer over it?
if (x >= textArea.x && x < textArea.w && y >= textArea.y && y < textArea.h) {
// Move caret.
t->caret = (x - textArea.x) / fontWidthGet(_guiFont);
t->caret = (x - textArea.x) / fontWidthGet(__guiFont);
// Did we go too far?
if (t->caret + t->offset > strlen(t->value)) {
t->caret = strlen(t->value) - t->offset;
@ -248,7 +248,7 @@ static void textboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16
TextboxT *textboxNew(uint16_t x, uint16_t y, uint16_t w, char *title) {
TextboxT *textbox = (TextboxT *)malloc(sizeof(TextboxT));
WidgetT *widget = NULL;
uint16_t h = fontHeightGet(_guiFont) + 4 + (_guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] * 2);
uint16_t h = fontHeightGet(__guiFont) + 4 + (__guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] * 2);
if (!textbox) return NULL;
@ -276,34 +276,34 @@ static void textboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
if (GUI_GET_FLAG(widget, WIDGET_FLAG_DIRTY) || guiFocusGet() == widget) {
labelWidth = (strlen(t->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_TEXTBOX_PADDING];
valueWidth = (t->visible * fontWidthGet(_guiFont)) + (_guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2);
labelWidth = (strlen(t->title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_TEXTBOX_PADDING];
valueWidth = (t->visible * fontWidthGet(__guiFont)) + (__guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2);
// Draw title.
fontRender(_guiFont, t->title, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y + 2 + _guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING]);
fontRender(__guiFont, t->title, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y + 2 + __guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING]);
// Draw outline of textbox.
surfaceHighlightFrameDraw( pos.x + labelWidth, pos.y, pos.x + labelWidth + valueWidth + 2, pos.y + pos.h, _guiColor[COLOR_TEXTBOX_SHADOW], _guiColor[COLOR_TEXTBOX_HIGHLIGHT]);
surfaceRectangleDraw( pos.x + labelWidth + 1, pos.y + 1, pos.x + labelWidth + valueWidth + 1, pos.y + pos.h - 1, _guiColor[COLOR_WINDOW_BACKGROUND]);
surfaceHighlightFrameDraw( pos.x + labelWidth, pos.y, pos.x + labelWidth + valueWidth + 2, pos.y + pos.h, __guiColor[COLOR_TEXTBOX_SHADOW], __guiColor[COLOR_TEXTBOX_HIGHLIGHT]);
surfaceRectangleDraw( pos.x + labelWidth + 1, pos.y + 1, pos.x + labelWidth + valueWidth + 1, pos.y + pos.h - 1, __guiColor[COLOR_WINDOW_BACKGROUND]);
// Draw background.
surfaceRectangleFilledDraw(pos.x + labelWidth + 2, pos.y + 2, pos.x + labelWidth + valueWidth, pos.y + pos.h - 2, _guiColor[COLOR_TEXTBOX_BACKGROUND]);
surfaceRectangleFilledDraw(pos.x + labelWidth + 2, pos.y + 2, pos.x + labelWidth + valueWidth, pos.y + pos.h - 2, __guiColor[COLOR_TEXTBOX_BACKGROUND]);
// Where's the text display start?
textX = pos.x + labelWidth + 2 + _guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
textY = pos.y + 2 + _guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
textX = pos.x + labelWidth + 2 + __guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
textY = pos.y + 2 + __guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
// Draw value.
draw = strdup(&t->value[t->offset]);
if (strlen(draw) > t->visible) draw[t->visible] = 0;
if (t->password != 0) memset(draw, t->password, strlen(draw));
fontRender(_guiFont, draw, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
fontRender(__guiFont, draw, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
free(draw);
// Draw cursor.
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
caretPos = textX + fontWidthGet(_guiFont) * t->caret;
fontRender(_guiFont, cursor, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_TEXTBOX_BACKGROUND], caretPos, textY);
caretPos = textX + fontWidthGet(__guiFont) * t->caret;
fontRender(__guiFont, cursor, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_TEXTBOX_BACKGROUND], caretPos, textY);
}
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
@ -321,7 +321,7 @@ void textboxTitleSet(TextboxT *textbox, char *title) {
textbox->title = strdup(title);
// Figure out how many characters we have room to display.
textbox->visible = (textbox->base.pos.w - ((strlen(title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_TEXTBOX_PADDING] + 4 + (_guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2))) / fontWidthGet(_guiFont);
textbox->visible = (textbox->base.pos.w - ((strlen(title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_TEXTBOX_PADDING] + 4 + (__guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2))) / fontWidthGet(__guiFont);
GUI_SET_FLAG((WidgetT *)textbox, WIDGET_FLAG_DIRTY);
}

View file

@ -191,11 +191,11 @@ static void updownMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
if (event == MOUSE_EVENT_LEFT_UP) {
updownSizesRecalculate(u);
_arrowStart += 1 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Left of up arrow
o = 1 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of arrows
_arrowStart += 1 + __guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Left of up arrow
o = 1 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of arrows
// Did they click the up arrow?
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(_guiFont) && y >= o && y <= o + fontHeightGet(_guiFont)) {
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(__guiFont) && y >= o && y <= o + fontHeightGet(__guiFont)) {
// Can we increment?
if (u->value < u->maximum) {
// Clamp.
@ -209,8 +209,8 @@ static void updownMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
}
// Did they click the down arrow?
_arrowStart += fontHeightGet(_guiFont) + 1; // Left of down arrow
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(_guiFont) && y >= o && y <= o + fontHeightGet(_guiFont)) {
_arrowStart += fontHeightGet(__guiFont) + 1; // Left of down arrow
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(__guiFont) && y >= o && y <= o + fontHeightGet(__guiFont)) {
// Can we decrement?
if (u->value > u->minimum) {
// Clamp.
@ -230,7 +230,7 @@ static void updownMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
UpdownT *updownNew(uint16_t x, uint16_t y, int32_t min, int32_t max, int32_t step, char *title) {
UpdownT *updown = (UpdownT *)malloc(sizeof(UpdownT));
WidgetT *widget = NULL;
uint16_t h = fontHeightGet(_guiFont) + 4 + (_guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] * 2);
uint16_t h = fontHeightGet(__guiFont) + 4 + (__guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] * 2);
if (!updown) return NULL;
@ -263,56 +263,56 @@ static void updownPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
_arrowStart += pos.x; // This method expects the start in screen space, not widget space.
// Draw title.
fontRender(_guiFont, u->title, _guiColor[COLOR_UPDOWN_TEXT], _guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y + 2 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]);
fontRender(__guiFont, u->title, __guiColor[COLOR_UPDOWN_TEXT], __guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y + 2 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]);
// Draw outline of text.
surfaceHighlightFrameDraw( pos.x + _labelWidth, pos.y, pos.x + _labelWidth + _valueWidth + 2, pos.y + pos.h, _guiColor[COLOR_UPDOWN_SHADOW], _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceRectangleDraw( pos.x + _labelWidth + 1, pos.y + 1, pos.x + _labelWidth + _valueWidth + 1, pos.y + pos.h - 1, _guiColor[COLOR_WINDOW_BACKGROUND]);
surfaceHighlightFrameDraw( pos.x + _labelWidth, pos.y, pos.x + _labelWidth + _valueWidth + 2, pos.y + pos.h, __guiColor[COLOR_UPDOWN_SHADOW], __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceRectangleDraw( pos.x + _labelWidth + 1, pos.y + 1, pos.x + _labelWidth + _valueWidth + 1, pos.y + pos.h - 1, __guiColor[COLOR_WINDOW_BACKGROUND]);
// Draw text background.
surfaceRectangleFilledDraw(pos.x + _labelWidth + 2, pos.y + 2, pos.x + _labelWidth + _valueWidth, pos.y + pos.h - 2, _guiColor[COLOR_UPDOWN_BACKGROUND]);
surfaceRectangleFilledDraw(pos.x + _labelWidth + 2, pos.y + 2, pos.x + _labelWidth + _valueWidth, pos.y + pos.h - 2, __guiColor[COLOR_UPDOWN_BACKGROUND]);
// Draw arrows outline
surfaceHighlightFrameDraw(_arrowStart, pos.y, _arrowStart + _arrowWidth + 1, pos.y + pos.h, _guiColor[COLOR_UPDOWN_SHADOW], _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceHighlightFrameDraw(_arrowStart, pos.y, _arrowStart + _arrowWidth + 1, pos.y + pos.h, __guiColor[COLOR_UPDOWN_SHADOW], __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
// Draw arrows background
surfaceRectangleFilledDraw(_arrowStart + 1, pos.y + 1, _arrowStart + _arrowWidth, pos.y + pos.h - 1, _guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND]);
surfaceRectangleFilledDraw(_arrowStart + 1, pos.y + 1, _arrowStart + _arrowWidth, pos.y + pos.h - 1, __guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND]);
// Draw up arrow
_arrowStart += _halfFont + 1 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Center of up arrow
o = pos.y + 1 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of up arrow
color = u->value < u->maximum ? _guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : _guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(_guiFont); i++) {
_arrowStart += _halfFont + 1 + __guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Center of up arrow
o = pos.y + 1 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of up arrow
color = u->value < u->maximum ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(__guiFont); i++) {
surfaceLineDraw(_arrowStart - i * 0.5, o + i, _arrowStart + i * 0.5, o + i, color);
}
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o + fontHeightGet(_guiFont), _arrowStart + _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o + fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o + fontHeightGet(__guiFont), _arrowStart + _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o + fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
// Draw down arrow
_arrowStart += fontHeightGet(_guiFont) + 1; // Center of down arrow
o += fontHeightGet(_guiFont); // Bottom of down arrow
color = u->value > u->minimum ? _guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : _guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(_guiFont); i++) {
_arrowStart += fontHeightGet(__guiFont) + 1; // Center of down arrow
o += fontHeightGet(__guiFont); // Bottom of down arrow
color = u->value > u->minimum ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
for (i=0; i<=fontHeightGet(__guiFont); i++) {
surfaceLineDraw(_arrowStart - i * 0.5, o - i, _arrowStart + i * 0.5, o - i, color);
}
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o - fontHeightGet(_guiFont), _arrowStart + _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o - fontHeightGet(_guiFont), _guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart + _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_SHADOW]);
surfaceLineDraw(_arrowStart - _halfFont, o - fontHeightGet(__guiFont), _arrowStart + _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
surfaceLineDraw(_arrowStart, o, _arrowStart - _halfFont, o - fontHeightGet(__guiFont), __guiColor[COLOR_UPDOWN_HIGHLIGHT]);
// Where's the text display start?
textX = pos.x + _labelWidth + 2 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING];
textY = pos.y + 2 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING];
textX = pos.x + _labelWidth + 2 + __guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING];
textY = pos.y + 2 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING];
// Draw value.
snprintf(draw, UPDOWN_MAX_DIGITS, "%ld", (long)u->value); // Weird typecasting prevents warnings in both DOS and Linux (32 and 64 bit)
textX += (u->visible - strlen(draw)) * fontWidthGet(_guiFont);
fontRender(_guiFont, draw, _guiColor[COLOR_UPDOWN_TEXT], _guiColor[COLOR_UPDOWN_BACKGROUND], textX, textY);
textX += (u->visible - strlen(draw)) * fontWidthGet(__guiFont);
fontRender(__guiFont, draw, __guiColor[COLOR_UPDOWN_TEXT], __guiColor[COLOR_UPDOWN_BACKGROUND], textX, textY);
// Draw cursor.
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
textX += (strlen(draw) - 1) * fontWidthGet(_guiFont);
fontRender(_guiFont, cursor, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
textX += (strlen(draw) - 1) * fontWidthGet(__guiFont);
fontRender(__guiFont, cursor, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
}
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
@ -329,11 +329,11 @@ static void updownSizesRecalculate(UpdownT *updown) {
// = - arrowStart (start of box surrounding arrows, including border).
// Set global stuff that isn't actually part of the widget state.
_halfFont = fontHeightGet(_guiFont) * 0.5;
_labelWidth = (strlen(updown->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_UPDOWN_PADDING];
_valueWidth = (updown->visible * fontWidthGet(_guiFont)) + (_guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] * 2);
_arrowWidth = (fontHeightGet(_guiFont) * 2) + 1 + 2 + (_guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] * 2); // Arrow width = font height
_arrowStart = _labelWidth + _valueWidth + 2 + _guiMetric[METRIC_UPDOWN_ARROW_PADDING];
_halfFont = fontHeightGet(__guiFont) * 0.5;
_labelWidth = (strlen(updown->title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_UPDOWN_PADDING];
_valueWidth = (updown->visible * fontWidthGet(__guiFont)) + (__guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] * 2);
_arrowWidth = (fontHeightGet(__guiFont) * 2) + 1 + 2 + (__guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] * 2); // Arrow width = font height
_arrowStart = _labelWidth + _valueWidth + 2 + __guiMetric[METRIC_UPDOWN_ARROW_PADDING];
}

View file

@ -52,7 +52,7 @@ void windowActiveSet(WindowT *window) {
}
// Tell the GUI.
_guiActiveWindow = window;
__guiActiveWindow = window;
}
@ -118,19 +118,19 @@ static void windowMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
// Start dragging?
if (event == MOUSE_EVENT_LEFT_DOWN && GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE)) {
// Are we on the draggable area of the titlebar / borders?
if (y < _guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT]) {
if (y < __guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT]) {
// Start dragging.
_guiDragWidget = widget;
__guiDragWidget = widget;
_guiDragOffsetX = mouse->x - window->base.pos.x;
_guiDragOffsetY = mouse->y - window->base.pos.y;
__guiDragOffsetY = mouse->y - window->base.pos.y;
}
}
// Still dragging? We use raw mouse data here because it's possible to drag too quickly and trigger "OUT" events.
if (_guiDragWidget == widget && mouse->buttonLeft && GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE)) {
if (__guiDragWidget == widget && mouse->buttonLeft && GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE)) {
// Move window.
window->base.pos.x = mouse->x - _guiDragOffsetX;
window->base.pos.y = mouse->y - _guiDragOffsetY;
window->base.pos.y = mouse->y - __guiDragOffsetY;
// Keep it on the screen.
if (window->base.pos.x < 0) window->base.pos.x = 0;
if (window->base.pos.x + window->base.pos.w > vbeDisplayWidthGet()) window->base.pos.x = vbeDisplayWidthGet() - window->base.pos.w;
@ -139,8 +139,8 @@ static void windowMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
}
// Be sure we stop dragging on mouse up or move out.
if (_guiDragWidget == widget && event == MOUSE_EVENT_LEFT_UP) {
_guiDragWidget = NULL;
if (__guiDragWidget == widget && event == MOUSE_EVENT_LEFT_UP) {
__guiDragWidget = NULL;
}
}
@ -152,10 +152,10 @@ WindowT *windowNew(uint16_t x, uint16_t y, uint16_t w, uint16_t h, char *title)
if (!window) return NULL;
widget = widgetInit(W(window), MAGIC_WINDOW, x, y, w, h,
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3,
_guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT],
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4,
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4);
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3,
__guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT],
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4,
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4);
if (!widget) {
free(window);
return NULL;
@ -176,23 +176,23 @@ static void windowPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
x2 = pos.w - 1;
y2 = pos.h - 1;
background = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_INACTIVE];
text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE];
background = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? __guiColor[COLOR_WINDOW_TITLE_ACTIVE] : __guiColor[COLOR_WINDOW_TITLE_INACTIVE];
text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? __guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] : __guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE];
// Background.
surfaceClear(_guiColor[COLOR_WINDOW_BACKGROUND]);
surfaceClear(__guiColor[COLOR_WINDOW_BACKGROUND]);
// Outer edge.
surfaceHighlightFrameDraw(0, 0, x2, y2, _guiColor[COLOR_WINDOW_HIGHLIGHT], _guiColor[COLOR_WINDOW_SHADOW]);
surfaceHighlightFrameDraw(0, 0, x2, y2, __guiColor[COLOR_WINDOW_HIGHLIGHT], __guiColor[COLOR_WINDOW_SHADOW]);
// Inner edge - skip METRIC_WINDOW_BORDER_WIDTH pixels. Be sure shadow and highlight are not included in the width.
surfaceHighlightFrameDraw(_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 2, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 2, x2 - _guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 2, y2 - _guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 2, _guiColor[COLOR_WINDOW_SHADOW], _guiColor[COLOR_WINDOW_HIGHLIGHT]);
surfaceHighlightFrameDraw(__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 2, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 2, x2 - __guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 2, y2 - __guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 2, __guiColor[COLOR_WINDOW_SHADOW], __guiColor[COLOR_WINDOW_HIGHLIGHT]);
// Title bar - METRIC_WINDOW_TITLE_HEIGHT pixels high. Be sure shadow and highlight are not included in the width.
surfaceHighlightFrameDraw(_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3, x2 - _guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 3, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + _guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 4, _guiColor[COLOR_WINDOW_HIGHLIGHT], _guiColor[COLOR_WINDOW_SHADOW]);
surfaceRectangleFilledDraw(_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4, x2 - _guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 4, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + _guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 2, background);
surfaceHighlightFrameDraw(__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3, x2 - __guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 3, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + __guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 4, __guiColor[COLOR_WINDOW_HIGHLIGHT], __guiColor[COLOR_WINDOW_SHADOW]);
surfaceRectangleFilledDraw(__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4, x2 - __guiMetric[METRIC_WINDOW_BORDER_WIDTH] - 4, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + __guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 2, background);
fontRender(_guiFont, w->title, text, background, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 16, _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 5);
fontRender(__guiFont, w->title, text, background, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 16, __guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 5);
}

View file

@ -75,7 +75,6 @@ static uint8_t _takeScreenshot = 0;
static void comAddToBuffer(char *data, uint16_t len);
//static void comBufferShow(void);
static void comModem(uint8_t c);
static void processEvent(void);
static void processNetworkEvent(void);
@ -98,21 +97,6 @@ static void comAddToBuffer(char *data, uint16_t len) {
}
/*
static void comBufferShow(void) {
uint16_t x = _bufferTail;
logWrite("={");
while (x != _bufferHead) {
if (_buffer[x] != '\r' && _buffer[x] != '\n') logWrite("%c ", _buffer[x]);
logWrite("%02x ", (uint8_t)_buffer[x++]);
if (x >= COM_BUFFER_SIZE) x = 0;
}
logWrite("}\n");
}
*/
int comClose(int com) {
// We only pretend to support one COM port.
if (com != 0) return SER_ERR_UNKNOWN;
@ -496,7 +480,6 @@ static void processNetworkEvent(void) {
break;
case ENET_EVENT_TYPE_RECEIVE:
//logWrite(" IN: "); packetDebugPrint((uint8_t *)event.packet->data, event.packet->dataLength);
comAddToBuffer((char *)event.packet->data, event.packet->dataLength);
break;

View file

@ -292,6 +292,8 @@ static void tableSave(void) {
}
extern void browserShow(void);
int main(int argc, char *argv[]) {
if (startup(argc, argv)) return 1;
@ -299,34 +301,13 @@ int main(int argc, char *argv[]) {
// Perform "first run" setup tasks or start the client?
if (hasValidSettings()) {
// We have what we need, start the client.
welcomeShow();
//welcomeShow();
browserShow();
eventLoop();
} else {
// Run the setup.
settingsShow(checkSettings);
}
/*
uint8_t length = 79;
uint8_t packet[] = {
0x00, 0x0b, 0x01, 0x03, 0x00, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0x32, 0x64,
0x64, 0x38, 0x37, 0x61, 0x39, 0x65, 0x62, 0x37, 0x62, 0x30, 0x35, 0x62, 0x33,
0x38, 0x61, 0x66, 0x30, 0x33, 0x39, 0x36, 0x61, 0x38, 0x33, 0x32, 0x62, 0x35,
0x63, 0x61, 0x66, 0x63, 0x35, 0x31, 0x65, 0x61, 0x33, 0x36, 0x64, 0x33, 0x35,
0x32, 0x33, 0x37, 0x36, 0x33, 0x38, 0x64, 0x62, 0x33, 0x32, 0x35, 0x33, 0x30,
0x33, 0x37, 0x35, 0x36, 0x32, 0x32, 0x36, 0x32, 0x63, 0x34, 0x00, 0x44, 0x7e,
0x00
};
PacketDecodeDataT decoded;
if (packetDecode(__packetThreadData, &decoded, (char *)packet, length)) {
logWrite("Packet decoded: %d\n", decoded.packetType);
} else {
logWrite("Packet NOT decoded.\n");
}
shutdown();
*/
return 0;
}

View file

@ -34,6 +34,8 @@
static void btnMsgBoxLogoff(MsgBoxButtonT button);
static void btnMsgBoxOkay(MsgBoxButtonT button);
static void menuEnable(uint8_t enable);
static void menuFilesReady(void);
static void picChatClick(WidgetT *widget);
static void picEmailClick(WidgetT *widget);
@ -63,6 +65,27 @@ static void btnMsgBoxLogoff(MsgBoxButtonT button) {
// ***TODO*** Need a way to close all other windows.
hangupShow(welcomeShow);
}
menuEnable(1);
}
static void btnMsgBoxOkay(MsgBoxButtonT button) {
(void)(button);
menuEnable(1);
}
static void menuEnable(uint8_t enable) {
/*
widgetEnableSet(W(_picProfile), enable);
widgetEnableSet(W(_picLogoff), enable);
widgetEnableSet(W(_picGames), enable);
widgetEnableSet(W(_picForums), enable);
widgetEnableSet(W(_picEmail), enable);
widgetEnableSet(W(_picChat), enable);
*/
}
@ -118,33 +141,38 @@ void menuShow(void) {
static void picChatClick(WidgetT *widget) {
(void)widget;
// ***TODO***
msgBoxOne("Chat", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
menuEnable(0);
msgBoxOne("Chat", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", btnMsgBoxOkay);
}
static void picEmailClick(WidgetT *widget) {
(void)widget;
// ***TODO***
msgBoxOne("E-Mail", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
menuEnable(0);
msgBoxOne("E-Mail", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", btnMsgBoxOkay);
}
static void picForumsClick(WidgetT *widget) {
(void)widget;
// ***TODO***
msgBoxOne("Forums", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
menuEnable(0);
msgBoxOne("Forums", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", btnMsgBoxOkay);
}
static void picGamesClick(WidgetT *widget) {
(void)widget;
// ***TODO***
msgBoxOne("Games", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
menuEnable(0);
msgBoxOne("Games", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", btnMsgBoxOkay);
}
static void picLogoffClick(WidgetT *widget) {
(void)widget;
menuEnable(0);
msgBoxTwo("Logoff?", MSGBOX_ICON_QUESTION, "This will disconnect you from the server.", "Okay", btnMsgBoxLogoff, "Cancel", btnMsgBoxLogoff);
}
@ -152,5 +180,6 @@ static void picLogoffClick(WidgetT *widget) {
static void picProfileClick(WidgetT *widget) {
(void)widget;
// ***TODO***
msgBoxOne("Options", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
menuEnable(0);
msgBoxOne("Options", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", btnMsgBoxOkay);
}

View file

@ -112,8 +112,6 @@ uint8_t cacheEntryAdd(char *sha256, char *entryName, char *virtualPath) {
// Index format is: SHA256 ENTRYNAME VIRTUALPATH
logWrite("Adding SHA [%s] Entry [%s] VPath [%s]\n", sha256, entryName, virtualPath);
sprintf(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH);
sprintf(indexNew, "CACHE%cINDEX.NEW", OS_PATH_SLASH);

View file

@ -25,9 +25,6 @@
void comPacketSender(uint8_t *data, uint32_t length, void *userData) {
(void)userData;
//logWrite("OUT: "); packetDebugPrint((uint8_t *)data, length);
comWrite(__configData.serialCom - 1, (char *)data, length);
}

View file

@ -117,7 +117,6 @@ void netProcess(void) {
r = comRead(__configData.serialCom - 1, (char *)buffer, 1024);
// New data or not, process anything in the queue.
if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
logWrite("network.c - Packet In: %d Length: %d Channel: %d\n", decoded.packetType, decoded.length, decoded.channel);
//packetDebugPrint((uint8_t *)decoded.data, decoded.length);
switch (decoded.packetType) {
case PACKET_TYPE_PING:
@ -158,7 +157,6 @@ void netProcess(void) {
packet->data = (uint8_t *)malloc(decoded.length);
memcpy(packet->data, decoded.data, decoded.length);
// Send it to the subscriber.
logWrite("Delivering to subscriber %p\n", _channels[r].value);
_channels[r].value(packet);
}
}

View file

@ -145,7 +145,6 @@ void *clientThread(void *data) {
packetSend(client->packetThreadData, &encoded);
DEL(packetData);
versionSent = 1;
consoleMessageQueue("PACKET_TYPE_VERSION sent.\n");
}
}

View file

@ -122,5 +122,4 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
packetEncode(client->packetThreadData, &encoded, NULL, 0);
// Send it.
packetSend(client->packetThreadData, &encoded);
consoleMessageQueue("PACKET_TYPE_PROCEED sent.\n");
}