Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/gamestates2/data/gui/scripts/InitialiseGUI.lua @ 6718

Last change on this file since 6718 was 6718, checked in by rgrieder, 14 years ago

Moved BasicGUI.lua to GUISheet.lua and derived MenuSheet.lua as well as HUDSheet.lua from it.
Also, to make a new GUI sheet, use either createHUDSheet or createMenuSheet.
Also removed bShowCursor from the showGUI function. This is now always a value directed by the GUI sheet.

  • Property svn:eol-style set to native
File size: 7.2 KB
Line 
1winMgr   = CEGUI.WindowManager:getSingleton()
2guiMgr   = orxonox.GUIManager:getInstance()
3inputMgr = orxonox.InputManager:getInstance()
4
5local schemeMgr = CEGUI.SchemeManager:getSingleton()
6local system    = CEGUI.System:getSingleton()
7local cursor    = CEGUI.MouseCursor:getSingleton()
8
9-- Load all required skins
10schemeMgr:loadScheme("TaharezGreenLook.scheme")
11--schemeMgr:loadScheme("TaharezLook.scheme")
12--schemeMgr:loadScheme("WindowsLook.scheme")
13--schemeMgr:loadScheme("VanillaLook.scheme")
14--schemeMgr:loadScheme("SleekSpaceLook.scheme")
15
16-- Connect skin specific window types with our own window types
17-- By loading a different file (if there is) you can change the skin
18-- of the menus or the HUD independently
19schemeMgr:loadScheme("TaharezGreenMenuWidgets.scheme")
20menuImageSet = "TaharezGreenLook"
21schemeMgr:loadScheme("TaharezGreenHUDWidgets.scheme")
22hudImageSet = "TaharezGreenLook"
23
24-- Just a remaining test hack
25schemeMgr:loadScheme("OrxonoxGUIScheme.scheme")
26
27system:setDefaultMouseCursor(menuImageSet, "MouseArrow")
28system:setDefaultFont("BlueHighway-12")
29system:setDefaultTooltip("MenuWidgets/Tooltip")
30
31local loadedSheets = {}
32local activeMenuSheets = {size = 0, topSheetTuple = nil}
33--activeHUDSheets  = {size = 0, topSheetTuple = nil}
34local root = nil
35
36-- Require all tools
37require("GUITools")
38
39
40-----------------------
41--- Local functions ---
42-----------------------
43
44-- Loads the GUI with the specified name
45-- The name corresponds to the filename of the *.lua and *.layout files
46-- but without the extension
47local function loadSheet(name)
48    -- Check if it has already been loaded
49    local sheet = loadedSheets[name]
50    if sheet == nil then
51        -- Load the sheet
52        sheet = require(name)
53        sheet:load()
54        loadedSheets[name] = sheet
55    end
56    return sheet
57end
58
59local function hideCursor()
60    if cursor:isVisible() then
61        cursor:hide()
62    end
63end
64
65local function showCursor()
66    if not cursor:isVisible() and orxonox.InputManager:getInstance():isMouseExclusive() then
67        cursor:show()
68    end
69end
70
71
72------------------------
73--- Global functions ---
74------------------------
75
76-- ?
77function showGUI(name, bHidePrevious, ptr)
78    local sheet = showGUI(name, bHidePrevious)
79    sheet.overlay = ptr
80    return sheet
81end
82
83-- Shows the specified menu sheet and loads it if neccessary
84function showGUI(name, bHidePrevious)
85    -- Get sheet (or load it)
86    local menuSheet = loadSheet(name)
87    if not menuSheet then
88        return nil
89    end
90
91    -- Use sheet's value if nil was provided
92    if bHidePrevious == nil then
93        bHidePrevious = menuSheet.bHidePrevious
94        assert(bHidePrevious ~= nil)
95    end
96
97    -- Hide if already displayed (to make sure it is up front in the end)
98    if activeMenuSheets[name] ~= nil then
99        hideGUI(name)
100    end
101
102    -- Add the sheet in a tuple of additional information
103    local sheetTuple =
104    {
105        ["sheet"]          = menuSheet,
106        ["bHidePrevious"]  = bHidePrevious
107    }
108    table.insert(activeMenuSheets, sheetTuple) -- indexed array access
109    activeMenuSheets[name] = sheetTuple -- name access
110    activeMenuSheets.size = activeMenuSheets.size + 1
111    activeMenuSheets.topSheetTuple = sheetTuple
112
113    if not root then
114        setBackground("")
115    end
116
117    -- Add sheet to the root window
118    root:addChildWindow(menuSheet.window)
119
120    -- Pause game control if this is the first menu to be displayed
121    -- HUGE HACK?
122    if activeMenuSheets.size == 0 then
123        orxonox.HumanController:pauseControl()
124    end
125
126    -- Handle input distribution
127    orxonox.InputManager:getInstance():enterState(menuSheet.inputState)
128
129    -- Only change cursor situation if menuSheet.tShowCursor ~= TriBool.Dontcare
130    if menuSheet.tShowCursor == TriBool.True then
131        showCursor()
132    elseif menuSheet.tShowCursor == TriBool.False then
133        hideCursor()
134    end
135
136    -- Hide all previous sheets if necessary
137    if bHidePrevious then
138        for i = 1, activeMenuSheets.size - 1 do
139            activeMenuSheets[i].sheet:hide()
140        end
141    end
142
143    menuSheet:show()
144
145    return menuSheet
146end
147
148function hideGUI(name)
149    local sheetTuple = activeMenuSheets[name]
150    if sheetTuple == nil then
151        return
152    end
153
154    -- Hide the sheet
155    sheetTuple.sheet:hide()
156
157    -- Show sheets that were hidden by the sheet to be removed
158    local i = activeMenuSheets.size
159    -- Only do something if all sheets on top of sheetTuple
160    -- have bHidePrevious == true and sheetTuple.bHidePrevious == true
161    while i > 0 do
162        if activeMenuSheets[i].bHidePrevious then
163            if activeMenuSheets[i] == sheetTuple then
164                i = i - 1
165                while i > 0 do
166                    activeMenuSheets[i].sheet:show()
167                    if activeMenuSheets[i].bHidePrevious then
168                        break
169                    end
170                    i = i - 1
171                end
172            end
173            break
174        end
175        i = i - 1
176    end
177
178    -- Remove sheet with its tuple from the table
179    root:removeChildWindow(sheetTuple.sheet.window)
180    table.remove(activeMenuSheets, table.findIndex(activeMenuSheets, sheetTuple))
181    activeMenuSheets[name] = nil
182    activeMenuSheets.size = activeMenuSheets.size - 1
183    activeMenuSheets.topSheetTuple = activeMenuSheets[activeMenuSheets.size]
184
185    -- Leave the input state
186    orxonox.InputManager:getInstance():leaveState(sheetTuple.sheet.inputState)
187   
188    -- CURSOR SHOWING
189    local i = activeMenuSheets.size
190    -- Find top most sheet that doesn't have tShowCusor == TriBool.Dontcare
191    while i > 0 and activeMenuSheets[i].sheet.tShowCursor == TriBool.Dontcare do
192        i = i - 1
193    end
194    if i > 0 and activeMenuSheets[i].sheet.tShowCursor == TriBool.True then
195        showCursor()
196    else
197        hideCursor()
198    end
199
200    -- Resume control if the last menu is hidden
201    if activeMenuSheets.size == 0 then
202        orxonox.HumanController:resumeControl()
203        hideCursor()
204    end
205end
206
207-- Hides all menu GUI sheets
208function hideAllGUIs()
209    while activeMenuSheets.size ~= 0 do
210        hideGUI(activeMenuSheets.topSheetTuple.sheet.name)
211    end
212end
213
214function keyESC()
215    -- HUGE, very HUGE hacks!
216    if activeMenuSheets.size == 1 and activeMenuSheets[1].sheet.name == "MainMenu" then
217        orxonox.execute("exit")
218    elseif activeMenuSheets.size > 0 then
219        orxonox.execute("hideGUI "..activeMenuSheets.topSheetTuple.sheet.name)
220    else
221        showGUI("InGameMenu")
222    end
223end
224
225function setBackground(name)
226    local newroot
227    if root ~= nil then
228        root:rename("oldRootWindow")
229    end
230    if name ~= "" then
231        newroot = winMgr:loadWindowLayout(name .. ".layout")
232        newroot:rename("AbsoluteRootWindow")
233        system:setGUISheet(newroot)
234    else
235        newroot = winMgr:createWindow("DefaultWindow", "AbsoluteRootWindow")
236        newroot:setProperty("Alpha", "0.0")
237        newroot:setSize(CEGUI.UVector2(CEGUI.UDim(1.0,0),CEGUI.UDim(1.0,0)))
238        system:setGUISheet(newroot)
239    end
240    if root ~= nil then
241        local child
242        while root:getChildCount()~=0 do
243            child = root:getChildAtIdx(0)
244            root:removeChildWindow(child)
245            newroot:addChildWindow(child)
246        end
247        winMgr:destroyWindow(root)
248    end
249    newroot:show()
250    root = newroot
251end
Note: See TracBrowser for help on using the repository browser.