UIPopupMenu = extends(UIWidget)

local currentMenu

function UIPopupMenu.create()
  local menu = UIPopupMenu.internalCreate()
  local layout = UIVerticalLayout.create(menu)
  layout:setFitChildren(true)
  menu:setLayout(layout)
  return menu
end

function UIPopupMenu:display(pos)
  -- don't display if not options was added
  if self:getChildCount() == 0 then
    self:destroy()
    return
  end

  if currentMenu then
    currentMenu:destroy()
  end

  rootWidget:addChild(self)
  self:setPosition(pos)
  self:grabMouse()
  self:grabKeyboard()
  currentMenu = self
end

function UIPopupMenu:onGeometryChange()
  self:bindRectToParent()
end

function UIPopupMenu:addOption(optionName, optionCallback)
  local optionWidget = createWidget(self:getStyleName() .. 'Button', self)
  local lastOptionWidget = self:getLastChild()
  optionWidget.onClick = function(self)
    optionCallback()
    self:getParent():destroy()
  end
  optionWidget:setText(optionName)
  local width = optionWidget:getTextSize().width + optionWidget:getMarginLeft() + optionWidget:getMarginRight() + 6
  self:setWidth(math.max(self:getWidth(), width))
end

function UIPopupMenu:addSeparator()
  createWidget(self:getStyleName() .. 'Separator', self)
end

function UIPopupMenu:onDestroy()
  if currentMenu == self then
    currentMenu = nil
  end
end

function UIPopupMenu:onMousePress(mousePos, mouseButton)
  -- clicks outside menu area destroys the menu
  if not self:containsPoint(mousePos) then
    self:destroy()
  end
  return true
end

function UIPopupMenu:onKeyPress(keyCode, keyboardModifiers)
  if keyCode == KeyEscape then
    self:destroy()
    return true
  end
  return false
end

-- close all menus when the window is resized
local function onRootGeometryUpdate()
  if currentMenu then
    currentMenu:destroy()
  end
end
connect(rootWidget, { onGeometryChange = onRootGeometryUpdate} )