162 lines
5.2 KiB
Lua
162 lines
5.2 KiB
Lua
----------------------------
|
|
-- CONTEXTUAL COMMANDS UI --
|
|
----------------------------
|
|
-- Code in this file manage the update of the contextual toolbar &
|
|
-- contextual menu for the current selected instance, depending on the vailable options
|
|
|
|
r2.ContextualCommands =
|
|
{
|
|
--ButtonCache = -- list of buttons already created in the toolbar
|
|
-- each entry has the form :
|
|
-- { Id="id_of_button_in_the_ui", CommandDesc={ }, }
|
|
-- 'CommandDesc' is one of the command description returned
|
|
-- by the selected instance when calling 'getAvailableCommands'
|
|
-- }
|
|
--{
|
|
|
|
--}
|
|
|
|
-- description of each command
|
|
CurrentCommands={},
|
|
-- map index of each command to the matching toolbar button
|
|
IndexToButton = {},
|
|
-- Current instance for which this contextual toolbar is displayed
|
|
CurrentInstance = nil,
|
|
-- Index of last triggered command
|
|
LastTriggeredCommandIndex = nil,
|
|
-- Cache of buttons (to avoid costrly template instanciation). Key is the command, Value if a pointer to the button
|
|
ButtonCache = {}
|
|
}
|
|
|
|
------------
|
|
-- PUBLIC --
|
|
------------
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Setup the contextual toolbar for the given instance
|
|
-- passing nil just hides the toolbar
|
|
function r2.ContextualCommands:setupToolbar(instance)
|
|
self.CurrentInstance = instance
|
|
table.clear(self.CurrentCommands)
|
|
table.clear(self.IndexToButton)
|
|
table.clear(self.LastTriggeredCommandIndex)
|
|
local toolbar = self:getToolbar()
|
|
local buttonList = toolbar:find("buttons")
|
|
if not instance then
|
|
toolbar.active = false
|
|
-- put all buttons in the cache for futur reuse
|
|
--for index, button in IndexToButton do
|
|
-- detach button from its parent
|
|
--if buttonlist.detachChild(button) then
|
|
-- ButtonCache[CurrentCommands[index]] = button
|
|
|
|
--end
|
|
--end
|
|
return
|
|
end
|
|
table.clear(self.CurrentCommands)
|
|
if not instance.Ghost then
|
|
instance:getAvailableCommands(self.CurrentCommands)
|
|
end
|
|
assert(self.CurrentCommands)
|
|
toolbar.active = true
|
|
buttonList:clear()
|
|
for index, commandDesc in pairs(self.CurrentCommands) do
|
|
self:addToolbarCommand(buttonList, commandDesc, index)
|
|
end
|
|
end
|
|
|
|
|
|
local newCommands = {}
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Update the toolbar content
|
|
function r2.ContextualCommands:update()
|
|
if self.CurrentInstance then
|
|
table.clear(newCommands)
|
|
if not self.CurrentInstance.Ghost then
|
|
self.CurrentInstance:getAvailableCommands(newCommands)
|
|
end
|
|
if isEqual(newCommands, self.CurrentCommands) then
|
|
return -- commands remains unchanged, no need to update the ui
|
|
end
|
|
end
|
|
-- if one of the command is highlighted, let it highlighted after the toolbar has been rebuilt
|
|
--local highlightedCommand
|
|
--for index, button in pairs(self.IndexToButton) do
|
|
-- if button == r2.ToolUI:getActiveToolUI() then
|
|
-- debugInfo("highlighted command found")
|
|
-- highlightedCommand = self.CurrentCommands[index]
|
|
-- break
|
|
-- end
|
|
--end
|
|
self:setupToolbar(self.CurrentInstance)
|
|
-- if one command was highlighted, highlight it again in new toolbar
|
|
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Hightlight the button of the last triggered command
|
|
function r2.ContextualCommands:highlightCurrentCommandButton()
|
|
debugInfo("***")
|
|
if self.LastTriggeredCommandIndex then
|
|
r2.ToolUI:setActiveToolUI(self.IndexToButton[self.LastTriggeredCommandIndex])
|
|
end
|
|
end
|
|
|
|
-------------
|
|
-- PRIVATE --
|
|
-------------
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Private : Get reference to the contextual toolBar
|
|
function r2.ContextualCommands:getToolbar(instance)
|
|
return getUI("ui:interface:r2ed_contextual_toolbar")
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Private : add a new button in the toolbar
|
|
function r2.ContextualCommands:addToolbarCommand(buttonList, commandDesc, index)
|
|
if not commandDesc.ButtonBitmap or commandDesc.ButtonBitmap == "" then
|
|
return -- no button wanted for this command
|
|
end
|
|
-- buld filenames for the 'normal', 'over' & 'pushed" textures
|
|
local icon = commandDesc.ButtonBitmap
|
|
local iconOver = nlfile.getFilenameWithoutExtension(icon) ..
|
|
"_over." .. nlfile.getExtension(icon)
|
|
local iconPushed = nlfile.getFilenameWithoutExtension(icon) ..
|
|
"_pushed." .. nlfile.getExtension(icon)
|
|
local tmplParams =
|
|
{
|
|
tooltip = commandDesc.TextId,
|
|
id = tostring(index),
|
|
icon = icon,
|
|
icon_over = iconOver,
|
|
icon_pushed = iconPushed,
|
|
onclick_l = "lua",
|
|
params_l = "r2.ContextualCommands:runCommand(" .. tostring(index) .. ")",
|
|
w = "32",
|
|
h = "32",
|
|
offset_x = select(commandDesc.Separator == true, 8, 0)
|
|
}
|
|
|
|
local newButton = createGroupInstance("r2ed_tool", buttonList.id, tmplParams)
|
|
if newButton then
|
|
buttonList:addChild(newButton)
|
|
self.IndexToButton[index] = newButton
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Private : execute a command triggered by a toolbar button
|
|
function r2.ContextualCommands:runCommand(index)
|
|
assert(self.CurrentInstance)
|
|
assert(self.CurrentCommands[index] ~= nil)
|
|
self.LastTriggeredCommandIndex = index
|
|
-- do actual call
|
|
self.CurrentCommands[index].DoCommand(self.CurrentInstance)
|
|
end
|
|
|
|
|
|
|
|
|