mirror of
				https://github.com/edubart/otclient.git
				synced 2025-11-04 04:36:23 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- @docclass
 | 
						|
UIComboBox = extends(UIWidget, "UIComboBox")
 | 
						|
 | 
						|
function UIComboBox.create()
 | 
						|
  local combobox = UIComboBox.internalCreate()
 | 
						|
  combobox:setFocusable(false)
 | 
						|
  combobox.options = {}
 | 
						|
  combobox.currentIndex = -1
 | 
						|
  combobox.mouseScroll = true
 | 
						|
  combobox.menuScroll = false
 | 
						|
  combobox.menuHeight = 100
 | 
						|
  combobox.menuScrollStep = 0
 | 
						|
  return combobox
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:clearOptions()
 | 
						|
  self.options = {}
 | 
						|
  self.currentIndex = -1
 | 
						|
  self:clearText()
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:getOption(text)
 | 
						|
  if not self.options then return nil end
 | 
						|
  for i,v in ipairs(self.options) do
 | 
						|
    if v.text == text then
 | 
						|
      return nil
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:setOption(text, dontSignal)
 | 
						|
  self:setCurrentOption(text, dontSignal)
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:setCurrentOption(text, dontSignal)
 | 
						|
  if not self.options then return end
 | 
						|
  for i,v in ipairs(self.options) do
 | 
						|
    if v.text == text and self.currentIndex ~= i then
 | 
						|
      self.currentIndex = i
 | 
						|
      self:setText(text)
 | 
						|
      if not dontSignal then
 | 
						|
        signalcall(self.onOptionChange, self, text, v.data)
 | 
						|
      end
 | 
						|
      return
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:setCurrentOptionByData(data, dontSignal)
 | 
						|
  if not self.options then return end
 | 
						|
  for i,v in ipairs(self.options) do
 | 
						|
    if v.data == data and self.currentIndex ~= i then
 | 
						|
      self.currentIndex = i
 | 
						|
      self:setText(v.text)
 | 
						|
      if not dontSignal then
 | 
						|
        signalcall(self.onOptionChange, self, v.text, v.data)
 | 
						|
      end
 | 
						|
      return
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:setCurrentIndex(index)
 | 
						|
  if index >= 1 and index <= #self.options then
 | 
						|
    local v = self.options[index]
 | 
						|
    self.currentIndex = index
 | 
						|
    self:setText(v.text)
 | 
						|
    signalcall(self.onOptionChange, self, v.text, v.data)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:getCurrentOption()
 | 
						|
  if table.haskey(self.options, self.currentIndex) then
 | 
						|
    return self.options[self.currentIndex]
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:addOption(text, data)
 | 
						|
  table.insert(self.options, { text = text, data = data })
 | 
						|
  local index = #self.options
 | 
						|
  if index == 1 then self:setCurrentOption(text) end
 | 
						|
  return index
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:removeOption(text)
 | 
						|
  for i,v in ipairs(self.options) do
 | 
						|
    if v.text == text then
 | 
						|
      table.remove(self.options, i)
 | 
						|
      if self.currentIndex == i then
 | 
						|
        self:setCurrentIndex(1)
 | 
						|
      elseif self.currentIndex > i then
 | 
						|
        self.currentIndex = self.currentIndex - 1
 | 
						|
      end
 | 
						|
      return
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:onMousePress(mousePos, mouseButton)
 | 
						|
  local menu
 | 
						|
  if self.menuScroll then
 | 
						|
    menu = g_ui.createWidget(self:getStyleName() .. 'PopupScrollMenu')
 | 
						|
    menu:setHeight(self.menuHeight)
 | 
						|
    if self.menuScrollStep > 0 then
 | 
						|
      menu:setScrollbarStep(self.menuScrollStep)
 | 
						|
    end
 | 
						|
  else
 | 
						|
    menu = g_ui.createWidget(self:getStyleName() .. 'PopupMenu')
 | 
						|
  end
 | 
						|
  menu:setId(self:getId() .. 'PopupMenu')
 | 
						|
  for i,v in ipairs(self.options) do
 | 
						|
    menu:addOption(v.text, function() self:setCurrentOption(v.text) end)
 | 
						|
  end
 | 
						|
  menu:setWidth(self:getWidth())
 | 
						|
  menu:display({ x = self:getX(), y = self:getY() + self:getHeight() })
 | 
						|
  connect(menu, { onDestroy = function() self:setOn(false) end })
 | 
						|
  self:setOn(true)
 | 
						|
  return true
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:onMouseWheel(mousePos, direction)
 | 
						|
  if not self.mouseScroll then
 | 
						|
    return false
 | 
						|
  end
 | 
						|
  if direction == MouseWheelUp and self.currentIndex > 1 then
 | 
						|
    self:setCurrentIndex(self.currentIndex - 1)
 | 
						|
  elseif direction == MouseWheelDown and self.currentIndex < #self.options then
 | 
						|
    self:setCurrentIndex(self.currentIndex + 1)
 | 
						|
  end
 | 
						|
  return true
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:onStyleApply(styleName, styleNode)
 | 
						|
  if styleNode.options then
 | 
						|
    for k,option in pairs(styleNode.options) do
 | 
						|
      self:addOption(option)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  if styleNode.data then
 | 
						|
    for k,data in pairs(styleNode.data) do
 | 
						|
      local option = self.options[k]
 | 
						|
      if option then
 | 
						|
        option.data = data
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  for name,value in pairs(styleNode) do
 | 
						|
    if name == 'mouse-scroll' then
 | 
						|
      self.mouseScroll = value
 | 
						|
    elseif name == 'menu-scroll' then
 | 
						|
      self.menuScroll = value
 | 
						|
    elseif name == 'menu-height' then
 | 
						|
      self.menuHeight = value
 | 
						|
    elseif name == 'menu-scroll-step' then
 | 
						|
      self.menuScrollStep = value
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:setMouseScroll(scroll)
 | 
						|
  self.mouseScroll = scroll
 | 
						|
end
 | 
						|
 | 
						|
function UIComboBox:canMouseScroll()
 | 
						|
  return self.mouseScroll
 | 
						|
end
 |