Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 9805 was 9348, checked in by landauf, 12 years ago

merged branch presentation2012merge back to trunk

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