Re #752 (CEGUIDemo) Loading menu done (before the Results menu) + reworked menu instances life cycle management

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@5114 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 3d6c5093c2a6b4194db702feb5a8316c5934e467
Former-commit-id: ee943ac7d22df3c2f23d95ce4177cfc8f4136998
This commit is contained in:
pouillot 2013-02-03 14:38:26 +00:00
parent cb8321915a
commit 20487120a2
22 changed files with 404 additions and 113 deletions

View file

@ -16,8 +16,9 @@
<Item path="datafiles/layouts/menucredits.layout" type="file" /> <Item path="datafiles/layouts/menucredits.layout" type="file" />
<Item path="datafiles/layouts/menumain.layout" type="file" /> <Item path="datafiles/layouts/menumain.layout" type="file" />
<Item path="datafiles/layouts/menuoptions.layout" type="file" /> <Item path="datafiles/layouts/menuoptions.layout" type="file" />
<Item path="datafiles/layouts/menutrackselect.layout" type="file" />
<Item path="datafiles/layouts/menuprofiles.layout" type="file" /> <Item path="datafiles/layouts/menuprofiles.layout" type="file" />
<Item path="datafiles/layouts/menutrackselect.layout" type="file" />
<Item path="datafiles/layouts/menuloading.layout" type="file" />
</Item> </Item>
<Item name="Schemes" type="folder"> <Item name="Schemes" type="folder">
<Item path="datafiles/schemes/ceguidemo.scheme" type="file" /> <Item path="datafiles/schemes/ceguidemo.scheme" type="file" />

View file

@ -41,11 +41,10 @@
<Image Height="6" Name="StaticBottomLeft" Width="6" XPos="74" YPos="335" /> <Image Height="6" Name="StaticBottomLeft" Width="6" XPos="74" YPos="335" />
<Image Height="6" Name="StaticBottomRight" Width="6" XPos="96" YPos="335" /> <Image Height="6" Name="StaticBottomRight" Width="6" XPos="96" YPos="335" />
<Image Height="6" Name="StaticBackdrop" Width="6" XPos="85" YPos="324" /> <Image Height="6" Name="StaticBackdrop" Width="6" XPos="85" YPos="324" />
<Image Height="12" Name="ProgressBarLeft" Width="7" XPos="71" YPos="74" /> <Image Height="12" Name="ProgressBarLeft" Width="8" XPos="75" YPos="355" />
<Image Height="12" Name="ProgressBarMiddle" Width="6" XPos="80" YPos="74" /> <Image Height="12" Name="ProgressBarMiddle" Width="8" XPos="83" YPos="355" />
<Image Height="12" Name="ProgressBarRight" Width="6" XPos="88" YPos="74" /> <Image Height="12" Name="ProgressBarRight" Width="8" XPos="91" YPos="355" />
<Image Height="12" Name="ProgressBarDimSegment" Width="8" XPos="96" YPos="74" /> <Image Height="12" Name="ProgressBarLitSegment" Width="8" XPos="100" YPos="355" />
<Image Height="12" Name="ProgressBarLitSegment" Width="8" XPos="106" YPos="74" />
<Image Height="18" Name="EditBoxLeft" Width="4" XPos="234" YPos="219" /> <Image Height="18" Name="EditBoxLeft" Width="4" XPos="234" YPos="219" />
<Image Height="18" Name="EditBoxMiddle" Width="4" XPos="240" YPos="219" /> <Image Height="18" Name="EditBoxMiddle" Width="4" XPos="240" YPos="219" />
<Image Height="18" Name="EditBoxRight" Width="4" XPos="246" YPos="219" /> <Image Height="18" Name="EditBoxRight" Width="4" XPos="246" YPos="219" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View file

