From b22b72f5c2cf8e65f36ed2feceeb2e762aca81da Mon Sep 17 00:00:00 2001 From: sys4 Date: Sun, 20 Sep 2020 15:03:52 +0200 Subject: [PATCH] Add items search filter on Buy tab --- exchange_machine.lua | 60 ++++++++++++++++++++++++++++++------ locale/global_exchange.fr.tr | 7 +++-- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/exchange_machine.lua b/exchange_machine.lua index cad353e..5740d12 100644 --- a/exchange_machine.lua +++ b/exchange_machine.lua @@ -52,7 +52,7 @@ local function mk_summary_fs() local def = all_items[row.Item] or {} add_row(row.Item, split(def.description, "\n")[1] or S("Unknown Item"), - wear_string(row.Wear), + wear_string(row.Wear), row.Buy_Volume or 0, row.Buy_Max or "N/A", row.Sell_Volume or 0, @@ -100,9 +100,12 @@ minetest.register_on_joinplayer(function(player) buy_wear = wear_levels[1].text, buy_price = "", buy_amount = "1", + buy_filter = "", sell_price = "", buy_page = 1, + buy_pagemax = 0, selected_index = 0, + filtered_list = nil, } end) @@ -131,6 +134,20 @@ minetest.after(0, function() pagemax = math.max(math.ceil(#selectable_list / pageitems), 1) end) +local function filter_list(filter) + local filtered_list = {} + if not filter or filter == "" then return nil, pagemax end + + for index, name in ipairs(selectable_list) do + local match = string.match(name, filter) or nil + if match then + filtered_list[#filtered_list+1] = name + end + end + + return filtered_list, math.max(math.ceil(#filtered_list / pageitems), 1) +end + local main_form = "global_exchange:exchange_main" local function table_from_results(fs, results, name, x, y, w, h, selected) @@ -186,16 +203,20 @@ local function mk_main_buy_fs(fs, p_name, state) fs:container(0,4, function() fs:button( 0,0.25, 1,1, "buy_left", "<<") - fs:button( 5,0.25, 2,1, "position", state.buy_page .. "/" .. pagemax) - fs:button(11,0.25, 1,1, "buy_right", ">>") + fs:button( 1,0.25, 2,1, "position", state.buy_page .. "/" .. state.buy_pagemax) + fs:button(3,0.25, 1,1, "buy_right", ">>") + + fs:field(5.28,0.55, 3,1, "buy_filter", S("Filter"), state.buy_filter, false) + fs:button(8, 0.25, 2,1, "filter", S("Search")) + fs:button(10, 0.25, 2,1, "reset_filter", S("Reset")) local firstitem = ((state.buy_page - 1) * pageitems) + local item_list = state.filtered_list or selectable_list for y=0,(pageheight-1) do for x=0,(pagewidth-1) do local index = firstitem + (pagewidth * y) + x + 1 - if selectable_list[index] then - fs:item_image_button(x,1.25+y, 1,1, "select_" .. index, - selectable_list[index]) + if item_list[index] then + fs:item_image_button(x,1.25+y, 1,1, "select_" .. index, item_list[index]) end end end @@ -385,6 +406,7 @@ local function handle_main(player, fields) "buy_wear", "buy_amount", "buy_price", + "buy_filter", "sell_price" } for _,k in ipairs(copy_fields) do @@ -393,25 +415,30 @@ local function handle_main(player, fields) end end + if state.buy_pagemax == 0 then + state.buy_pagemax = pagemax + end + if fields.tab then state.tab = tonumber(fields.tab) or 1 show_main(p_name) end if fields.buy_left then - state.buy_page = (((state.buy_page or 1) + ((2*pagemax-1) - 1)) % pagemax) + 1 + state.buy_page = (((state.buy_page or 1) + ((2*state.buy_pagemax-1) - 1)) % state.buy_pagemax) + 1 show_main(p_name) end if fields.buy_right then - state.buy_page = (((state.buy_page or 1) + ((2*pagemax-1) + 1)) % pagemax) + 1 + state.buy_page = (((state.buy_page or 1) + ((2*state.buy_pagemax-1) + 1)) % state.buy_pagemax) + 1 show_main(p_name) end + local item_list = state.filtered_list or selectable_list for name in pairs(fields) do local index = tonumber(string.match(name, "select_([0-9]+)")) - if index and index >= 1 and index < #selectable_list then - state.buy_item = selectable_list[index] + if index and index >= 1 and index <= #item_list then + state.buy_item = item_list[index] show_main(p_name) end end @@ -430,6 +457,19 @@ local function handle_main(player, fields) end end + if fields.filter then + state.filtered_list, state.buy_pagemax = filter_list(state.buy_filter) + state.buy_page = 1 + show_main(p_name) + end + + if fields.reset_filter then + state.buy_filter = "" + state.filtered_list, state.buy_pagemax = filter_list(nil) + state.buy_page = 1 + show_main(p_name) + end + if fields.sell then local succ, err = post_sell(player, "", fields.sell_price) if succ then diff --git a/locale/global_exchange.fr.tr b/locale/global_exchange.fr.tr index 25176d4..a4b610d 100644 --- a/locale/global_exchange.fr.tr +++ b/locale/global_exchange.fr.tr @@ -46,7 +46,7 @@ Transaction Log=Journaux transactions ATM=Distributeur Automatique d'argent Cash deposit (+@1)=Dépot d'espèces (+@1) -### exchange_macine.lua ### +### exchange_machine.lua ### Wear=Usure Buy Vol=Qté achat Buy Max=Achat Max @@ -74,4 +74,7 @@ Invalid wear.=Usure invalide. Invalid amount.=Montant invalide. Invalid rate.=Taux invalide. Cannot sell an item with metadata.=Ne peut vendre un item avec des métadonnées. -Qty=Qté \ No newline at end of file +Qty=Qté +Filter=Filtre +Search=Chercher +Reset=Reset