Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/menue/data/gui/scripts/SingleplayerMenu.lua @ 8931

Last change on this file since 8931 was 8931, checked in by jo, 13 years ago

Adding new tags: 'gametype' and 'minigame'.

  • Property svn:eol-style set to native
File size: 5.2 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    SingleplayerSelectionChanged()
22   
23    --buttons are arranged in a 1x3 matrix
24    P:setButton(1, 1, {
25            ["button"] = winMgr:getWindow("orxonox/SingleplayerStartButton"),
26            ["callback"]  = P.SingleplayerStartButton_clicked
27    })
28
29    P:setButton(1, 2, {
30            ["button"] = winMgr:getWindow("orxonox/SingleplayerConfigButton"),
31            ["callback"]  = P.SingleplayerConfigButton_clicked
32    })
33
34    P:setButton(1, 3, {
35            ["button"] = winMgr:getWindow("orxonox/SingleplayerBackButton"),
36            ["callback"]  = P.SingleplayerBackButton_clicked
37    })
38end
39
40function P.createLevelList()
41    P.levelList = {}
42    local size = orxonox.LevelManager:getInstance():getNumberOfLevels()
43    local index = 0
44    local level = nil
45    while index < size do
46        level = orxonox.LevelManager:getInstance():getAvailableLevelListItem(index)
47        if level ~= nil then
48            local levelXMLFilename = level:getXMLFilename()
49            local imageName = level:getScreenshot()
50            if imageName ~= "" then
51                CEGUI.ImagesetManager:getSingleton():createImagesetFromImageFile(levelXMLFilename..imageName, imageName)
52            else
53                CEGUI.ImagesetManager:getSingleton():createImagesetFromImageFile(levelXMLFilename..imageName, "noscreenshot.png")
54            end
55            table.insert(P.levelList, level)
56        end
57        index = index + 1
58    end
59end
60
61function P.createFilterTab(name, tag)
62    -- create unique tab window name
63    local tabName = "orxonox/SingleplayerLevelTab"
64    if tag ~= nil then
65        tabName = tabName..tag
66    end
67    -- create new tab window with desired name
68    local listbox = CEGUI.toListbox(winMgr:createWindow("MenuWidgets/Listbox", tabName))
69    listbox:setText(name)
70    listbox:setProperty("UnifiedMaxSize", "{{1,0},{1,0}}")
71    listbox:setProperty("UnifiedAreaRect", "{{0.05,0},{0.1,0},{0.5,0},{0.675,0}}")
72    -- fill listbox with items
73    listbox:resetList()
74    orxonox.GUIManager:setItemTooltipsEnabledHelper(listbox, true)
75    local preselect = orxonox.LevelManager:getInstance():getDefaultLevel()
76    local tabIndexes = {}
77    for k,v in pairs(P.levelList) do
78        -- only add level if it has desired tag
79        if tag == nil or v:hasTag(tag) then
80            local item = CEGUI.createListboxTextItem(v:getName())
81            item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
82            listbox:addItem(item)
83            table.insert(tabIndexes, k)
84            if v:getXMLFilename() == preselect then
85                listbox:setItemSelectState(item, true)
86            end
87            orxonox.GUIManager:setTooltipTextHelper(item, v:getDescription())
88        end
89    end
90    table.insert(P.activeTabIndexes, tabIndexes)
91    listbox:subscribeEvent("ItemSelectionChanged", "SingleplayerSelectionChanged")
92    local tabControl = winMgr:getWindow("orxonox/SingleplayerTabControl")
93    tabControl:subscribeEvent("TabSelectionChanged", "SingleplayerSelectionChanged")
94    if listbox:getItemCount() > 0 then
95        tabControl:addChildWindow(tabName)
96    end
97end
98
99function P.SingleplayerGetSelectedLevel()
100    -- choose the active listbox
101    local tabControl = CEGUI.toTabControl(winMgr:getWindow("orxonox/SingleplayerTabControl"))
102    local listbox = CEGUI.toListbox(tabControl:getTabContentsAtIndex(tabControl:getSelectedTabIndex()))
103    local choice = listbox:getFirstSelectedItem()
104    if choice ~= nil then
105        local tabIndexes = P.activeTabIndexes[tabControl:getSelectedTabIndex()+1]
106        local index = tabIndexes[listbox:getItemIndex(choice)+1]
107        return P.levelList[index]
108    else
109        return nil
110    end
111end
112
113function SingleplayerSelectionChanged(e)
114    local levelImage = winMgr:getWindow("orxonox/SingleplayerLevelImage")
115    local levelDescription = winMgr:getWindow("orxonox/SingleplayerLevelDescription")
116    local level = P.SingleplayerGetSelectedLevel()
117    if level ~= nil then
118        local levelXMLFilename = level:getXMLFilename()
119        local imageName = level:getScreenshot()
120        levelImage:setProperty("Image", "set:"..levelXMLFilename..imageName.." image:full_image")
121        levelDescription:setText(level:getDescription())
122    else
123        levelImage:setProperty("Image", nil)
124        levelDescription:setText("")
125    end
126end
127
128function P.SingleplayerStartButton_clicked(e)
129    local level = P.SingleplayerGetSelectedLevel()
130    if level ~= nil then
131        orxonox.execute("startGame " .. level:getXMLFilename())
132        hideAllMenuSheets()
133    end
134end
135
136function P.SingleplayerConfigButton_clicked(e)
137    showMenuSheet("SingleplayerConfigMenu", true)
138end
139
140function P.SingleplayerBackButton_clicked(e)
141    hideMenuSheet(P.name)
142end
143
144return P
Note: See TracBrowser for help on using the repository browser.