@ -0,0 +1,4 @@
<?xml version="1.0" ?>
<Imageset Name="SplashLoading" AutoScaled="true" Imagefile="splash-loading.jpg" NativeHorzRes="800" NativeVertRes="600">
<Image Name="everything" Height="800" Width="1280" XPos="0" YPos="0" />
</Imageset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -0,0 +1,47 @@
<GUILayout>
<Window Name="MenuLoading" Type="CEGUIDemo/StaticImage">
<Property Name="UnifiedAreaRect" Value="{{0,0},{0,0},{1,0},{1,0}}" />
<Property Name="Image" Value="set:SplashLoading image:everything" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="FrameEnabled" Value="False" />
<Property Name="BackgroundEnabled" Value="False" />
<Window Name="MenuLoading/ImgLogo" Type="CEGUIDemo/StaticImage">
<Property Name="UnifiedAreaRect" Value="{{0,0},{0,0},{0.3,0},{0.25,0}}" />
<Property Name="Image" Value="set:Logo image:everything" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="Tooltip" Value="What a nice logo !" />
<Property Name="FrameEnabled" Value="False" />
<Property Name="BackgroundEnabled" Value="False" />
</Window>
<Window Name="MenuLoading/TxtTitle" Type="CEGUIDemo/PageTitle">
<Property Name="UnifiedAreaRect" Value="{{0.22,0},{0.1,0},{0.92,0},{0.2,0}}" />
<Property Name="Font" Value="MenuTitle" />
<Property Name="Text" Value="Loading ..." />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="Tooltip" Value="Yeah, this is the title of the menu !" />
<Property Name="FrameEnabled" Value="False" />
</Window>
<Window Name="MenuLoading/TxtFrameRate" Type="CEGUIDemo/StaticText">
<Property Name="UnifiedAreaRect" Value="{{0.95,0},{0.01,0},{0.99,0},{0.04,0}}" />
<Property Name="Font" Value="TextSmall" />
<Property Name="Text" Value="99.9" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="TextColours" Value="tl:FFFFFFFF tr:FFC0C0C0 bl:FF808080 br:FF606060" />
<Property Name="Tooltip" Value="Frame rate (F/s)" />
<Property Name="FrameEnabled" Value="False" />
<Property Name="HorzFormatting" Value="RightAligned" />
<Property Name="VertFormatting" Value="TopAligned" />
<Property Name="BackgroundEnabled" Value="False" />
</Window>
<Window Name="MenuLoading/PrbProgress" Type="CEGUIDemo/ProgressBar">
<Property Name="UnifiedAreaRect" Value="{{0.1,0},{0.9,0},{0.9,0},{0.95,0}}" />
<Property Name="StepSize" Value="0.01" />
<Property Name="Tooltip" Value="Current loading work progress" />
</Window>
<Window Name="MenuLoading/ScpMessages" Type="CEGUIDemo/ScrollablePane">
<Property Name="UnifiedAreaRect" Value="{{0.1,0},{0.27,0},{0.9,0},{0.87,0}}" />
<Property Name="Font" Value="MenuMedium" />
<Property Name="Tooltip" Value="Loading messages" />
</Window>
</Window>
</GUILayout>

View file

@ -1,4 +1,8 @@
<?xml version="1.0" ?> <?xml version="1.0" ?>
<!--
CEGUI demo application look & feel for checking if CEGUI could be used for Speed Dreams menus
Note: Heavily based on Falagard's look & feel (from CEGUI 0.7.5).
-->
<Falagard> <Falagard>
<!-- <!--
*************************************************** ***************************************************

View file

@ -8,6 +8,7 @@
<Imageset Filename="splash-credits.imageset" /> <Imageset Filename="splash-credits.imageset" />
<Imageset Filename="splash-options.imageset" /> <Imageset Filename="splash-options.imageset" />
<Imageset Filename="splash-profiles.imageset" /> <Imageset Filename="splash-profiles.imageset" />
<Imageset Filename="splash-loading.imageset" />
<Imageset Filename="splash-okcancel.imageset" /> <Imageset Filename="splash-okcancel.imageset" />
<Font Name="MenuSmall" Filename="menu-small.font" /> <Font Name="MenuSmall" Filename="menu-small.font" />
<Font Name="MenuMedium" Filename="menu-medium.font" /> <Font Name="MenuMedium" Filename="menu-medium.font" />

View file

@ -26,7 +26,7 @@ class DialogOKCancel(object):
singleton = None singleton = None
def getSingleton(): def instance():
if not DialogOKCancel.singleton: if not DialogOKCancel.singleton:
DialogOKCancel.singleton = DialogOKCancel() DialogOKCancel.singleton = DialogOKCancel()
@ -35,7 +35,7 @@ class DialogOKCancel(object):
return DialogOKCancel.singleton return DialogOKCancel.singleton
getSingleton = staticmethod(getSingleton) instance = staticmethod(instance)
def __init__(self): def __init__(self):

