Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/menu/data/gui/scripts/SheetManager.lua @ 7670

Last change on this file since 7670 was 7670, checked in by dafrick, 14 years ago

ESC behavior is once again correct.
Kind of hackish, though, but I guess there is really no good way around that seeing that the MainMenu is still a hack.

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