Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/data/gui/scripts/SingleplayerMenu.lua @ 9049

Last change on this file since 9049 was 9049, checked in by dafrick, 12 years ago

Fixing problem due to CEGUI version conflict.

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1-- SingleplayerMenu.lua
2
3local P = createMenuSheet("SingleplayerMenu")
4
5P.levelList = {}
6P.activeTabIndexes = {}
7P.scrollbarWidth = 13
8
9function P.onLoad()
10    P.createLevelList()
11   
12    -- create tabs with desired tab as argument (nil for all)
13    P.createFilterTab("Gametypes", "gametype")
14    P.createFilterTab("Missions", "mission")
15    P.createFilterTab("Minigames", "minigame")
16    P.createFilterTab("Showcases", "showcase")
17    P.createFilterTab("Presentations", "presentation")
18    P.createFilterTab("Tests", "test")
19    P.createFilterTab("Show All", nil)
20   
21    -- update description and screenshot boxes
22    P.SingleplayerSelectionChanged()
23   
24    --buttons are arranged in a 1x3 matrix
25    P:setButton(1, 1, {
26            ["button"] = winMgr:getWindow("orxonox/SingleplayerStartButton"),
27            ["callback"]  = P.SingleplayerStartButton_clicked
28    })
29
30    P:setButton(1, 2, {
31            ["button"] = winMgr:getWindow("orxonox/SingleplayerConfigButton"),
32            ["callback"]  = P.SingleplayerConfigButton_clicked
33    })
34
35    P:setButton(1, 3, {
36            ["button"] = winMgr:getWindow("orxonox/SingleplayerBackButton"),
37            ["callback"]  = P.SingleplayerBackButton_clicked
38    })
39end
40
41function P.createLevelList()
42    P.levelList = {}
43    local size = orxonox.LevelManager:getInstance():getNumberOfLevels()
44    local index = 0
45    local level = nil
46    while index < size do
47        level = orxonox.LevelManager:getInstance():getAvailableLevelListItem(index)
48        if level ~= nil then
49            local levelXMLFilename = level:getXMLFilename()
50            -- create an imageset for each screenshot
51            local imageName = level:getScreenshot()
52            if imageName ~= "" then
53                if guiMgr:usingOldCEGUI() then
54                    CEGUI.ImagesetManager:getSingleton():createImagesetFromImageFile(levelXMLFilename..imageName, imageName)
55                else
56                    CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, imageName)
57                end
58            else
59                if guiMgr:usingOldCEGUI() then
60                    CEGUI.ImagesetManager:getSingleton():createImagesetFromImageFile(levelXMLFilename..imageName, "noscreenshot.png")
61                else
62                    CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, "noscreenshot.png")
63                end
64            end
65            table.insert(P.levelList, level)
66        end
67        index = index + 1
68    end
69end
70
71function P.createFilterTab(name, tag)
72    -- create unique tab window name
73    local tabName = "orxonox/SingleplayerLevelTab"
74    if tag ~= nil then
75        tabName = tabName..tag
76    end
77    -- create new tab window with desired name
78    local listbox = CEGUI.toListbox(winMgr:createWindow("MenuWidgets/Listbox", tabName))
79    listbox:setText(name)
80    listbox:setProperty("UnifiedMaxSize", "{{1,0},{1,0}}")
81    listbox:setProperty("UnifiedAreaRect", "{{0.05,0},{0.1,0},{0.5,0},{0.675,0}}")
82    -- fill listbox with items
83    listbox:resetList()
84    orxonox.GUIManager:setItemTooltipsEnabledHelper(listbox, true)
85    local preselect = orxonox.LevelManager:getInstance():getDefaultLevel()
86    local tabIndexes = {}
87    for k,v in pairs(P.levelList) do
88        -- only add level if it has desired tag
89        if tag == nil or v:hasTag(tag) then
90            local item = CEGUI.createListboxTextItem(v:getName())
91            item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
92            listbox:addItem(item)
93            table.insert(tabIndexes, k)
94            if v:getXMLFilename() == preselect then
95                listbox:setItemSelectState(item, true)
96            end
97            orxonox.GUIManager:setTooltipTextHelper(item, v:getDescription())
98        end
99    end
100    table.insert(P.activeTabIndexes, tabIndexes)
101    -- listen to selection changes
102    orxonox.GUIManager:subscribeEventHelper(listbox, "ItemSelectionChanged", P.name..".SingleplayerSelectionChanged")
103    local tabControl = winMgr:getWindow("orxonox/SingleplayerTabControl")
104    orxonox.GUIManager:subscribeEventHelper(tabControl, "TabSelectionChanged", P.name..".SingleplayerSelectionChanged")
105    if listbox:getItemCount() > 0 then
106        tabControl:addChildWindow(tabName)
107    end
108end
109
110function P.SingleplayerGetSelectedLevel()
111    -- choose the active listbox
112    local tabControl = CEGUI.toTabControl(winMgr:getWindow("orxonox/SingleplayerTabControl"))
113    local listbox = CEGUI.toListbox(tabControl:getTabContentsAtIndex(tabControl:getSelectedTabIndex()))
114    local choice = listbox:getFirstSelectedItem()
115    if choice ~= nil then
116        -- get the right tab and the right index
117        local tabIndexes = P.activeTabIndexes[tabControl:getSelectedTabIndex()+1]
118        local index = tabIndexes[listbox:getItemIndex(choice)+1]
119        return P.levelList[index]
120    else
121        return nil
122    end
123end
124
125function P.SingleplayerSelectionChanged(e)
126    local levelImage = winMgr:getWindow("orxonox/SingleplayerLevelImage")
127    local levelDescription = winMgr:getWindow("orxonox/SingleplayerLevelDescription")
128    local configButton = winMgr:getWindow("orxonox/SingleplayerConfigButton")
129    local level = P.SingleplayerGetSelectedLevel()
130    if level ~= nil then
131        local levelXMLFilename = level:getXMLFilename()
132        local imageName = level:getScreenshot()
133        -- set the screenshot and the description for the selected level
134        levelImage:setProperty("Image", "set:"..levelXMLFilename..imageName.." image:full_image")
135        levelDescription:setText(level:getDescription())
136        -- only enable config button for "gametype" levels
137        if level:hasTag("gametype") then
138            configButton:setProperty("Disabled", "False")
139        else
140            configButton:setProperty("Disabled", "True")
141        end
142    else
143        -- also take care of "no level selected"
144        levelImage:setProperty("Image", nil)
145        levelDescription:setText("")
146        configButton:setProperty("Disabled", "True")
147    end
148end
149
150function P.SingleplayerStartButton_clicked(e)
151    local level = P.SingleplayerGetSelectedLevel()
152    if level ~= nil then
153        orxonox.execute("startGame " .. level:getXMLFilename())
154        hideAllMenuSheets()
155    end
156end
157
158function P.SingleplayerConfigButton_clicked(e)
159    local level = P.SingleplayerGetSelectedLevel()
160    if level ~= nil then
161        local configMenu = showMenuSheet("SingleplayerConfigMenu")
162        configMenu:loadConfig(level)
163    end
164end
165
166function P.SingleplayerBackButton_clicked(e)
167    hideMenuSheet(P.name)
168end
169
170return P
Note: See TracBrowser for help on using the repository browser.