View file

@ -17,7 +17,8 @@ import PyCEGUI
# Import: User # Import: User
from errors import InitializationError from errors import InitializationError
from menumain import MenuMain from menufactory import MenuFactory
from menumanager import MenuManager
# Import: Configuration # Import: Configuration
from configuration import TheConfig from configuration import TheConfig
@ -74,6 +75,8 @@ class GUI(object):
self.initializeResources() self.initializeResources()
self.initializeDefaults() self.initializeDefaults()
MenuFactory.initialize()
except Exception, msg: except Exception, msg:
raise InitializationError(msg) raise InitializationError(msg)
@ -81,4 +84,4 @@ class GUI(object):
# Setup: Interface # Setup: Interface
def setupInterface(self): def setupInterface(self):
MenuMain.instance().activate() MenuManager.get("Main").activate()

View file

@ -171,10 +171,6 @@ class Menu(object):
if previous: if previous:
self.prevMenu = previous self.prevMenu = previous
# Initialize frame rate data.
self.nFrames = 0
self.lastTime = glutGet(GLUT_ELAPSED_TIME)
# Return to the previous menu. # Return to the previous menu.
def switchTo(self, menu): def switchTo(self, menu):
@ -193,13 +189,13 @@ class Menu(object):
# Update frame rate indicator. # Update frame rate indicator.
def onUpdate(self, winArgs): # Bug: Not an UpdateEventArgs, but a WindowEventArgs ! def onUpdate(self, winArgs): # Bug: Not an UpdateEventArgs, but a WindowEventArgs !
thisTime = glutGet(GLUT_ELAPSED_TIME) self.currTime = glutGet(GLUT_ELAPSED_TIME)
elapsed = (thisTime - self.lastTime) / 1000.0 elapsed = (self.currTime - self.lastTime) / 1000.0
self.nFrames += 1 self.nFrames += 1
if elapsed >= 1.0: # Skidding mean for each second if elapsed >= 1.0: # Skidding mean for each second
self.txtFrameRate.setText("%4.1f" % (self.nFrames / elapsed)) self.txtFrameRate.setText("%4.1f" % (self.nFrames / elapsed))
self.nFrames = 0 self.nFrames = 0
self.lastTime = thisTime self.lastTime = self.currTime
def onKeyDown(self, keyArgs): def onKeyDown(self, keyArgs):
@ -211,7 +207,13 @@ class Menu(object):
def onActivated(self, args): def onActivated(self, args):
print("%s.onActivated" % self.__class__.__name__) print("%s.onActivated" % self.__class__.__name__)
#self.connectHandlers() #self.connectHandlers()
# Initialize frame rate data.
self.nFrames = 0
self.currTime = self.lastTime = glutGet(GLUT_ELAPSED_TIME)
return False return False
def onDeactivated(self, args): def onDeactivated(self, args):

View file

@ -19,14 +19,13 @@ from configuration import TheConfig
# Import: Menu # Import: Menu
from menustandard import MenuStandard from menustandard import MenuStandard
from menucredits import MenuCredits from menumanager import MenuManager
from menuoptions import MenuOptions
from menuprofiles import MenuProfiles
from menuresults import MenuResults
# Car selection menu # Car selection menu
class MenuCarSelect(MenuStandard): class MenuCarSelect(MenuStandard):
# Static cars data.
Car = collections.namedtuple("Car", "name, topSpeed, acceleration, cornering, skins") Car = collections.namedtuple("Car", "name, topSpeed, acceleration, cornering, skins")
Cars = \ Cars = \
@ -60,11 +59,23 @@ class MenuCarSelect(MenuStandard):
} }
} }
# Singleton pattern.
singleton = None
def instance():
if not MenuCarSelect.singleton:
MenuCarSelect.singleton = MenuCarSelect()
MenuCarSelect.singleton.initialize()
MenuCarSelect.singleton.setup()
return MenuCarSelect.singleton
instance = staticmethod(instance)
def __init__(self): def __init__(self):
MenuStandard.__init__(self, MenuCredits, MenuOptions, MenuProfiles) MenuStandard.__init__(self)
self.menuResults = None
# Initialize # Initialize
def initialize(self): def initialize(self):
@ -141,12 +152,7 @@ class MenuCarSelect(MenuStandard):
# Handler: buttonClicked # Handler: buttonClicked
def onStartButtonClicked(self, args): def onStartButtonClicked(self, args):
if not self.menuResults: self.switchTo(MenuManager.get("Loading"))
self.menuResults = MenuResults()
self.menuResults.initialize()
self.menuResults.setup()
self.menuResults.activate(previous=self)
def onBackButtonClicked(self, args): def onBackButtonClicked(self, args):

