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.
102 lines
2.8 KiB
102 lines
2.8 KiB
--[[
|
|
Select.lua
|
|
@Author : DengSir (tdaddon@163.com)
|
|
@Link : https://dengsir.github.io
|
|
]]
|
|
|
|
local MAJOR, MINOR = 'Select', 1
|
|
local GUI = LibStub('tdGUI-1.0')
|
|
local View, oldminor = GUI:NewEmbed(MAJOR, MINOR)
|
|
if not View then return end
|
|
|
|
local SELECT_MODES = {
|
|
NONE = {
|
|
SetSelected = nop,
|
|
GetSelected = nop,
|
|
IsSelected = nop,
|
|
GetSelectedItem = nop,
|
|
SetSelectedItem = nop,
|
|
},
|
|
RADIO = {
|
|
SetSelected = function(self, index)
|
|
if index ~= self._selected or self._selectedItem ~= self:GetItem(index) then
|
|
self._selected = index
|
|
self._selectedItem = self:GetItem(index)
|
|
self:Refresh()
|
|
self:Fire('OnSelectChanged', index, self._selectedItem)
|
|
end
|
|
end,
|
|
GetSelected = function(self)
|
|
return self._selected
|
|
end,
|
|
IsSelected = function(self, index)
|
|
return self._selected == index
|
|
end,
|
|
SelectAll = nop,
|
|
GetSelectedItem = function(self)
|
|
return self._selected and self:GetItem(self._selected) or nil
|
|
end,
|
|
SetSelectedItem = function(self, item)
|
|
for i = 1, self:GetItemCount() do
|
|
if self:GetItem(i) == item then
|
|
return self:SetSelected(i)
|
|
end
|
|
end
|
|
self:SetSelected(nil)
|
|
end,
|
|
},
|
|
MULTI = {
|
|
SetSelected = function(self, index)
|
|
self._selected[index] = not self._selected[index] or nil
|
|
self:Refresh()
|
|
end,
|
|
GetSelected = function(self)
|
|
return self._selected
|
|
end,
|
|
IsSelected = function(self, index)
|
|
return self._selected[index]
|
|
end,
|
|
SelectAll = function(self, flag)
|
|
if flag then
|
|
for i = 1, self:GetItemCount() do
|
|
self._selected[i] = true
|
|
end
|
|
else
|
|
wipe(self._selected)
|
|
end
|
|
self:Refresh()
|
|
end,
|
|
GetSelectedItem = nop,
|
|
SetSelectedItem = nop,
|
|
},
|
|
}
|
|
|
|
function View:SetSelectMode(mode)
|
|
mode = mode:upper()
|
|
|
|
if not (mode == 'NONE' or mode == 'MULTI' or mode == 'RADIO') then
|
|
error(([[Cannot set select mode to '%s']]):format(mode), 2)
|
|
end
|
|
self._selectMode = mode
|
|
|
|
for k, v in pairs(SELECT_MODES[mode]) do
|
|
self[k] = v
|
|
end
|
|
|
|
if mode == 'MULTI' then
|
|
self._selected = {}
|
|
else
|
|
self._selected = nil
|
|
end
|
|
end
|
|
|
|
function View:GetSelectMode()
|
|
return self._selectMode or 'NONE'
|
|
end
|
|
|
|
local mixins = {
|
|
'SetSelectMode',
|
|
'GetSelectMode',
|
|
}
|
|
|
|
View.Embed = GUI:EmbedFactory(View, mixins)
|
|
|