From fff980a979aa6be6ad5697f73017a2da6649de86 Mon Sep 17 00:00:00 2001 From: ailurux Date: Tue, 11 Feb 2025 11:02:04 +1100 Subject: [PATCH] Fix bug in infinite list causing items to be removed (#253) --- lua/widgets.lua | 3 ++- src/tangara/lua/lua_database.cpp | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lua/widgets.lua b/lua/widgets.lua index 20f0cd2a..de2aa43d 100644 --- a/lua/widgets.lua +++ b/lua/widgets.lua @@ -346,8 +346,9 @@ function widgets.InfiniteList(parent, iterator, opts) if this_item < last_selected then -- moving backward if (first_index > 0 and last_index - this_item > 3) then - local to_add = bck_iterator:prev(); + local to_add = bck_iterator:value(); if to_add then + bck_iterator:prev() remove_last() add_item(to_add, first_index - 1) refresh_group() diff --git a/src/tangara/lua/lua_database.cpp b/src/tangara/lua/lua_database.cpp index 928dbc39..a49f3d07 100644 --- a/src/tangara/lua/lua_database.cpp +++ b/src/tangara/lua/lua_database.cpp @@ -250,6 +250,19 @@ static auto db_iterate(lua_State* state) -> int { return 1; } +static auto db_iterator_value(lua_State* state) -> int { + database::Iterator* it = db_check_iterator(state, 1); + std::optional res = it->value(); + + if (res) { + push_lua_record(state, *res); + } else { + lua_pushnil(state); + } + + return 1; +} + static auto db_iterator_clone(lua_State* state) -> int { database::Iterator* it = db_check_iterator(state, 1); push_iterator(state, *it); @@ -265,7 +278,8 @@ static auto db_iterator_gc(lua_State* state) -> int { static const struct luaL_Reg kDbIteratorFuncs[] = { {"next", db_iterate}, {"prev", db_iterate_prev}, {"clone", db_iterator_clone}, {"__call", db_iterate}, - {"__gc", db_iterator_gc}, {NULL, NULL}}; + {"__gc", db_iterator_gc}, {"value", db_iterator_value}, + {NULL, NULL}}; static auto record_text(lua_State* state) -> int { database::Record* rec = db_check_record(state, 1);