[Bugfix] open_plugins.rock add 'add' item regardless & voice improvements

also fixes a bug where synclist viewport could be empty if the list isn't
initialized

voices path and parameters now

adds the item [Add] as the last item in the list

Change-Id: I1aad62baf3c19a67d04fa1fb3db8a7573e0a467f
This commit is contained in:
William Wilgus 2026-06-09 00:17:03 -04:00
parent dfe965d81e
commit a81d3fa10e

View file

@ -564,8 +564,10 @@ static uint32_t op_entry_add_path(const char *key, const char *plugin, const cha
if (plugin != op_entry.path) if (plugin != op_entry.path)
rb->strlcpy(op_entry.path, plugin, OPEN_PLUGIN_BUFSZ); rb->strlcpy(op_entry.path, plugin, OPEN_PLUGIN_BUFSZ);
if(parameter) if(parameter || rb->strncmp(plugin, VIEWERS_DIR, sizeof(VIEWERS_DIR) -1) == 0)
{ {
if (!parameter)
parameter = "";
/* param matches lang_id so we want to set parameter */ /* param matches lang_id so we want to set parameter */
bool needs_param = op_entry.lang_id >= 0 bool needs_param = op_entry.lang_id >= 0
&& (rb->strcmp(parameter, rb->str(op_entry.lang_id)) == 0); && (rb->strcmp(parameter, rb->str(op_entry.lang_id)) == 0);
@ -575,6 +577,9 @@ static uint32_t op_entry_add_path(const char *key, const char *plugin, const cha
if (needs_param) if (needs_param)
op_entry.param[0] = '\0'; op_entry.param[0] = '\0';
op_entry_set_param(); op_entry_set_param();
if (!use_key && pathbasename(op_entry.param, (const char **)&pos) != 0)
rb->strlcpy(op_entry.name, pos, OPEN_PLUGIN_NAMESZ);
} }
else if (parameter != op_entry.param) else if (parameter != op_entry.param)
rb->strlcpy(op_entry.param, parameter, OPEN_PLUGIN_BUFSZ); rb->strlcpy(op_entry.param, parameter, OPEN_PLUGIN_BUFSZ);
@ -761,7 +766,9 @@ static const char* list_get_name_cb(int selected_item, void* data,
/*TODO memoize names so we don't keep reading the disk when not necessary */ /*TODO memoize names so we don't keep reading the disk when not necessary */
if (data == (void*) &MENU_ID_MAIN) /* check address */ if (data == (void*) &MENU_ID_MAIN) /* check address */
{ {
if (op_entry_read_name(fd_dat, selected_item)) if (selected_item == rb->gui_synclist_get_nb_items(&lists) - 1)
rb->snprintf(buf, buf_len, "[%s]", rb->str(LANG_ADD));
else if (op_entry_read_name(fd_dat, selected_item))
{ {
if (op_entry.lang_id >= 0) if (op_entry.lang_id >= 0)
rb->snprintf(buf, buf_len, "%s [%s] ", rb->snprintf(buf, buf_len, "%s [%s] ",
@ -815,7 +822,12 @@ static int list_voice_cb(int list_index, void* data)
{ {
if (data == (void*) &MENU_ID_MAIN) /* check address */ if (data == (void*) &MENU_ID_MAIN) /* check address */
{ {
if (op_entry_read_name(fd_dat, list_index)) if (list_index == rb->gui_synclist_get_nb_items(&lists) - 1)
{
static const long langids[] = {LANG_ADD, VOICE_EXT_ROCK, TALK_FINAL_ID};
rb->talk_idarray(langids, false);
}
else if (op_entry_read_name(fd_dat, list_index))
{ {
if (op_entry.lang_id >= 0) if (op_entry.lang_id >= 0)
{ {
@ -842,9 +854,15 @@ static int list_voice_cb(int list_index, void* data)
} }
return rb->talk_spell(op_entry.name, false); return rb->talk_spell(op_entry.name, false);
case 2: case 2:
return rb->talk_id(LANG_DISPLAY_FULL_PATH, false); rb->talk_id(LANG_DISPLAY_FULL_PATH, false);
return rb->talk_fullpath(op_entry.path, true);
case 4: case 4:
return rb->talk_id(LANG_PARAMETER, false); rb->talk_id(LANG_PARAMETER, false);
if (op_entry.param[0] == '\0')
return rb->talk_id(VOICE_BLANK, true);
if (rb->file_exists(op_entry.param))
return rb->talk_fullpath(op_entry.param, true);
return rb->talk_spell(op_entry.param, true);
case 6: case 6:
return rb->talk_id(LANG_BACK, false); return rb->talk_id(LANG_BACK, false);
default: default:
@ -980,6 +998,12 @@ static void edit_menu(int selection)
static int context_menu(int selection) static int context_menu(int selection)
{ {
int selected_item; int selected_item;
if (selection == rb->gui_synclist_get_nb_items(&lists) -1)
{
op_entry_browse_add(-1);
rb->plugin_open(rb->plugin_get_current_filename(), "\0");
return OP_PLUGIN_RESTART;
}
if (op_entry_read(fd_dat, selection, op_entry_sz)) if (op_entry_read(fd_dat, selection, op_entry_sz))
{ {
MENUITEM_STRINGLIST(menu, op_entry.name, context_menu_cb, MENUITEM_STRINGLIST(menu, op_entry.name, context_menu_cb,
@ -1430,7 +1454,7 @@ reopen_datfile:
if (!op_entry_read(fd_dat, i, op_entry_sz)) if (!op_entry_read(fd_dat, i, op_entry_sz))
items--; items--;
} }
# if 0
if (items < 1 && !exit) if (items < 1 && !exit)
{ {
char* cur_filename = rb->plugin_get_current_filename(); char* cur_filename = rb->plugin_get_current_filename();
@ -1445,10 +1469,10 @@ reopen_datfile:
rb->close(fd_dat); rb->close(fd_dat);
return PLUGIN_ERROR; return PLUGIN_ERROR;
} }
#endif
if (!exit) if (!exit)
{ {
synclist_set(MENU_ID_MAIN, selection, items, 1); synclist_set(MENU_ID_MAIN, selection, items + 1, 1);
rb->gui_synclist_draw(&lists); rb->gui_synclist_draw(&lists);
while (!exit && fd_dat >= 0) while (!exit && fd_dat >= 0)
@ -1470,13 +1494,20 @@ reopen_datfile:
} }
else if (ret != PLUGIN_GOTO_PLUGIN) else if (ret != PLUGIN_GOTO_PLUGIN)
{ {
synclist_set(MENU_ID_MAIN, selection, items, 1); synclist_set(MENU_ID_MAIN, selection, items + 1, 1);
rb->gui_synclist_draw(&lists); rb->gui_synclist_draw(&lists);
break; break;
} }
/* fallthrough */ /* fallthrough */
case ACTION_STD_OK: case ACTION_STD_OK:
if (op_entry_read(fd_dat, selection, op_entry_sz)) if (selection == items)
{
op_entry_browse_add(-1);
rb->plugin_open(rb->plugin_get_current_filename(), "\0");
ret = PLUGIN_GOTO_PLUGIN;
exit = true;
}
else if (op_entry_read(fd_dat, selection, op_entry_sz))
{ {
ret = op_entry_run(); ret = op_entry_run();
exit = true; exit = true;
@ -1500,8 +1531,9 @@ reopen_datfile:
} }
} }
op_entry_remove_empty(); op_entry_remove_empty();
}
rb->gui_synclist_scroll_stop(&lists); rb->gui_synclist_scroll_stop(&lists);
}
rb->close(fd_dat); rb->close(fd_dat);
if (ret != PLUGIN_OK) if (ret != PLUGIN_OK)
return ret; return ret;