View file

@ -24,7 +24,7 @@ class MenuCredits(Menu):
singleton = None singleton = None
def getSingleton(): def instance():
if not MenuCredits.singleton: if not MenuCredits.singleton:
MenuCredits.singleton = MenuCredits() MenuCredits.singleton = MenuCredits()
@ -33,7 +33,7 @@ class MenuCredits(Menu):
return MenuCredits.singleton return MenuCredits.singleton
getSingleton = staticmethod(getSingleton) instance = staticmethod(instance)
def __init__(self): def __init__(self):

View file

@ -0,0 +1,38 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Menu factory.
"""
# Import: Menus manager
from menumanager import MenuManager
# Import: Menus
from menucredits import MenuCredits
from menuoptions import MenuOptions
from menuprofiles import MenuProfiles
from menumain import MenuMain
from menutrackselect import MenuTrackSelect
from menucarselect import MenuCarSelect
from menuloading import MenuLoading
from menuresults import MenuResults
class MenuFactory:
def initialize():
MenuManager.register("Credits", MenuCredits.instance)
MenuManager.register("Options", MenuOptions.instance)
MenuManager.register("Profiles", MenuProfiles.instance)
MenuManager.register("Main", MenuMain.instance)
MenuManager.register("TrackSelect", MenuTrackSelect.instance)
MenuManager.register("CarSelect", MenuCarSelect.instance)
MenuManager.register("Loading", MenuLoading.instance)
MenuManager.register("Results", MenuResults.instance)
initialize = staticmethod(initialize)

View file

@ -0,0 +1,170 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Loading menu.
"""
# Import: std
import sys
import time
import collections
# Import: PyCEGUI
import PyCEGUI
# Import: Configuration
from configuration import TheConfig
# Import: Menu
from menu import Menu
from menumanager import MenuManager
# Loading menu
class MenuLoading(Menu):
# Static data.
Msg = collections.namedtuple("Msg", "time, dur, txt")
Messages = \
(Msg(time= 0.0, dur=0.1, txt="Loading Forza track by A. Sumner (5784m long, 11m wide)"),
Msg(time= 0.1, dur=0.9, txt="Determining starting order"),
Msg(time= 1.0, dur=1.0, txt="Preparing starting grid"),
Msg(time= 2.0, dur=2.0, txt="Loading physics engine (Simu V2.1)"),
Msg(time= 4.0, dur=1.0, txt="Loading Aarne Fisher driver (Boxer 96)"),
Msg(time= 5.0, dur=1.0, txt="Loading Jacky Graham driver (Spirit 300)"),
Msg(time= 6.0, dur=1.0, txt="Loading Tony Davis driver (Cavallo 360)"),
Msg(time= 7.0, dur=2.0, txt="Loading graphics for Forza track"),
Msg(time= 9.0, dur=1.0, txt="Running pre-start"),
Msg(time=10.0, dur=2.0, txt="Loading graphics for all cars"),
Msg(time=12.0, dur=1.0, txt="Loading sounds for all cars"),
Msg(time=13.0, dur=1.0, txt="Ready"),
Msg(time=14.0, dur=1.0, txt="Set"),
Msg(time=15.0, dur=1.0, txt="Go"),
Msg(time=16.0, dur=0.0, txt="Now, you should be racing"))
# Singleton pattern.
singleton = None
def instance():
if not MenuLoading.singleton:
MenuLoading.singleton = MenuLoading()
MenuLoading.singleton.initialize()
MenuLoading.singleton.setup()
return MenuLoading.singleton
instance = staticmethod(instance)
def __init__(self):
Menu.__init__(self)
# Initialize
def initialize(self):
name = "MenuLoading"
# No code written for this menu : use mandatory layout.
window = Menu.initialize(self, name=name, title="Loading", layout="menuloading")
# Retrieve window descendants created here.
self.prbProgress = window.getChild(name + "/PrbProgress")
self.scpMessages = window.getChild(name + "/ScpMessages")
# Complete widget initialization.
return window
# connectHandlers
# - Wrapper method to define the subscription/listener relationships.
# - If there are a lot, it may behoove the coder to encapsulate them in methods, then call those methods here.
def connectHandlers(self):
# Inherited connections.
Menu.connectHandlers(self)
# Specific connections.
# None (onUpdate inherited).
def onActivated(self, args):
print("%s.onActivated" % self.__class__.__name__)
sts = Menu.onActivated(self, args)
self.actTime = self.currTime
self.curInd = -1
if self.scpMessages.getContentPane().getChildCount() > 0:
for ind in range(len(self.Messages)):
txtChld = self.scpMessages.getContentPane().getChild("MenuLoading/ScpMessages/Msg%d" % ind)
self.scpMessages.getContentPane().removeChildWindow(txtChld)
txtChld.destroy()
self.prbProgress.setProgress(0)
return sts
def onUpdate(self, args):
Menu.onUpdate(self, args)
sinceAct = (self.currTime - self.actTime) / 1000.0
#print("Since=%.2f, curr=%d" % (sinceAct, self.curInd))
if self.curInd < 0 \
or (sinceAct > self.Messages[self.curInd].time + self.Messages[self.curInd].dur):
# Next message : if none left, wait a little, and then switch to next menu.
if self.curInd == len(self.Messages) - 1:
if sinceAct > self.Messages[self.curInd].time + self.Messages[self.curInd].dur + 2.0:
self.switchTo(MenuManager.get("Results"))
else:
self.prbProgress.hide()
time.sleep(0.01) # Let the CPU keep cool (no hurry).
# Next message : if at least one left ...
else:
self.curInd = self.curInd + 1
# Create and add the static text for the new message.
scpItem = PyCEGUI.WindowManager.getSingleton().createWindow("CEGUIDemo/StaticText", "MenuLoading/ScpMessages/Msg%d" % self.curInd)
scpItem.setText(self.Messages[self.curInd].txt + " ...")
scpItem.setProperty("FrameEnabled", "false")
scpItem.setProperty("BackgroundEnabled", "false")
scpItem.setXPosition(PyCEGUI.UDim(0.0, 0.0))
scpItem.setYPosition(PyCEGUI.UDim(1.0 + self.curInd * 0.10, 0.0))
scpItem.setWidth(PyCEGUI.UDim(1.0, 0.0))
scpItem.setHeight(PyCEGUI.UDim(0.10, 0.0))
self.scpMessages.addChildWindow(scpItem)
# Adjust alpha for all messages.
nChildren = self.scpMessages.getContentPane().getChildCount()
for chldInd in range(nChildren):
txtChld = self.scpMessages.getContentPane().getChildAtIdx(chldInd)
txtChld.setAlpha(0.85 ** (nChildren - 1 - chldInd))
# Scroll down to show the added static text.
self.scpMessages.setVerticalScrollPosition(1.0)
# Hide any scrollbar (might get shown after every call to addChildWindow).
self.scpMessages.getVertScrollbar().hide()
self.scpMessages.getHorzScrollbar().hide()
# Reset progress-bar.
self.prbProgress.setProgress(0)
self.prbProgress.show()
else:
# Update progress-bar.
progress = (sinceAct - self.Messages[self.curInd].time) / self.Messages[self.curInd].dur
self.prbProgress.setProgress(progress)

View file

@ -16,16 +16,14 @@ import PyCEGUI
# Import: Configuration # Import: Configuration
from configuration import TheConfig from configuration import TheConfig
# Import: Menu # Import: Menus
from menustandard import MenuStandard from menustandard import MenuStandard
from menucredits import MenuCredits from menumanager import MenuManager
from menuoptions import MenuOptions
from menuprofiles import MenuProfiles
from menutrackselect import MenuTrackSelect
# Main menu # Main menu
class MenuMain(MenuStandard): class MenuMain(MenuStandard):
# Singleton pattern.
singleton = None singleton = None
def instance(): def instance():
@ -41,9 +39,7 @@ class MenuMain(MenuStandard):
def __init__(self): def __init__(self):
MenuStandard.__init__(self, MenuCredits, MenuOptions, MenuProfiles) MenuStandard.__init__(self)
self.menuTrackSelect = None
# Initialize # Initialize
def initialize(self): def initialize(self):
@ -142,21 +138,12 @@ class MenuMain(MenuStandard):
# Handler: buttonClicked # Handler: buttonClicked
def onPracticeButtonClicked(self, args): def onPracticeButtonClicked(self, args):
self.activateTrackSelectMenu() self.switchTo(MenuManager.get("TrackSelect"))
def onQuickRaceButtonClicked(self, args): def onQuickRaceButtonClicked(self, args):
self.activateTrackSelectMenu() self.switchTo(MenuManager.get("TrackSelect"))
def onSingleEventButtonClicked(self, args): def onSingleEventButtonClicked(self, args):
self.activateTrackSelectMenu() self.switchTo(MenuManager.get("TrackSelect"))
def activateTrackSelectMenu(self):
if not self.menuTrackSelect:
self.menuTrackSelect = MenuTrackSelect()
self.menuTrackSelect.initialize()
self.menuTrackSelect.setup()
self.switchTo(self.menuTrackSelect)

