Some changes and a fully scriptable GUI
Posted: Thu Jul 15, 2010 6:20 pm
I had to change the scripting language to Lua. Squirrel is no longer in active development and will not be supported by the original author. It's not much of a change from Squirrel as Squirrel is actually a derivative of Lua.
Now...on to the good stuff. I've been working on a fully scriptable GUI for a little while now and have finally achieved it. The Lua switch made that a lot easier.
Here is a sample script that makes a window. When you close that window, it quits RF2.
The above code produces the following:
You can also use the CEGUI Layout Editor to create the GUI visually and just attach your own script functions to the window events. Here is a sample of that using the CEGUI Demo8 Layout.
The above code produces the following:
Boy I can't wait to see the complicated inventory systems and HUDs that can be achieved with this.
Now...on to the good stuff. I've been working on a fully scriptable GUI for a little while now and have finally achieved it. The Lua switch made that a lot easier.
Here is a sample script that makes a window. When you close that window, it quits RF2.
Code: Select all
-- Get the singletons so that we type less
local guiSys = CEGUI.System:getSingleton()
local winMgr = CEGUI.WindowManager:getSingleton()
-- Create the root window
local sheet = winMgr:createWindow("DefaultGUISheet", "root")
-- Create a frame window
local frameWin = winMgr:createWindow("TaharezLook/FrameWindow", "mainWnd")
-- Add the frame window to the root window
sheet:addChildWindow(frameWin)
-- Set the size and position of the frame window
local sz = CEGUI.UVector2(CEGUI.UDim(0.5, 0), CEGUI.UDim(0.5,0))
local pos = CEGUI.UVector2(CEGUI.UDim(0.2,0), CEGUI.UDim(0.1, 0))
frameWin:setSize(sz)
frameWin:setPosition(pos)
-- Disable user resizing
frameWin:setProperty("SizingEnabled", "False")
-- Subscribe to the CloseClicked event
frameWin:subscribeEvent("CloseClicked", "frameWin_onCloseClicked")
-- Tell the GUI system to use our root window as the current GUI
guiSys:setGUISheet(sheet)
-- Event function
function frameWin_onCloseClicked(eventArgs)
local we = CEGUI.toWindowEventArgs(eventArgs)
CEGUI.WindowManager:getSingleton():destroyWindow(we.window)
ScriptEngine:quit()
end
You can also use the CEGUI Layout Editor to create the GUI visually and just attach your own script functions to the window events. Here is a sample of that using the CEGUI Demo8 Layout.
Code: Select all
-----------------------------------------
-- Start of handler functions
-----------------------------------------
-----------------------------------------
-- Alpha slider handler (not used!)
-----------------------------------------
function sliderHandler(args)
CEGUI.System:getSingleton():getGUISheet():setAlpha(CEGUI.toSlider(CEGUI.toWindowEventArgs(args).window):getCurrentValue())
end
-----------------------------------------
-- Handler to slide pane
--
-- Here we move the 'Demo8' sheet window
-- and re-position the scrollbar
-----------------------------------------
function panelSlideHandler(args)
local scroller = CEGUI.toScrollbar(CEGUI.toWindowEventArgs(args).window)
local demoWnd = CEGUI.WindowManager:getSingleton():getWindow("Demo8")
local relHeight = demoWnd:getHeight():asRelative(demoWnd:getParentPixelHeight())
scroller:setPosition(CEGUI.UVector2(CEGUI.UDim(0,0), CEGUI.UDim(scroller:getScrollPosition() / relHeight,0)))
demoWnd:setPosition(CEGUI.UVector2(CEGUI.UDim(0,0), CEGUI.UDim(-scroller:getScrollPosition(),0)))
end
-----------------------------------------
-- Handler to set preview colour when
-- colour selector scrollers change
-----------------------------------------
function colourChangeHandler(args)
local winMgr = CEGUI.WindowManager:getSingleton()
local r = CEGUI.toScrollbar(winMgr:getWindow("Demo8/Window1/Controls/Red")):getScrollPosition()
local g = CEGUI.toScrollbar(winMgr:getWindow("Demo8/Window1/Controls/Green")):getScrollPosition()
local b = CEGUI.toScrollbar(winMgr:getWindow("Demo8/Window1/Controls/Blue")):getScrollPosition()
local col = CEGUI.colour:new_local(r, g, b, 1)
local crect = CEGUI.ColourRect(col)
winMgr:getWindow("Demo8/Window1/Controls/ColourSample"):setProperty("ImageColours", CEGUI.PropertyHelper:colourRectToString(crect))
end
-----------------------------------------
-- Handler to add an item to the box
-----------------------------------------
function addItemHandler(args)
local winMgr = CEGUI.WindowManager:getSingleton()
local text = winMgr:getWindow("Demo8/Window1/Controls/Editbox"):getText()
local cols = CEGUI.PropertyHelper:stringToColourRect(winMgr:getWindow("Demo8/Window1/Controls/ColourSample"):getProperty("ImageColours"))
local newItem = CEGUI.createListboxTextItem(text, 0, nil, false, true)
newItem:setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush")
newItem:setSelectionColours(cols)
CEGUI.toListbox(winMgr:getWindow("Demo8/Window1/Listbox")):addItem(newItem)
end
local guiSys = CEGUI.System:getSingleton()
local winMgr = CEGUI.WindowManager:getSingleton()
local rootWin = winMgr:loadWindowLayout("./media/gui/demo8.layout")
guiSys:setGUISheet(rootWin)
-- subscribe required events
winMgr:getWindow("Demo8/ViewScroll"):subscribeEvent("ScrollPosChanged", "panelSlideHandler")
winMgr:getWindow("Demo8/Window1/Controls/Blue"):subscribeEvent("ScrollPosChanged", "colourChangeHandler")
winMgr:getWindow("Demo8/Window1/Controls/Red"):subscribeEvent("ScrollPosChanged", "colourChangeHandler")
winMgr:getWindow("Demo8/Window1/Controls/Green"):subscribeEvent("ScrollPosChanged", "colourChangeHandler")
winMgr:getWindow("Demo8/Window1/Controls/Add"):subscribeEvent("Clicked", "addItemHandler")
Boy I can't wait to see the complicated inventory systems and HUDs that can be achieved with this.