Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 9244 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
RevLine 
[6363]1-- SingleplayerMenu.lua
2
[6746]3local P = createMenuSheet("SingleplayerMenu")
[6363]4
[7648]5P.levelList = {}
[9016]6P.activeTabIndexes = {}
7P.scrollbarWidth = 13
[7648]8
[6746]9function P.onLoad()
[7648]10    P.createLevelList()
[9016]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
[8079]25    P:setButton(1, 1, {
[7689]26            ["button"] = winMgr:getWindow("orxonox/SingleplayerStartButton"),
[8079]27            ["callback"]  = P.SingleplayerStartButton_clicked
28    })
[7689]29
[8079]30    P:setButton(1, 2, {
[9016]31            ["button"] = winMgr:getWindow("orxonox/SingleplayerConfigButton"),
32            ["callback"]  = P.SingleplayerConfigButton_clicked
33    })
34
35    P:setButton(1, 3, {
[7689]36            ["button"] = winMgr:getWindow("orxonox/SingleplayerBackButton"),
[8079]37            ["callback"]  = P.SingleplayerBackButton_clicked
38    })
[7648]39end
40
41function P.createLevelList()
42    P.levelList = {}
43    local size = orxonox.LevelManager:getInstance():getNumberOfLevels()
[6363]44    local index = 0
[7648]45    local level = nil
46    while index < size do
47        level = orxonox.LevelManager:getInstance():getAvailableLevelListItem(index)
48        if level ~= nil then
[9016]49            local levelXMLFilename = level:getXMLFilename()
50            -- create an imageset for each screenshot
51            local imageName = level:getScreenshot()
52            if imageName ~= "" then
[9050]53                CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, imageName)
[9016]54            else
[9050]55                CEGUI.ImagesetManager:getSingleton():createFromImageFile(levelXMLFilename..imageName, "noscreenshot.png")
[7648]56            end
[9016]57            table.insert(P.levelList, level)
[7648]58        end
59        index = index + 1
[6363]60    end
[9016]61end
[8706]62
[9016]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 = {}
[7648]79    for k,v in pairs(P.levelList) do
[9016]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())
[6363]90        end
91    end
[9016]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
[6363]100end
101
[9016]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()))
[7648]106    local choice = listbox:getFirstSelectedItem()
107    if choice ~= nil then
[9016]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")
[7648]133        end
[9016]134    else
135        -- also take care of "no level selected"
136        levelImage:setProperty("Image", nil)
137        levelDescription:setText("")
138        configButton:setProperty("Disabled", "True")
[6363]139    end
140end
141
[9016]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
[7648]148end
149
[9016]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
[6363]158function P.SingleplayerBackButton_clicked(e)
[6746]159    hideMenuSheet(P.name)
[6363]160end
161
162return P
Note: See TracBrowser for help on using the repository browser.