Advertisement
Guest User

Untitled

a guest
Mar 8th, 2012
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.81 KB | None | 0 0
  1. -- Helper Functions
  2.  
  3. local function UpdateSelection(self)
  4.   for i, itemFrame in ipairs(self.itemFrames) do
  5.     if itemFrame.selected then
  6.       itemFrame.bgFrame:SetBackgroundColor(unpack(self.selectionBackgroundColor))
  7.     else
  8.       local level = self.levels[i]
  9.       local backgroundColor = {0, 0, 0, 0}
  10.       if level then
  11.         backgroundColor = self.levelBackgroundColors[level] or backgroundColor
  12.       end
  13.       itemFrame.bgFrame:SetBackgroundColor(unpack(backgroundColor))
  14.     end
  15.   end
  16. end
  17.  
  18.  
  19. -- Item Frame Events
  20.  
  21. local function ItemIsSelectable(self, index)
  22.   local selectable = self.levelSelectable[self.levels[index]]
  23.   return selectable == nil or selectable
  24. end
  25.  
  26. local function ItemClick(self)
  27.   local widget = self:GetParent()
  28.   if not widget.enabled then return end
  29.   if not ItemIsSelectable(widget, self.index) then return end
  30.   if widget.selectionMode == "single" then
  31.     widget:SetSelectedIndex(self.index)
  32.   elseif widget.selectionMode == "multi" then
  33.     if self.selected then
  34.       widget:RemoveSelectedIndex(self.index)
  35.     else
  36.       widget:AddSelectedIndex(self.index)
  37.     end
  38.   end
  39. end
  40.  
  41. local function ItemMouseIn(self)
  42.   local widget = self:GetParent()
  43.   if not widget.enabled then return end
  44.   if not ItemIsSelectable(widget, self.index) then return end
  45.   if not self.selected then
  46.     self.bgFrame:SetBackgroundColor(0.3, 0.3, 0.3, 1)
  47.   end
  48. end
  49.  
  50. local function ItemMouseOut(self)
  51.   local widget = self:GetParent()
  52.   if not widget.enabled then return end
  53.   if not ItemIsSelectable(widget, self.index) then return end
  54.   if not self.selected then
  55.     local level = widget.levels[self.index]
  56.     local backgroundColor = {0, 0, 0, 0}
  57.     if level then
  58.       backgroundColor = widget.levelBackgroundColors[level] or backgroundColor
  59.     end
  60.     self.bgFrame:SetBackgroundColor(unpack(backgroundColor))
  61.   end
  62. end
  63.  
  64.  
  65. local function LayoutItems(self)
  66.   local height = 0
  67.   local prevItemFrame
  68.   for i, item in ipairs(self.items) do
  69.     local itemFrame = self.itemFrames[i]
  70.     local bgFrame = itemFrame and itemFrame.bgFrame
  71.     if not itemFrame then
  72.       itemFrame = UI.CreateFrame("Text", self:GetName().."Item"..i, self)
  73.       itemFrame:SetBackgroundColor(0, 0, 0, 0)
  74.       if prevItemFrame then
  75.         itemFrame:SetPoint("TOP", prevItemFrame, "BOTTOM")
  76.       else
  77.         itemFrame:SetPoint("TOP", self, "TOP")
  78.       end
  79.       itemFrame:SetPoint("RIGHT", self, "RIGHT")
  80.       bgFrame = UI.CreateFrame("Frame", self:GetName().."ItemBG"..i, self)
  81.       bgFrame:SetLayer(itemFrame:GetLayer()-1)
  82.       bgFrame:SetPoint("TOP", itemFrame, "TOP")
  83.       bgFrame:SetPoint("BOTTOM", itemFrame, "BOTTOM")
  84.       bgFrame:SetPoint("LEFT", self, "LEFT")
  85.       bgFrame:SetPoint("RIGHT", self, "RIGHT")
  86.       bgFrame.Event.LeftClick = function() ItemClick(itemFrame) end
  87.       bgFrame.Event.MouseIn = function() ItemMouseIn(itemFrame) end
  88.       bgFrame.Event.MouseOut = function() ItemMouseOut(itemFrame) end
  89.       itemFrame.index = i
  90.       itemFrame.bgFrame = bgFrame
  91.       self.itemFrames[i] = itemFrame
  92.     end
  93.  
  94.     local level = self.levels[i]
  95.  
  96.     local indent = 0
  97.     local fontSize = self.fontSize
  98.     local fontColor = {1, 1, 1}
  99.     local backgroundColor = {0, 0, 0, 0}
  100.     if level then
  101.       indent = self.indentSize * (level-1)
  102.       fontSize = self.levelFontSizes[level] or fontSize
  103.       fontColor = self.levelFontColors[level] or fontColor
  104.       backgroundColor = self.levelBackgroundColors[level] or backgroundColor
  105.     end
  106.  
  107.     itemFrame:SetPoint("LEFT", self, "LEFT", indent, nil)
  108.     itemFrame:SetFontSize(fontSize)
  109.     itemFrame:SetFontColor(unpack(fontColor))
  110.     itemFrame:SetText(item)
  111.     itemFrame:SetVisible(true)
  112.     itemFrame.bgFrame:SetBackgroundColor(unpack(backgroundColor))
  113.     itemFrame.bgFrame:SetVisible(true)
  114.  
  115.     height = height + itemFrame:GetHeight()
  116.     prevItemFrame = itemFrame
  117.   end
  118.  
  119.   self:SetHeight(height)
  120. end
  121.  
  122. -- Public Functions
  123.  
  124. local function SetBorder(self, width, r, g, b, a)
  125.   Library.LibSimpleWidgets.SetBorder(self, width, r, g, b, a)
  126. end
  127.  
  128. local function GetFontSize(self)
  129.   return self.fontSize
  130. end
  131.  
  132. local function SetFontSize(self, size)
  133.   self.fontSize = size
  134.   LayoutItems(self)
  135. end
  136.  
  137. local function GetEnabled(self)
  138.   return self.enabled
  139. end
  140.  
  141. local function SetLevelIndentSize(self, size)
  142.   self.indentSize = size
  143.   LayoutItems(self)
  144. end
  145.  
  146. local function SetLevelFontSize(self, level, size)
  147.   self.levelFontSizes[level] = size
  148.   LayoutItems(self)
  149. end
  150.  
  151. local function SetLevelFontColor(self, level, r, g, b)
  152.   self.levelFontColors[level] = {r, g, b}
  153.   LayoutItems(self)
  154. end
  155.  
  156. local function SetLevelBackgroundColor(self, level, r, g, b, a)
  157.   self.levelBackgroundColors[level] = {r, g, b, a }
  158.   LayoutItems(self)
  159. end
  160.  
  161. local function SetLevelSelectable(self, level, selectable)
  162.   self.levelSelectable[level] = selectable
  163. end
  164.  
  165. local function SetSelectionBackgroundColor(self, r, g, b, a)
  166.   self.selectionBackgroundColor = {r, g, b, a}
  167.   LayoutItems(self)
  168. end
  169.  
  170. local function SetEnabled(self, enabled)
  171.   self.enabled = enabled
  172.   if enabled then
  173.     for i, itemFrame in ipairs(self.itemFrames) do
  174.       itemFrame:SetFontColor(1, 1, 1, 1)
  175.     end
  176.   else
  177.     for i, itemFrame in ipairs(self.itemFrames) do
  178.       itemFrame:SetFontColor(0.5, 0.5, 0.5, 1)
  179.     end
  180.   end
  181. end
  182.  
  183. local function GetItems(self)
  184.   return self.items
  185. end
  186.  
  187. local function SetItems(self, items, values, levels)
  188.   self:ClearSelection(true)
  189.  
  190.   self.items = items
  191.   self.values = values or {}
  192.   self.levels = levels or {}
  193.  
  194.   LayoutItems(self)
  195.  
  196.   if #items < #self.itemFrames then
  197.     for i = #items+1, #self.itemFrames do
  198.       self.itemFrames[i]:SetVisible(false)
  199.       self.itemFrames[i].bgFrame:SetVisible(false)
  200.     end
  201.   end
  202. end
  203.  
  204. local function GetValues(self)
  205.   return self.values
  206. end
  207.  
  208. local function SetSelectionMode(self, mode)
  209.   if mode ~= "single" and mode ~= "multi" then
  210.     error("Invalid selection mode: "..mode)
  211.   end
  212.  
  213.   self:ClearSelection()
  214.  
  215.   self.selectionMode = mode
  216. end
  217.  
  218. local function GetSelectedItem(self)
  219.   if self.selectionMode ~= "single" then
  220.     error("List is not in single-select mode.")
  221.   end
  222.   return self.items[self.selectedIndex]
  223. end
  224.  
  225. local function SetSelectedItem(self, item, silent)
  226.   if self.selectionMode ~= "single" then
  227.     error("List is not in single-select mode.")
  228.   end
  229.   if item then
  230.     for i, v in ipairs(self.items) do
  231.       if v == item then
  232.         self:SetSelectedIndex(i, silent)
  233.         return
  234.       end
  235.     end
  236.   end
  237.  
  238.   self:SetSelectedIndex(nil, silent)
  239. end
  240.  
  241. local function GetSelectedValue(self)
  242.   if self.selectionMode ~= "single" then
  243.     error("List is not in single-select mode.")
  244.   end
  245.   return self.values[self.selectedIndex]
  246. end
  247.  
  248. local function SetSelectedValue(self, value, silent)
  249.   if self.selectionMode ~= "single" then
  250.     error("List is not in single-select mode.")
  251.   end
  252.   if value then
  253.     for i, v in ipairs(self.values) do
  254.       if v == value then
  255.         self:SetSelectedIndex(i, silent)
  256.         return
  257.       end
  258.     end
  259.   end
  260.  
  261.   self:SetSelectedIndex(nil, silent)
  262. end
  263.  
  264. local function GetSelectedIndex(self)
  265.   if self.selectionMode ~= "single" then
  266.     error("List is not in single-select mode.")
  267.   end
  268.   return self.selectedIndex
  269. end
  270.  
  271. local function SetSelectedIndex(self, index, silent)
  272.   if self.selectionMode ~= "single" then
  273.     error("List is not in single-select mode.")
  274.   end
  275.  
  276.   if index == nil then
  277.     self:ClearSelection(silent)
  278.     return
  279.   end
  280.  
  281.   if index and (index < 1 or index > #self.items) then
  282.     index = nil
  283.   end
  284.  
  285.   if index == self.selectedIndex then
  286.     return
  287.   end
  288.  
  289.   if self.selectedIndex then
  290.     self.itemFrames[self.selectedIndex].selected = false
  291.   end
  292.  
  293.   if index then
  294.     self.itemFrames[index].selected = true
  295.   end
  296.  
  297.   self.selectedIndex = index
  298.  
  299.   if not silent and self.Event.ItemSelect then
  300.     local item = self.items[index]
  301.     local value = self.values[index]
  302.     self.Event.ItemSelect(self, item, value, index)
  303.   end
  304.  
  305.   UpdateSelection(self)
  306.  
  307.   if not silent and self.Event.SelectionChange then
  308.     self.Event.SelectionChange(self)
  309.   end
  310. end
  311.  
  312. local function AddSelectedIndex(self, index, silent)
  313.   if self.selectionMode ~= "multi" then
  314.     error("List is not in multi-select mode.")
  315.   end
  316.  
  317.   if index and (index < 1 or index > #self.items) then
  318.     return
  319.   end
  320.  
  321.   if not self.itemFrames[index].selected then
  322.     self.itemFrames[index].selected = true
  323.  
  324.     UpdateSelection(self)
  325.  
  326.     if not silent and self.Event.SelectionChange then
  327.       self.Event.SelectionChange(self)
  328.     end
  329.   end
  330. end
  331.  
  332. local function RemoveSelectedIndex(self, index, silent)
  333.   if self.selectionMode ~= "multi" then
  334.     error("List is not in multi-select mode.")
  335.   end
  336.  
  337.   if index and (index < 1 or index > #self.items) then
  338.     return
  339.   end
  340.  
  341.   if self.itemFrames[index].selected then
  342.     self.itemFrames[index].selected = false
  343.  
  344.     UpdateSelection(self)
  345.  
  346.     if not silent and self.Event.SelectionChange then
  347.       self.Event.SelectionChange(self)
  348.     end
  349.   end
  350. end
  351.  
  352. local function GetSelection(self)
  353.   local selection = {}
  354.  
  355.   for i, itemFrame in ipairs(self.itemFrames) do
  356.     if itemFrame.selected then
  357.       table.insert(selection, { index=i, item=self.items[i], value=self.values[i] })
  358.     end
  359.   end
  360.  
  361.   return selection
  362. end
  363.  
  364. local function ClearSelection(self, silent)
  365.   for i, itemFrame in ipairs(self.itemFrames) do
  366.     itemFrame.selected = false
  367.   end
  368.  
  369.   self.selectedIndex = nil
  370.  
  371.   UpdateSelection(self)
  372.  
  373.   if not silent and self.Event.SelectionChange then
  374.     self.Event.SelectionChange(self)
  375.   end
  376. end
  377.  
  378. local function GetSelectedIndices(self)
  379.   local indices = {}
  380.  
  381.   for i, itemFrame in ipairs(self.itemFrames) do
  382.     if itemFrame.selected then
  383.       table.insert(indices, i)
  384.     end
  385.   end
  386.  
  387.   return indices
  388. end
  389.  
  390. local function SetSelectedIndices(self, indices, silent)
  391.   if self.selectionMode ~= "multi" then
  392.     error("List is not in multi-select mode.")
  393.   end
  394.  
  395.   if indices == nil then
  396.     self:ClearSelection(silent)
  397.     return
  398.   end
  399.  
  400.   for i, itemFrame in ipairs(self.itemFrames) do
  401.     itemFrame.selected = false
  402.   end
  403.  
  404.   for _, i in ipairs(indices) do
  405.     if i ~= nil and i >= 1 and i <= #self.items then
  406.       self.itemFrames[i].selected = true
  407.     end
  408.   end
  409.  
  410.   UpdateSelection(self)
  411.  
  412.   if not silent and self.Event.SelectionChange then
  413.     self.Event.SelectionChange(self)
  414.   end
  415. end
  416.  
  417. local function GetSelectedItems(self)
  418.   local items = {}
  419.  
  420.   for i, itemFrame in ipairs(self.itemFrames) do
  421.     if itemFrame.selected then
  422.       table.insert(items, self.items[i])
  423.     end
  424.   end
  425.  
  426.   return items
  427. end
  428.  
  429. local function SetSelectedItems(self, items, silent)
  430.   if self.selectionMode ~= "multi" then
  431.     error("List is not in multi-select mode.")
  432.   end
  433.  
  434.   if items == nil then
  435.     self:ClearSelection(silent)
  436.     return
  437.   end
  438.  
  439.   local indices = {}
  440.  
  441.   for i, item in ipairs(self.items) do
  442.     for _, selectItem in ipairs(items) do
  443.       if item == selectItem then
  444.         table.insert(indices, i)
  445.       end
  446.     end
  447.   end
  448.  
  449.   self:SetSelectedIndices(indices, silent)
  450. end
  451.  
  452. local function GetSelectedValues(self)
  453.   local values = {}
  454.  
  455.   for i, itemFrame in ipairs(self.itemFrames) do
  456.     if itemFrame.selected then
  457.       table.insert(values, self.values[i])
  458.     end
  459.   end
  460.  
  461.   return values
  462. end
  463.  
  464. local function SetSelectedValues(self, values, silent)
  465.   if self.selectionMode ~= "multi" then
  466.     error("List is not in multi-select mode.")
  467.   end
  468.  
  469.   if values == nil then
  470.     self:ClearSelection(silent)
  471.     return
  472.   end
  473.  
  474.   local indices = {}
  475.  
  476.   for i, value in ipairs(self.values) do
  477.     for _, selectValue in ipairs(values) do
  478.       if value == selectValue then
  479.         table.insert(indices, i)
  480.       end
  481.     end
  482.   end
  483.  
  484.   self:SetSelectedIndices(indices, silent)
  485. end
  486.  
  487.  
  488. -- Constructor Function
  489.  
  490. function Library.LibSimpleWidgets.List(name, parent)
  491.   local widget = UI.CreateFrame("Frame", name, parent)
  492.   widget:SetBackgroundColor(0, 0, 0, 1)
  493.  
  494.   widget.enabled = true
  495.   widget.fontSize = 12
  496.   widget.items = {}
  497.   widget.values = {}
  498.   widget.levels = {}
  499.   widget.itemFrames = {}
  500.   widget.indentSize = 10
  501.   widget.levelFontSizes = {}
  502.   widget.levelFontColors = {}
  503.   widget.levelBackgroundColors = {}
  504.   widget.levelSelectable = {}
  505.   widget.selectedIndex = nil
  506.   widget.selectionMode = "single"
  507.   widget.selectionBackgroundColor = {0, 0, 0.5, 1}
  508.  
  509.   widget.SetBorder = SetBorder
  510.   widget.GetFontSize = GetFontSize
  511.   widget.SetFontSize = SetFontSize
  512.   widget.GetEnabled = GetEnabled
  513.   widget.SetEnabled = SetEnabled
  514.   widget.SetLevelIndentSize = SetLevelIndentSize
  515.   widget.SetLevelFontSize = SetLevelFontSize
  516.   widget.SetLevelFontColor = SetLevelFontColor
  517.   widget.SetLevelBackgroundColor = SetLevelBackgroundColor
  518.   widget.SetLevelSelectable = SetLevelSelectable
  519.   widget.GetItems = GetItems
  520.   widget.SetItems = SetItems
  521.   widget.GetValues = GetValues
  522.   widget.SetSelectionMode = SetSelectionMode
  523.   widget.GetSelectedIndex = GetSelectedIndex
  524.   widget.SetSelectedIndex = SetSelectedIndex
  525.   widget.GetSelectedItem = GetSelectedItem
  526.   widget.SetSelectedItem = SetSelectedItem
  527.   widget.GetSelectedValue = GetSelectedValue
  528.   widget.SetSelectedValue = SetSelectedValue
  529.   widget.AddSelectedIndex = AddSelectedIndex
  530.   widget.RemoveSelectedIndex = RemoveSelectedIndex
  531.   widget.GetSelection = GetSelection
  532.   widget.ClearSelection = ClearSelection
  533.   widget.GetSelectedIndices = GetSelectedIndices
  534.   widget.SetSelectedIndices = SetSelectedIndices
  535.   widget.GetSelectedItems = GetSelectedItems
  536.   widget.SetSelectedItems = SetSelectedItems
  537.   widget.GetSelectedValues = GetSelectedValues
  538.   widget.SetSelectedValues = SetSelectedValues
  539.   widget.SetSelectionBackgroundColor = SetSelectionBackgroundColor
  540.  
  541.   Library.LibSimpleWidgets.EventProxy(widget, {"ItemSelect", "SelectionChange"})
  542.  
  543.   return widget
  544. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement