diff --git a/completion.lua b/completion.lua index 514a6ff..3275739 100644 --- a/completion.lua +++ b/completion.lua @@ -37,18 +37,20 @@ function m:complete() 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() - - for _, item_name in ipairs(m.sorted_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) +function m.completor(options) + return function(self) + if IsControlKeyDown() then -- TODO problem is ctrl-v, maybe find a better solution return end + + local text = self:GetText() + + for _, item_name in ipairs(options) do + if string.sub(strupper(item_name), 1, strlen(text)) == strupper(text) then + self:SetText(strlower(item_name)) + self:HighlightText(strlen(text), -1) + return + end + end end end \ No newline at end of file diff --git a/core.lua b/core.lua index ab38c1f..3a8311a 100644 --- a/core.lua +++ b/core.lua @@ -1,5 +1,5 @@ Aux = { - version = '2.6.9', + version = '2.6.10', blizzard_ui_shown = false, orig = {}, } diff --git a/search_frame.lua b/search_frame.lua index 6a660ea..5d2a4c3 100644 --- a/search_frame.lua +++ b/search_frame.lua @@ -324,9 +324,9 @@ function public.on_load() end do local editbox = Aux.gui.editbox(AuxSearchFrameFilter, '$parentNameInputBox') - editbox.complete_item = Aux.completion.complete_item + editbox.complete_item = Aux.completion.completor(Aux.completion.sorted_item_names()) editbox:SetPoint('TOPLEFT', 14, -20) - editbox:SetWidth(300) + editbox:SetWidth(260) editbox:SetScript('OnChar', function() if AuxSearchFrameFilterExactCheckButton:GetChecked() then this:complete_item() @@ -353,10 +353,20 @@ function public.on_load() label:SetPoint('BOTTOMLEFT', editbox, 'TOPLEFT', -2, 1) label:SetText('Name') end + do + local checkbox = CreateFrame('CheckButton', '$parentExactCheckButton', AuxSearchFrameFilter, 'UICheckButtonTemplate') + checkbox:SetWidth(22) + checkbox:SetHeight(22) + checkbox:SetPoint('TOPLEFT', AuxSearchFrameFilterNameInputBox, 'TOPRIGHT', 10, 0) + local label = Aux.gui.label(AuxSearchFrameFilterExactCheckButton, 13) + label:SetPoint('BOTTOMLEFT', AuxSearchFrameFilterExactCheckButton, 'TOPLEFT', 1, -3) + label:SetText('Exact') + private.show_hidden_checkbox = checkbox + end do local editbox = Aux.gui.editbox(AuxSearchFrameFilter, '$parentMinLevel') editbox:SetPoint('TOPLEFT', AuxSearchFrameFilterNameInputBox, 'BOTTOMLEFT', 0, -22) - editbox:SetWidth(145) + editbox:SetWidth(125) editbox:SetNumeric(true) editbox:SetMaxLetters(2) editbox:SetScript('OnTabPressed', function() @@ -383,7 +393,7 @@ function public.on_load() do local editbox = Aux.gui.editbox(AuxSearchFrameFilter, '$parentMaxLevel') editbox:SetPoint('TOPLEFT', AuxSearchFrameFilterMinLevel, 'TOPRIGHT', 10, 0) - editbox:SetWidth(145) + editbox:SetWidth(125) editbox:SetNumeric(true) editbox:SetMaxLetters(2) editbox:SetScript('OnTabPressed', function() @@ -404,9 +414,19 @@ function public.on_load() this:HighlightText() end) local label = Aux.gui.label(editbox, 13) - label:SetPoint('RIGHT', editbox, 'LEFT', -4, 0) + label:SetPoint('RIGHT', editbox, 'LEFT', -3, 0) label:SetText('-') end + do + local checkbox = CreateFrame('CheckButton', '$parentUsableCheckButton', AuxSearchFrameFilter, 'UICheckButtonTemplate') + checkbox:SetWidth(22) + checkbox:SetHeight(22) + checkbox:SetPoint('TOPLEFT', AuxSearchFrameFilterMaxLevel, 'TOPRIGHT', 10, 0) + local label = Aux.gui.label(AuxSearchFrameFilterUsableCheckButton, 13) + label:SetPoint('BOTTOMLEFT', AuxSearchFrameFilterUsableCheckButton, 'TOPLEFT', 1, -3) + label:SetText('Usable') + private.show_hidden_checkbox = checkbox + end do local dropdown = Aux.gui.dropdown(AuxSearchFrameFilter) dropdown:SetPoint('TOPLEFT', AuxSearchFrameFilterMinLevel, 'BOTTOMLEFT', 0, -22) @@ -464,17 +484,11 @@ function public.on_load() private.quality_dropdown = dropdown end Aux.gui.vertical_line(AuxSearchFrameFilter, 332) - do - local label = Aux.gui.label(AuxSearchFrameFilterExactCheckButton, 13) - label:SetPoint('BOTTOMLEFT', AuxSearchFrameFilterExactCheckButton, 'TOPLEFT', 1, -3) - label:SetText('Exact') - end do local label = Aux.gui.label(AuxSearchFrameFilterUsableCheckButton, 13) label:SetPoint('BOTTOMLEFT', AuxSearchFrameFilterUsableCheckButton, 'TOPLEFT', 1, -3) label:SetText('Usable') end - Aux.gui.vertical_line(AuxSearchFrameFilter, 425) local function add_modifier(...) local current_filter_string = private.search_box:GetText() for i=1,arg.n do @@ -485,215 +499,162 @@ function public.on_load() end private.search_box:SetText(current_filter_string) end - private.modifier_buttons = {} do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) - btn:SetPoint('TOPRIGHT', -270, -10) + btn:SetPoint('TOPRIGHT', -362, -14) btn:SetWidth(50) btn:SetHeight(24) btn:SetText('and') btn:SetScript('OnClick', function() add_modifier('and') end) - private.modifier_buttons['and'] = btn + private.and_operator_button = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) - btn:SetPoint('LEFT', private.modifier_buttons['and'], 'RIGHT', 10, 0) + btn:SetPoint('LEFT', private.and_operator_button, 'RIGHT', 10, 0) btn:SetWidth(50) btn:SetHeight(24) btn:SetText('or') btn:SetScript('OnClick', function() add_modifier('or') end) - private.modifier_buttons['or'] = btn + private.or_operator_button = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) - btn:SetPoint('LEFT', private.modifier_buttons['or'], 'RIGHT', 10, 0) + btn:SetPoint('LEFT', private.or_operator_button, 'RIGHT', 10, 0) btn:SetWidth(50) btn:SetHeight(24) btn:SetText('not') btn:SetScript('OnClick', function() add_modifier('not') end) - private.modifier_buttons['not'] = btn + private.not_operator_button = btn end + private.modifier_buttons = {} do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) - btn:SetPoint('TOPLEFT', private.modifier_buttons['and'], 'BOTTOMLEFT', 100, -25) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('item') - btn:SetScript('OnClick', function() - add_modifier('item') - end) + btn:SetPoint('TOPLEFT', private.and_operator_button, 'BOTTOMLEFT', 205, -16) private.modifier_buttons['item'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['item'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('tt') - btn:SetScript('OnClick', function() - add_modifier('tt') - end) private.modifier_buttons['tt'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['tt'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('min-lvl') - btn:SetScript('OnClick', function() - add_modifier('min-lvl') - end) private.modifier_buttons['min-lvl'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['min-lvl'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('max-lvl') - btn:SetScript('OnClick', function() - add_modifier('max-lvl') - end) private.modifier_buttons['max-lvl'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['max-lvl'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('rarity') - btn:SetScript('OnClick', function() - add_modifier('rarity') - end) private.modifier_buttons['rarity'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['rarity'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('left') - btn:SetScript('OnClick', function() - add_modifier('left') - end) private.modifier_buttons['left'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['left'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('utilizable') - btn:SetScript('OnClick', function() - add_modifier('utilizable') - end) private.modifier_buttons['utilizable'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['utilizable'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('discard') - btn:SetScript('OnClick', function() - add_modifier('discard') - end) private.modifier_buttons['discard'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) - btn:SetPoint('TOPLEFT', private.modifier_buttons['and'], 'BOTTOMLEFT', 0, -25) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('min-bid') - btn:SetScript('OnClick', function() - add_modifier('min-bid') - end) + btn:SetPoint('TOPLEFT', private.and_operator_button, 'BOTTOMLEFT', 0, -16) private.modifier_buttons['min-bid'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['min-bid'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('max-bid') - btn:SetScript('OnClick', function() - add_modifier('max-bid') - end) private.modifier_buttons['max-bid'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['max-bid'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('bid-profit') - btn:SetScript('OnClick', function() - add_modifier('bid-profit') - end) private.modifier_buttons['bid-profit'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['bid-profit'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('bid-pct') - btn:SetScript('OnClick', function() - add_modifier('bid-pct') - end) private.modifier_buttons['bid-pct'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['bid-pct'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('min-buyout') - btn:SetScript('OnClick', function() - add_modifier('min-buyout') - end) private.modifier_buttons['min-buyout'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['min-buyout'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('max-buyout') - btn:SetScript('OnClick', function() - add_modifier('max-buyout') - end) private.modifier_buttons['max-buyout'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['max-buyout'], 'BOTTOMLEFT', 0, -10) - btn:SetWidth(80) - btn:SetHeight(24) - btn:SetText('buyout-profit') - btn:SetScript('OnClick', function() - add_modifier('buyout-profit') - end) private.modifier_buttons['buyout-profit'] = btn end do local btn = Aux.gui.button(AuxSearchFrameFilter, 16) btn:SetPoint('TOPLEFT', private.modifier_buttons['buyout-profit'], 'BOTTOMLEFT', 0, -10) + private.modifier_buttons['buyout-pct'] = btn + end + for modifier_name, btn in private.modifier_buttons do + local modifier_name = modifier_name + local btn = btn + + local filter = Aux.scan_util.filters[modifier_name] + btn:SetWidth(80) btn:SetHeight(24) - btn:SetText('buyout-pct') + btn:SetText(modifier_name) btn:SetScript('OnClick', function() - add_modifier('buyout-pct') + local args = Aux.util.map(btn.inputs, function(input) return input:GetText() end) + if filter.test(unpack(args)) then + add_modifier(unpack(Aux.util.cons(modifier_name, args))) + for _, input in btn.inputs do + input:SetText('') + input:ClearFocus() + end + end end) - private.modifier_buttons['buyout-pct'] = btn + btn.inputs = {} + if filter.arity > 0 then + local editbox = Aux.gui.editbox(AuxSearchFrameFilter) + editbox.complete = Aux.completion.completor(({filter.test()})[2]) + editbox:SetPoint('LEFT', btn, 'RIGHT', 10, 0) + editbox:SetWidth(100) +-- editbox:SetNumeric(true) +-- editbox:SetMaxLetters(2) + editbox:SetScript('OnChar', function() + this:complete() + end) + local on_click = btn:GetScript('OnClick') + editbox:SetScript('OnEnterPressed', function() + on_click() + end) + editbox:SetScript('OnEscapePressed', function() + this:ClearFocus() + end) + editbox:SetScript('OnEditFocusGained', function() + this:HighlightText() + end) + tinsert(btn.inputs, editbox) + end end private.results_listing = Aux.auction_listing.CreateAuctionResultsTable(AuxSearchFrameResults) diff --git a/search_frame.xml b/search_frame.xml index 3db4a06..74905bd 100644 --- a/search_frame.xml +++ b/search_frame.xml @@ -14,16 +14,6 @@ - - - - - - - - - - diff --git a/util.lua b/util.lua index 2543975..869ba0a 100644 --- a/util.lua +++ b/util.lua @@ -25,6 +25,12 @@ function public.copy_table(table) return copy end +function public.cons(element, list) + local new_list = public.copy_table(list) + tinsert(new_list, 1, element) + return new_list +end + function public.trim(string) string = gsub(string, '^%s*', '') string = gsub(string, '%s*$', '')