Start of game browser.
This commit is contained in:
parent
41df0f0e54
commit
185391ef2a
31 changed files with 758 additions and 393 deletions
|
@ -70,6 +70,7 @@ HEADERS = \
|
||||||
$$SHARED/primes.h \
|
$$SHARED/primes.h \
|
||||||
$$SHARED/packet.h \
|
$$SHARED/packet.h \
|
||||||
$$SHARED/packets.h \
|
$$SHARED/packets.h \
|
||||||
|
src/browser.h \
|
||||||
src/config.h \
|
src/config.h \
|
||||||
$$SHARED/util.h \
|
$$SHARED/util.h \
|
||||||
src/file.h \
|
src/file.h \
|
||||||
|
@ -125,6 +126,7 @@ SOURCES = \
|
||||||
$$SHARED/thirdparty/tiny-AES-c/aes.c \
|
$$SHARED/thirdparty/tiny-AES-c/aes.c \
|
||||||
$$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \
|
$$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \
|
||||||
$$SHARED/memory.c \
|
$$SHARED/memory.c \
|
||||||
|
src/browser.c \
|
||||||
src/file.c \
|
src/file.c \
|
||||||
src/gui/msgbox.c \
|
src/gui/msgbox.c \
|
||||||
src/gui/timer.c \
|
src/gui/timer.c \
|
||||||
|
|
255
client/src/browser.c
Normal file
255
client/src/browser.c
Normal 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
31
client/src/browser.h
Normal 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
|
|
@ -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 *buttonNew(uint16_t x, uint16_t y, char *title, widgetCallback callback) {
|
||||||
ButtonT *button = (ButtonT *)malloc(sizeof(ButtonT));
|
ButtonT *button = (ButtonT *)malloc(sizeof(ButtonT));
|
||||||
WidgetT *widget = NULL;
|
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;
|
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);
|
active = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE);
|
||||||
|
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
highlight = active ? _guiColor[COLOR_BUTTON_SHADOW] : _guiColor[COLOR_BUTTON_HIGHLIGHT];
|
highlight = active ? __guiColor[COLOR_BUTTON_SHADOW] : __guiColor[COLOR_BUTTON_HIGHLIGHT];
|
||||||
shadow = active ? _guiColor[COLOR_BUTTON_HIGHLIGHT] : _guiColor[COLOR_BUTTON_SHADOW];
|
shadow = active ? __guiColor[COLOR_BUTTON_HIGHLIGHT] : __guiColor[COLOR_BUTTON_SHADOW];
|
||||||
background = _guiColor[COLOR_BUTTON_BACKGROUND];
|
background = __guiColor[COLOR_BUTTON_BACKGROUND];
|
||||||
text = _guiColor[COLOR_BUTTON_TEXT];
|
text = __guiColor[COLOR_BUTTON_TEXT];
|
||||||
} else {
|
} else {
|
||||||
highlight = active ? _guiColor[COLOR_BUTTON_SHADOW_DISABLED] : _guiColor[COLOR_BUTTON_HIGHLIGHT_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];
|
shadow = active ? __guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] : __guiColor[COLOR_BUTTON_SHADOW_DISABLED];
|
||||||
background = _guiColor[COLOR_BUTTON_BACKGROUND_DISABLED];
|
background = __guiColor[COLOR_BUTTON_BACKGROUND_DISABLED];
|
||||||
text = _guiColor[COLOR_BUTTON_TEXT_DISABLED];
|
text = __guiColor[COLOR_BUTTON_TEXT_DISABLED];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw bezel.
|
// 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);
|
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);
|
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).
|
// 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) {
|
void buttonTitleSet(ButtonT *button, char *title) {
|
||||||
if (button->title) free(button->title);
|
if (button->title) free(button->title);
|
||||||
button->title = strdup(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);
|
GUI_SET_FLAG((WidgetT *)button, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 *checkboxNew(uint16_t x, uint16_t y, char *title) {
|
||||||
CheckboxT *checkbox = (CheckboxT *)malloc(sizeof(CheckboxT));
|
CheckboxT *checkbox = (CheckboxT *)malloc(sizeof(CheckboxT));
|
||||||
WidgetT *widget = NULL;
|
WidgetT *widget = NULL;
|
||||||
uint16_t h = fontHeightGet(_guiFont);
|
uint16_t h = fontHeightGet(__guiFont);
|
||||||
|
|
||||||
if (!checkbox) return NULL;
|
if (!checkbox) return NULL;
|
||||||
|
|
||||||
|
@ -101,21 +101,21 @@ static void checkboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
|
|
||||||
active = checkboxValueGet(c);
|
active = checkboxValueGet(c);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
highlight = active ? _guiColor[COLOR_CHECKBOX_SHADOW] : _guiColor[COLOR_CHECKBOX_HIGHLIGHT];
|
highlight = active ? __guiColor[COLOR_CHECKBOX_SHADOW] : __guiColor[COLOR_CHECKBOX_HIGHLIGHT];
|
||||||
shadow = active ? _guiColor[COLOR_CHECKBOX_HIGHLIGHT] : _guiColor[COLOR_CHECKBOX_SHADOW];
|
shadow = active ? __guiColor[COLOR_CHECKBOX_HIGHLIGHT] : __guiColor[COLOR_CHECKBOX_SHADOW];
|
||||||
fill = active ? _guiColor[COLOR_CHECKBOX_ACTIVE] : _guiColor[COLOR_CHECKBOX_INACTIVE];
|
fill = active ? __guiColor[COLOR_CHECKBOX_ACTIVE] : __guiColor[COLOR_CHECKBOX_INACTIVE];
|
||||||
text = _guiColor[COLOR_CHECKBOX_TEXT];
|
text = __guiColor[COLOR_CHECKBOX_TEXT];
|
||||||
background = _guiColor[COLOR_WINDOW_BACKGROUND];
|
background = __guiColor[COLOR_WINDOW_BACKGROUND];
|
||||||
} else {
|
} else {
|
||||||
highlight = active ? _guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] : _guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED];
|
highlight = active ? __guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] : __guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED];
|
||||||
shadow = active ? _guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] : _guiColor[COLOR_CHECKBOX_SHADOW_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];
|
fill = active ? __guiColor[COLOR_CHECKBOX_ACTIVE_DISABLED] : __guiColor[COLOR_CHECKBOX_INACTIVE_DISABLED];
|
||||||
text = _guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
|
text = __guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
|
||||||
background = _guiColor[COLOR_WINDOW_BACKGROUND];
|
background = __guiColor[COLOR_WINDOW_BACKGROUND];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checkbox is 10x10 pixels. Find offset based on font height.
|
// 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.
|
// Draw outline of checkbox.
|
||||||
surfaceHighlightFrameDraw(pos.x, pos.y + o, pos.x + 10, pos.y + 10 + o, highlight, shadow);
|
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);
|
surfaceRectangleFilledDraw(pos.x + 1, pos.y + o + 1, pos.x + 9, pos.y + + o + 9, fill);
|
||||||
|
|
||||||
// Draw title.
|
// 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) {
|
void checkboxTitleSet(CheckboxT *checkbox, char *title) {
|
||||||
if (checkbox->title) free(checkbox->title);
|
if (checkbox->title) free(checkbox->title);
|
||||||
checkbox->title = strdup(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);
|
GUI_SET_FLAG((WidgetT *)checkbox, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,5 +65,5 @@ static void desktopPaint(WidgetT *desktop, uint8_t enabled, RectT pos) {
|
||||||
(void)pos;
|
(void)pos;
|
||||||
(void)enabled;
|
(void)enabled;
|
||||||
|
|
||||||
surfaceClear(_guiColor[COLOR_DESKTOP]);
|
surfaceClear(__guiColor[COLOR_DESKTOP]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,10 +67,10 @@ static void framePaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
FrameT *f = (FrameT *)widget;
|
FrameT *f = (FrameT *)widget;
|
||||||
|
|
||||||
// Draw frame.
|
// 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.
|
// 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "desktop.h"
|
#include "desktop.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
#include "msgbox.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct PendingEventsS {
|
typedef struct PendingEventsS {
|
||||||
|
@ -33,13 +34,32 @@ typedef struct PendingEventsS {
|
||||||
} PendingEventsT;
|
} PendingEventsT;
|
||||||
|
|
||||||
|
|
||||||
int16_t _guiMetric[METRIC_COUNT];
|
// Widget Magic Debug Info. Don't forget to change MagicE!
|
||||||
ColorT _guiColor[COLOR_COUNT];
|
char *__guiMagicDebugNames[MAGIC_COUNT] = {
|
||||||
FontT *_guiFont = NULL;
|
"Unknown",
|
||||||
WidgetT *_guiDragWidget = NULL;
|
"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 _guiDragOffsetX = 0;
|
||||||
uint16_t _guiDragOffsetY = 0;
|
uint16_t __guiDragOffsetY = 0;
|
||||||
WindowT *_guiActiveWindow = NULL;
|
WindowT *__guiActiveWindow = NULL;
|
||||||
|
|
||||||
|
|
||||||
static DesktopT *_guiDesktop = NULL;
|
static DesktopT *_guiDesktop = NULL;
|
||||||
|
@ -59,23 +79,7 @@ static uint32_t _guiTimerQuarterSecondOn = 0;
|
||||||
static uint32_t _guiTimerHalfSecondOn = 0;
|
static uint32_t _guiTimerHalfSecondOn = 0;
|
||||||
static uint32_t _guiTimerSecondOn = 0;
|
static uint32_t _guiTimerSecondOn = 0;
|
||||||
static PendingEventsT **_guiPendingEvents = NULL;
|
static PendingEventsT **_guiPendingEvents = NULL;
|
||||||
|
static void **_guiPendingFrees = 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 guiDeleteList(void);
|
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);
|
guiWidgetBoundsDrawableOnScreenGet(widget, &r);
|
||||||
logWrite("%s: Size %dx%d Area %dx%d TL %dx%d BR %dx%d\n",
|
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,
|
widget->pos.w, widget->pos.h,
|
||||||
r.w, r.h,
|
r.w, r.h,
|
||||||
widget->margin.x, widget->margin.y,
|
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",
|
logWrite("%s %s P:%dx%d-%dx%d M:%dx%d-%dx%d C:%dx%d-%dx%d F:%d\n",
|
||||||
line,
|
line,
|
||||||
_magicDebugNames[widget->magic],
|
__guiMagicDebugNames[widget->magic],
|
||||||
widget->pos.x, widget->pos.y, widget->pos.w, widget->pos.h,
|
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->margin.x, widget->margin.y, widget->margin.w, widget->margin.h,
|
||||||
widget->clip.x, widget->clip.y, widget->clip.w, widget->clip.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) {
|
void guiDelete(WidgetT **widget) {
|
||||||
// Since deleting happens in widget events, it's not safe to do it
|
// Since deleting happens in widget events, it's not safe to do it
|
||||||
// immediately. Instead, we make a list of what to delete and
|
// immediately. Instead, we make a list of what to delete and
|
||||||
|
@ -316,6 +334,7 @@ void guiFocusSet(WidgetT *widget) {
|
||||||
}
|
}
|
||||||
// Change focus.
|
// Change focus.
|
||||||
_guiFocused = widget;
|
_guiFocused = widget;
|
||||||
|
logWrite("Focus is now on %s\n", __guiMagicDebugNames[widget->magic]);
|
||||||
// Tell new control it has focus.
|
// Tell new control it has focus.
|
||||||
if (_guiFocused) {
|
if (_guiFocused) {
|
||||||
if (_guiFocused->focusMethod) _guiFocused->focusMethod(_guiFocused, 1);
|
if (_guiFocused->focusMethod) _guiFocused->focusMethod(_guiFocused, 1);
|
||||||
|
@ -390,12 +409,12 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
|
||||||
sy = r.y;
|
sy = r.y;
|
||||||
guiMousePositionOnWidgetGet(widget, mouse, &mx, &my);
|
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.
|
// 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
|
// 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.
|
// 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);
|
widget->mouseEventMethod(widget, mouse, mx, my, MOUSE_EVENT_LEFT_HOLD);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -408,8 +427,8 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is the mouse inside this widget?
|
// 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) {
|
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?
|
// Is this the same widget we were over before?
|
||||||
if (_guiLastWidgetLeft != widget) {
|
if (_guiLastWidgetLeft != widget) {
|
||||||
|
@ -444,8 +463,8 @@ static uint8_t guiMouseChildrenProcess(WidgetT *widget, MouseT *mouse) {
|
||||||
|
|
||||||
// Is there an event?
|
// Is there an event?
|
||||||
if (event != MOUSE_EVENT_NONE) {
|
if (event != MOUSE_EVENT_NONE) {
|
||||||
// Does it belong to the active window? Or does it target a window? A 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) {
|
if (widget->window == __guiActiveWindow || widget->magic == MAGIC_WINDOW || widget->magic == MAGIC_DESKTOP || widget->window == NULL) {
|
||||||
// Is there a mouse handler?
|
// Is there a mouse handler?
|
||||||
if (widget->mouseEventMethod) {
|
if (widget->mouseEventMethod) {
|
||||||
if (!GUI_GET_FLAG(widget, WIDGET_FLAG_DISABLED) && !GUI_GET_FLAG(widget, WIDGET_FLAG_HIDDEN)) {
|
if (!GUI_GET_FLAG(widget, WIDGET_FLAG_DISABLED) && !GUI_GET_FLAG(widget, WIDGET_FLAG_HIDDEN)) {
|
||||||
|
@ -505,13 +524,13 @@ static void guiPaintChildren(WidgetT *widget) {
|
||||||
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Paint all children.
|
// Paint all children.
|
||||||
len = arrlenu(widget->children);
|
len = arrlenu(widget->children);
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
for (x=0; x<len; x++) {
|
for (x=0; x<len; x++) {
|
||||||
guiPaintChildren(widget->children[x]);
|
guiPaintChildren(widget->children[x]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -556,116 +575,117 @@ WidgetT *guiRootGet(void) {
|
||||||
|
|
||||||
|
|
||||||
void guiShutdown(void) {
|
void guiShutdown(void) {
|
||||||
// Unload fonts.
|
|
||||||
fontUnload(&_guiFont);
|
|
||||||
|
|
||||||
// Delete all widgets in GUI tree.
|
// Delete all widgets in GUI tree.
|
||||||
guiDelete((WidgetT **)&_guiDesktop);
|
guiDelete((WidgetT **)&_guiDesktop);
|
||||||
guiDeleteList();
|
guiDeleteList();
|
||||||
|
|
||||||
|
// Unload font.
|
||||||
|
fontUnload(&__guiFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DesktopT *guiStartup(void) {
|
DesktopT *guiStartup(void) {
|
||||||
|
|
||||||
_guiMetric[METRIC_BUTTON_BEZEL_SIZE] = 2;
|
__guiMetric[METRIC_BUTTON_BEZEL_SIZE] = 2;
|
||||||
_guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] = 8;
|
__guiMetric[METRIC_BUTTON_HORIZONTAL_PADDING] = 8;
|
||||||
_guiMetric[METRIC_BUTTON_VERTICAL_PADDING] = 2;
|
__guiMetric[METRIC_BUTTON_VERTICAL_PADDING] = 2;
|
||||||
|
|
||||||
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] = 4; // Does not include highlight or shadow lines.
|
__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_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_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_HORIZONTAL_PADDING] = 2;
|
||||||
_guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] = 2;
|
__guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING] = 2;
|
||||||
_guiMetric[METRIC_TEXTBOX_PADDING] = 6; // Matches other label / widget padding.
|
__guiMetric[METRIC_TEXTBOX_PADDING] = 6; // Matches other label / widget padding.
|
||||||
|
|
||||||
_guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] = 2;
|
__guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] = 2;
|
||||||
_guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] = 2;
|
__guiMetric[METRIC_UPDOWN_VERTICAL_PADDING] = 2;
|
||||||
_guiMetric[METRIC_UPDOWN_PADDING] = 6; // Matches other label / widget padding.
|
__guiMetric[METRIC_UPDOWN_PADDING] = 6; // Matches other label / widget padding.
|
||||||
_guiMetric[METRIC_UPDOWN_ARROW_PADDING] = 2;
|
__guiMetric[METRIC_UPDOWN_ARROW_PADDING] = 2;
|
||||||
|
|
||||||
_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] = 2;
|
__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] = 2;
|
||||||
_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] = 2;
|
__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] = 2;
|
||||||
|
|
||||||
|
|
||||||
_guiColor[COLOR_BUTTON_BACKGROUND] = vbeColorMake(168, 168, 168);
|
__guiColor[COLOR_BUTTON_BACKGROUND] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_BUTTON_SHADOW] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_BUTTON_SHADOW] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_BUTTON_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_BUTTON_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
|
|
||||||
_guiColor[COLOR_BUTTON_BACKGROUND_DISABLED] = vbeColorMake(124, 126, 124);
|
__guiColor[COLOR_BUTTON_BACKGROUND_DISABLED] = vbeColorMake(124, 126, 124);
|
||||||
_guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
__guiColor[COLOR_BUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
||||||
_guiColor[COLOR_BUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_BUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_BUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
|
__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_BACKGROUND] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_WINDOW_SHADOW] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_WINDOW_SHADOW] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_WINDOW_TITLE_ACTIVE] = 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_INACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
|
__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(248, 252, 248);
|
||||||
_guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_LABEL_TEXT_INACTIVE] = vbeColorMake( 0, 0, 0);
|
||||||
|
|
||||||
_guiColor[COLOR_CHECKBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_CHECKBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_CHECKBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_CHECKBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_CHECKBOX_ACTIVE] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_CHECKBOX_ACTIVE] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_CHECKBOX_INACTIVE] = vbeColorMake(168, 168, 168);
|
__guiColor[COLOR_CHECKBOX_INACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_CHECKBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_CHECKBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
__guiColor[COLOR_CHECKBOX_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
||||||
_guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_CHECKBOX_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_CHECKBOX_ACTIVE_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_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
|
||||||
_guiColor[COLOR_CHECKBOX_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
|
__guiColor[COLOR_CHECKBOX_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
|
||||||
|
|
||||||
_guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_RADIOBUTTON_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_RADIOBUTTON_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_RADIOBUTTON_ACTIVE] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_RADIOBUTTON_ACTIVE] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_RADIOBUTTON_INACTIVE] = vbeColorMake(168, 168, 168);
|
__guiColor[COLOR_RADIOBUTTON_INACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_RADIOBUTTON_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_RADIOBUTTON_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
__guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] = vbeColorMake(200, 200, 200);
|
||||||
_guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] = vbeColorMake( 80, 84, 80);
|
||||||
_guiColor[COLOR_RADIOBUTTON_ACTIVE_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_INACTIVE_DISABLED] = vbeColorMake(124, 126, 124);
|
||||||
_guiColor[COLOR_RADIOBUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
|
__guiColor[COLOR_RADIOBUTTON_TEXT_DISABLED] = vbeColorMake( 84, 84, 84);
|
||||||
|
|
||||||
_guiColor[COLOR_FRAME_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_FRAME_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_FRAME_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_FRAME_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_FRAME_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_FRAME_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
|
|
||||||
_guiColor[COLOR_TEXTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_TEXTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_TEXTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_TEXTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_TEXTBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_TEXTBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_TEXTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_TEXTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
|
||||||
|
|
||||||
_guiColor[COLOR_UPDOWN_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_UPDOWN_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_UPDOWN_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_UPDOWN_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_UPDOWN_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_UPDOWN_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_UPDOWN_BACKGROUND] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_UPDOWN_BACKGROUND] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
|
__guiColor[COLOR_UPDOWN_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
|
||||||
_guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
__guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_UPDOWN_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
__guiColor[COLOR_UPDOWN_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
||||||
|
|
||||||
_guiColor[COLOR_LISTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_LISTBOX_HIGHLIGHT] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_LISTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_LISTBOX_SHADOW] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_LISTBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
__guiColor[COLOR_LISTBOX_TEXT] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_LISTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
|
__guiColor[COLOR_LISTBOX_BACKGROUND] = vbeColorMake(248, 252, 248);
|
||||||
_guiColor[COLOR_LISTBOX_SELECTED_TEXT] = 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_SELECTED_BACKGROUND] = vbeColorMake( 0, 0, 0);
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
|
__guiColor[COLOR_LISTBOX_ARROWS_BACKGROUND] = vbeColorMake(124, 126, 124);
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
__guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
__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.
|
// 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.
|
// Create desktop and return it. Remember it for later.
|
||||||
_guiDesktop = desktopNew();
|
_guiDesktop = desktopNew();
|
||||||
|
|
|
@ -180,19 +180,21 @@ typedef struct WidgetS WidgetT;
|
||||||
typedef struct WindowS WindowT;
|
typedef struct WindowS WindowT;
|
||||||
|
|
||||||
|
|
||||||
extern int16_t _guiMetric[METRIC_COUNT];
|
extern int16_t __guiMetric[METRIC_COUNT];
|
||||||
extern ColorT _guiColor[COLOR_COUNT];
|
extern ColorT __guiColor[COLOR_COUNT];
|
||||||
extern FontT *_guiFont;
|
extern FontT *__guiFont;
|
||||||
extern WidgetT *_guiDragWidget;
|
extern WidgetT *__guiDragWidget;
|
||||||
extern uint16_t _guiDragOffsetX;
|
extern uint16_t _guiDragOffsetX;
|
||||||
extern uint16_t _guiDragOffsetY;
|
extern uint16_t __guiDragOffsetY;
|
||||||
extern WindowT *_guiActiveWindow;
|
extern WindowT *__guiActiveWindow;
|
||||||
|
extern char *__guiMagicDebugNames[MAGIC_COUNT];
|
||||||
|
|
||||||
|
|
||||||
void guiAttach(WidgetT *parent, WidgetT *child);
|
void guiAttach(WidgetT *parent, WidgetT *child);
|
||||||
void guiComposite(void);
|
void guiComposite(void);
|
||||||
void guiDebugAreaShow(WidgetT *widget);
|
void guiDebugAreaShow(WidgetT *widget);
|
||||||
void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth);
|
void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth);
|
||||||
|
void guiDelayedFree(void **pointer);
|
||||||
void guiDelete(WidgetT **widget);
|
void guiDelete(WidgetT **widget);
|
||||||
WidgetT *guiFocusGet(void);
|
WidgetT *guiFocusGet(void);
|
||||||
void guiFocusSet(WidgetT *widget);
|
void guiFocusSet(WidgetT *widget);
|
||||||
|
|
|
@ -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) {
|
void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha) {
|
||||||
uint16_t x1;
|
uint16_t x1;
|
||||||
uint16_t y1;
|
uint16_t y1;
|
||||||
|
|
|
@ -43,6 +43,7 @@ uint8_t imageInfoGet(char *filename, uint16_t *width, uint16_t *height);
|
||||||
ImageT *imageLoad(char *filename);
|
ImageT *imageLoad(char *filename);
|
||||||
ColorT imagePixelGet(ImageT *image, uint16_t x, uint16_t y);
|
ColorT imagePixelGet(ImageT *image, uint16_t x, uint16_t y);
|
||||||
void imageRender(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 imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha);
|
||||||
void imageUnload(ImageT **image);
|
void imageUnload(ImageT **image);
|
||||||
uint16_t imageWidthGet(ImageT *image);
|
uint16_t imageWidthGet(ImageT *image);
|
||||||
|
|
|
@ -63,8 +63,8 @@ WidgetT *labelInit(WidgetT *widget, char *title) {
|
||||||
l->base.paintMethod = labelPaint;
|
l->base.paintMethod = labelPaint;
|
||||||
l->base.mouseEventMethod = labelMouseEvent;
|
l->base.mouseEventMethod = labelMouseEvent;
|
||||||
l->title = NULL;
|
l->title = NULL;
|
||||||
l->background = _guiColor[COLOR_WINDOW_BACKGROUND];
|
l->background = __guiColor[COLOR_WINDOW_BACKGROUND];
|
||||||
l->foreground = _guiColor[COLOR_LABEL_TEXT_INACTIVE];
|
l->foreground = __guiColor[COLOR_LABEL_TEXT_INACTIVE];
|
||||||
l->clicked = NULL;
|
l->clicked = NULL;
|
||||||
|
|
||||||
labelTitleSet(l, title);
|
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 *labelNew(uint16_t x, uint16_t y, char *title) {
|
||||||
LabelT *label = (LabelT *)malloc(sizeof(LabelT));
|
LabelT *label = (LabelT *)malloc(sizeof(LabelT));
|
||||||
WidgetT *widget = NULL;
|
WidgetT *widget = NULL;
|
||||||
uint16_t h = fontHeightGet(_guiFont);
|
uint16_t h = fontHeightGet(__guiFont);
|
||||||
|
|
||||||
if (!label) return NULL;
|
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;
|
ColorT text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? l->active : l->foreground;
|
||||||
|
|
||||||
// Draw title.
|
// 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) {
|
void labelTitleSet(LabelT *label, char *title) {
|
||||||
if (label->title) free(label->title);
|
if (label->title) free(label->title);
|
||||||
label->title = strdup(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);
|
GUI_SET_FLAG((WidgetT *)label, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ static uint16_t _valueTop = 0;
|
||||||
static uint16_t _valueBottom = 0;
|
static uint16_t _valueBottom = 0;
|
||||||
static uint16_t _arrowWidth = 0;
|
static uint16_t _arrowWidth = 0;
|
||||||
static uint16_t _arrowStart = 0;
|
static uint16_t _arrowStart = 0;
|
||||||
|
static uint8_t _hasTitle = 0;
|
||||||
|
|
||||||
|
|
||||||
static void listboxDel(WidgetT **widget);
|
static void listboxDel(WidgetT **widget);
|
||||||
|
@ -185,25 +186,29 @@ static void listboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16
|
||||||
len = arrlenu(l->values);
|
len = arrlenu(l->values);
|
||||||
|
|
||||||
// Clicked item in listbox.
|
// 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) {
|
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 (o < len) l->selected = o;
|
||||||
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.
|
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);
|
GUI_SET_FLAG(widget, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
_arrowStart += 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Left of up arrow
|
_arrowStart += 1 + __guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Left of up arrow
|
||||||
o = _valueTop + 1 + _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of arrows
|
o = _valueTop + 1 + __guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Top of arrows
|
||||||
|
|
||||||
// Did they click the up arrow?
|
// 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);
|
listboxScrollUp(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Did they click the down arrow?
|
// Did they click the down arrow?
|
||||||
o = _valueBottom - 1 - _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of 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) {
|
if (x >= _arrowStart && x <= _arrowStart + fontHeightGet(__guiFont) && y >= o - fontHeightGet(__guiFont) && y <= o) {
|
||||||
listboxScrollDown(l);
|
listboxScrollDown(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,55 +253,59 @@ static void listboxPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
|
|
||||||
// How many items can we draw?
|
// How many items can we draw?
|
||||||
items = len - l->offset;
|
items = len - l->offset;
|
||||||
if (items > _visibleY - 1) items = _visibleY - 1;
|
if (_hasTitle) {
|
||||||
|
if (items > _visibleY - 1) items = _visibleY - 1;
|
||||||
|
} else {
|
||||||
|
if (items > _visibleY) items = _visibleY;
|
||||||
|
}
|
||||||
|
|
||||||
// Draw title.
|
// Draw title, if it exists.
|
||||||
fontRender(_guiFont, l->title, _guiColor[COLOR_LISTBOX_TEXT], _guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y);
|
if (_hasTitle) fontRender(__guiFont, l->title, __guiColor[COLOR_LISTBOX_TEXT], __guiColor[COLOR_WINDOW_BACKGROUND], pos.x, pos.y);
|
||||||
|
|
||||||
// Draw outline of listbox.
|
// 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.
|
// 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.
|
// 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++) {
|
for (i=0; i<items; i++) {
|
||||||
if (i == l->selected) {
|
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]);
|
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);
|
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 {
|
} 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.
|
// 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.
|
// 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
|
// Draw up arrow
|
||||||
_arrowStart += _halfFont + 1 + _guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING]; // Center of 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
|
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];
|
color = l->offset + l->selected > 0 ? __guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] : __guiColor[COLOR_LISTBOX_ARROWS_INACTIVE];
|
||||||
for (i=0; i<=fontHeightGet(_guiFont); i++) {
|
for (i=0; i<=fontHeightGet(__guiFont); i++) {
|
||||||
surfaceLineDraw(_arrowStart - i * 0.5, o + i, _arrowStart + i * 0.5, o + i, color);
|
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, 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 - _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_HIGHLIGHT]);
|
||||||
|
|
||||||
// Draw down arrow
|
// Draw down arrow
|
||||||
o = _valueBottom - 1 - _guiMetric[METRIC_LISTBOX_VERTICAL_PADDING]; // Bottom of 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];
|
color = l->offset + l->selected < len - 1 ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
|
||||||
for (i=0; i<=fontHeightGet(_guiFont); i++) {
|
for (i=0; i<=fontHeightGet(__guiFont); i++) {
|
||||||
surfaceLineDraw(_arrowStart - i * 0.5, o - i, _arrowStart + i * 0.5, o - i, color);
|
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, 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 - _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_HIGHLIGHT]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,7 +313,7 @@ static void listboxScrollDown(ListboxT *listbox) {
|
||||||
int16_t len = arrlenu(listbox->values);
|
int16_t len = arrlenu(listbox->values);
|
||||||
|
|
||||||
// Can we increment?
|
// Can we increment?
|
||||||
if (listbox->selected < _visibleY - 2) {
|
if (listbox->selected < _visibleY - (_hasTitle ? 2 : 1)) {
|
||||||
// Is it off the end of the list?
|
// Is it off the end of the list?
|
||||||
if (listbox->offset + listbox->selected < len - 1) {
|
if (listbox->offset + listbox->selected < len - 1) {
|
||||||
listbox->selected++;
|
listbox->selected++;
|
||||||
|
@ -346,18 +355,18 @@ static void listboxSizesRecalculate(ListboxT *listbox) {
|
||||||
// arrowStart is x+1+valueWidth
|
// arrowStart is x+1+valueWidth
|
||||||
|
|
||||||
// Set global stuff that isn't actually part of the widget state.
|
// Set global stuff that isn't actually part of the widget state.
|
||||||
_halfFont = fontHeightGet(_guiFont) * 0.5;
|
_hasTitle = (listbox->title != NULL);
|
||||||
_arrowWidth = 2 + (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) + fontHeightGet(_guiFont); // Arrow width = font height
|
_halfFont = fontHeightGet(__guiFont) * 0.5;
|
||||||
_valueWidth = listbox->base.pos.w - 1 - 1 - (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) - _arrowWidth;
|
_arrowWidth = 2 + (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) + fontHeightGet(__guiFont); // Arrow width = font height
|
||||||
_valueHeight = listbox->base.pos.h - 2 - (_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2);
|
_valueWidth = listbox->base.pos.w - 1 - 1 - (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2) - _arrowWidth;
|
||||||
_valueTop = fontHeightGet(_guiFont) + 1;
|
_valueHeight = listbox->base.pos.h - 2 - (__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2);
|
||||||
|
_valueTop = (fontHeightGet(__guiFont) + 1) * _hasTitle;
|
||||||
_valueBottom = _valueHeight;
|
_valueBottom = _valueHeight;
|
||||||
_arrowStart = 2 + _valueWidth;
|
_arrowStart = 2 + _valueWidth;
|
||||||
|
|
||||||
// Figure out how many characters we have room to display.
|
// Figure out how many characters we have room to display.
|
||||||
_visibleX = (_valueWidth - 2 + (_guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2)) / fontWidthGet(_guiFont);
|
_visibleX = (_valueWidth - 2 + (__guiMetric[METRIC_LISTBOX_HORIZONTAL_PADDING] * 2)) / fontWidthGet(__guiFont);
|
||||||
_visibleY = (_valueHeight - 2 + (_guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2)) / fontHeightGet(_guiFont);
|
_visibleY = (_valueHeight - 2 + (__guiMetric[METRIC_LISTBOX_VERTICAL_PADDING] * 2)) / fontHeightGet(__guiFont);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,16 +43,17 @@
|
||||||
#define ICN_SIZE 32
|
#define ICN_SIZE 32
|
||||||
|
|
||||||
|
|
||||||
static msgBoxCallback _cbOne = NULL;
|
typedef struct MessageBoxContextS {
|
||||||
static msgBoxCallback _cbTwo = NULL;
|
msgBoxCallback cbOne;
|
||||||
static msgBoxCallback _cbThree = NULL;
|
msgBoxCallback cbTwo;
|
||||||
|
msgBoxCallback cbThree;
|
||||||
static WindowT *_winDialog = NULL;
|
WindowT *winDialog;
|
||||||
static PictureT *_picIcon = NULL;
|
PictureT *picIcon;
|
||||||
static LabelT *_lblText = NULL;
|
LabelT *lblText;
|
||||||
static ButtonT *_btnOne = NULL;
|
ButtonT *btnOne;
|
||||||
static ButtonT *_btnTwo = NULL;
|
ButtonT *btnTwo;
|
||||||
static ButtonT *_btnThree = NULL;
|
ButtonT *btnThree;
|
||||||
|
} MessageBoxContextT;
|
||||||
|
|
||||||
|
|
||||||
//***TODO*** This depends on the cache system which isn't really part of the GUI.
|
//***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) {
|
static void btnMsgBox(WidgetT *widget) {
|
||||||
|
MessageBoxContextT *context = guiUserDataGet(widget);
|
||||||
|
|
||||||
// Remove us from the display.
|
// Remove us from the display.
|
||||||
guiDelete(D(_winDialog));
|
guiDelete(D(context->winDialog));
|
||||||
|
|
||||||
// Call whoever wanted called.
|
// Call whoever wanted called.
|
||||||
if (widget == W(_btnOne)) {
|
if (widget == W(context->btnOne)) {
|
||||||
if (_cbOne) _cbOne(MSGBOX_BUTTON_ONE);
|
if (context->cbOne) context->cbOne(MSGBOX_BUTTON_ONE);
|
||||||
}
|
}
|
||||||
if (widget == W(_btnTwo)) {
|
if (widget == W(context->btnTwo)) {
|
||||||
if (_cbTwo) _cbTwo(MSGBOX_BUTTON_TWO);
|
if (context->cbTwo) context->cbTwo(MSGBOX_BUTTON_TWO);
|
||||||
}
|
}
|
||||||
if (widget == W(_btnThree)) {
|
if (widget == W(context->btnThree)) {
|
||||||
if (_cbThree) _cbThree(MSGBOX_BUTTON_THREE);
|
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;
|
uint16_t cursorH = 0;
|
||||||
char *token = NULL;
|
char *token = NULL;
|
||||||
char *text = NULL;
|
char *text = NULL;
|
||||||
|
MessageBoxContextT *context = NULL;
|
||||||
|
|
||||||
|
NEW(MessageBoxContextT, context);
|
||||||
|
|
||||||
// Null these for later.
|
// Null these for later.
|
||||||
_btnOne = NULL;
|
context->btnOne = NULL;
|
||||||
_btnTwo = NULL;
|
context->btnTwo = NULL;
|
||||||
_btnThree = NULL;
|
context->btnThree = NULL;
|
||||||
|
|
||||||
// Remember callbacks for later.
|
// Remember callbacks for later.
|
||||||
_cbOne = callbackOne;
|
context->cbOne = callbackOne;
|
||||||
_cbTwo = callbackTwo;
|
context->cbTwo = callbackTwo;
|
||||||
_cbThree = callbackThree;
|
context->cbThree = callbackThree;
|
||||||
|
|
||||||
// Calculate size of dialog box window.
|
// Calculate size of dialog box window.
|
||||||
|
|
||||||
// Initial minimum window width is the left and right margins + font width * (title length + 3).
|
// 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).
|
// 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.
|
// Count lines of text and add up height. Find widest line.
|
||||||
text = strdup(message);
|
text = strdup(message);
|
||||||
token = strtok(text, "\n");
|
token = strtok(text, "\n");
|
||||||
while (token) {
|
while (token) {
|
||||||
textH += fontHeightGet(_guiFont);
|
textH += fontHeightGet(__guiFont);
|
||||||
if (strlen(token) > textW) {
|
if (strlen(token) > textW) {
|
||||||
textW = strlen(token);
|
textW = strlen(token);
|
||||||
}
|
}
|
||||||
token = strtok(NULL, "\n");
|
token = strtok(NULL, "\n");
|
||||||
}
|
}
|
||||||
free(text);
|
free(text);
|
||||||
textW *= fontWidthGet(_guiFont);
|
textW *= fontWidthGet(__guiFont);
|
||||||
|
|
||||||
// Initial cursor move and window sizing are based on text height.
|
// Initial cursor move and window sizing are based on text height.
|
||||||
cursorH = textH;
|
cursorH = textH;
|
||||||
|
@ -155,16 +165,16 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
|
||||||
if (newW > w) w = newW;
|
if (newW > w) w = newW;
|
||||||
|
|
||||||
// Do we need to make the dialog wider to contain the buttons?
|
// 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));
|
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 (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 (buttonThree) newW += MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonThree));
|
||||||
if (newW > w) w = newW;
|
if (newW > w) w = newW;
|
||||||
|
|
||||||
// Draw dialog.
|
// Draw dialog.
|
||||||
|
|
||||||
h -= 5; // Height is off for some reason. At least, to me, it doesn't look right.
|
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);
|
context->winDialog = windowNew(vbeDisplayWidthGet() / 2 - w / 2, vbeDisplayHeightGet() / 2 - h / 2, w, h, title);
|
||||||
guiAttach(guiRootGet(), W(_winDialog));
|
guiAttach(guiRootGet(), W(context->winDialog));
|
||||||
|
|
||||||
// Initial x cursor is the (implied window left margin +) padding
|
// Initial x cursor is the (implied window left margin +) padding
|
||||||
x = MSG_PADDING;
|
x = MSG_PADDING;
|
||||||
|
@ -174,8 +184,8 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
|
||||||
|
|
||||||
// Load proper icon, if desired.
|
// Load proper icon, if desired.
|
||||||
if (icon > MSGBOX_ICON_NONE && icon < MSGBOX_ICON_COUNT) {
|
if (icon > MSGBOX_ICON_NONE && icon < MSGBOX_ICON_COUNT) {
|
||||||
_picIcon = pictureNew(x, y, cacheFilenameGet(_iconFiles[icon - 1]));
|
context->picIcon = pictureNew(x, y, cacheFilenameGet(_iconFiles[icon - 1]));
|
||||||
guiAttach(W(_winDialog), W(_picIcon));
|
guiAttach(W(context->winDialog), W(context->picIcon));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw message text.
|
// Draw message text.
|
||||||
|
@ -184,33 +194,36 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne,
|
||||||
text = strdup(message);
|
text = strdup(message);
|
||||||
token = strtok(text, "\n");
|
token = strtok(text, "\n");
|
||||||
while (token) {
|
while (token) {
|
||||||
_lblText = labelNew(x, t, token);
|
context->lblText = labelNew(x, t, token);
|
||||||
guiAttach(W(_winDialog), W(_lblText));
|
guiAttach(W(context->winDialog), W(context->lblText));
|
||||||
t += fontHeightGet(_guiFont);
|
t += fontHeightGet(__guiFont);
|
||||||
token = strtok(NULL, "\n");
|
token = strtok(NULL, "\n");
|
||||||
}
|
}
|
||||||
free(text);
|
free(text);
|
||||||
|
|
||||||
// Move to where buttons belong.
|
// 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;
|
y += cursorH + MSG_PADDING;
|
||||||
|
|
||||||
// We always have at least one button.
|
// We always have at least one button.
|
||||||
_btnOne = buttonNew(x, y, buttonOne, btnMsgBox);
|
context->btnOne = buttonNew(x, y, buttonOne, btnMsgBox);
|
||||||
guiAttach(W(_winDialog), W(_btnOne));
|
guiUserDataSet(W(context->btnOne), context);
|
||||||
|
guiAttach(W(context->winDialog), W(context->btnOne));
|
||||||
|
|
||||||
// Two buttons?
|
// Two buttons?
|
||||||
if (buttonTwo) {
|
if (buttonTwo) {
|
||||||
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonTwo)));
|
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonTwo)));
|
||||||
_btnTwo = buttonNew(x, y, buttonTwo, btnMsgBox);
|
context->btnTwo = buttonNew(x, y, buttonTwo, btnMsgBox);
|
||||||
guiAttach(W(_winDialog), W(_btnTwo));
|
guiUserDataSet(W(context->btnTwo), context);
|
||||||
|
guiAttach(W(context->winDialog), W(context->btnTwo));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Three buttons?
|
// Three buttons?
|
||||||
if (buttonThree) {
|
if (buttonThree) {
|
||||||
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(_guiFont) * strlen(buttonThree)));
|
x -= (MSG_PADDING + BTN_MARGIN_LEFT + BTN_MARGIN_RIGHT + (fontWidthGet(__guiFont) * strlen(buttonThree)));
|
||||||
_btnThree = buttonNew(x, y, buttonThree, btnMsgBox);
|
context->btnThree = buttonNew(x, y, buttonThree, btnMsgBox);
|
||||||
guiAttach(W(_winDialog), W(_btnThree));
|
guiUserDataSet(W(context->btnThree), context);
|
||||||
|
guiAttach(W(context->winDialog), W(context->btnThree));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ WidgetT *pictureInit(WidgetT *widget, char *filename) {
|
||||||
l->base.mouseEventMethod = pictureMouseEvent;
|
l->base.mouseEventMethod = pictureMouseEvent;
|
||||||
l->filename = strdup(filename);
|
l->filename = strdup(filename);
|
||||||
l->clicked = NULL;
|
l->clicked = NULL;
|
||||||
|
l->zoom = PICTURE_FULL;
|
||||||
|
|
||||||
l->image = imageLoad(l->filename);
|
l->image = imageLoad(l->filename);
|
||||||
if (!l->image) {
|
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) {
|
static void picturePaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
PictureT *p = (PictureT *)widget;
|
PictureT *p = (PictureT *)widget;
|
||||||
|
|
||||||
imageRender(p->image, pos.x, pos.y);
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,17 +27,25 @@
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum PictureZoomE {
|
||||||
|
PICTURE_FULL = 0,
|
||||||
|
PICTURE_HALF
|
||||||
|
} PictureZoomT;
|
||||||
|
|
||||||
|
|
||||||
typedef struct PictureS {
|
typedef struct PictureS {
|
||||||
WidgetT base; // Must be first in every widget
|
WidgetT base; // Must be first in every widget
|
||||||
char *filename;
|
char *filename;
|
||||||
widgetCallback clicked;
|
widgetCallback clicked;
|
||||||
ImageT *image;
|
ImageT *image;
|
||||||
|
int8_t zoom;
|
||||||
} PictureT;
|
} PictureT;
|
||||||
|
|
||||||
|
|
||||||
void pictureClickHandlerSet(PictureT *picture, widgetCallback callback);
|
void pictureClickHandlerSet(PictureT *picture, widgetCallback callback);
|
||||||
WidgetT *pictureInit(WidgetT *widget, char *filename);
|
WidgetT *pictureInit(WidgetT *widget, char *filename);
|
||||||
PictureT *pictureNew(uint16_t x, uint16_t y, char *filename);
|
PictureT *pictureNew(uint16_t x, uint16_t y, char *filename);
|
||||||
|
void pictureZoomSet(PictureT *picture, PictureZoomT zoom);
|
||||||
|
|
||||||
|
|
||||||
#endif // PICTURE_H
|
#endif // PICTURE_H
|
||||||
|
|
|
@ -53,7 +53,7 @@ WidgetT *radioInit(WidgetT *widget, char *title, uint16_t group) {
|
||||||
radioTitleSet(r, title);
|
radioTitleSet(r, title);
|
||||||
|
|
||||||
// Width is set in radioSetTitle
|
// Width is set in radioSetTitle
|
||||||
r->base.pos.h = fontHeightGet(_guiFont);
|
r->base.pos.h = fontHeightGet(__guiFont);
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
@ -107,21 +107,21 @@ static void radioPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
|
|
||||||
active = (radioSelectedGet(r) == r);
|
active = (radioSelectedGet(r) == r);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
highlight = active ? _guiColor[COLOR_RADIOBUTTON_SHADOW] : _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT];
|
highlight = active ? __guiColor[COLOR_RADIOBUTTON_SHADOW] : __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT];
|
||||||
shadow = active ? _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] : _guiColor[COLOR_RADIOBUTTON_SHADOW];
|
shadow = active ? __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT] : __guiColor[COLOR_RADIOBUTTON_SHADOW];
|
||||||
fill = active ? _guiColor[COLOR_RADIOBUTTON_ACTIVE] : _guiColor[COLOR_RADIOBUTTON_INACTIVE];
|
fill = active ? __guiColor[COLOR_RADIOBUTTON_ACTIVE] : __guiColor[COLOR_RADIOBUTTON_INACTIVE];
|
||||||
text = _guiColor[COLOR_CHECKBOX_TEXT];
|
text = __guiColor[COLOR_CHECKBOX_TEXT];
|
||||||
background = _guiColor[COLOR_WINDOW_BACKGROUND];
|
background = __guiColor[COLOR_WINDOW_BACKGROUND];
|
||||||
} else {
|
} else {
|
||||||
highlight = active ? _guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] : _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED];
|
highlight = active ? __guiColor[COLOR_RADIOBUTTON_SHADOW_DISABLED] : __guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED];
|
||||||
shadow = active ? _guiColor[COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED] : _guiColor[COLOR_RADIOBUTTON_SHADOW_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];
|
fill = active ? __guiColor[COLOR_RADIOBUTTON_ACTIVE_DISABLED] : __guiColor[COLOR_RADIOBUTTON_INACTIVE_DISABLED];
|
||||||
text = _guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
|
text = __guiColor[COLOR_CHECKBOX_TEXT_DISABLED];
|
||||||
background = _guiColor[COLOR_WINDOW_BACKGROUND];
|
background = __guiColor[COLOR_WINDOW_BACKGROUND];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Radio button is 10x10 pixels. Find offset based on font height.
|
// 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.
|
// Draw outline of radio button.
|
||||||
surfaceLineDraw(pos.x, pos.y + o + 5, pos.x + 5, pos.y + o, highlight);
|
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.
|
// 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) {
|
void radioTitleSet(RadioT *radio, char *title) {
|
||||||
if (radio->title) free(radio->title);
|
if (radio->title) free(radio->title);
|
||||||
radio->title = strdup(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);
|
GUI_SET_FLAG((WidgetT *)radio, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,7 @@ static void tagListWidgetAttributeHandle(void) {
|
||||||
uint8_t enabled;
|
uint8_t enabled;
|
||||||
uint8_t visible;
|
uint8_t visible;
|
||||||
char mask;
|
char mask;
|
||||||
|
PictureZoomT zoom;
|
||||||
|
|
||||||
// Process generated lists in reverse.
|
// Process generated lists in reverse.
|
||||||
while (arrlen(_widgetList) > 0) {
|
while (arrlen(_widgetList) > 0) {
|
||||||
|
@ -147,6 +148,7 @@ static void tagListWidgetAttributeHandle(void) {
|
||||||
enabled = 1;
|
enabled = 1;
|
||||||
visible = 1;
|
visible = 1;
|
||||||
mask = 0;
|
mask = 0;
|
||||||
|
zoom = PICTURE_FULL;
|
||||||
|
|
||||||
// Parse provided attributes.
|
// Parse provided attributes.
|
||||||
for (i=0; i<arrlen(w->tagList); i+=2) {
|
for (i=0; i<arrlen(w->tagList); i+=2) {
|
||||||
|
@ -256,6 +258,9 @@ static void tagListWidgetAttributeHandle(void) {
|
||||||
pos.y = v;
|
pos.y = v;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_ZOOM:
|
||||||
|
zoom = v;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,6 +321,7 @@ static void tagListWidgetAttributeHandle(void) {
|
||||||
|
|
||||||
case T_PICTURE:
|
case T_PICTURE:
|
||||||
widget = W(pictureNew(pos.x, pos.y, filename));
|
widget = W(pictureNew(pos.x, pos.y, filename));
|
||||||
|
pictureZoomSet((PictureT *)widget, zoom);
|
||||||
if (click != NULL) pictureClickHandlerSet((PictureT *)widget, click);
|
if (click != NULL) pictureClickHandlerSet((PictureT *)widget, click);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ enum TagItemsE {
|
||||||
T_WIDTH,
|
T_WIDTH,
|
||||||
T_X,
|
T_X,
|
||||||
T_Y,
|
T_Y,
|
||||||
|
T_ZOOM,
|
||||||
|
|
||||||
T_META_END_OF_ATTRIBUTES
|
T_META_END_OF_ATTRIBUTES
|
||||||
};
|
};
|
||||||
|
|
|
@ -539,7 +539,7 @@ WidgetT *terminalInit(WidgetT *widget, uint16_t cols, uint16_t rows) {
|
||||||
t->base.paintMethod = terminalPaint;
|
t->base.paintMethod = terminalPaint;
|
||||||
t->base.keyboardEventMethod = terminalKeyboardEvent;
|
t->base.keyboardEventMethod = terminalKeyboardEvent;
|
||||||
t->base.mouseEventMethod = terminalMouseEvent;
|
t->base.mouseEventMethod = terminalMouseEvent;
|
||||||
t->font = _guiFont; // Default font. Also see terminalNew.
|
t->font = __guiFont; // Default font. Also see terminalNew.
|
||||||
t->cols = cols;
|
t->cols = cols;
|
||||||
t->rows = rows;
|
t->rows = rows;
|
||||||
t->cursorX = 1;
|
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;
|
if (!terminal) return NULL;
|
||||||
|
|
||||||
// Default font. Also see terminalInit.
|
// Default font. Also see terminalInit.
|
||||||
w = fontWidthGet(_guiFont) * cols;
|
w = fontWidthGet(__guiFont) * cols;
|
||||||
h = fontHeightGet(_guiFont) * rows;
|
h = fontHeightGet(__guiFont) * rows;
|
||||||
|
|
||||||
widget = widgetInit(W(terminal), MAGIC_TERMINAL, x, y, w, h, 0, 0, 0, 0);
|
widget = widgetInit(W(terminal), MAGIC_TERMINAL, x, y, w, h, 0, 0, 0, 0);
|
||||||
if (!widget) {
|
if (!widget) {
|
||||||
|
|
|
@ -226,14 +226,14 @@ static void textboxMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16
|
||||||
// Allow dragging/positioning text cursor with mouse.
|
// Allow dragging/positioning text cursor with mouse.
|
||||||
if (event == MOUSE_EVENT_LEFT_HOLD) {
|
if (event == MOUSE_EVENT_LEFT_HOLD) {
|
||||||
// Where's the text display?
|
// Where's the text display?
|
||||||
textArea.x = (strlen(t->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_TEXTBOX_PADDING] + 2 + _guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
|
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.y = 2 + __guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
|
||||||
textArea.w = textArea.x + t->visible * fontWidthGet(_guiFont);
|
textArea.w = textArea.x + t->visible * fontWidthGet(__guiFont);
|
||||||
textArea.h = textArea.y + fontHeightGet(_guiFont);
|
textArea.h = textArea.y + fontHeightGet(__guiFont);
|
||||||
// Is the pointer over it?
|
// Is the pointer over it?
|
||||||
if (x >= textArea.x && x < textArea.w && y >= textArea.y && y < textArea.h) {
|
if (x >= textArea.x && x < textArea.w && y >= textArea.y && y < textArea.h) {
|
||||||
// Move caret.
|
// Move caret.
|
||||||
t->caret = (x - textArea.x) / fontWidthGet(_guiFont);
|
t->caret = (x - textArea.x) / fontWidthGet(__guiFont);
|
||||||
// Did we go too far?
|
// Did we go too far?
|
||||||
if (t->caret + t->offset > strlen(t->value)) {
|
if (t->caret + t->offset > strlen(t->value)) {
|
||||||
t->caret = strlen(t->value) - t->offset;
|
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 *textboxNew(uint16_t x, uint16_t y, uint16_t w, char *title) {
|
||||||
TextboxT *textbox = (TextboxT *)malloc(sizeof(TextboxT));
|
TextboxT *textbox = (TextboxT *)malloc(sizeof(TextboxT));
|
||||||
WidgetT *widget = NULL;
|
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;
|
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) {
|
if (GUI_GET_FLAG(widget, WIDGET_FLAG_DIRTY) || guiFocusGet() == widget) {
|
||||||
labelWidth = (strlen(t->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_TEXTBOX_PADDING];
|
labelWidth = (strlen(t->title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_TEXTBOX_PADDING];
|
||||||
valueWidth = (t->visible * fontWidthGet(_guiFont)) + (_guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2);
|
valueWidth = (t->visible * fontWidthGet(__guiFont)) + (__guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING] * 2);
|
||||||
|
|
||||||
// Draw title.
|
// 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.
|
// 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]);
|
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]);
|
surfaceRectangleDraw( pos.x + labelWidth + 1, pos.y + 1, pos.x + labelWidth + valueWidth + 1, pos.y + pos.h - 1, __guiColor[COLOR_WINDOW_BACKGROUND]);
|
||||||
|
|
||||||
// Draw 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?
|
// Where's the text display start?
|
||||||
textX = pos.x + labelWidth + 2 + _guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
|
textX = pos.x + labelWidth + 2 + __guiMetric[METRIC_TEXTBOX_HORIZONTAL_PADDING];
|
||||||
textY = pos.y + 2 + _guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
|
textY = pos.y + 2 + __guiMetric[METRIC_TEXTBOX_VERTICAL_PADDING];
|
||||||
|
|
||||||
// Draw value.
|
// Draw value.
|
||||||
draw = strdup(&t->value[t->offset]);
|
draw = strdup(&t->value[t->offset]);
|
||||||
if (strlen(draw) > t->visible) draw[t->visible] = 0;
|
if (strlen(draw) > t->visible) draw[t->visible] = 0;
|
||||||
if (t->password != 0) memset(draw, t->password, strlen(draw));
|
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);
|
free(draw);
|
||||||
|
|
||||||
// Draw cursor.
|
// Draw cursor.
|
||||||
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
|
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
|
||||||
caretPos = textX + fontWidthGet(_guiFont) * t->caret;
|
caretPos = textX + fontWidthGet(__guiFont) * t->caret;
|
||||||
fontRender(_guiFont, cursor, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_TEXTBOX_BACKGROUND], caretPos, textY);
|
fontRender(__guiFont, cursor, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_TEXTBOX_BACKGROUND], caretPos, textY);
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
||||||
|
@ -321,7 +321,7 @@ void textboxTitleSet(TextboxT *textbox, char *title) {
|
||||||
textbox->title = strdup(title);
|
textbox->title = strdup(title);
|
||||||
|
|
||||||
// Figure out how many characters we have room to display.
|
// 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);
|
GUI_SET_FLAG((WidgetT *)textbox, WIDGET_FLAG_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,11 +191,11 @@ static void updownMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
|
||||||
if (event == MOUSE_EVENT_LEFT_UP) {
|
if (event == MOUSE_EVENT_LEFT_UP) {
|
||||||
updownSizesRecalculate(u);
|
updownSizesRecalculate(u);
|
||||||
|
|
||||||
_arrowStart += 1 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Left of up arrow
|
_arrowStart += 1 + __guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Left of up arrow
|
||||||
o = 1 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of arrows
|
o = 1 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING]; // Top of arrows
|
||||||
|
|
||||||
// Did they click the up arrow?
|
// 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?
|
// Can we increment?
|
||||||
if (u->value < u->maximum) {
|
if (u->value < u->maximum) {
|
||||||
// Clamp.
|
// Clamp.
|
||||||
|
@ -209,8 +209,8 @@ static void updownMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
|
||||||
}
|
}
|
||||||
|
|
||||||
// Did they click the down arrow?
|
// Did they click the down arrow?
|
||||||
_arrowStart += fontHeightGet(_guiFont) + 1; // Left of down arrow
|
_arrowStart += fontHeightGet(__guiFont) + 1; // Left of down 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 decrement?
|
// Can we decrement?
|
||||||
if (u->value > u->minimum) {
|
if (u->value > u->minimum) {
|
||||||
// Clamp.
|
// 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 *updownNew(uint16_t x, uint16_t y, int32_t min, int32_t max, int32_t step, char *title) {
|
||||||
UpdownT *updown = (UpdownT *)malloc(sizeof(UpdownT));
|
UpdownT *updown = (UpdownT *)malloc(sizeof(UpdownT));
|
||||||
WidgetT *widget = NULL;
|
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;
|
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.
|
_arrowStart += pos.x; // This method expects the start in screen space, not widget space.
|
||||||
|
|
||||||
// Draw title.
|
// 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.
|
// 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]);
|
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]);
|
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.
|
// 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
|
// 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
|
// 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
|
// Draw up arrow
|
||||||
_arrowStart += _halfFont + 1 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING]; // Center of 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
|
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];
|
color = u->value < u->maximum ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
|
||||||
for (i=0; i<=fontHeightGet(_guiFont); i++) {
|
for (i=0; i<=fontHeightGet(__guiFont); i++) {
|
||||||
surfaceLineDraw(_arrowStart - i * 0.5, o + i, _arrowStart + i * 0.5, o + i, color);
|
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, 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 - _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_HIGHLIGHT]);
|
||||||
|
|
||||||
// Draw down arrow
|
// Draw down arrow
|
||||||
_arrowStart += fontHeightGet(_guiFont) + 1; // Center of down arrow
|
_arrowStart += fontHeightGet(__guiFont) + 1; // Center of down arrow
|
||||||
o += fontHeightGet(_guiFont); // Bottom 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];
|
color = u->value > u->minimum ? __guiColor[COLOR_UPDOWN_ARROWS_ACTIVE] : __guiColor[COLOR_UPDOWN_ARROWS_INACTIVE];
|
||||||
for (i=0; i<=fontHeightGet(_guiFont); i++) {
|
for (i=0; i<=fontHeightGet(__guiFont); i++) {
|
||||||
surfaceLineDraw(_arrowStart - i * 0.5, o - i, _arrowStart + i * 0.5, o - i, color);
|
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, 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 - _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_HIGHLIGHT]);
|
||||||
|
|
||||||
// Where's the text display start?
|
// Where's the text display start?
|
||||||
textX = pos.x + _labelWidth + 2 + _guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING];
|
textX = pos.x + _labelWidth + 2 + __guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING];
|
||||||
textY = pos.y + 2 + _guiMetric[METRIC_UPDOWN_VERTICAL_PADDING];
|
textY = pos.y + 2 + __guiMetric[METRIC_UPDOWN_VERTICAL_PADDING];
|
||||||
|
|
||||||
// Draw value.
|
// Draw value.
|
||||||
snprintf(draw, UPDOWN_MAX_DIGITS, "%ld", (long)u->value); // Weird typecasting prevents warnings in both DOS and Linux (32 and 64 bit)
|
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);
|
textX += (u->visible - strlen(draw)) * fontWidthGet(__guiFont);
|
||||||
fontRender(_guiFont, draw, _guiColor[COLOR_UPDOWN_TEXT], _guiColor[COLOR_UPDOWN_BACKGROUND], textX, textY);
|
fontRender(__guiFont, draw, __guiColor[COLOR_UPDOWN_TEXT], __guiColor[COLOR_UPDOWN_BACKGROUND], textX, textY);
|
||||||
|
|
||||||
// Draw cursor.
|
// Draw cursor.
|
||||||
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
|
if (guiFocusGet() == widget && guiTimerQuarterSecondOn()) {
|
||||||
textX += (strlen(draw) - 1) * fontWidthGet(_guiFont);
|
textX += (strlen(draw) - 1) * fontWidthGet(__guiFont);
|
||||||
fontRender(_guiFont, cursor, _guiColor[COLOR_TEXTBOX_TEXT], _guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
|
fontRender(__guiFont, cursor, __guiColor[COLOR_TEXTBOX_TEXT], __guiColor[COLOR_TEXTBOX_BACKGROUND], textX, textY);
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
GUI_CLEAR_FLAG(widget, WIDGET_FLAG_DIRTY);
|
||||||
|
@ -329,11 +329,11 @@ static void updownSizesRecalculate(UpdownT *updown) {
|
||||||
// = - arrowStart (start of box surrounding arrows, including border).
|
// = - arrowStart (start of box surrounding arrows, including border).
|
||||||
|
|
||||||
// Set global stuff that isn't actually part of the widget state.
|
// Set global stuff that isn't actually part of the widget state.
|
||||||
_halfFont = fontHeightGet(_guiFont) * 0.5;
|
_halfFont = fontHeightGet(__guiFont) * 0.5;
|
||||||
_labelWidth = (strlen(updown->title) * fontWidthGet(_guiFont)) + _guiMetric[METRIC_UPDOWN_PADDING];
|
_labelWidth = (strlen(updown->title) * fontWidthGet(__guiFont)) + __guiMetric[METRIC_UPDOWN_PADDING];
|
||||||
_valueWidth = (updown->visible * fontWidthGet(_guiFont)) + (_guiMetric[METRIC_UPDOWN_HORIZONTAL_PADDING] * 2);
|
_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
|
_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];
|
_arrowStart = _labelWidth + _valueWidth + 2 + __guiMetric[METRIC_UPDOWN_ARROW_PADDING];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ void windowActiveSet(WindowT *window) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the GUI.
|
// Tell the GUI.
|
||||||
_guiActiveWindow = window;
|
__guiActiveWindow = window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,19 +118,19 @@ static void windowMouseEvent(WidgetT *widget, MouseT *mouse, uint16_t x, uint16_
|
||||||
// Start dragging?
|
// Start dragging?
|
||||||
if (event == MOUSE_EVENT_LEFT_DOWN && GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE)) {
|
if (event == MOUSE_EVENT_LEFT_DOWN && GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE)) {
|
||||||
// Are we on the draggable area of the titlebar / borders?
|
// 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.
|
// Start dragging.
|
||||||
_guiDragWidget = widget;
|
__guiDragWidget = widget;
|
||||||
_guiDragOffsetX = mouse->x - window->base.pos.x;
|
_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.
|
// 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.
|
// Move window.
|
||||||
window->base.pos.x = mouse->x - _guiDragOffsetX;
|
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.
|
// Keep it on the screen.
|
||||||
if (window->base.pos.x < 0) window->base.pos.x = 0;
|
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;
|
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.
|
// Be sure we stop dragging on mouse up or move out.
|
||||||
if (_guiDragWidget == widget && event == MOUSE_EVENT_LEFT_UP) {
|
if (__guiDragWidget == widget && event == MOUSE_EVENT_LEFT_UP) {
|
||||||
_guiDragWidget = NULL;
|
__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;
|
if (!window) return NULL;
|
||||||
|
|
||||||
widget = widgetInit(W(window), MAGIC_WINDOW, x, y, w, h,
|
widget = widgetInit(W(window), MAGIC_WINDOW, x, y, w, h,
|
||||||
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3,
|
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 3,
|
||||||
_guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT],
|
__guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT],
|
||||||
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4,
|
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4,
|
||||||
_guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4);
|
__guiMetric[METRIC_WINDOW_BORDER_WIDTH] + 4);
|
||||||
if (!widget) {
|
if (!widget) {
|
||||||
free(window);
|
free(window);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -176,23 +176,23 @@ static void windowPaint(WidgetT *widget, uint8_t enabled, RectT pos) {
|
||||||
|
|
||||||
x2 = pos.w - 1;
|
x2 = pos.w - 1;
|
||||||
y2 = pos.h - 1;
|
y2 = pos.h - 1;
|
||||||
background = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_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];
|
text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? __guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] : __guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE];
|
||||||
|
|
||||||
// Background.
|
// Background.
|
||||||
surfaceClear(_guiColor[COLOR_WINDOW_BACKGROUND]);
|
surfaceClear(__guiColor[COLOR_WINDOW_BACKGROUND]);
|
||||||
|
|
||||||
// Outer edge.
|
// 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.
|
// 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.
|
// 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]);
|
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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,6 @@ static uint8_t _takeScreenshot = 0;
|
||||||
|
|
||||||
|
|
||||||
static void comAddToBuffer(char *data, uint16_t len);
|
static void comAddToBuffer(char *data, uint16_t len);
|
||||||
//static void comBufferShow(void);
|
|
||||||
static void comModem(uint8_t c);
|
static void comModem(uint8_t c);
|
||||||
static void processEvent(void);
|
static void processEvent(void);
|
||||||
static void processNetworkEvent(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) {
|
int comClose(int com) {
|
||||||
// We only pretend to support one COM port.
|
// We only pretend to support one COM port.
|
||||||
if (com != 0) return SER_ERR_UNKNOWN;
|
if (com != 0) return SER_ERR_UNKNOWN;
|
||||||
|
@ -496,7 +480,6 @@ static void processNetworkEvent(void) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENET_EVENT_TYPE_RECEIVE:
|
case ENET_EVENT_TYPE_RECEIVE:
|
||||||
//logWrite(" IN: "); packetDebugPrint((uint8_t *)event.packet->data, event.packet->dataLength);
|
|
||||||
comAddToBuffer((char *)event.packet->data, event.packet->dataLength);
|
comAddToBuffer((char *)event.packet->data, event.packet->dataLength);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -292,6 +292,8 @@ static void tableSave(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern void browserShow(void);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (startup(argc, argv)) return 1;
|
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?
|
// Perform "first run" setup tasks or start the client?
|
||||||
if (hasValidSettings()) {
|
if (hasValidSettings()) {
|
||||||
// We have what we need, start the client.
|
// We have what we need, start the client.
|
||||||
welcomeShow();
|
//welcomeShow();
|
||||||
|
browserShow();
|
||||||
eventLoop();
|
eventLoop();
|
||||||
} else {
|
} else {
|
||||||
// Run the setup.
|
// Run the setup.
|
||||||
settingsShow(checkSettings);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
|
|
||||||
|
|
||||||
static void btnMsgBoxLogoff(MsgBoxButtonT button);
|
static void btnMsgBoxLogoff(MsgBoxButtonT button);
|
||||||
|
static void btnMsgBoxOkay(MsgBoxButtonT button);
|
||||||
|
static void menuEnable(uint8_t enable);
|
||||||
static void menuFilesReady(void);
|
static void menuFilesReady(void);
|
||||||
static void picChatClick(WidgetT *widget);
|
static void picChatClick(WidgetT *widget);
|
||||||
static void picEmailClick(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.
|
// ***TODO*** Need a way to close all other windows.
|
||||||
hangupShow(welcomeShow);
|
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) {
|
static void picChatClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
// ***TODO***
|
// ***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) {
|
static void picEmailClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
// ***TODO***
|
// ***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) {
|
static void picForumsClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
// ***TODO***
|
// ***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) {
|
static void picGamesClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
// ***TODO***
|
// ***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) {
|
static void picLogoffClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
|
menuEnable(0);
|
||||||
msgBoxTwo("Logoff?", MSGBOX_ICON_QUESTION, "This will disconnect you from the server.", "Okay", btnMsgBoxLogoff, "Cancel", btnMsgBoxLogoff);
|
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) {
|
static void picProfileClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
// ***TODO***
|
// ***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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,8 +112,6 @@ uint8_t cacheEntryAdd(char *sha256, char *entryName, char *virtualPath) {
|
||||||
|
|
||||||
// Index format is: SHA256 ENTRYNAME 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(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH);
|
||||||
sprintf(indexNew, "CACHE%cINDEX.NEW", OS_PATH_SLASH);
|
sprintf(indexNew, "CACHE%cINDEX.NEW", OS_PATH_SLASH);
|
||||||
|
|
||||||
|
|
|
@ -25,9 +25,6 @@
|
||||||
|
|
||||||
void comPacketSender(uint8_t *data, uint32_t length, void *userData) {
|
void comPacketSender(uint8_t *data, uint32_t length, void *userData) {
|
||||||
(void)userData;
|
(void)userData;
|
||||||
|
|
||||||
//logWrite("OUT: "); packetDebugPrint((uint8_t *)data, length);
|
|
||||||
|
|
||||||
comWrite(__configData.serialCom - 1, (char *)data, length);
|
comWrite(__configData.serialCom - 1, (char *)data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,6 @@ void netProcess(void) {
|
||||||
r = comRead(__configData.serialCom - 1, (char *)buffer, 1024);
|
r = comRead(__configData.serialCom - 1, (char *)buffer, 1024);
|
||||||
// New data or not, process anything in the queue.
|
// New data or not, process anything in the queue.
|
||||||
if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
|
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);
|
//packetDebugPrint((uint8_t *)decoded.data, decoded.length);
|
||||||
switch (decoded.packetType) {
|
switch (decoded.packetType) {
|
||||||
case PACKET_TYPE_PING:
|
case PACKET_TYPE_PING:
|
||||||
|
@ -158,7 +157,6 @@ void netProcess(void) {
|
||||||
packet->data = (uint8_t *)malloc(decoded.length);
|
packet->data = (uint8_t *)malloc(decoded.length);
|
||||||
memcpy(packet->data, decoded.data, decoded.length);
|
memcpy(packet->data, decoded.data, decoded.length);
|
||||||
// Send it to the subscriber.
|
// Send it to the subscriber.
|
||||||
logWrite("Delivering to subscriber %p\n", _channels[r].value);
|
|
||||||
_channels[r].value(packet);
|
_channels[r].value(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,6 @@ void *clientThread(void *data) {
|
||||||
packetSend(client->packetThreadData, &encoded);
|
packetSend(client->packetThreadData, &encoded);
|
||||||
DEL(packetData);
|
DEL(packetData);
|
||||||
versionSent = 1;
|
versionSent = 1;
|
||||||
consoleMessageQueue("PACKET_TYPE_VERSION sent.\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -122,5 +122,4 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
packetEncode(client->packetThreadData, &encoded, NULL, 0);
|
packetEncode(client->packetThreadData, &encoded, NULL, 0);
|
||||||
// Send it.
|
// Send it.
|
||||||
packetSend(client->packetThreadData, &encoded);
|
packetSend(client->packetThreadData, &encoded);
|
||||||
consoleMessageQueue("PACKET_TYPE_PROCEED sent.\n");
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue