193 lines
5.1 KiB
Lua
193 lines
5.1 KiB
Lua
----------------------------
|
|
-- GENERIC TOOLBAR SYSTEM --
|
|
----------------------------
|
|
|
|
-- Generic code for toolbar
|
|
--
|
|
-- A toolbar is a set of 'buttons' that triggers 'commands'
|
|
-- A 'command' is a structure returned by a function like baseClass.getAvailableCommand (see there for doc)
|
|
-- A 'button' is a widget thet may have any form you want, derivers should just tell how to setup a button from a command
|
|
--
|
|
-- Usage :
|
|
--
|
|
-- -- 1°) creation
|
|
-- myToolBar = r2.newToolbar()
|
|
--
|
|
-- -- 2°) definition of toolbar behavior. Function that should be given by the deriver are given in section below
|
|
-- function myTooBar:getToolbar()
|
|
-- ...
|
|
-- end
|
|
-- function myToolbar ...
|
|
--
|
|
-- NB : command index are starting at 0 in the ui, and at 1 in lua
|
|
|
|
|
|
--
|
|
--
|
|
--
|
|
local toolbarTemplate = {}
|
|
|
|
|
|
------------------------------------
|
|
-- TO BE IMPLEMENTED BY DERIVERS --
|
|
------------------------------------
|
|
|
|
-- return a reference on the toolbar ui
|
|
function toolbarTemplate:getToolbar()
|
|
assert(false) -- ! SHOULD BE IMPLEMENTED BY DERIVER
|
|
end
|
|
|
|
-- return the max number of commands that the toolbar may contains
|
|
function toolbarTemplate:getMaxNumCommands()
|
|
assert(false) -- ! SHOULD BE IMPLEMENTED BY DERIVER
|
|
end
|
|
|
|
-- get a button from its index in the toolbar (starting from 0)
|
|
function toolbarTemplate:getButton(index)
|
|
assert(false) -- ! SHOULD BE IMPLEMENTED BY DERIVER
|
|
end
|
|
|
|
-- setup a button from a commandDesc.
|
|
function toolbarTemplate:setupButton(button, commandDesc, buttonIndex)
|
|
assert(false) -- ! SHOULD BE IMPLEMENTED BY DERIVER
|
|
end
|
|
|
|
-- retrieve a command list for the given instance
|
|
function toolbarTemplate:getAvailableCommands(instance, dest)
|
|
assert(false) -- ! SHOULD BE IMPLEMENTED BY DERIVER
|
|
end
|
|
|
|
-----------------------
|
|
-- PUBLIC INTERFACE --
|
|
-----------------------
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- Setup the contextual toolbar for the given instance
|
|
-- passing nil just hides the toolbar
|
|
function toolbarTemplate:setupToolbar(instance)
|
|
assert(false)
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- run a command in the toolbar from its index
|
|
function toolbarTemplate:runCommand(index)
|
|
assert(false)
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- call this to create a new toolbar, then specialize it
|
|
function r2.newToolbar()
|
|
local tb = clone(toolbarTemplate)
|
|
|
|
-- description of each command
|
|
tb.ToolbarCommands={}
|
|
-- map index of each command to the matching toolbar button
|
|
tb.IndexToButton = {}
|
|
-- Current instance for which this contextual toolbar is displayed
|
|
tb.CurrentInstance = nil
|
|
-- Index of last triggered command
|
|
tb.LastTriggeredCommandIndex = nil
|
|
-- Cache for current commands
|
|
tb.CurrentCommands = {}
|
|
-- Command id to button
|
|
tb.CommandIdToIndex = {}
|
|
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Setup the contextual toolbar for the given instance
|
|
-- passing nil just hides the toolbar
|
|
function tb:setupToolbar(instance)
|
|
self.CurrentInstance = instance
|
|
-- clear current list of commands
|
|
table.clear(self.ToolbarCommands)
|
|
table.clear(self.CurrentCommands)
|
|
table.clear(self.IndexToButton)
|
|
table.clear(self.CommandIdToIndex)
|
|
self.LastTriggeredCommandIndex = nil
|
|
local toolbar = self:getToolbar()
|
|
local buttonList = toolbar:find("buttons")
|
|
if not instance then
|
|
toolbar.active = false
|
|
return
|
|
end
|
|
local commands = self.CurrentCommands
|
|
table.clear(commands)
|
|
self:getAvailableCommands(instance, commands)
|
|
assert(self.ToolbarCommands)
|
|
toolbar.active = true
|
|
local buttonIndex = 0
|
|
local maxNumButtons = self:getMaxNumCommands()
|
|
for index, commandDesc in pairs(commands) do
|
|
local button
|
|
if commandDesc.ButtonBitmap ~= "" and commandDesc.ButtonBitmap ~= nil then
|
|
-- new button wanted
|
|
local button = self:getButton(buttonIndex)
|
|
if not button then
|
|
inspect(buttonList)
|
|
assert(button)
|
|
end
|
|
self:setupButton(button, commandDesc, buttonIndex)
|
|
self.IndexToButton[index] = button
|
|
self.ToolbarCommands[buttonIndex + 1] = commandDesc
|
|
self.CommandIdToIndex[commandDesc.Id] = index
|
|
buttonIndex = buttonIndex + 1
|
|
if buttonIndex == maxNumButtons then break end
|
|
end
|
|
end
|
|
-- hide buttons that are not visible anymore
|
|
for index = buttonIndex, maxNumButtons - 1 do
|
|
local button = self:getButton(index)
|
|
button.active = false
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Run the command with the given index
|
|
function tb:runCommand(index)
|
|
assert(self.CurrentInstance)
|
|
assert(self.ToolbarCommands[index] ~= nil)
|
|
self.LastTriggeredCommandIndex = index
|
|
-- do actual call
|
|
self.ToolbarCommands[index].DoCommand(self.CurrentInstance)
|
|
end
|
|
return tb
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
-- Private : execute a command triggered by a toolbar button
|
|
function r2.runBaseToolbarCommand(toolbar, index)
|
|
assert(toolbar) -- deriver should provide the "Toolbar" field in the groups containing control that can trigger commands!
|
|
toolbar:runCommand(index + 1)
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|