You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.2 KiB

5 years ago
--[[
AutoCompleteBox.lua
@Author : DengSir (tdaddon@163.com)
@Link : https://dengsir.github.io
]]
local ns = select(2, ...)
local Addon = ns.Addon
local GUI = LibStub('tdGUI-1.0')
local AutoCompleteBox = Addon:NewClass('AutoCompleteBox', GUI:GetClass('AutoSizeGridView'))
function AutoCompleteBox:Constructor()
self:Hide()
self:SetSize(100, 100)
self:SetItemHeight(20)
self:SetItemClass(Addon:GetClass('AutoCompleteItem'))
self:SetSelectMode('RADIO')
self:SetClampedToScreen(true)
self:SetFrameStrata('FULLSCREEN_DIALOG')
self:EnableMouse(true)
self:SetPadding(13)
self:SetItemSpacing(5)
self:SetBackdrop{
bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
edgeSize = 16, tileSize = 16, tile = true,
insets = {left = 4, right = 4, top = 4, bottom = 4},
}
self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
self:SetCallback('OnItemFormatting', self.OnItemFormatting)
self:SetCallback('OnItemClick', self.OnItemClick)
self:SetCallback('OnSelectChanged', self.OnSelectChanged)
self:SetScript('OnKeyDown', self.OnKeyDown)
self:SetScript('OnHide', self.OnHide)
end
function AutoCompleteBox:Open(object, list, column)
self:SetOwner(object)
self:SetPoint('CENTER')
self:SetColumnCount(column)
self:SetItemList(list)
self:SetSelected(1)
if not list[1].value then
self:SetSelected(self:Move(1))
end
self:Refresh()
self:Show()
end
function AutoCompleteBox:Input(item)
self:GetOwner():Insert(item.value)
self:Hide()
if item.callback then
item.callback(item)
end
end
function AutoCompleteBox:OnItemFormatting(button, item)
button:SetItem(item)
button.CheckedTexture:SetShown(self:IsSelected(button:GetID()))
end
function AutoCompleteBox:OnItemClick(button, item)
return self:Input(item)
end
function AutoCompleteBox:OnHide()
self:GetOwner():SetFocus()
end
function AutoCompleteBox:OnKeyDown(key)
self:SetPropagateKeyboardInput(false)
if key == 'UP' then
self:OnArrowPresssed(-1*self:GetColumnCount())
elseif key == 'DOWN' then
self:OnArrowPresssed(1*self:GetColumnCount())
elseif key == 'LEFT' then
self:OnArrowPresssed(-1)
elseif key == 'RIGHT' then
self:OnArrowPresssed(1)
elseif key == 'ENTER' or key == 'TAB' then
self:OnEnterPressed()
elseif key == 'ESCAPE' then
self:Hide()
else
self:SetPropagateKeyboardInput(true)
self:Hide()
end
end
function AutoCompleteBox:OnArrowPresssed(delta)
self:SetSelected(self:Move(delta))
end
function AutoCompleteBox:Move(delta)
local index = self:GetSelected()
local max = self:GetItemCount()
repeat
index = (index + delta - 1) % self:GetItemCount() + 1
until self:GetItem(index).value
return index
end
function AutoCompleteBox:OnEnterPressed()
return self:Input(self:GetSelectedItem())
end