Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/cegui0.8/data/gui/scripts/SheetManager.lua @ 12181

Last change on this file since 12181 was 11118, checked in by bknecht, 10 years ago

initial commit to get orxonox to find and compile and start with cegui0.8. doesn't work yet

  • Property svn:eol-style set to native
File size: 9.5 KB
RevLine 
[6737]1-- SheetManager.lua
[6595]2
[11118]3local cursor = CEGUI.System:getSingleton():getDefaultGUIContext():getMouseCursor()
4--local cursor = CEGUI.MouseCursor:getSingleton()
[6662]5local loadedSheets = {}
[6718]6local activeMenuSheets = {size = 0, topSheetTuple = nil}
[6737]7local menuSheetsRoot = guiMgr:getMenuRootWindow()
[8484]8local bInGameConsoleClosed = false
[7689]9local mainMenuLoaded = false
10orxonox.GUIManager:subscribeEventHelper(menuSheetsRoot, "KeyDown", "keyPressed")
[8079]11orxonox.GUIManager:subscribeEventHelper(menuSheetsRoot, "Sized", "windowResized")
[5491]12
[8079]13------------------------
14--- Global functions ---
15------------------------
[6662]16
[8079]17function hideCursor()
[6662]18    if cursor:isVisible() then
19        cursor:hide()
20    end
21end
22
[8079]23function showCursor()
[6737]24    if not cursor:isVisible() and inputMgr:isMouseExclusive() then
[6662]25        cursor:show()
26    end
27end
28
[11052]29function getLoadedSheets()
30    local names = ""
31    for name, sheet in pairs(loadedSheets) do
32        names = names .. name
33        names = names .. ","
34    end
35    return names
36end
37
[6737]38-- Loads the GUI with the specified name
39-- The name corresponds to the filename of the *.lua and *.layout files
40-- but without the extension
41function loadSheet(name)
42    -- Check if it has already been loaded
43    local sheet = loadedSheets[name]
44    if sheet == nil then
45        -- Load the sheet
46        sheet = require(name)
47        sheet:load()
48        loadedSheets[name] = sheet
49    end
50    return sheet
51end
52
[6662]53-- ?
[7403]54function showMenuSheet(name, bHidePrevious, bNoInput, ptr)
55    local sheet = showMenuSheet(name, bHidePrevious, bNoInput)
[6718]56    sheet.overlay = ptr
57    return sheet
[5491]58end
59
[6662]60-- Shows the specified menu sheet and loads it if neccessary
[7403]61function showMenuSheet(name, bHidePrevious, bNoInput)
[6737]62    if name == "" then
63        return nil
64    end
[6718]65    -- Get sheet (or load it)
66    local menuSheet = loadSheet(name)
[5491]67
[6718]68    -- Use sheet's value if nil was provided
69    if bHidePrevious == nil then
70        bHidePrevious = menuSheet.bHidePrevious
71        assert(bHidePrevious ~= nil)
72    end
73
[7403]74    -- Set bNoInput to false if it hasn't been set.
75    if bNoInput == nil then
76        bNoInput = false
77    end
78
79    -- Count the number of sheets that don't need input till the first that does.
[7689]80    local counter = noInputSheetIndex()
[6721]81    -- Pause game control if this is the first menu to be displayed
82    -- HUGE HACK?
[7403]83    if bNoInput == false and counter == 0 then
[6721]84        orxonox.HumanController:pauseControl()
85    end
86
[6662]87    -- Hide if already displayed (to make sure it is up front in the end)
88    if activeMenuSheets[name] ~= nil then
[6722]89        hideMenuSheet(name)
[6662]90    end
91
[7403]92    if bNoInput == true then
[8729]93        menuSheet.tShowCursor = tribool(dontcare)
[7403]94    end
95
[6718]96    -- Add the sheet in a tuple of additional information
97    local sheetTuple =
98    {
99        ["sheet"]          = menuSheet,
[7403]100        ["bHidePrevious"]  = bHidePrevious,
[8079]101        ["bNoInput"]       = bNoInput,
102        ["name"]           = name
[6718]103    }
104    table.insert(activeMenuSheets, sheetTuple) -- indexed array access
105    activeMenuSheets[name] = sheetTuple -- name access
106    activeMenuSheets.size = activeMenuSheets.size + 1
107    activeMenuSheets.topSheetTuple = sheetTuple
108
[6662]109    -- Add sheet to the root window
[11118]110    menuSheetsRoot:addChild(menuSheet.window)
[6662]111
[7689]112    -- If sheet is the MainMenu
113    if name == "MainMenu" then
114        mainMenuLoaded = true
115    end
116
[6662]117    -- Handle input distribution
[7403]118    if bNoInput == false then
119        inputMgr:enterState(menuSheet.inputState)
120    end
[6662]121
[8729]122    -- Only change cursor situation if menuSheet.tShowCursor ~= tribool(dontcare)
123    if menuSheet.tShowCursor == tribool(true) then
[6417]124        showCursor()
[8729]125    elseif menuSheet.tShowCursor == tribool(false) then
[6417]126        hideCursor()
[5491]127    end
[6417]128
[6662]129    -- Hide all previous sheets if necessary
[8079]130    local previous
[6662]131    if bHidePrevious then
132        for i = 1, activeMenuSheets.size - 1 do
[8079]133            previous = activeMenuSheets[i].sheet
134            previous:hide()
[6417]135        end
136    end
[8079]137
[6662]138    menuSheet:show()
[7689]139    menuSheetsRoot:activate()
[6718]140
[8079]141    -- select first button if the menu was opened with the keyboard
142    if previous and previous.pressedEnter and menuSheet:hasSelection() == false then
143        menuSheet:setSelectionNear(1, 1)
144    end
145
[6662]146    return menuSheet
[5491]147end
148
[6722]149function hideMenuSheet(name)
[6662]150    local sheetTuple = activeMenuSheets[name]
151    if sheetTuple == nil then
152        return
[6417]153    end
[5491]154
[6662]155    -- Hide the sheet
[6718]156    sheetTuple.sheet:hide()
[6662]157
158    -- Show sheets that were hidden by the sheet to be removed
159    local i = activeMenuSheets.size
160    -- Only do something if all sheets on top of sheetTuple
[6718]161    -- have bHidePrevious == true and sheetTuple.bHidePrevious == true
[6662]162    while i > 0 do
[6718]163        if activeMenuSheets[i].bHidePrevious then
[6662]164            if activeMenuSheets[i] == sheetTuple then
165                i = i - 1
166                while i > 0 do
[6718]167                    activeMenuSheets[i].sheet:show()
168                    if activeMenuSheets[i].bHidePrevious then
[6662]169                        break
170                    end
171                    i = i - 1
[6417]172                end
173            end
[6662]174            break
[6417]175        end
[6662]176        i = i - 1
[6417]177    end
[6662]178
179    -- Remove sheet with its tuple from the table
[11118]180    menuSheetsRoot:removeChild(sheetTuple.sheet.window)
[6671]181    table.remove(activeMenuSheets, table.findIndex(activeMenuSheets, sheetTuple))
[6662]182    activeMenuSheets[name] = nil
183    activeMenuSheets.size = activeMenuSheets.size - 1
[6718]184    activeMenuSheets.topSheetTuple = activeMenuSheets[activeMenuSheets.size]
[6662]185
[7689]186    -- If sheet is the MainMenu
187    if name == "MainMenu" then
188        mainMenuLoaded = false
189    end
190
[6662]191    -- Leave the input state
[7403]192    if not sheetTuple.bNoInput then
193        inputMgr:leaveState(sheetTuple.sheet.inputState)
194    end
[8079]195
[6718]196    -- CURSOR SHOWING
197    local i = activeMenuSheets.size
[8729]198    -- Find top most sheet that doesn't have tShowCusor == tribool(dontcare)
199    while i > 0 and activeMenuSheets[i].sheet.tShowCursor == tribool(dontcare) do
[6718]200        i = i - 1
201    end
[8729]202    if i > 0 and activeMenuSheets[i].sheet.tShowCursor == tribool(true) then
[6662]203        showCursor()
204    else
205        hideCursor()
206    end
207
[7403]208    -- Count the number of sheets that don't need input till the first that does.
[7689]209    local counter = noInputSheetIndex()
[7403]210    -- Resume control if the last (non-noInput) menu is hidden
211    if counter == 0 then
[6417]212        orxonox.HumanController:resumeControl()
213        hideCursor()
214    end
[7403]215
[8079]216    sheetTuple.sheet:quit()
[5491]217end
[6417]218
[6662]219-- Hides all menu GUI sheets
[6722]220function hideAllMenuSheets()
[6662]221    while activeMenuSheets.size ~= 0 do
[6722]222        hideMenuSheet(activeMenuSheets.topSheetTuple.sheet.name)
[6417]223    end
224end
225
226function keyESC()
[6662]227    -- HUGE, very HUGE hacks!
[8529]228
[8484]229    -- If the InGameConsole is active, ignore the ESC command.
230    if bInGameConsoleClosed == true then
231        bInGameConsoleClosed = false
[8529]232        if activeMenuSheets[1] and activeMenuSheets[1].sheet.name == "MainMenu" then
[8484]233            return
234        end
235    end
[7403]236
[8485]237    -- Count the number of sheets that don't need input till the first that does.
238    local counter = noInputSheetIndex()
239
[7403]240    -- If the first sheet that needs input is the MainMenu.
[7689]241    if noInputSheetCounter() == 1 and activeMenuSheets[counter].sheet.name == "MainMenu" then
[6417]242        orxonox.execute("exit")
[7403]243    -- If there is at least one sheet that needs input.
244    elseif counter > 0 then
245        orxonox.execute("hideGUI "..activeMenuSheets[counter].sheet.name)
[6417]246    else
[6722]247        showMenuSheet("InGameMenu")
[6417]248    end
249end
250
[7689]251function keyPressed(e)
252    local we = tolua.cast(e, "CEGUI::KeyEventArgs")
253    local sheet = activeMenuSheets[activeMenuSheets.size]
254    code = tostring(we.scancode)
255    -- Some preprocessing
256    if not mainMenuLoaded and not sheet.bNoInput then
257        if code == "1" then
258            keyESC()
259        elseif code == "0"then
[8079]260            orxonox.CommandExecutor:execute("InGameConsole openConsole")
[7689]261        end
262    end
[8079]263    sheet.sheet:keyPressed()
[7689]264end
265
[8079]266function windowResized(e)
267    for name, sheet in pairs(loadedSheets) do
[8729]268        if orxonox.GraphicsManager:getInstance():isFullScreen() or sheet.tShowCursor == tribool(false) then
269            inputMgr:setMouseExclusive(sheet.inputState, tribool(true))
[8079]270        else
[8729]271            inputMgr:setMouseExclusive(sheet.inputState, tribool(false))
[8079]272        end
273    end
274    local sheetTuple = activeMenuSheets[activeMenuSheets.size]
275    if sheetTuple then
[8729]276        if orxonox.GraphicsManager:getInstance():isFullScreen() and sheetTuple.sheet.tShowCursor ~= tribool(false) then
[8079]277            showCursor()
278        else
279            hideCursor()
280        end
281        sheetTuple.sheet:windowResized()
282    end
283end
284
[6737]285function setBackgroundImage(imageSet, imageName)
286    guiMgr:setBackgroundImage(imageSet, imageName)
[6417]287end
[6737]288
[7689]289function noInputSheetIndex()
290    -- Count the number of sheets that don't need input till the first that does.
291    local index = activeMenuSheets.size
292    while index > 0 and activeMenuSheets[index].bNoInput do
293        index = index - 1
294    end
295    return index
296end
297
[7403]298function noInputSheetCounter()
[7689]299    -- Count the number of sheets that do need input.
[7403]300    local counter = activeMenuSheets.size
[7689]301    for i = 1,activeMenuSheets.size do
302        if activeMenuSheets[i].bNoInput then
303            counter = counter - 1
304        end
[7403]305    end
306    return counter
307end
308
[8484]309function inGameConsoleClosed()
310    bInGameConsoleClosed = not bInGameConsoleClosed;
311end
312
[8079]313function getGUIFirstActive(name, bHidePrevious, bNoInput)
314    local sheet = activeMenuSheets.topSheetTuple
315    -- If the topmost gui sheet has the input name
316    if sheet ~= nil and sheet.name == name then
317        guiMgr:toggleGUIHelper(name, bHidePrevious, bNoInput, false);
318    else
319        guiMgr:toggleGUIHelper(name, bHidePrevious, bNoInput, true);
320    end
321end
322
[6737]323----------------------
324--- Initialisation ---
325----------------------
326
327hideCursor()
Note: See TracBrowser for help on using the repository browser.