Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/shipSelection/data/gui/scripts/SingleplayerMenu.lua @ 9039

Last change on this file since 9039 was 9039, checked in by huttemat, 12 years ago

Added ShipSelectionMenu.layout

  • Property svn:eol-style set to native
File size: 6.2 KB
Line 
1-- SingleplayerMenu.lua
2
3local P = createMenuSheet("SingleplayerMenu")
4P.loadAlong = { "ShipSelectionMenu"}
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():createImagesetFromImageFile(levelXMLFilename..imageName, imageName)
54            else
55                CEGUI.ImagesetManager:getSingleton():createImagesetFromImageFile(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        if level:hasTag("shipselection") then
146            showMenuSheet("ShipSelectionMenu", true)
147        end
148        orxonox.execute("startGame " .. level:getXMLFilename())
149        hideAllMenuSheets()
150    end
151end
152
153function P.SingleplayerConfigButton_clicked(e)
154    local level = P.SingleplayerGetSelectedLevel()
155    if level ~= nil then
156        local configMenu = showMenuSheet("SingleplayerConfigMenu")
157        configMenu:loadConfig(level)
158    end
159end
160
161function P.SingleplayerBackButton_clicked(e)
162    hideMenuSheet(P.name)
163end
164
165return P
Note: See TracBrowser for help on using the repository browser.