Changeset 6658
- Timestamp:
- Mar 30, 2010, 3:41:15 PM (15 years ago)
- Location:
- code/branches/gamestate
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/gamestate/data/gui/scripts/InitialiseGUI.lua
r6572 r6658 29 29 system:setDefaultTooltip("MenuWidgets/Tooltip") 30 30 31 loadedGUIs = {} 32 cursorVisibility = {} 33 activeSheets = {} 34 nrOfActiveSheets = 0 35 root = nil 36 bShowsCursor = false 37 bHidePrevious = {} 31 local loadedSheets = {} 32 local activeMenuSheets = {size = 0, topSheet = nil} 33 --activeHUDSheets = {size = 0, topSheet = nil} 34 local root = nil 38 35 39 36 -- Require all tools 40 37 require("GUITools") 41 38 42 -- loads the GUI with the specified filename 43 -- be sure to set the global variable "filename" before calling this function 44 function loadGUI(filename) 45 -- check if it already exists 46 loadedGui = loadedGUIs[filename] 47 if loadedGui == nil then 48 loadedGuiNS = require(filename) 49 if loadedGuiNS == nil then 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 47 local 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 if sheet == nil then 50 54 return 51 55 end 52 loadedGui = loadedGuiNS:load() 53 loadedGUIs[filename] = loadedGui 54 -- if there has no GUI been loaded yet, set new GUI as current 55 if table.getn(loadedGUIs) == 1 then 56 current = loadedGUIs[1] 57 end 58 -- hide new GUI as we do not want to show it accidentially 59 loadedGui:hide() 60 end 61 return loadedGui 62 end 63 64 function showGUI(filename, hidePrevious, bCursorVisible, ptr) 65 gui = showGUI(filename, hidePrevious, bCursorVisible) 56 sheet:load() 57 loadedSheets[name] = sheet 58 -- Hide new GUI as we do not want to show it accidentally 59 sheet:hide() 60 end 61 return sheet 62 end 63 64 local function hideCursor() 65 if cursor:isVisible() then 66 cursor:hide() 67 end 68 end 69 70 local function showCursor() 71 if not cursor:isVisible() and orxonox.InputManager:getInstance():isMouseExclusive() then 72 cursor:show() 73 end 74 end 75 76 local function find(table, value) 77 for i, v in ipairs(table) do 78 if v == value then 79 return i 80 end 81 end 82 return nil 83 end 84 85 86 ------------------------ 87 --- Global functions --- 88 ------------------------ 89 90 -- ? 91 function showGUI(name, bHidePrevious, bShowCursor, ptr) 92 gui = showGUI(name, bHidePrevious, bShowCursor) 66 93 gui.overlay = ptr 67 94 end 68 95 69 -- shows the specified GUI sheet and loads it if not loaded already 70 function showGUI(filename, hidePrevious, bCursorVisible) 71 if bCursorVisible == nil then 72 if nrOfActiveSheets > 0 then 73 bCursorVisible = cursorVisibility[activeSheets[nrOfActiveSheets]] 96 -- Shows the specified menu sheet and loads it if neccessary 97 function showGUI(name, bHidePrevious, bShowCursor) 98 -- Handle default value for bShowCursor 99 if bShowCursor == nil then 100 if activeMenuSheets.size > 0 then 101 bShowCursor = activeMenuSheets.topSheet.bShowCursor 74 102 else 75 bCursorVisible = true 76 end 77 end 78 79 if root == nil then 103 bShowCursor = true 104 end 105 end 106 107 -- Hide if already displayed (to make sure it is up front in the end) 108 if activeMenuSheets[name] ~= nil then 109 hideGUI(name) 110 end 111 112 if not root then 80 113 setBackground("") 81 114 end 82 115 83 local currentGUI = loadedGUIs[filename] 84 if(currentGUI == nil) then 85 currentGUI = loadGUI(filename) 86 end 87 88 if(root:isChild(currentGUI.window)) then 89 root:removeChildWindow(currentGUI.window) 90 end 91 root:addChildWindow(currentGUI.window) 92 93 if bCursorVisible then 116 -- Get sheet (or load it) 117 local menuSheet = loadSheet(name) 118 if not menuSheet then 119 return 120 end 121 122 -- Add sheet to the root window 123 root:addChildWindow(menuSheet.window) 124 125 -- Pause game control if this is the first menu to be displayed 126 -- HUGE HACK? 127 if activeMenuSheets.size == 0 then 128 orxonox.HumanController:pauseControl() 129 end 130 131 -- Handle input distribution 132 orxonox.InputManager:getInstance():enterState(menuSheet.inputState) 133 134 if bShowCursor then 94 135 showCursor() 95 136 else … … 97 138 end 98 139 99 if find( activeSheets, filename ) ~= nil then 100 table.remove( activeSheets, find( activeSheets, filename ) ) 101 nrOfActiveSheets = nrOfActiveSheets - 1 102 else 103 if nrOfActiveSheets == 0 then 104 --orxonox.InputManager:getInstance():enterState("guiMouseOnly") 105 orxonox.HumanController:pauseControl() 106 end 107 end 108 orxonox.InputManager:getInstance():enterState(currentGUI.inputState) 109 110 nrOfActiveSheets = nrOfActiveSheets + 1 111 table.insert(activeSheets, filename) 112 activeSheets[nrOfActiveSheets] = filename 113 bHidePrevious[filename]=hidePrevious 114 cursorVisibility[filename] = bCursorVisible 115 116 if hidePrevious == true then 117 for i=1,nrOfActiveSheets-1 do 118 loadedGUIs[ activeSheets[i] ]:hide() 119 end 120 end 121 currentGUI:show() 122 return currentGUI 123 end 124 125 function hideCursor() 126 if bShowsCursor==true then 127 bShowsCursor=false 128 cursor:hide() 129 end 130 end 131 132 function showCursor() 133 if bShowsCursor==false then 134 bShowsCursor=true 135 cursor:show() 136 end 137 end 138 139 function hideGUI(filename) 140 local currentGUI = loadedGUIs[filename] 141 if currentGUI == nil then 140 -- Add the sheet in a tuple of additional information 141 local sheetTuple = 142 { 143 ["menuSheet"] = menuSheet, 144 ["name"] = name, 145 ["bShowCursor"] = bShowCursor, 146 ["bHidePrevious"] = bHidePrevious 147 } 148 table.insert(activeMenuSheets, sheetTuple) -- indexed array access 149 activeMenuSheets[name] = sheetTuple -- name access 150 activeMenuSheets.size = activeMenuSheets.size + 1 151 activeMenuSheets.topSheet = sheetTuple 152 153 -- Hide all previous sheets if necessary 154 if bHidePrevious then 155 for i = 1, activeMenuSheets.size - 1 do 156 activeMenuSheets[i].menuSheet:hide() 157 end 158 end 159 160 menuSheet:show() 161 return menuSheet 162 end 163 164 function hideGUI(name) 165 local sheetTuple = activeMenuSheets[name] 166 if sheetTuple == nil then 142 167 return 143 168 end 144 currentGUI:hide() 145 if bHidePrevious[filename] == true then 146 local i = nrOfActiveSheets-1 147 while i>0 do 148 loadedGUIs[ activeSheets[i] ]:show() 149 if bHidePrevious[filename]==true then 150 break 151 else 152 i=i-1 169 170 -- Hide the sheet 171 sheetTuple.menuSheet:hide() 172 173 -- Show sheets that were hidden by the sheet to be removed 174 local i = activeMenuSheets.size 175 -- Only do something if all sheets on top of sheetTuple 176 -- have bHidePrevious == false and sheetTuple.bHidePrevious == true 177 while i > 0 do 178 if activeMenuSheets[i].bHidePrevious == true then 179 if activeMenuSheets[i] == sheetTuple then 180 i = i - 1 181 while i > 0 do 182 activeMenuSheets[i].menuSheet:show() 183 if activeMenuSheets[i].bHidePrevious == true then 184 break 185 end 186 i = i - 1 187 end 153 188 end 154 end 155 end 156 root:removeChildWindow(currentGUI.window) 157 local i=1 158 while activeSheets[i] do 159 if activeSheets[i+1] == nil then 160 if activeSheets[i-1] ~= nil then 161 if cursorVisibility[ activeSheets[i-1] ] == true then 162 showCursor() 163 else 164 hideCursor() 165 end 166 else 167 hideCursor() 168 end 169 end 170 if activeSheets[i] == filename then 171 table.remove( activeSheets, i ) 172 nrOfActiveSheets = nrOfActiveSheets-1 173 else 174 i = i+1 175 end 176 end 177 cursorVisibility[filename] = nil -- remove the cursor visibility of the current gui from the table 178 bHidePrevious[filename] = nil 179 if nrOfActiveSheets == 0 then 180 --orxonox.InputManager:getInstance():leaveState("guiMouseOnly") 189 break 190 end 191 i = i - 1 192 end 193 194 -- Remove sheet with its tuple from the table 195 root:removeChildWindow(sheetTuple.menuSheet.window) 196 table.remove(activeMenuSheets, find(activeMenuSheets, sheetTuple)) 197 activeMenuSheets[name] = nil 198 activeMenuSheets.size = activeMenuSheets.size - 1 199 activeMenuSheets.topSheet = activeMenuSheets[activeMenuSheets.size] 200 201 -- Leave the input state 202 orxonox.InputManager:getInstance():leaveState(sheetTuple.menuSheet.inputState) 203 204 -- See whether to show or hide cursor 205 if activeMenuSheets.size > 0 and activeMenuSheets.topSheet.bShowCursor then 206 showCursor() 207 else 208 hideCursor() 209 end 210 211 -- Resume control if the last menu is hidden 212 if activeMenuSheets.size == 0 then 181 213 orxonox.HumanController:resumeControl() 182 214 hideCursor() 183 215 end 184 orxonox.InputManager:getInstance():leaveState(currentGUI.inputState) 185 end 186 216 end 217 218 -- Hides all menu GUI sheets 187 219 function hideAllGUIs() 188 while nrOfActiveSheets~= 0 do189 hideGUI(active Sheets[nrOfActiveSheets])220 while activeMenuSheets.size ~= 0 do 221 hideGUI(activeMenuSheets.topSheet.name) 190 222 end 191 223 end 192 224 193 225 function keyESC() 194 if nrOfActiveSheets == 1 and activeSheets[1] == "MainMenu" then 226 -- HUGE, very HUGE hacks! 227 if activeMenuSheets.size == 1 and activeMenuSheets[1].name == "MainMenu" then 195 228 orxonox.execute("exit") 196 elseif nrOfActiveSheets> 0 then197 orxonox.execute("hideGUI "..active Sheets[nrOfActiveSheets])229 elseif activeMenuSheets.size > 0 then 230 orxonox.execute("hideGUI "..activeMenuSheets.topSheet.name) 198 231 else 199 232 showGUI("InGameMenu") … … 201 234 end 202 235 203 function setBackground( filename)236 function setBackground(name) 204 237 local newroot 205 238 if root ~= nil then 206 239 root:rename("oldRootWindow") 207 240 end 208 if filename ~= "" then209 newroot = winMgr:loadWindowLayout( filename .. ".layout")241 if name ~= "" then 242 newroot = winMgr:loadWindowLayout(name .. ".layout") 210 243 newroot:rename("AbsoluteRootWindow") 211 244 system:setGUISheet(newroot) … … 228 261 root = newroot 229 262 end 230 231 function find(table, value)232 local i=0233 while table[i] ~= nil do234 if table[i]==value then235 return i236 else237 i=i+1238 end239 end240 return nil241 end242 243 function test(e)244 debug(0, "Blubb")245 end -
code/branches/gamestate/src/libraries/core/GUIManager.cc
r6537 r6658 253 253 } 254 254 255 const std::string& GUIManager::createInputState(const std::string& name, TriBool::Value show Mouse, TriBool::Value useKeyboard, bool bBlockJoyStick)255 const std::string& GUIManager::createInputState(const std::string& name, TriBool::Value showCursor, TriBool::Value useKeyboard, bool bBlockJoyStick) 256 256 { 257 257 InputState* state = InputManager::getInstance().createInputState(name); 258 258 259 if (GraphicsManager::getInstance().isFullScreen() && showMouse == TriBool::True || 260 !GraphicsManager::getInstance().isFullScreen() && showMouse == TriBool::False) 259 /* Table that maps isFullScreen() and showCursor to mouseExclusive 260 isFullscreen / showCursor | True | False | Dontcare 261 ---------------------------------------------------- 262 true | True | True | Dontcare 263 ---------------------------------------------------- 264 false | False | True | Dontcare 265 */ 266 if (showCursor == TriBool::Dontcare) 267 state->setMouseExclusive(TriBool::Dontcare); 268 else if (GraphicsManager::getInstance().isFullScreen() || showCursor == TriBool::False) 261 269 state->setMouseExclusive(TriBool::True); 262 270 else 263 state->setMouseExclusive(TriBool:: Dontcare);264 265 if (show Mouse== TriBool::True)271 state->setMouseExclusive(TriBool::False); 272 273 if (showCursor == TriBool::True) 266 274 state->setMouseHandler(this); 267 else if (show Mouse== TriBool::False)275 else if (showCursor == TriBool::False) 268 276 state->setMouseHandler(&InputHandler::EMPTY); 269 277 -
code/branches/gamestate/src/libraries/core/GUIManager.h
r6537 r6658 81 81 void setBackground(const std::string& name); 82 82 83 const std::string& createInputState(const std::string& name, TriBool::Value show Mouse= TriBool::True, TriBool::Value useKeyboard = TriBool::True, bool bBlockJoyStick = false); // tolua_export83 const std::string& createInputState(const std::string& name, TriBool::Value showCursor = TriBool::True, TriBool::Value useKeyboard = TriBool::True, bool bBlockJoyStick = false); // tolua_export 84 84 85 85 void setCamera(Ogre::Camera* camera); -
code/branches/gamestate/src/libraries/core/input/InputManager.h
r6657 r6658 168 168 //! Returns a pointer to the OIS InputManager. Only you if you know what you're doing! 169 169 OIS::InputManager* getOISInputManager() { return this->oisInputManager_; } 170 //! Returns the position of the cursor as std::pair of ints 170 171 std::pair<int, int> getMousePosition() const; 172 //! Tells whether the mouse is used exclusively to the game 173 bool isMouseExclusive() const { return this->exclusiveMouse_; } // tolua_export 171 174 172 175 //------------------------------- -
code/branches/gamestate/src/orxonox/gamestates/GSMainMenu.cc
r6537 r6658 85 85 { 86 86 // show main menu 87 GUIManager::getInstance().showGUI("MainMenu", true, GraphicsManager::getInstance().isFullScreen());87 GUIManager::getInstance().showGUI("MainMenu", true, true); 88 88 GUIManager::getInstance().setCamera(this->camera_); 89 89 GUIManager::getInstance().setBackground("MainMenuBackground");
Note: See TracChangeset
for help on using the changeset viewer.