aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-09-26 02:24:46 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-09-26 02:24:46 +0200
commite00ed40c9cec2c25704263adedbeac5cedb60170 (patch)
tree12e641a2079aee6e11018a3783773a38b2b67c6b /src
parentf5c7e88b2657076b3b17d6e21e056df7add446e8 (diff)
downloadjancity-e00ed40c9cec2c25704263adedbeac5cedb60170.tar.gz
gui/line_edit: Allow setting input filters
Diffstat (limited to 'src')
-rw-r--r--src/gui/inc/gui/line_edit.h9
-rw-r--r--src/gui/src/line_edit.c15
2 files changed, 23 insertions, 1 deletions
diff --git a/src/gui/inc/gui/line_edit.h b/src/gui/inc/gui/line_edit.h
index 3a0f027..d461a10 100644
--- a/src/gui/inc/gui/line_edit.h
+++ b/src/gui/inc/gui/line_edit.h
@@ -13,6 +13,13 @@ extern "C"
{
#endif
+enum gui_line_edit_filter
+{
+ GUI_LINE_EDIT_FILTER_NONE,
+ GUI_LINE_EDIT_FILTER_ALPHA = 1 << 1,
+ GUI_LINE_EDIT_FILTER_NUM = 1 << 2
+};
+
struct gui_line_edit
{
struct gui_common common;
@@ -22,6 +29,8 @@ struct gui_line_edit
unsigned blt;
char *text;
size_t i, sz;
+ /* Use with gui_line_edit_filter. */
+ int filters;
};
void gui_line_edit_init(struct gui_line_edit *l, char *buf, size_t sz);
diff --git a/src/gui/src/line_edit.c b/src/gui/src/line_edit.c
index a5c01a7..ef37708 100644
--- a/src/gui/src/line_edit.c
+++ b/src/gui/src/line_edit.c
@@ -8,6 +8,7 @@
#include <mouse.h>
#include <pad.h>
#include <peripheral.h>
+#include <ctype.h>
#include <string.h>
struct sprite gui_line_edit_sprites[MAX_GUI_LINE_EDIT_SPRITES];
@@ -115,8 +116,20 @@ static void get_dim(const struct gui_common *const g,
static void on_char(const char ch, void *const user)
{
struct gui_line_edit *const l = user;
+ bool allowed = false;
- if (l->i + 1 < l->sz)
+ if (l->filters)
+ {
+ if (((l->filters & GUI_LINE_EDIT_FILTER_ALPHA)
+ && isalpha((unsigned char)ch))
+ || ((l->filters & GUI_LINE_EDIT_FILTER_NUM)
+ && isdigit((unsigned char)ch)))
+ allowed = true;
+ }
+ else
+ allowed = true;
+
+ if (allowed && l->i + 1 < l->sz)
l->text[l->i++] = ch;
}