Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/data/gui/scripts/GraphicsMenu.lua @ 11410

Last change on this file since 11410 was 9051, checked in by dafrick, 13 years ago

Resolving some issues with typecasts and comboboxes in graphics menu.

  • Property svn:eol-style set to native
File size: 16.1 KB
Line 
1-- GraphicsMenu.lua
2
3local P = createMenuSheet("GraphicsMenu")
4
5P.resolutionList = {"custom", "640 x 480", "720 x 480", "720 x 576", "800 x 600", "1024 x 600", "1024 x 768", "1152 x 864", "1280 x 720", "1280 x 800", "1280 x 960", "1280 x 1024", "1360 x 768", "1440 x 900", "1600 x 900", "1600 x 1200", "1680 x 1050"}
6P.schemeList = {"TaharezGreen", "Orxonox"}
7P.fsaaList = {"0", "2", "4", "8", "8 [Quality]"}
8P.particleLodList = {"None", "Low", "Normal", "High"}
9
10function P:onLoad()
11    -------------------
12    -- Button matrix --
13    -------------------
14
15    P:setButton(1, 1, {
16            ["button"] = winMgr:getWindow("orxonox/GraphicsOkButton"),
17            ["callback"]  = P.callback_Ok_Clicked
18    })
19
20    P:setButton(1, 2, {
21            ["button"] = winMgr:getWindow("orxonox/GraphicsCancelButton"),
22            ["callback"]  = P.callback_Cancel_Clicked
23    })
24
25    -- place apply button at the bottom in the matrix, even though it's in fact at the top, to make the OK button highlighted by default
26    P:setButton(2, 1, {
27            ["button"] = winMgr:getWindow("orxonox/Display/Resolution/Apply"),
28            ["callback"]  = P.callback_Apply_Clicked
29    })
30
31    -----------------
32    -- Combo boxes --
33    -----------------
34
35    -- resolution combobox
36    local resolutionCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/Resolution/Combobox"))
37    resolutionCombobox:setReadOnly(true)
38
39    for k,v in pairs(P.resolutionList) do
40        local item = CEGUI.createListboxTextItem(v)
41        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
42        resolutionCombobox:addItem(item)
43    end
44
45    -- themes combobox
46    local themeCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/Theme/Combobox"))
47    themeCombobox:setReadOnly(true)
48
49    for k,v in pairs(P.schemeList) do
50        local item = CEGUI.createListboxTextItem(v)
51        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
52        themeCombobox:addItem(item)
53    end
54
55    -- fsaa combobox
56    local fsaaCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/More/FSAA"))
57    fsaaCombobox:setReadOnly(true)
58
59    for k,v in pairs(P.fsaaList) do
60        local item = CEGUI.createListboxTextItem(v)
61        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
62        fsaaCombobox:addItem(item)
63    end
64
65    -- particle lod combobox
66    local particleLodCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Settings/ParticleLodCombobox"))
67    particleLodCombobox:setReadOnly(true)
68
69    for k,v in pairs(P.particleLodList) do
70        local item = CEGUI.createListboxTextItem(v)
71        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
72        particleLodCombobox:addItem(item)
73    end
74end
75
76function P:onShow()
77    -----------------
78    -- Display tab --
79    -----------------
80
81    -- fullscreen checkbox / resolution combobox / resolution editboxes
82    self:onWindowResized()
83
84    -- apply button
85    self.updateApplyButton()
86
87    -- aspect ratio editbox
88    local aspectRatioEditbox = winMgr:getWindow("orxonox/Display/Resolution/AspectRatio")
89    local currentAspectRatio = orxonox.CommandExecutor:query("getConfig Camera aspectRatio_")
90    aspectRatioEditbox:setText(currentAspectRatio)
91
92    -- themes combobox
93    local themeCombobox =  CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/Theme/Combobox"))
94    local currentTheme = orxonox.CommandExecutor:query("getConfig GUIManager guiScheme_")
95
96    for i = 0, themeCombobox:getDropList():getItemCount() - 1 do
97        local item = themeCombobox:getListboxItemFromIndex(i)
98        themeCombobox:setItemSelectState(item, (item:getText() == currentTheme))
99    end
100
101    -- vsync checkbox
102    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
103    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
104    CEGUI.toCheckbox(vsyncCheckbox):setSelected(hasVSync)
105
106    -- fsaa combobox
107    local fsaaCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/More/FSAA"))
108    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
109
110    for i = 0, fsaaCombobox:getDropList():getItemCount() - 1 do
111        local item = fsaaCombobox:getListboxItemFromIndex(i)
112        fsaaCombobox:setItemSelectState(item, (item:getText() == currentFSAAMode))
113    end
114
115    -- notice
116    self:updateRedLabel()
117
118    ------------------
119    -- Settings tab --
120    ------------------
121
122    -- fov editbox
123    local fovEditbox = winMgr:getWindow("orxonox/Settings/Fov")
124    local currentFov = orxonox.CommandExecutor:query("getConfig Camera fov_")
125    fovEditbox:setText(currentFov)
126
127    -- fps limit editbox
128    local fpsEditbox = winMgr:getWindow("orxonox/Settings/FpsLimit")
129    local currentFpsLimit = orxonox.CommandExecutor:query("getConfig GraphicsSettings fpsLimit")
130    fpsEditbox:setText(currentFpsLimit)
131
132    -- particle lod combobox
133    local particleLodCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Settings/ParticleLodCombobox"))
134    local currentParticleLod = orxonox.CommandExecutor:query("getConfig GraphicsSettings particlesDetailLevel")
135
136    if currentParticleLod == "" then
137        particleLodCombobox:disable()
138    else
139        particleLodCombobox:enable()
140
141        for i = 0, particleLodCombobox:getDropList():getItemCount() - 1 do
142            local item = particleLodCombobox:getListboxItemFromIndex(i)
143            particleLodCombobox:setItemSelectState(item, (tostring(i) == currentParticleLod))
144        end
145    end
146
147    -- mesh lod checkbox
148    local meshLodCheckbox = winMgr:getWindow("orxonox/Settings/MeshLodCheckbox")
149    local hasMeshLod = orxonox.CommandExecutor:query("getConfig GraphicsSettings enableMeshLoD")
150    if hasMeshLod == "true" then
151        hasMeshLod = true
152    elseif hasMeshLod == "false" then
153        hasMeshLod = false
154    end
155    CEGUI.toCheckbox(meshLodCheckbox):setSelected(hasMeshLod)
156
157    -- motion blur checkbox
158    local motionBlurCheckbox = winMgr:getWindow("orxonox/Settings/MotionBlurCheckbox")
159    local hasMotionBlur = orxonox.CommandExecutor:query("getConfig GraphicsSettings enableMotionBlur")
160    if hasMotionBlur == "true" then
161        hasMotionBlur = true
162    elseif hasMotionBlur == "false" then
163        hasMotionBlur = false
164    end
165    CEGUI.toCheckbox(motionBlurCheckbox):setSelected(hasMotionBlur)
166end
167
168function P:onWindowResized()
169    -- fullscreen checkbox
170    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
171    local isFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
172    CEGUI.toCheckbox(fullscreenCheckbox):setSelected(isFullscreen)
173
174    -- resolution combobox
175    local resolutionCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/Resolution/Combobox"))
176
177    local currentWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
178    local currentHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
179
180    if P.forceResolutionEditboxes then
181        currentWidth = P.newWidth
182        currentHeight = P.newHeight
183        P.forceResolutionEditboxes = false
184    end
185
186    local currentResolution = currentWidth .. " x " .. currentHeight
187
188    for i = 0, resolutionCombobox:getDropList():getItemCount() - 1 do
189        local item = resolutionCombobox:getListboxItemFromIndex(i)
190        resolutionCombobox:setItemSelectState(item, item:getText() == currentResolution)
191    end
192
193    -- resolution editboxes
194    self.updateResolutionEditboxes()
195end
196
197----------------------
198-- Helper functions --
199----------------------
200
201-- updates the text of the resolution checkboxes and checks if they should be enabled (only if the "custom" resolution was selected)
202function P.updateResolutionEditboxes()
203    -- resolution combobox
204    local resolutionCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Display/Resolution/Combobox"))
205
206    local currentWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
207    local currentHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
208
209    -- resolution editboxes
210    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
211    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
212    widthEditbox:disable()
213    heightEditbox:disable()
214
215    -- selected combobox item
216    local item = resolutionCombobox:getSelectedItem()
217    if item then
218        local itemText = item:getText()
219        if itemText ~= "custom" then
220            currentWidth = string.sub(itemText, 1, string.find(itemText, "x") - 2)
221            currentHeight = string.sub(itemText, string.find(itemText, "x") + 2)
222        else
223            widthEditbox:enable()
224            heightEditbox:enable()
225        end
226    end
227
228    widthEditbox:setText(currentWidth)
229    heightEditbox:setText(currentHeight)
230end
231
232-- checks if the apply button should be enabled or disabled (only enabled if the current settings are different from the selected values)
233function P.updateApplyButton()
234    -- fullscreen checkbox
235    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
236    local isFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
237    local fullscreenChanged = (isFullscreen ~= CEGUI.toCheckbox(fullscreenCheckbox):isSelected())
238
239    -- resolution editboxes
240    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
241    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
242    local currentWidth = tostring(orxonox.GraphicsManager:getInstance():getWindowWidth())
243    local currentHeight = tostring(orxonox.GraphicsManager:getInstance():getWindowHeight())
244    local widthChanged = (currentWidth ~= widthEditbox:getText())
245    local heightChanged = (currentHeight ~= heightEditbox:getText())
246    local resolutionEditboxesEnabled = not widthEditbox:isDisabled()
247
248    -- apply button
249    local applyButton = winMgr:getWindow("orxonox/Display/Resolution/Apply")
250
251    if fullscreenChanged or widthChanged or heightChanged or resolutionEditboxesEnabled then
252        applyButton:enable()
253    else
254        applyButton:disable()
255    end
256end
257
258function P.updateRedLabel()
259    -- theme
260    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
261    local currentTheme = orxonox.CommandExecutor:query("getConfig GUIManager guiScheme_")
262    local themeChanged = (currentTheme ~= themeCombobox:getText())
263
264    -- vsync
265    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
266    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
267    local vsyncChanged = (hasVSync ~= CEGUI.toCheckbox(vsyncCheckbox):isSelected())
268
269    -- fsaa
270    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
271    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
272    local fsaaChanged = (currentFSAAMode ~= fsaaCombobox:getText())
273
274    local needRestart = themeChanged or vsyncChanged or fsaaChanged
275
276    local notice = winMgr:getWindow("orxonox/Display/Notice")
277    notice:setVisible(not needRestart)
278    local noticeRed = winMgr:getWindow("orxonox/Display/NoticeRed")
279    noticeRed:setVisible(needRestart)
280end
281
282---------------------
283-- Event callbacks --
284---------------------
285
286-- resolution
287
288function P.callback_FullscreenCheckbox_CheckStateChanged(e)
289    P.updateApplyButton()
290end
291
292function P.callback_ResolutionCombobox_ListSelectionAccepted(e)
293    P.updateResolutionEditboxes()
294end
295
296function P.callback_ResolutionEditboxWidth_TextChanged(e)
297    P.updateApplyButton()
298end
299
300function P.callback_ResolutionEditboxHeight_TextChanged(e)
301    P.updateApplyButton()
302end
303
304-- theme
305
306function P.callback_ThemeCombobox_ListSelectionAccepted(e)
307    P.updateRedLabel()
308end
309
310-- vsync
311
312function P.callback_VSyncCheckbox_CheckStateChanged(e)
313    P.updateRedLabel()
314end
315
316-- fsaa
317
318function P.callback_FSAACombobox_ListSelectionAccepted(e)
319    P.updateRedLabel()
320end
321
322-- buttons
323
324function P.callback_Apply_Clicked(e)
325    -- resolution
326    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
327    local checkedFullscreen = tostring(CEGUI.toCheckbox(fullscreenCheckbox):isSelected())
328
329    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
330    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
331
332    P.newWidth = widthEditbox:getText()
333    P.newHeight = heightEditbox:getText()
334    P.forceResolutionEditboxes = true
335
336    -- start revert timer
337    P.oldWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
338    P.oldHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
339    P.oldFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
340
341    P.revertTimerHandle = orxonox.CommandExecutor:query("delayreal 10 {hideGUI DecisionPopup; GraphicsManager setScreenResolution " .. P.oldWidth .. " " .. P.oldHeight .. " " .. tostring(P.oldFullscreen) .. "; config Core lastLevelTimestamp_ [expr [getConfig Core ogreConfigTimestamp_] + 1]}")
342
343    -- change settings
344    orxonox.CommandExecutor:execute("GraphicsManager setScreenResolution " .. P.newWidth .. " " .. P.newHeight .. " " .. checkedFullscreen)
345
346    P.updateApplyButton()
347
348    -- prompt for confirmation
349    openDecisionPopup("Do you want to keep these settings? (Settings will be reverted in 10 seconds if not accepted)", GraphicsMenu.callback_ApplyDecisionPopup)
350    if checkedFullscreen then
351        showCursor()
352    end
353end
354
355function P.callback_ApplyDecisionPopup(pressedOK)
356    orxonox.CommandExecutor:execute("killdelay " .. P.revertTimerHandle)
357
358    if not pressedOK then
359        orxonox.CommandExecutor:execute("GraphicsManager setScreenResolution " .. P.oldWidth .. " " .. P.oldHeight .. " " .. tostring(P.oldFullscreen))
360        P:onShow()
361    end
362
363    -- update timestamp to avoid showing the ogre config dialog again after the user accepted or reverted the resolution
364    orxonox.CommandExecutor:execute("config Core lastLevelTimestamp_ [expr [getConfig Core ogreConfigTimestamp_] + 1]")
365end
366
367function P.callback_Ok_Clicked(e)
368    -- aspect ratio
369    local aspectRatioEditbox = winMgr:getWindow("orxonox/Display/Resolution/AspectRatio")
370    orxonox.CommandExecutor:execute("config Camera aspectRatio_ " .. aspectRatioEditbox:getText())
371
372    -- theme
373    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
374    orxonox.CommandExecutor:execute("config GUIManager guiScheme_ " .. themeCombobox:getText())
375
376    -- vsync
377    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
378    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
379    if hasVSync ~= CEGUI.toCheckbox(vsyncCheckbox):isSelected() then
380        orxonox.CommandExecutor:execute("GraphicsManager setVSync " .. tostring(CEGUI.toCheckbox(vsyncCheckbox):isSelected()))
381    end
382
383    -- fsaa
384    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
385    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
386    if currentFSAAMode ~= fsaaCombobox:getText() then
387        orxonox.CommandExecutor:execute("GraphicsManager setFSAA {" .. fsaaCombobox:getText() .. "}") -- enclose argument in { ... } because it can contain [brackets] (conflicts with tcl)
388    end
389
390    -- fov
391    local fovEditbox = winMgr:getWindow("orxonox/Settings/Fov")
392    orxonox.CommandExecutor:execute("config Camera fov_ " .. fovEditbox:getText())
393
394    -- fps limit
395    local fpsEditbox = winMgr:getWindow("orxonox/Settings/FpsLimit")
396    orxonox.CommandExecutor:execute("config GraphicsSettings fpsLimit " .. fpsEditbox:getText())
397
398    -- particle lod
399    local particleLodCombobox = CEGUI.toCombobox(winMgr:getWindow("orxonox/Settings/ParticleLodCombobox"))
400    local item = particleLodCombobox:getSelectedItem()
401    if item then
402        orxonox.CommandExecutor:execute("config GraphicsSettings particlesDetailLevel " .. particleLodCombobox:getItemIndex(item))
403    end
404
405    -- mesh lod
406    local meshLodCheckbox = winMgr:getWindow("orxonox/Settings/MeshLodCheckbox")
407    orxonox.CommandExecutor:execute("config GraphicsSettings enableMeshLoD " .. tostring(CEGUI.toCheckbox(meshLodCheckbox):isSelected()))
408
409    -- motion blur
410    local motionBlurCheckbox = winMgr:getWindow("orxonox/Settings/MotionBlurCheckbox")
411    orxonox.CommandExecutor:execute("config GraphicsSettings enableMotionBlur " .. tostring(CEGUI.toCheckbox(motionBlurCheckbox):isSelected()))
412
413    hideMenuSheet(P.name)
414end
415
416function P.callback_Cancel_Clicked(e)
417    hideMenuSheet(P.name)
418end
419
420return P
421
Note: See TracBrowser for help on using the repository browser.