mirror of
https://git.planet-casio.com/Lephenixnoir/JustUI.git
synced 2025-06-06 05:25:10 +02:00
jfileselect: add touch support
This commit is contained in:
parent
50df5fe37c
commit
0d0919ecd7
2 changed files with 81 additions and 24 deletions
|
@ -48,6 +48,8 @@ typedef struct {
|
||||||
|
|
||||||
/* Current cursor position (0 .. folder_entries-1) */
|
/* Current cursor position (0 .. folder_entries-1) */
|
||||||
int16_t cursor;
|
int16_t cursor;
|
||||||
|
/* Index of the currently touch-clicked item, -1 none */
|
||||||
|
int touch_cursor;
|
||||||
/* Current scroll position */
|
/* Current scroll position */
|
||||||
int16_t scroll;
|
int16_t scroll;
|
||||||
/* Number of visible lines */
|
/* Number of visible lines */
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <justui/jwidget.h>
|
#include <justui/jwidget.h>
|
||||||
#include <justui/jwidget-api.h>
|
#include <justui/jwidget-api.h>
|
||||||
#include <justui/jfileselect.h>
|
#include <justui/jfileselect.h>
|
||||||
|
#include <justui/config.h>
|
||||||
|
|
||||||
#include <gint/display.h>
|
#include <gint/display.h>
|
||||||
#include <gint/gint.h>
|
#include <gint/gint.h>
|
||||||
|
@ -75,6 +76,7 @@ jfileselect *jfileselect_create(void *parent)
|
||||||
fs->filter_function = jfileselect_default_filter;
|
fs->filter_function = jfileselect_default_filter;
|
||||||
|
|
||||||
fs->cursor = -1;
|
fs->cursor = -1;
|
||||||
|
fs->touch_cursor = -1;
|
||||||
fs->scroll = 0;
|
fs->scroll = 0;
|
||||||
fs->visible_lines = 0;
|
fs->visible_lines = 0;
|
||||||
|
|
||||||
|
@ -323,6 +325,7 @@ bool jfileselect_browse(jfileselect *fs, char const *path)
|
||||||
fs->selected_file = NULL;
|
fs->selected_file = NULL;
|
||||||
|
|
||||||
fs->cursor = 0;
|
fs->cursor = 0;
|
||||||
|
fs->touch_cursor = -1;
|
||||||
fs->scroll = 0;
|
fs->scroll = 0;
|
||||||
stop_input(fs);
|
stop_input(fs);
|
||||||
return ok;
|
return ok;
|
||||||
|
@ -357,6 +360,18 @@ bool jfileselect_default_filter(struct dirent const *ent)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void jfileselect_select(jfileselect *fs, int index)
|
||||||
|
{
|
||||||
|
/* Normalize out-of-bounds to -1 */
|
||||||
|
if(index < 0 || index >= fs->entry_count)
|
||||||
|
index = -1;
|
||||||
|
if(fs->cursor == index)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fs->cursor = index;
|
||||||
|
fs->widget.update = 1;
|
||||||
|
}
|
||||||
|
|
||||||
//---
|
//---
|
||||||
// Polymorphic widget operations
|
// Polymorphic widget operations
|
||||||
//---
|
//---
|
||||||
|
@ -461,13 +476,42 @@ static void jfileselect_poly_render(void *fs0, int x, int y)
|
||||||
int sb_h = ch * fs->visible_lines / fs->entry_count;
|
int sb_h = ch * fs->visible_lines / fs->entry_count;
|
||||||
|
|
||||||
drect(x + cw - fs->scrollbar_width, y + sb_y,
|
drect(x + cw - fs->scrollbar_width, y + sb_y,
|
||||||
x + cw - 1, y + sb_y + sb_h - 1,
|
x + cw - 1, y + sb_y + sb_h - 1,
|
||||||
C_BLACK);
|
C_BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
dfont(old_font);
|
dfont(old_font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trigger_entry(jfileselect *fs)
|
||||||
|
{
|
||||||
|
struct fileinfo *finfo = fs->entries;
|
||||||
|
struct fileinfo *i = &finfo[fs->cursor];
|
||||||
|
|
||||||
|
if(i->type == DT_DIR) {
|
||||||
|
char *child = path_down(fs->path, i->name);
|
||||||
|
if(child) {
|
||||||
|
load_folder(fs, child);
|
||||||
|
fs->cursor = 0;
|
||||||
|
fs->touch_cursor = -1;
|
||||||
|
fs->scroll = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(fs->saveas && i->type == -1) {
|
||||||
|
start_input(fs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fs->selected_file = path_down(fs->path, i->name);
|
||||||
|
if(fs->selected_file) {
|
||||||
|
jwidget_emit(fs, (jevent){ .type = JFILESELECT_VALIDATED });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool jfileselect_poly_event(void *fs0, jevent e)
|
static bool jfileselect_poly_event(void *fs0, jevent e)
|
||||||
{
|
{
|
||||||
jfileselect *fs = fs0;
|
jfileselect *fs = fs0;
|
||||||
|
@ -500,6 +544,37 @@ static bool jfileselect_poly_event(void *fs0, jevent e)
|
||||||
|
|
||||||
if(e.type == JWIDGET_KEY) {
|
if(e.type == JWIDGET_KEY) {
|
||||||
key_event_t ev = e.key;
|
key_event_t ev = e.key;
|
||||||
|
|
||||||
|
#if J_CONFIG_TOUCH
|
||||||
|
bool accept_touch = !fs->folder_error && fs->entries && fs->entry_count;
|
||||||
|
if((ev.type == KEYEV_TOUCH_DOWN || ev.type == KEYEV_TOUCH_DRAG ||
|
||||||
|
ev.type == KEYEV_TOUCH_UP) && accept_touch) {
|
||||||
|
int lx = ev.x - jwidget_absolute_content_x(fs);
|
||||||
|
int ly = ev.y - jwidget_absolute_content_y(fs);
|
||||||
|
uint w = jwidget_content_width(fs);
|
||||||
|
uint h = jwidget_content_height(fs);
|
||||||
|
|
||||||
|
int index = -1;
|
||||||
|
if((uint)lx < w && (uint)ly < h) {
|
||||||
|
int line_height = fs->font->line_height + fs->line_spacing;
|
||||||
|
index = (ly / line_height) + fs->scroll;
|
||||||
|
if((uint)index >= (uint)fs->entry_count)
|
||||||
|
index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ev.type == KEYEV_TOUCH_DOWN && index >= 0) {
|
||||||
|
jfileselect_select(fs, index);
|
||||||
|
fs->touch_cursor = index;
|
||||||
|
}
|
||||||
|
if(ev.type == KEYEV_TOUCH_DRAG && index >= 0)
|
||||||
|
jfileselect_select(fs, index);
|
||||||
|
if(ev.type == KEYEV_TOUCH_UP && index >= 0 &&
|
||||||
|
index == fs->touch_cursor)
|
||||||
|
trigger_entry(fs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(ev.type != KEYEV_DOWN && ev.type != KEYEV_HOLD)
|
if(ev.type != KEYEV_DOWN && ev.type != KEYEV_HOLD)
|
||||||
return false;
|
return false;
|
||||||
int key = ev.key;
|
int key = ev.key;
|
||||||
|
@ -537,34 +612,14 @@ static bool jfileselect_poly_event(void *fs0, jevent e)
|
||||||
if(parent) {
|
if(parent) {
|
||||||
load_folder(fs, parent);
|
load_folder(fs, parent);
|
||||||
fs->cursor = 0;
|
fs->cursor = 0;
|
||||||
|
fs->touch_cursor = -1;
|
||||||
fs->scroll = 0;
|
fs->scroll = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if((key == KEY_EXE || key == KEY_OK) && fs->entries) {
|
else if((key == KEY_EXE || key == KEY_OK) && fs->entries) {
|
||||||
struct fileinfo *finfo = fs->entries;
|
if(trigger_entry(fs))
|
||||||
struct fileinfo *i = &finfo[fs->cursor];
|
|
||||||
|
|
||||||
if(i->type == DT_DIR) {
|
|
||||||
char *child = path_down(fs->path, i->name);
|
|
||||||
if(child) {
|
|
||||||
load_folder(fs, child);
|
|
||||||
fs->cursor = 0;
|
|
||||||
fs->scroll = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(fs->saveas && i->type == -1) {
|
|
||||||
start_input(fs);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
else {
|
|
||||||
fs->selected_file = path_down(fs->path, i->name);
|
|
||||||
if(fs->selected_file) {
|
|
||||||
jwidget_emit(fs,(jevent){ .type = JFILESELECT_VALIDATED });
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue