Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 9087 was 9050, checked in by dafrick, 13 years ago

More elegant resolution of discrepancies between cegui 0.6 and 0.7.

  • Property svn:eol-style set to native
File size: 6.0 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                CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, imageName)
54            else
55                CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, "noscreenshot.png")
56            end
57            table.insert(P.levelList, level)
58        end
59        index = index + 1
60    end
61end
62
63function P.createFilterTab(name, tag)
64    -- create unique tab window name
65    local tabName = "orxonox/SingleplayerLevelTab"
66    if tag ~= nil then
67        tabName = tabName..tag
68    end
69    -- create new tab window with desired name
70    local listbox = CEGUI.toListbox(winMgr:createWindow("MenuWidgets/Listbox", tabName))
71    listbox:setText(name)
72    listbox:setProperty("UnifiedMaxSize", "{{1,0},{1,0}}")
73    listbox:setProperty("UnifiedAreaRect", "{{0.05,0},{0.1,0},{0.5,0},{0.675,0}}")
74    -- fill listbox with items
75    listbox:resetList()
76    orxonox.GUIManager:setItemTooltipsEnabledHelper(listbox, true)
77    local preselect = orxonox.LevelManager:getInstance():getDefaultLevel()
78    local tabIndexes = {}
79    for k,v in pairs(P.levelList) do
80        -- only add level if it has desired tag
81        if tag == nil or v:hasTag(tag) then
82            local item = CEGUI.createListboxTextItem(v:getName())
83            item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
84            listbox:addItem(item)
85            table.insert(tabIndexes, k)
86            if v:getXMLFilename() == preselect then
87                listbox:setItemSelectState(item, true)
88            end
89            orxonox.GUIManager:setTooltipTextHelper(item, v:getDescription())
90        end
91    end
92    table.insert(P.activeTabIndexes, tabIndexes)
93    -- listen to selection changes
94    orxonox.GUIManager:subscribeEventHelper(listbox, "ItemSelectionChanged", P.name..".SingleplayerSelectionChanged")
95    local tabControl = winMgr:getWindow("orxonox/SingleplayerTabControl")
96    orxonox.GUIManager:subscribeEventHelper(tabControl, "TabSelectionChanged", P.name..".SingleplayerSelectionChanged")
97    if listbox:getItemCount() > 0 then
98        tabControl:addChildWindow(tabName)
99    end
100end
101
102function P.SingleplayerGetSelectedLevel()
103    -- choose the active listbox
104    local tabControl = CEGUI.toTabControl(winMgr:getWindow("orxonox/SingleplayerTabControl"))
105    local listbox = CEGUI.toListbox(tabControl:getTabContentsAtIndex(tabControl:getSelectedTabIndex()))
106    local choice = listbox:getFirstSelectedItem()
107    if choice ~= nil then
108        -- get the right tab and the right index
109        local tabIndexes = P.activeTabIndexes[tabControl:getSelectedTabIndex()+1]
110        local index = tabIndexes[listbox:getItemIndex(choice)+1]
111        return P.levelList[index]
112    else
113        return nil
114    end
115end
116
117function P.SingleplayerSelectionChanged(e)
118    local levelImage = winMgr:getWindow("orxonox/SingleplayerLevelImage")
119    local levelDescription = winMgr:getWindow("orxonox/SingleplayerLevelDescription")
120    local configButton = winMgr:getWindow("orxonox/SingleplayerConfigButton")
121    local level = P.SingleplayerGetSelectedLevel()
122    if level ~= nil then
123        local levelXMLFilename = level:getXMLFilename()
124        local imageName = level:getScreenshot()
125        -- set the screenshot and the description for the selected level
126        levelImage:setProperty("Image", "set:"..levelXMLFilename..imageName.." image:full_image")
127        levelDescription:setText(level:getDescription())
128        -- only enable config button for "gametype" levels
129        if level:hasTag("gametype") then
130            configButton:setProperty("Disabled", "False")
131        else
132            configButton:setProperty("Disabled", "True")
133        end
134    else
135        -- also take care of "no level selected"
136        levelImage:setProperty("Image", nil)
137        levelDescription:setText("")
138        configButton:setProperty("Disabled", "True")
139    end
140end
141
142function P.SingleplayerStartButton_clicked(e)
143    local level = P.SingleplayerGetSelectedLevel()
144    if level ~= nil then
145        orxonox.execute("startGame " .. level:getXMLFilename())
146        hideAllMenuSheets()
147    end
148end
149
150function P.SingleplayerConfigButton_clicked(e)
151    local level = P.SingleplayerGetSelectedLevel()
152    if level ~= nil then
153        local configMenu = showMenuSheet("SingleplayerConfigMenu")
154        configMenu:loadConfig(level)
155    end
156end
157
158function P.SingleplayerBackButton_clicked(e)
159    hideMenuSheet(P.name)
160end
161
162return P
Note: See TracBrowser for help on using the repository browser.