def setText(self, formattedText): """Set new HTML content into the formatted text widget.""" w = self.getWxWidget() if self.useHtml: fontName = None fontSize = None if st.isDefined("style-html-font"): fontName = st.getSystemString("style-html-font") if st.isDefined("style-html-size"): fontSize = st.getSystemString("style-html-size") if fontName != None or fontSize != None: fontElem = "<font" if fontName != None: fontElem += ' face="%s"' % fontName if fontSize != None: fontElem += ' size="%s"' % fontSize fontElem += ">" else: fontElem = None #color = wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT) #print color #formattedText = '<body bgcolor="#%02x%02x%02x">' \ # % (color.Red(), color.Green(), color.Blue()) \ # + formattedText + '</body>' if fontElem == None: w.SetPage(uniConv(formattedText)) else: w.SetPage(uniConv(fontElem + formattedText + '</font>'))
def setValue(self, settingId, newValue, doNotify=True): """Set the value of the setting in this profile. @param settingId Identifier of the setting to set. @param newValue New value for the setting (as a string). @param doNotify If True, a notification event will be sent. """ value = None if st.isDefined(settingId): # System settings are not saved into profiles. return # Change the value of an existing Value. for v in self.values: if v.getId() == settingId: value = v if value: value.setValue(newValue) else: value = Value(settingId, newValue) self.values.append(value) # A kludge for detecting a change of the language. if self is profdb.defaults and settingId == 'language': language.change(newValue) # Send a notification of this. if doNotify: events.send(events.ValueNotify(settingId, newValue, self))
def getValue(self, id, fallbackToDefaults=True): """Returns the Value for the given setting. Falls back to the defaults profile. @param id Setting identifier. @param fallbackToDefaults If True, the value is retrieved from the Defaults profile if it isn't defined in this one. """ defaults = profdb.defaults # If this is a system setting, let's consult the system # configuration. if st.isDefined(id): return Value(id, st.getSystemString(id)) # First look in the Values in this profile. for v in self.values: if v.getId() == id: return v if id == 'game-mode': # We can look for the game mode in the system profile. sysProfFileName = os.path.join(paths.getSystemPath(paths.PROFILES), self.getFileName()) if os.path.exists(sysProfFileName): try: p = cfparser.FileParser(sysProfFileName) while True: element = p.get() if element.isKey() and element.getName() == 'game-mode': return Value(element.getName(), element.getValue()) except cfparser.OutOfElements: # The file ended normally. pass # Fall back to the Defaults profile. if fallbackToDefaults and self is not defaults: return defaults.getValue(id) elif self is defaults: # See if the setting itself has a default for this. try: setting = st.getSetting(id) if setting.getDefault(): return Value(id, str(setting.getDefault())) except: pass # No Value for this setting could be found. return None else: # A normal profile with no value for this setting. return None
def generateOptions(profile): """Generate a text string of all the command line options used when launching a game. @param profile A profiles.Profile object. The values of settings are retrieved from here. @return All the options in a single string. Returns None if there is an unresolved addon conflict. """ clearLog() # Determine which addons are in use. The final list of addons # includes all the addons that must be loaded at launch (defaults; # required parts of boxes). usedAddonIds = profile.getFinalAddons() usedAddons = map(lambda id: ao.get(id), usedAddonIds) # Form the command line. cmdLine = [] # Determine the settings that apply to the components and # addons. effectiveSettings = st.getCompatibleSettings(profile) # Are there any system-specific options defined? if st.isDefined('common-options'): cmdLine.append(ex.evaluate(st.getSystemString('common-options'), None)) # All profiles use the same runtime directory. if st.isDefined('doomsday-base'): basePath = os.path.abspath(st.getSystemString('doomsday-base')) cmdLine.append('-basedir ' + paths.quote(basePath)) # Determine the components used by the profile. for compId in profile.getComponents(): # Append the component's options to the command line as-is. cmdLine.append( st.getComponent(compId).getOption() ) # Resolve conflicting addons by letting the user choose between # them. if not resolveAddonConflicts(usedAddons, profile): # Launch aborted! return None # Get the command line options for loading all the addons. for addon in usedAddons: params = addon.getCommandLine(profile).strip() if params: cmdLine.append(params) # Update IDs of used addons. usedAddonsId = map(lambda a: a.getId(), usedAddons) # Get the command line options from each setting. for setting in effectiveSettings: # If the setting's required addons are not being loaded, skip # this setting. skipThis = False for req in setting.getRequiredAddons(): if req not in usedAddonIds: skipThis = True break if skipThis: continue # All settings can't be used at all times. In # case of a conflict, some of the settings are ignored. if setting.isEnabled(profile): params = setting.getCommandLine(profile).strip() if params: cmdLine.append(params) # Send a launch options notification. This is done so that # plugins are able to observe/modify the list of launch options. events.send(events.LaunchNotify(cmdLine)) return string.join(cmdLine, ' ')
def __init__(self, title): """Initialize the main window. @param title Title for the main window. """ from sb.widget.area import Area # Commands for the popup menu. self.menuCommandMap = {} # FIXME: Layout is botched. Way too wide. if host.isMac(): initialSize = (769, 559) elif host.isUnix(): initialSize = (900, 610) else: initialSize = (733, 527) # The configuration may define a window size. if st.isDefined('main-width'): initialSize = (st.getSystemInteger('main-width'), initialSize[1]) if st.isDefined('main-height'): initialSize = (initialSize[0], st.getSystemInteger('main-height')) # The configuration can also specify the window position. if st.isDefined('main-x') and st.isDefined('main-y'): initialPos = (st.getSystemInteger('main-x'), st.getSystemInteger('main-y')) else: initialPos = None wx.Frame.__init__(self, None, -1, title, size=initialSize) #self.SetExtraStyle(wx.FRAME_EX_METAL) #self.Create(None, -1, title, size=initialSize) if initialPos is not None: self.MoveXY(*initialPos) else: self.Center() # Set the icon for the frame. icon = wx.Icon('graphics/snowberry.ico', wx.BITMAP_TYPE_ICO) self.SetIcon(icon) #self.Iconize(True) #self.Hide() SPLITTER_ID = 9501 PROF_SPLITTER_ID = 9502 self.splitter = None self.profSplitter = None # The parentWin is where the profSplitter and the help panel # are inside. parentWin = self if USE_HELP_AREA: # The help area is in a splitter. self.splitter = wx.SplitterWindow(self, SPLITTER_ID, style=wx.SP_3DSASH) self.splitter.SetMinimumPaneSize(10) parentWin = self.splitter if not USE_MINIMAL_PROFILE: self.profSplitter = wx.SplitterWindow(parentWin, PROF_SPLITTER_ID, style=wx.SP_3DSASH)# | #wx.SP_NO_XP_THEME) self.profSplitter.SetMinimumPaneSize(100) # Profile panel. profilePanel = wx.Panel(self.profSplitter, -1, style=wx.NO_BORDER | wx.CLIP_CHILDREN) area = Area(PROFILES, profilePanel, ALIGN_VERTICAL, 10) _newArea(area) # Create panels inside the profile splitter. self.mainPanel = MainPanel(self.profSplitter) else: profilePanel = None self.mainPanel = MainPanel(parentWin) getArea(TABS).setWeight(0) profArea = getArea(TABS).createArea(alignment=ALIGN_HORIZONTAL, border=12) profArea.setId(PROFILES) _newArea(profArea) getArea(TABS).setWeight(1) getArea(TABS).setBorderDirs(BORDER_NOT_TOP) # Create a TabArea into the TABS area. self.mainPanel.tabs = getArea(TABS).createTabArea( 'tab', style=sb.widget.tab.TabArea.STYLE_BASIC) if st.isDefined('main-split-position'): self.splitPos = INITIAL_SASH_POS else: self.splitPos = None self.profSplitPos = INITIAL_PROFILE_SASH_POS # Create the help area. if self.splitter: self.helpPanel = wx.Panel(self.splitter, -1, style = wx.NO_BORDER | wx.CLIP_CHILDREN) self.helpPanel.SetBackgroundColour(wx.WHITE) _newArea( Area(HELP, self.helpPanel, ALIGN_VERTICAL, border=4) ) # Init the splitter. leftSide = self.profSplitter if not leftSide: leftSide = self.mainPanel self.splitter.SplitVertically(leftSide, self.helpPanel, -INITIAL_SASH_POS) else: self.helpPanel = None if self.profSplitter: self.profSplitter.SplitVertically(profilePanel, self.mainPanel, self.profSplitPos) # Listen for changes in the sash position. wx.EVT_SPLITTER_SASH_POS_CHANGED(self, SPLITTER_ID, self.onSplitChange) wx.EVT_SPLITTER_SASH_POS_CHANGED(self, PROF_SPLITTER_ID, self.onProfSplitChange) # The main panel should be globally accessible. global mainPanel mainPanel = self.mainPanel # Intercept the window close event. wx.EVT_CLOSE(self, self.onWindowClose) # Maintain the splitter position. wx.EVT_SIZE(self, self.onWindowSize) # Listen to some commands. events.addCommandListener(self.handleCommand, ['quit']) # Create a menu bar. self.menuBar = wx.MenuBar()
self.SetSizer(aSizer) self.SetAutoLayout(True) def getTabs(self): """Returns the TabArea widget that contains the main tabbing area.""" return self.tabs def updateLayout(self): self.verticalSizer.Layout() INITIAL_SASH_POS = 180 INITIAL_PROFILE_SASH_POS = 190 if st.isDefined('main-split-position'): INITIAL_SASH_POS = st.getSystemInteger('main-split-position') if st.isDefined('main-profile-split-position'): INITIAL_PROFILE_SASH_POS = st.getSystemInteger( 'main-profile-split-position') class MainFrame (wx.Frame): """The main frame is the main window of Snowberry.""" def __init__(self, title): """Initialize the main window. @param title Title for the main window. """
def __init__(self, title): """Initialize the main window. @param title Title for the main window. """ from sb.widget.area import Area # Commands for the popup menu. self.menuCommandMap = {} # FIXME: Layout is botched. Way too wide. if host.isMac(): initialSize = (769, 559) elif host.isUnix(): initialSize = (900, 610) else: initialSize = (733, 527) # The configuration may define a window size. if st.isDefined('main-width'): initialSize = (st.getSystemInteger('main-width'), initialSize[1]) if st.isDefined('main-height'): initialSize = (initialSize[0], st.getSystemInteger('main-height')) # The configuration can also specify the window position. if st.isDefined('main-x') and st.isDefined('main-y'): initialPos = (st.getSystemInteger('main-x'), st.getSystemInteger('main-y')) else: initialPos = None wx.Frame.__init__(self, None, -1, title, size=initialSize) #self.SetExtraStyle(wx.FRAME_EX_METAL) #self.Create(None, -1, title, size=initialSize) if initialPos is not None: self.MoveXY(*initialPos) else: self.Center() # Set the icon for the frame. icon = wx.Icon('graphics/snowberry.ico', wx.BITMAP_TYPE_ICO) self.SetIcon(icon) #self.Iconize(True) #self.Hide() SPLITTER_ID = 9501 PROF_SPLITTER_ID = 9502 self.splitter = None self.profSplitter = None # The parentWin is where the profSplitter and the help panel # are inside. parentWin = self if USE_HELP_AREA: # The help area is in a splitter. self.splitter = wx.SplitterWindow(self, SPLITTER_ID, style=wx.SP_3DSASH) self.splitter.SetMinimumPaneSize(10) parentWin = self.splitter if not USE_MINIMAL_PROFILE: self.profSplitter = wx.SplitterWindow(parentWin, PROF_SPLITTER_ID, style=wx.SP_3DSASH) # | #wx.SP_NO_XP_THEME) self.profSplitter.SetMinimumPaneSize(100) # Profile panel. profilePanel = wx.Panel(self.profSplitter, -1, style=wx.NO_BORDER | wx.CLIP_CHILDREN) area = Area(PROFILES, profilePanel, ALIGN_VERTICAL, 10) _newArea(area) # Create panels inside the profile splitter. self.mainPanel = MainPanel(self.profSplitter) else: profilePanel = None self.mainPanel = MainPanel(parentWin) getArea(TABS).setWeight(0) profArea = getArea(TABS).createArea(alignment=ALIGN_HORIZONTAL, border=12) profArea.setId(PROFILES) _newArea(profArea) getArea(TABS).setWeight(1) getArea(TABS).setBorderDirs(BORDER_NOT_TOP) # Create a TabArea into the TABS area. self.mainPanel.tabs = getArea(TABS).createTabArea( 'tab', style=sb.widget.tab.TabArea.STYLE_BASIC) if st.isDefined('main-split-position'): self.splitPos = INITIAL_SASH_POS else: self.splitPos = None self.profSplitPos = INITIAL_PROFILE_SASH_POS # Create the help area. if self.splitter: self.helpPanel = wx.Panel(self.splitter, -1, style=wx.NO_BORDER | wx.CLIP_CHILDREN) self.helpPanel.SetBackgroundColour(wx.WHITE) _newArea(Area(HELP, self.helpPanel, ALIGN_VERTICAL, border=4)) # Init the splitter. leftSide = self.profSplitter if not leftSide: leftSide = self.mainPanel self.splitter.SplitVertically(leftSide, self.helpPanel, -INITIAL_SASH_POS) else: self.helpPanel = None if self.profSplitter: self.profSplitter.SplitVertically(profilePanel, self.mainPanel, self.profSplitPos) # Listen for changes in the sash position. wx.EVT_SPLITTER_SASH_POS_CHANGED(self, SPLITTER_ID, self.onSplitChange) wx.EVT_SPLITTER_SASH_POS_CHANGED(self, PROF_SPLITTER_ID, self.onProfSplitChange) # The main panel should be globally accessible. global mainPanel mainPanel = self.mainPanel # Intercept the window close event. wx.EVT_CLOSE(self, self.onWindowClose) # Maintain the splitter position. wx.EVT_SIZE(self, self.onWindowSize) # Listen to some commands. events.addCommandListener(self.handleCommand, ['quit']) # Create a menu bar. self.menuBar = wx.MenuBar()
self.SetSizer(aSizer) self.SetAutoLayout(True) def getTabs(self): """Returns the TabArea widget that contains the main tabbing area.""" return self.tabs def updateLayout(self): self.verticalSizer.Layout() INITIAL_SASH_POS = 180 INITIAL_PROFILE_SASH_POS = 190 if st.isDefined('main-split-position'): INITIAL_SASH_POS = st.getSystemInteger('main-split-position') if st.isDefined('main-profile-split-position'): INITIAL_PROFILE_SASH_POS = st.getSystemInteger( 'main-profile-split-position') class MainFrame(wx.Frame): """The main frame is the main window of Snowberry.""" def __init__(self, title): """Initialize the main window. @param title Title for the main window. """ from sb.widget.area import Area