Skip to content

Commit 3f18391

Browse files
committed
UI: experimental keypad to replace android keypad
1 parent 1d71f82 commit 3f18391

File tree

8 files changed

+152
-101
lines changed

8 files changed

+152
-101
lines changed

images/keypad/build.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ declare -a IMAGE_FILES=(\
1414
"arrow-down"\
1515
"arrow-download"\
1616
"arrow-up" \
17-
"arrow-upload"
17+
"arrow-upload" \
18+
"tag"
1819
)
1920

2021
echo "#pragma once" > keypad_icons.h

src/platform/android/jni/editor.cpp

Lines changed: 59 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515

1616
struct StatusMessage {
1717
explicit StatusMessage(const TextEditInput *editor) :
18-
_dirty(editor->isDirty()),
18+
_dirty(!editor->isDirty()),
19+
_enabled(true),
20+
_find(false),
21+
_scroll(-1),
1922
_row(editor->getRow()),
2023
_col(editor->getCol()) {
2124
}
@@ -29,22 +32,48 @@ struct StatusMessage {
2932
}
3033
}
3134

32-
bool update(TextEditInput *editor, const AnsiWidget *out, const bool force=false) {
35+
void resetCursor(const TextEditInput *editor) {
36+
_row = editor->getRow();
37+
_col = editor->getCol();
38+
_scroll = editor->getScroll();
39+
}
40+
41+
bool toggleEnabled() {
42+
_enabled = !_enabled;
43+
_dirty = true;
44+
return _enabled;
45+
}
46+
47+
void setDirty(const TextEditInput *editor) {
48+
_dirty = !editor->isDirty();
49+
}
50+
51+
void setFind(bool find) {
52+
_find = find;
53+
_dirty = true;
54+
}
55+
56+
bool update(TextEditInput *editor, const AnsiWidget *out) {
3357
bool result;
3458
bool dirty = editor->isDirty();
35-
if (force
36-
|| _dirty != dirty
37-
|| _row != editor->getRow()
38-
|| _col != editor->getCol()) {
59+
if (_enabled &&
60+
(_dirty != dirty
61+
|| _scroll != editor->getScroll()
62+
|| _row != editor->getRow()
63+
|| _col != editor->getCol())) {
3964
String message;
4065
result = true;
41-
if (dirty) {
42-
message.append(" * ");
66+
if (_find) {
67+
message.append(" Search ");
4368
} else {
44-
message.append(" - ");
69+
if (dirty) {
70+
message.append(" * ");
71+
} else {
72+
message.append(" - ");
73+
}
74+
message.append(_fileName);
4575
}
46-
message.append(_fileName)
47-
.append(" (")
76+
message.append(" (")
4877
.append(editor->getRow())
4978
.append(",")
5079
.append(editor->getCol())
@@ -66,16 +95,11 @@ struct StatusMessage {
6695
return result;
6796
}
6897

69-
void resetCursor(const TextEditInput *editor) {
70-
_row = editor->getRow();
71-
_col = editor->getCol();
72-
}
73-
74-
void setDirty(const TextEditInput *editor) {
75-
_dirty = !editor->isDirty();
76-
}
77-
98+
private:
7899
bool _dirty;
100+
bool _enabled;
101+
bool _find;
102+
int _scroll;
79103
int _row;
80104
int _col;
81105
String _fileName;
@@ -143,8 +167,7 @@ void Runtime::editSource(strlib::String loadPath, bool restoreOnExit) {
143167
alert(gsb_last_errmsg);
144168
}
145169

146-
statusMessage.update(editWidget, _output, true);
147-
bool showStatus = !editWidget->getScroll();
170+
statusMessage.update(editWidget, _output);
148171
_srcRendered = false;
149172
_output->redraw();
150173
_state = kEditState;
@@ -153,51 +176,22 @@ void Runtime::editSource(strlib::String loadPath, bool restoreOnExit) {
153176
MAEvent event = getNextEvent();
154177
bool exitHelp = false;
155178
switch (event.type) {
156-
case EVENT_TYPE_POINTER_PRESSED:
157-
if (!showStatus && widget == editWidget && event.point.x < editWidget->getMarginWidth()) {
158-
statusMessage.update(editWidget, _output, true);
159-
_output->redraw();
160-
showStatus = true;
161-
}
162-
break;
163-
case EVENT_TYPE_POINTER_DRAGGED:
164-
statusMessage.update(editWidget, _output);
165-
break;
166179
case EVENT_TYPE_POINTER_RELEASED:
167-
if (showStatus && event.point.x < editWidget->getMarginWidth() && editWidget->getScroll()) {
168-
statusMessage.update(editWidget, _output);
169-
_output->setStatus("");
170-
_output->redraw();
171-
showStatus = false;
172-
}
173-
break;
174180
case EVENT_TYPE_OPTIONS_BOX_BUTTON_CLICKED:
175-
if (editWidget->isDirty() && !editWidget->getScroll()) {
176-
statusMessage.update(editWidget, _output, true);
181+
if (statusMessage.update(editWidget, _output)) {
177182
_output->redraw();
178183
}
179184
break;
180185
case EVENT_TYPE_KEY_PRESSED:
181186
if (_userScreenId == -1) {
182187
dev_clrkb();
183188
bool redraw = true;
184-
bool dirty = editWidget->isDirty();
185189
char *text;
186190

187191
switch (event.key) {
188-
case SB_KEY_F(2):
189-
case SB_KEY_F(3):
190-
case SB_KEY_F(4):
191-
case SB_KEY_F(5):
192-
case SB_KEY_F(6):
193-
case SB_KEY_F(7):
194-
case SB_KEY_F(8):
195-
case SB_KEY_F(10):
196-
case SB_KEY_F(11):
197-
case SB_KEY_F(12):
198-
case SB_KEY_MENU:
199-
case SB_KEY_ESCAPE:
200-
case SB_KEY_BREAK:
192+
case SB_KEY_F(2): case SB_KEY_F(3): case SB_KEY_F(4): case SB_KEY_F(5): case SB_KEY_F(6):
193+
case SB_KEY_F(7): case SB_KEY_F(8): case SB_KEY_F(10): case SB_KEY_F(11): case SB_KEY_F(12):
194+
case SB_KEY_MENU: case SB_KEY_ESCAPE: case SB_KEY_BREAK:
201195
// unhandled keys
202196
redraw = false;
203197
break;
@@ -218,13 +212,14 @@ void Runtime::editSource(strlib::String loadPath, bool restoreOnExit) {
218212
break;
219213
case SB_KEY_CTRL('f'):
220214
if (widget == helpWidget) {
221-
_output->setStatus("");
222215
exitHelp = true;
216+
statusMessage.setFind(false);
223217
} else {
224-
_output->setStatus("Search...");
225218
widget = helpWidget;
226219
showFind(helpWidget);
220+
statusMessage.setFind(true);
227221
}
222+
redraw = true;
228223
break;
229224
case SB_KEY_CTRL('s'):
230225
saveFile(editWidget, loadPath);
@@ -251,13 +246,17 @@ void Runtime::editSource(strlib::String loadPath, bool restoreOnExit) {
251246
_output->selectScreen(SOURCE_SCREEN);
252247
_state = kEditState;
253248
break;
249+
case SB_KEY_CTRL('t'):
250+
if (!statusMessage.toggleEnabled()) {
251+
_output->setStatus("");
252+
}
253+
redraw = true;
254+
break;
254255
default:
255256
redraw = widget->edit(event.key, _output->getScreenWidth(), charWidth);
256257
break;
257258
}
258-
if (editWidget->isDirty() != dirty && !editWidget->getScroll()) {
259-
redraw |= statusMessage.update(editWidget, _output, true);
260-
}
259+
redraw |= statusMessage.update(editWidget, _output);
261260
if (redraw) {
262261
_output->redraw();
263262
}

src/ui/keycode.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ enum KeyCode : char {
2222
K_PAGE_UP = (char)-11,
2323
K_LINE_DOWN= (char)-12,
2424
K_PAGE_DOWN= (char)-13,
25-
K_EXT1 = (char)-14,
26-
K_EXT2 = (char)-15,
27-
K_EXT3 = (char)-16,
28-
K_EXT4 = (char)-17,
29-
K_EXT5 = (char)-18,
25+
K_TAG = (char)-14,
26+
K_EXT1 = (char)-15,
27+
K_EXT2 = (char)-16,
28+
K_EXT3 = (char)-17,
29+
K_EXT4 = (char)-18,
30+
K_EXT5 = (char)-19,
3031
K_NULL = 0,
3132
K_BACKSPACE = 8,
3233
K_TAB = 9,

src/ui/keypad.cpp

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ constexpr RawKey KEYS[MAX_ROWS][MAX_COLS] = {
7171
{K_h, K_H, K_BACKSLASH, K_PIPE},
7272
{K_j, K_J, K_SEMICOLON, K_COLON},
7373
{K_k, K_K, K_APOSTROPHE, K_QUOTE},
74-
{K_l, K_L, K_HASH, K_EXT1},
74+
{K_l, K_L, K_HASH, K_TAG},
7575
{K_NULL}
7676
},
7777
// ZXC
@@ -142,6 +142,7 @@ KeypadDrawContext::KeypadDrawContext(int charWidth, int charHeight) :
142142
!_pageUpImage.decode(img_arrow_upload, img_arrow_upload_len) ||
143143
!_lineDownImage.decode(img_arrow_down, img_arrow_down_len) ||
144144
!_pageDownImage.decode(img_arrow_download, img_arrow_download_len) ||
145+
!_tagImage.decode(img_tag, img_tag_len) ||
145146
!_toggleImage.decode(img_layers, img_layers_len)) {
146147
deviceLog("%s", _cutImage.getLastError());
147148
} else if (imageSize < IMAGE_SIZE - 2 || imageSize > IMAGE_SIZE + 2) {
@@ -159,6 +160,7 @@ KeypadDrawContext::KeypadDrawContext(int charWidth, int charHeight) :
159160
_lineDownImage.resize(imageSize, imageSize);
160161
_pageDownImage.resize(imageSize, imageSize);
161162
_toggleImage.resize(imageSize, imageSize);
163+
_tagImage.resize(imageSize, imageSize);
162164
}
163165
}
164166

@@ -179,6 +181,7 @@ const KeypadImage *KeypadDrawContext::getImage(const RawKey &key) const {
179181
case K_PAGE_UP: result = &_pageUpImage; break;
180182
case K_LINE_DOWN: result = &_lineDownImage; break;
181183
case K_PAGE_DOWN: result = &_pageDownImage; break;
184+
case K_TAG: result = &_tagImage; break;
182185
default: result = nullptr; break;
183186
}
184187
return result;
@@ -250,22 +253,25 @@ void Key::draw(const KeypadTheme *theme, const KeypadDrawContext *context) const
250253
int ycT = _y + rc + pad; // y center for top arcs
251254
int ycB = by - rc; // y center for bottom arcs
252255

256+
char keyChar = getKey(context);
257+
bool printable = _printable && keyChar != K_TAG;
258+
253259
// Set background color
254-
if (_printable) {
260+
if (printable) {
255261
maSetColor(theme->_key);
256262
maFillRect(_x, _y, _w, _h);
257263
} else {
258264
maSetColor(theme->_funcKeyBg);
259265
maFillRect(_x + 1, _y + 1, _w - 2, _h - 2);
260266
}
261267

262-
if (_printable || _pressed) {
263-
if (_printable && _pressed) {
268+
if (printable || _pressed) {
269+
if (printable && _pressed) {
264270
maSetColor(theme->_outline);
265271
maFillRect(_x + 4, _y + 4, _w - 7, _h - 7);
266272
}
267273

268-
maSetColor(_printable ? theme->_keyHighlight : theme->_funcKeyHighlight);
274+
maSetColor(printable ? theme->_keyHighlight : theme->_funcKeyHighlight);
269275

270276
// Draw edges (excluding the rounded corners)
271277
maLine(lt, _y + pad, rt, _y + pad); // top edge
@@ -282,8 +288,7 @@ void Key::draw(const KeypadTheme *theme, const KeypadDrawContext *context) const
282288
maArc(xcL, ycB, rc, PI / 2, PI, aspect); // Bottom-left corner
283289
}
284290

285-
if (_printable) {
286-
char keyChar = getKey(context);
291+
if (printable) {
287292
char key[] = {keyChar, '\0'};
288293
int xOffset = (_w - context->_charWidth) / 2;
289294
int yOffset = (_h - context->_charHeight) / 2;
@@ -353,6 +358,9 @@ void Key::onClick(const KeypadDrawContext *context) const {
353358
case K_PAGE_DOWN:
354359
event->key = SB_KEY_PGDN;
355360
break;
361+
case K_TAG:
362+
event->key = SB_KEY_CTRL('t');
363+
break;
356364
default:
357365
event->key = (unsigned char)getKey(context);
358366
break;
@@ -447,7 +455,7 @@ void Keypad::clicked(int x, int y, bool pressed) {
447455
const bool inside = key->inside(x, y);
448456
key->_pressed = pressed && inside;
449457

450-
if (pressed && inside) {
458+
if (!pressed && inside) {
451459
if (key->_key._lower == K_TOGGLE) {
452460
_context.toggle();
453461
break;
@@ -483,25 +491,16 @@ KeypadInput::~KeypadInput() {
483491
}
484492

485493
void KeypadInput::clicked(int x, int y, bool pressed) {
486-
if (_keypad) {
487-
_keypad->clicked(x, y, pressed);
488-
}
494+
_keypad->clicked(x, y, pressed);
489495
}
490496

491497
void KeypadInput::draw(int x, int y, int w, int h, int chw) {
492-
if (_keypad) {
493-
_keypad->draw();
494-
} else {
495-
maSetColor(MODERN_DARK_THEME._bg);
496-
maFillRect(x, y, _width, _height);
497-
}
498+
_keypad->draw();
498499
}
499500

500501
void KeypadInput::layout(int x, int y, int w, int h) {
501502
_x = x;
502503
_y = _floatTop ? 0 : h;
503504
_width = w;
504-
if (_keypad) {
505-
_keypad->layout(_x, _y, _width, _height);
506-
}
505+
_keypad->layout(_x, _y, _width, _height);
507506
}

src/ui/keypad.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ struct KeypadDrawContext {
7575
KeypadImage _pageUpImage;
7676
KeypadImage _lineDownImage;
7777
KeypadImage _pageDownImage;
78+
KeypadImage _tagImage;
7879
};
7980

8081
struct Key {

0 commit comments

Comments
 (0)