From fc1439386fd708d8a33bd6df38bac011a8a93e46 Mon Sep 17 00:00:00 2001 From: Manuel Simon Hirsig Date: Sat, 6 Feb 2016 18:26:05 +0100 Subject: [PATCH] some refactoring --- auction_listing.lua | 2 + completion.lua | 643 ++++++++++++++++++++++++++------------------ core.lua | 6 +- gui.lua | 1 - search_frame.lua | 30 ++- test.lua | 140 ---------- 6 files changed, 413 insertions(+), 409 deletions(-) diff --git a/auction_listing.lua b/auction_listing.lua index 8d998d4..a6976c5 100644 --- a/auction_listing.lua +++ b/auction_listing.lua @@ -147,6 +147,8 @@ local methods = { elseif IsShiftKeyDown() then if ChatFrameEditBox:IsVisible() then ChatFrameEditBox:Insert(this.row.data.record.hyperlink) + else + Aux.search_frame.start_search(strlower(Aux.static.item_info(this.row.data.record.item_id).name)..'/exact') end elseif IsAltKeyDown() then if this.rt.handlers.OnCellAltClick then diff --git a/completion.lua b/completion.lua index 69c796f..b0e3cce 100644 --- a/completion.lua +++ b/completion.lua @@ -1,279 +1,402 @@ -local private, public = {}, {} -Aux.completion = public +local m = {} +Aux.completion = m -local NUM_MATCHES = 5 - -local fuzzy, generate_suggestions - -function fuzzy(input) - local uppercase_input = strupper(input) - local pattern = '(.*)' - for i=1,strlen(uppercase_input) do - if strfind(string.sub(uppercase_input, i, i), '%w') or strfind(string.sub(uppercase_input, i, i), '%s') then - pattern = pattern .. string.sub(uppercase_input, i, i) .. '(.*)' - end +function m:complete() + if IsControlKeyDown() then -- TODO problem is ctrl-v, maybe find a better solution + return end - return function(item_name) - local match = { string.find(strupper(item_name), pattern) } - if match[1] then - local rating = 0 - for i=4,getn(match)-1 do - if strlen(match[i]) == 0 then - rating = rating + 1 + + local filter_string = this:GetText() + + local completed_filter_string = ({strfind(filter_string, '([^;]*)/[^/;]*$')})[3] + local current_filter = completed_filter_string and Aux.scan_util.filter_from_string(completed_filter_string) + + local options = {} + + if current_filter or not completed_filter_string then + current_filter = current_filter or {} + + if current_filter.name + and Aux.static.auctionable_items[strupper(current_filter.name)] + and not current_filter.min_level + and not current_filter.max_level + and not current_filter.class + and not current_filter.subclass + and not current_filter.slot + and not current_filter.quality + and not current_filter.usable + and not current_filter.exact + then + tinsert(options, 'exact') + end + + tinsert(options, 'and') + tinsert(options, 'or') + tinsert(options, 'not') + tinsert(options, 'tt') + + -- classes + if not current_filter.class and not current_filter.exact then + for _, class in ipairs({ GetAuctionItemClasses() }) do + tinsert(options, class) + end + end + + -- subclasses + if current_filter.class and not current_filter.subclass then + for _, subclass in ipairs({ GetAuctionItemSubClasses(current_filter.class) }) do + tinsert(options, subclass) + end + end + + -- slots + if current_filter.class and current_filter.subclass and not current_filter.slot then + for _, invtype in ipairs({ GetAuctionInvTypes(current_filter.class, current_filter.subclass) }) do + tinsert(options, getglobal(invtype)) + end + end + + -- usable + if not current_filter.usable and not current_filter.exact then + tinsert(options, 'usable') + end + + -- rarities + if not current_filter.quality and not current_filter.exact then + for i=0,4 do + tinsert(options, getglobal('ITEM_QUALITY'..i..'_DESC')) + end + end + + -- discard + if not current_filter.discard then + tinsert(options, 'discard') + end + + -- item names + if not completed_filter_string then + local item_filters = {} + for key, value in Aux.static.auctionable_items do + if type(key) == 'number' then + tinsert(item_filters, value.name..'/exact') end end - return rating + sort(item_filters) + for _, item_name in ipairs(item_filters) do + tinsert(options, item_name) + end + end + + local start_index, _, current_modifier = strfind(filter_string, '([^/;]*)$') + current_modifier = current_modifier or '' + + for _, option in ipairs(options) do + if string.sub(strupper(option), 1, strlen(current_modifier)) == strupper(current_modifier) then + this:SetText(strlower(string.sub(filter_string, 1, start_index - 1)..option)) + this:HighlightText(strlen(filter_string), -1) + return + end end end end -function generate_suggestions(input) - local matcher = fuzzy(input) - function fuzzy_sort(array) - sort(array, function(a, b) return strlen(a.name) < strlen(b.name) end) - sort(array, function(a, b) return b.rating < a.rating end) - return array - end - - local best = {} - for _, id in ipairs(Aux.static.item_ids()) do - local item_info = Aux.static.item_info(id) - local rating = matcher(item_info.name) - if rating then - local candidate = { name=item_info.name, id=item_info.id, rating=rating } - if getn(best) < NUM_MATCHES then - tinsert(best, candidate) - fuzzy_sort(best) - else - best[getn(best)] = fuzzy_sort({ best[getn(best)], candidate })[1] - fuzzy_sort(best) - end - end +function m:complete_item() + if IsControlKeyDown() then -- TODO problem is ctrl-v, maybe find a better solution + return end - return Aux.util.map(best, function(match) return { text=match.name, display_text='|c'..Aux.quality_color(Aux.static.item_info(match.id).quality)..'['..match.name..']'..'|r', value=match.id } end) -end + local text = this:GetText() -function public.completor(edit_box) - local self = {} - - local suggestions = {} - local index = 0 - local input - local quietly_set_text - - local fill_dropdown, update_dropdown, update_highlighting - - function fill_dropdown() - for _, suggestion in ipairs(suggestions) do - local text = suggestion.text - UIDropDownMenu_AddButton{ - text = suggestion.display_text, - value = suggestion.value, - notCheckable = true, - func = function() - self.set_quietly(text) - end, - } + local item_names = {} + for key, value in Aux.static.auctionable_items do + if type(key) == 'number' then + tinsert(item_names, value.name) end end + sort(item_names) - function update_dropdown() - function toggle() - ToggleDropDownMenu(1, nil, AuxCompletionDropDown, edit_box, -12, 4) - end - - if DropDownList1:IsVisible() then - toggle() - end - toggle() - end - - function update_highlighting() - for i=1,32 do - local highlight = getglobal('DropDownList1Button' .. i .. 'Highlight') - if i == index then - highlight:Show() - else - highlight:Hide() - end - end - end - - function self.close() - CloseDropDownMenus(1) - end - - function self.set_quietly(text) - quietly_set_text = text - edit_box:SetText(text) - end - - function self.open() - local _, owner = DropDownList1:GetPoint() - return DropDownList1:IsVisible() and owner == edit_box - end - - function self.suggest() - local new_input = edit_box:GetText() - if new_input == quietly_set_text then - quietly_set_text = nil + for _, item_name in ipairs(item_names) do + if string.sub(strupper(item_name), 1, strlen(text)) == strupper(text) then + this:SetText(strlower(item_name)) + this:HighlightText(strlen(text), -1) return end - quietly_set_text = nil - - input = new_input - index = 0 - update_highlighting() - - if input == '' then - suggestions = {} - else - suggestions = generate_suggestions(input) - UIDropDownMenu_Initialize(AuxCompletionDropDown, function() fill_dropdown() end) - end - - update_dropdown() end - - function self.next() - update_dropdown() - if getn(suggestions) > 0 then - index = index > 0 and mod(index + 1, getn(suggestions) + 1) or 1 - update_highlighting() - if index == 0 then - self.set_quietly(input) - else - self.set_quietly(suggestions[index].text) - end - end - end - - function self.previous() - update_dropdown() - if getn(suggestions) > 0 then - index = index > 0 and index - 1 or getn(suggestions) - update_highlighting() - if index == 0 then - self.set_quietly(input) - else - self.set_quietly(suggestions[index].text) - end - end - end - - return self end -function public.selector(edit_box, on_click) - local self = {} - - local suggestions = {} - local index = 0 - local input - - local fill_dropdown, update_dropdown, update_highlighting - - function fill_dropdown() - for i, suggestion in ipairs(suggestions) do - local text = suggestion.text - UIDropDownMenu_AddButton{ - text = suggestion.display_text, - value = i, - notCheckable = true, - func = function() - index = this.value - if on_click then - on_click() - end - end, - } - end - end - - function update_dropdown() - function toggle() - ToggleDropDownMenu(1, nil, AuxCompletionDropDown, edit_box, -12, 4) - end - - if DropDownList1:IsVisible() then - toggle() - end - toggle() - DropDownList1.aux = true - DropDownList1:SetScript('OnHide', function() - DropDownList1.aux = false - end) - end - - function update_highlighting() - for i=1,32 do - local highlight = getglobal('DropDownList1Button' .. i .. 'Highlight') - if i == index then - highlight:Show() - else - highlight:Hide() - end - end - end - - function self.close() - CloseDropDownMenus(1) - end - - function self.open() - local _, owner = DropDownList1:GetPoint() - return DropDownList1:IsVisible() and owner == edit_box - end - - function self.suggest() - local new_input = edit_box:GetText() - - input = new_input - - if input == '' then - suggestions = {} - else - suggestions = generate_suggestions(input) - UIDropDownMenu_Initialize(AuxCompletionDropDown, fill_dropdown) - end - - index = 1 - update_highlighting() - - update_dropdown() - end - - function self.next() - update_dropdown() - if getn(suggestions) > 0 then - index = mod(index, getn(suggestions)) + 1 - update_highlighting() - end - end - - function self.previous() - update_dropdown() - if getn(suggestions) > 0 then - index = index > 1 and index - 1 or getn(suggestions) - update_highlighting() - end - end - - function self.selected_value() - return suggestions[index] and suggestions[index].value - end - - function self.clear() - index = 1 - suggestions = {} - end - - return self -end - -function public.UIDropDownMenu_StartCounting(frame) - if not frame.aux then - return Aux.orig.UIDropDownMenu_StartCounting(frame) - end -end \ No newline at end of file +--local NUM_MATCHES = 5 +-- +--local fuzzy, generate_suggestions +-- +--function fuzzy(input) +-- local uppercase_input = strupper(input) +-- local pattern = '(.*)' +-- for i=1,strlen(uppercase_input) do +-- if strfind(string.sub(uppercase_input, i, i), '%w') or strfind(string.sub(uppercase_input, i, i), '%s') then +-- pattern = pattern .. string.sub(uppercase_input, i, i) .. '(.*)' +-- end +-- end +-- return function(item_name) +-- local match = { string.find(strupper(item_name), pattern) } +-- if match[1] then +-- local rating = 0 +-- for i=4,getn(match)-1 do +-- if strlen(match[i]) == 0 then +-- rating = rating + 1 +-- end +-- end +-- return rating +-- end +-- end +--end +-- +--function generate_suggestions(input) +-- local matcher = fuzzy(input) +-- function fuzzy_sort(array) +-- sort(array, function(a, b) return strlen(a.name) < strlen(b.name) end) +-- sort(array, function(a, b) return b.rating < a.rating end) +-- return array +-- end +-- +-- local best = {} +-- for _, id in ipairs(Aux.static.item_ids()) do +-- local item_info = Aux.static.item_info(id) +-- local rating = matcher(item_info.name) +-- if rating then +-- local candidate = { name=item_info.name, id=item_info.id, rating=rating } +-- if getn(best) < NUM_MATCHES then +-- tinsert(best, candidate) +-- fuzzy_sort(best) +-- else +-- best[getn(best)] = fuzzy_sort({ best[getn(best)], candidate })[1] +-- fuzzy_sort(best) +-- end +-- end +-- end +-- +-- return Aux.util.map(best, function(match) return { text=match.name, display_text='|c'..Aux.quality_color(Aux.static.item_info(match.id).quality)..'['..match.name..']'..'|r', value=match.id } end) +--end +-- +--function public.completor(edit_box) +-- local self = {} +-- +-- local suggestions = {} +-- local index = 0 +-- local input +-- local quietly_set_text +-- +-- local fill_dropdown, update_dropdown, update_highlighting +-- +-- function fill_dropdown() +-- for _, suggestion in ipairs(suggestions) do +-- local text = suggestion.text +-- UIDropDownMenu_AddButton{ +-- text = suggestion.display_text, +-- value = suggestion.value, +-- notCheckable = true, +-- func = function() +-- self.set_quietly(text) +-- end, +-- } +-- end +-- end +-- +-- function update_dropdown() +-- function toggle() +-- ToggleDropDownMenu(1, nil, AuxCompletionDropDown, edit_box, -12, 4) +-- end +-- +-- if DropDownList1:IsVisible() then +-- toggle() +-- end +-- toggle() +-- end +-- +-- function update_highlighting() +-- for i=1,32 do +-- local highlight = getglobal('DropDownList1Button' .. i .. 'Highlight') +-- if i == index then +-- highlight:Show() +-- else +-- highlight:Hide() +-- end +-- end +-- end +-- +-- function self.close() +-- CloseDropDownMenus(1) +-- end +-- +-- function self.set_quietly(text) +-- quietly_set_text = text +-- edit_box:SetText(text) +-- end +-- +-- function self.open() +-- local _, owner = DropDownList1:GetPoint() +-- return DropDownList1:IsVisible() and owner == edit_box +-- end +-- +-- function self.suggest() +-- local new_input = edit_box:GetText() +-- if new_input == quietly_set_text then +-- quietly_set_text = nil +-- return +-- end +-- quietly_set_text = nil +-- +-- input = new_input +-- index = 0 +-- update_highlighting() +-- +-- if input == '' then +-- suggestions = {} +-- else +-- suggestions = generate_suggestions(input) +-- UIDropDownMenu_Initialize(AuxCompletionDropDown, function() fill_dropdown() end) +-- end +-- +-- update_dropdown() +-- end +-- +-- function self.next() +-- update_dropdown() +-- if getn(suggestions) > 0 then +-- index = index > 0 and mod(index + 1, getn(suggestions) + 1) or 1 +-- update_highlighting() +-- if index == 0 then +-- self.set_quietly(input) +-- else +-- self.set_quietly(suggestions[index].text) +-- end +-- end +-- end +-- +-- function self.previous() +-- update_dropdown() +-- if getn(suggestions) > 0 then +-- index = index > 0 and index - 1 or getn(suggestions) +-- update_highlighting() +-- if index == 0 then +-- self.set_quietly(input) +-- else +-- self.set_quietly(suggestions[index].text) +-- end +-- end +-- end +-- +-- return self +--end +-- +--function public.selector(edit_box, on_click) +-- local self = {} +-- +-- local suggestions = {} +-- local index = 0 +-- local input +-- +-- local fill_dropdown, update_dropdown, update_highlighting +-- +-- function fill_dropdown() +-- for i, suggestion in ipairs(suggestions) do +-- local text = suggestion.text +-- UIDropDownMenu_AddButton{ +-- text = suggestion.display_text, +-- value = i, +-- notCheckable = true, +-- func = function() +-- index = this.value +-- if on_click then +-- on_click() +-- end +-- end, +-- } +-- end +-- end +-- +-- function update_dropdown() +-- function toggle() +-- ToggleDropDownMenu(1, nil, AuxCompletionDropDown, edit_box, -12, 4) +-- end +-- +-- if DropDownList1:IsVisible() then +-- toggle() +-- end +-- toggle() +-- DropDownList1.aux = true +-- DropDownList1:SetScript('OnHide', function() +-- DropDownList1.aux = false +-- end) +-- end +-- +-- function update_highlighting() +-- for i=1,32 do +-- local highlight = getglobal('DropDownList1Button' .. i .. 'Highlight') +-- if i == index then +-- highlight:Show() +-- else +-- highlight:Hide() +-- end +-- end +-- end +-- +-- function self.close() +-- CloseDropDownMenus(1) +-- end +-- +-- function self.open() +-- local _, owner = DropDownList1:GetPoint() +-- return DropDownList1:IsVisible() and owner == edit_box +-- end +-- +-- function self.suggest() +-- local new_input = edit_box:GetText() +-- +-- input = new_input +-- +-- if input == '' then +-- suggestions = {} +-- else +-- suggestions = generate_suggestions(input) +-- UIDropDownMenu_Initialize(AuxCompletionDropDown, fill_dropdown) +-- end +-- +-- index = 1 +-- update_highlighting() +-- +-- update_dropdown() +-- end +-- +-- function self.next() +-- update_dropdown() +-- if getn(suggestions) > 0 then +-- index = mod(index, getn(suggestions)) + 1 +-- update_highlighting() +-- end +-- end +-- +-- function self.previous() +-- update_dropdown() +-- if getn(suggestions) > 0 then +-- index = index > 1 and index - 1 or getn(suggestions) +-- update_highlighting() +-- end +-- end +-- +-- function self.selected_value() +-- return suggestions[index] and suggestions[index].value +-- end +-- +-- function self.clear() +-- index = 1 +-- suggestions = {} +-- end +-- +-- return self +--end +-- +--function public.UIDropDownMenu_StartCounting(frame) +-- if not frame.aux then +-- return Aux.orig.UIDropDownMenu_StartCounting(frame) +-- end +--end \ No newline at end of file diff --git a/core.lua b/core.lua index 57fe286..dc58498 100644 --- a/core.lua +++ b/core.lua @@ -1,4 +1,4 @@ -AuxVersion = '2.4.13' +AuxVersion = '2.4.14' AuxAuthors = 'shirsig; Zerf; Zirco (Auctionator); Nimeral (Auctionator backport)' Aux = { @@ -174,8 +174,8 @@ function Aux.setup_hooks() Aux.orig.AuctionFrameAuctions_OnEvent = AuctionFrameAuctions_OnEvent AuctionFrameAuctions_OnEvent = Aux.AuctionFrameAuctions_OnEvent - Aux.orig.UIDropDownMenu_StartCounting = UIDropDownMenu_StartCounting - UIDropDownMenu_StartCounting = Aux.completion.UIDropDownMenu_StartCounting +-- Aux.orig.UIDropDownMenu_StartCounting = UIDropDownMenu_StartCounting +-- UIDropDownMenu_StartCounting = Aux.completion.UIDropDownMenu_StartCounting end diff --git a/gui.lua b/gui.lua index b37f0e3..e35439d 100644 --- a/gui.lua +++ b/gui.lua @@ -274,7 +274,6 @@ function m.editbox(parent, name) -- frame:Hide() local editbox = CreateFrame('EditBox', name, parent) - editbox.selector = Aux.completion.selector(editbox) editbox:SetAutoFocus(false) editbox:SetTextInsets(0, 0, 3, 3) editbox:SetMaxLetters(256) diff --git a/search_frame.lua b/search_frame.lua index 65f7895..8a92fca 100644 --- a/search_frame.lua +++ b/search_frame.lua @@ -158,6 +158,23 @@ function private.get_form_filter() } end +function private.prettify_search(search) + local item_pattern = '([^/;]+)([^;]*)/exact' + while true do + local _, _, name, in_between = strfind(search, item_pattern) + if name then + search = gsub(search, item_pattern, private.display_name(Aux.static.auctionable_items[strupper(name)])..in_between, 1) + else + return Aux.gui.inline_color({216, 225, 211, 1})..search..'|r' + end + end +end + +function private.display_name(item_id) + local item_info = Aux.static.item_info(item_id) + return '|c'..Aux.quality_color(item_info.quality)..'['..item_info.name..']'..'|r' +end + function public.on_open() private.update_search_listings() end @@ -177,7 +194,7 @@ function public.on_load() btn:SetWidth(60) btn:SetHeight(25) btn:SetText('Search') - btn:SetScript('OnClick', Aux.search_frame.start_search) + btn:SetScript('OnClick', public.start_search) private.search_button = btn end do @@ -194,7 +211,7 @@ function public.on_load() local editbox = Aux.gui.editbox(AuxFilterSearchFrame) editbox:SetMaxLetters(nil) editbox:EnableMouse(1) - editbox.complete = Aux.test.complete + editbox.complete = Aux.completion.complete editbox:SetPoint('TOPLEFT', 5, -8) editbox:SetPoint('RIGHT', private.search_button, 'LEFT', -4, 0) editbox:SetWidth(400) @@ -314,7 +331,7 @@ function public.on_load() end do local editbox = Aux.gui.editbox(AuxFilterSearchFrameFilter, '$parentNameInputBox') - editbox.complete_item = Aux.test.complete_item + editbox.complete_item = Aux.completion.complete_item editbox:SetPoint('TOPLEFT', 14, -20) editbox:SetWidth(300) editbox:SetScript('OnChar', function() @@ -767,9 +784,12 @@ function public.stop_search() Aux.scan.abort() end -function public.start_search() +function public.start_search(filter_string) Aux.scan.abort(function() + if filter_string then + private.search_box:SetText(filter_string) + end local queries @@ -787,7 +807,7 @@ function public.start_search() return end - tinsert(aux_recent_searches, 1, { filter_string = private.search_box:GetText(), prettified = Aux.test.prettify_search(private.search_box:GetText()) }) + tinsert(aux_recent_searches, 1, { filter_string = private.search_box:GetText(), prettified = private.prettify_search(private.search_box:GetText()) }) while getn(aux_recent_searches) > 50 do tremove(aux_recent_searches) end diff --git a/test.lua b/test.lua index a84cf31..f1308ed 100644 --- a/test.lua +++ b/test.lua @@ -1,146 +1,6 @@ local m = {} Aux.test = m -function m.prettify_search(search) - local item_pattern = '([^/;]+)([^;]*)/exact' - while true do - local _, _, name, in_between = strfind(search, item_pattern) - if name then - search = gsub(search, item_pattern, m.display_name(Aux.static.auctionable_items[strupper(name)])..in_between, 1) - else - return Aux.gui.inline_color({216, 225, 211, 1})..search..'|r' - end - end -end - -function m.display_name(item_id) - local item_info = Aux.static.item_info(item_id) - return '|c'..Aux.quality_color(item_info.quality)..'['..item_info.name..']'..'|r' -end - -function m:complete() - if IsControlKeyDown() then -- TODO problem is ctrl-v, maybe find a better solution - return - end - - local filter_string = this:GetText() - - local completed_filter_string = ({strfind(filter_string, '([^;]*)/[^/;]*$')})[3] - local current_filter = completed_filter_string and Aux.scan_util.filter_from_string(completed_filter_string) - - local options = {} - - if current_filter or not completed_filter_string then - current_filter = current_filter or {} - - if current_filter.name - and Aux.static.auctionable_items[strupper(current_filter.name)] - and not current_filter.min_level - and not current_filter.max_level - and not current_filter.class - and not current_filter.subclass - and not current_filter.slot - and not current_filter.quality - and not current_filter.usable - and not current_filter.exact - then - tinsert(options, 'exact') - end - - tinsert(options, 'and') - tinsert(options, 'or') - tinsert(options, 'not') - tinsert(options, 'tt') - - -- classes - if not current_filter.class and not current_filter.exact then - for _, class in ipairs({ GetAuctionItemClasses() }) do - tinsert(options, class) - end - end - - -- subclasses - if current_filter.class and not current_filter.subclass then - for _, subclass in ipairs({ GetAuctionItemSubClasses(current_filter.class) }) do - tinsert(options, subclass) - end - end - - -- slots - if current_filter.class and current_filter.subclass and not current_filter.slot then - for _, invtype in ipairs({ GetAuctionInvTypes(current_filter.class, current_filter.subclass) }) do - tinsert(options, getglobal(invtype)) - end - end - - -- usable - if not current_filter.usable and not current_filter.exact then - tinsert(options, 'usable') - end - - -- rarities - if not current_filter.quality and not current_filter.exact then - for i=0,4 do - tinsert(options, getglobal('ITEM_QUALITY'..i..'_DESC')) - end - end - - -- discard - if not current_filter.discard then - tinsert(options, 'discard') - end - - -- item names - if not completed_filter_string then - local item_filters = {} - for key, value in Aux.static.auctionable_items do - if type(key) == 'number' then - tinsert(item_filters, value.name..'/exact') - end - end - sort(item_filters) - for _, item_name in ipairs(item_filters) do - tinsert(options, item_name) - end - end - - local start_index, _, current_modifier = strfind(filter_string, '([^/;]*)$') - current_modifier = current_modifier or '' - - for _, option in ipairs(options) do - if string.sub(strupper(option), 1, strlen(current_modifier)) == strupper(current_modifier) then - this:SetText(strlower(string.sub(filter_string, 1, start_index - 1)..option)) - this:HighlightText(strlen(filter_string), -1) - return - end - end - end -end - -function m:complete_item() - if IsControlKeyDown() then -- TODO problem is ctrl-v, maybe find a better solution - return - end - - local text = this:GetText() - - local item_names = {} - for key, value in Aux.static.auctionable_items do - if type(key) == 'number' then - tinsert(item_names, value.name) - end - end - sort(item_names) - - for _, item_name in ipairs(item_names) do - if string.sub(strupper(item_name), 1, strlen(text)) == strupper(text) then - this:SetText(strlower(item_name)) - this:HighlightText(strlen(text), -1) - return - end - end -end - --StaticPopupDialogs["CANCEL_AUCTION"] = { -- text = TEXT(CANCEL_AUCTION_CONFIRMATION), -- button1 = TEXT(ACCEPT),