View file

@ -0,0 +1,24 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Menu manager.
A dictionary of menu instance() functions (see MenuFactory)
"""
class MenuManager:
menus = { }
def register(menuName, menuFactory):
MenuManager.menus[menuName] = menuFactory
register = staticmethod(register)
def get(menuName):
return MenuManager.menus[menuName]()
get = staticmethod(get)

View file

@ -24,7 +24,7 @@ class MenuOptions(Menu):
singleton = None singleton = None
def getSingleton(): def instance():
if not MenuOptions.singleton: if not MenuOptions.singleton:
MenuOptions.singleton = MenuOptions() MenuOptions.singleton = MenuOptions()
@ -33,7 +33,7 @@ class MenuOptions(Menu):
return MenuOptions.singleton return MenuOptions.singleton
getSingleton = staticmethod(getSingleton) instance = staticmethod(instance)
def __init__(self): def __init__(self):

View file

@ -22,9 +22,10 @@ from menu import Menu
# Profiles menu # Profiles menu
class MenuProfiles(Menu): class MenuProfiles(Menu):
# Singleton pattern.
singleton = None singleton = None
def getSingleton(): def instance():
if not MenuProfiles.singleton: if not MenuProfiles.singleton:
MenuProfiles.singleton = MenuProfiles() MenuProfiles.singleton = MenuProfiles()
@ -33,7 +34,7 @@ class MenuProfiles(Menu):
return MenuProfiles.singleton return MenuProfiles.singleton
getSingleton = staticmethod(getSingleton) instance = staticmethod(instance)
def __init__(self): def __init__(self):

View file

@ -16,12 +16,14 @@ import PyCEGUI
# Import: Configuration # Import: Configuration
from configuration import TheConfig from configuration import TheConfig
# Import: Menu # Import: Menus
from menu import Menu from menu import Menu
from menumanager import MenuManager
# Results menu # Results menu
class MenuResults(Menu): class MenuResults(Menu):
# Static data.
CIdRank = 0 CIdRank = 0
CIdAdvance = 1 CIdAdvance = 1
CIdDriver = 2 CIdDriver = 2
@ -44,9 +46,10 @@ class MenuResults(Menu):
(6, -4, "Don Nelson", "USR", "Lynx 220", "39:15:559", "1:20.602", 36, 285, 4500, 4), (6, -4, "Don Nelson", "USR", "Lynx 220", "39:15:559", "1:20.602", 36, 285, 4500, 4),
] ]
# Singleton pattern.
singleton = None singleton = None
def getSingleton(): def instance():
if not MenuResults.singleton: if not MenuResults.singleton:
MenuResults.singleton = MenuResults() MenuResults.singleton = MenuResults()
@ -55,7 +58,7 @@ class MenuResults(Menu):
return MenuResults.singleton return MenuResults.singleton
getSingleton = staticmethod(getSingleton) instance = staticmethod(instance)
def __init__(self): def __init__(self):
@ -119,7 +122,7 @@ class MenuResults(Menu):
def onContinueButtonClicked(self, args): def onContinueButtonClicked(self, args):
self.back() self.switchTo(MenuManager.get("Main"))
def onKeyDown(self, keyArgs): def onKeyDown(self, keyArgs):

View file

@ -15,26 +15,21 @@ import sys
# Import: PyCEGUI # Import: PyCEGUI
import PyCEGUI import PyCEGUI
# Import: Menu # Import: Menus and dialogs
from menu import Menu from menu import Menu
from dialogs import DialogOKCancel from dialogs import DialogOKCancel
# Import: MenuManager
from menumanager import MenuManager
# Standard menu # Standard menu
class MenuStandard(Menu): class MenuStandard(Menu):
def __init__(self, clsMenuCredits, clsMenuOptions, clsMenuProfiles): def __init__(self):
Menu.__init__(self) Menu.__init__(self)
self.clsMenuCredits = clsMenuCredits
self.clsMenuOptions = clsMenuOptions
self.clsMenuProfiles = clsMenuProfiles
self.menuCredits = None
self.menuProfiles = None
self.menuOptions = None
# Initialize # Initialize
def initialize(self, name, title=None, layout=None, background=None): def initialize(self, name, title=None, layout=None, background=None):
@ -117,19 +112,19 @@ class MenuStandard(Menu):
# Handlers # Handlers
def onCreditsButtonClicked(self, args): def onCreditsButtonClicked(self, args):
self.switchTo(self.clsMenuCredits.getSingleton()) self.switchTo(MenuManager.get("Credits"))
def onProfilesButtonClicked(self, args): def onProfilesButtonClicked(self, args):
self.switchTo(self.clsMenuProfiles.getSingleton()) self.switchTo(MenuManager.get("Profiles"))
def onOptionsButtonClicked(self, args): def onOptionsButtonClicked(self, args):
self.switchTo(self.clsMenuOptions.getSingleton()) self.switchTo(MenuManager.get("Options"))
def onExitButtonClicked(self, args): def onExitButtonClicked(self, args):
DialogOKCancel.getSingleton().show(self.window, self.onOKCancelClosed, "Really quit ?") DialogOKCancel.instance().show(self.window, self.onOKCancelClosed, "Really quit ?")
def onOKCancelClosed(self, reallyQuit=False): def onOKCancelClosed(self, reallyQuit=False):

View file

@ -19,14 +19,13 @@ from configuration import TheConfig
# Import: Menu # Import: Menu
from menustandard import MenuStandard from menustandard import MenuStandard
from menucredits import MenuCredits from menumanager import MenuManager
from menuoptions import MenuOptions
from menuprofiles import MenuProfiles
from menucarselect import MenuCarSelect
# Track selection menu # Track selection menu
class MenuTrackSelect(MenuStandard): class MenuTrackSelect(MenuStandard):
# Static data.
Track = collections.namedtuple("Track", "name, description, authors, length, width, nPits, outline, preview") Track = collections.namedtuple("Track", "name, description, authors, length, width, nPits, outline, preview")
Tracks = \ Tracks = \
@ -74,11 +73,23 @@ class MenuTrackSelect(MenuStandard):
} }
} }
# Singleton pattern.
singleton = None
def instance():
if not MenuTrackSelect.singleton:
MenuTrackSelect.singleton = MenuTrackSelect()
MenuTrackSelect.singleton.initialize()
MenuTrackSelect.singleton.setup()
return MenuTrackSelect.singleton
instance = staticmethod(instance)
def __init__(self): def __init__(self):
MenuStandard.__init__(self, MenuCredits, MenuOptions, MenuProfiles) MenuStandard.__init__(self)
self.menuCarSelect = None
# Initialize # Initialize
def initialize(self): def initialize(self):
@ -136,12 +147,7 @@ class MenuTrackSelect(MenuStandard):
# Handler: buttonClicked # Handler: buttonClicked
def onNextButtonClicked(self, args): def onNextButtonClicked(self, args):
if not self.menuCarSelect: self.switchTo(MenuManager.get("CarSelect"))
self.menuCarSelect = MenuCarSelect()
self.menuCarSelect.initialize()
self.menuCarSelect.setup()
self.menuCarSelect.activate(previous=self)
def onBackButtonClicked(self, args): def onBackButtonClicked(self, args):