def __init__( self, parent = None, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None, ): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity self.dlgTitle = "Settings of '%s'" % pyre_component.name #self.dlgTitle += "\n When done, type <*> and then <enter>" if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.choices = [] self.get_action_window() return
def _getOptions_r(self, prefix, component): inventory = component.inventory invp = InventoryProxy( inventory ) ret = [] if prefix == '': name = invp.name() else: name = '.'.join( [prefix, invp.name() ] ) component_info = name, component.__class__.__doc__ opts = self._getOptions( name, invp ) ret.append( (component_info, opts) ) for fac in invp.facilities(self.verbosity): component = fac.component() opts = self._getOptions_r( name, component ) ret += opts continue return ret
def _getOptions_r(self, prefix, component): inventory = component.inventory invp = InventoryProxy(inventory) ret = [] if prefix == '': name = invp.name() else: name = '.'.join([prefix, invp.name()]) component_info = name, component.__class__.__doc__ opts = self._getOptions(name, invp) ret.append((component_info, opts)) for fac in invp.facilities(self.verbosity): component = fac.component() opts = self._getOptions_r(name, component) ret += opts continue return ret
def main(self, appname, verbosity = 1): self.verbosity = verbosity invp = InventoryProxy( self.inventory ) app_info = self.name, self.__class__.__doc__ options = [(app_info, self._getOptions( '', invp ))] for fac in invp.facilities(self.verbosity): component = fac.component() opts = self._getOptions_r( '', component ) options += opts continue cmdtokens = [appname] for comp_info, opts in options: for opt in opts: cmdtokens.append( '--%s=%r' % (opt.name, opt.default) ) continue continue fullcmd = ' '.join( cmdtokens ) pre = [ "NAME", " %s" % (appname,), "", "SYNOPSIS", " %s [options]" % appname, "", "Command With All Options And Their Defaults:", " %s" % fullcmd, "", "", "ALL OPTIONS", " General Description", " All options are in the form", " --<component>.<property>=<value>", " In the following, a description of the component", " will be given first, and then all options of that", " component will be presented.", "", "", ] print '\n'.join( pre ) self._printOptions( options ) return
def main(self, appname, verbosity=1): self.verbosity = verbosity invp = InventoryProxy(self.inventory) app_info = self.name, self.__class__.__doc__ options = [(app_info, self._getOptions('', invp))] for fac in invp.facilities(self.verbosity): component = fac.component() opts = self._getOptions_r('', component) options += opts continue cmdtokens = [appname] for comp_info, opts in options: for opt in opts: cmdtokens.append('--%s=%r' % (opt.name, opt.default)) continue continue fullcmd = ' '.join(cmdtokens) pre = [ "NAME", " %s" % (appname, ), "", "SYNOPSIS", " %s [options]" % appname, "", "Command With All Options And Their Defaults:", " %s" % fullcmd, "", "", "ALL OPTIONS", " General Description", " All options are in the form", " --<component>.<property>=<value>", " In the following, a description of the component", " will be given first, and then all options of that", " component will be presented.", "", "", ] print '\n'.join(pre) self._printOptions(options) return
def InventoryDialogLoop( parent, pyre_component, toolkit, verbosity = 1): InventoryDialog = toolkit.InventoryDialog dlg = InventoryDialog( parent = parent, pyre_component = pyre_component, pyre_inventory = pyre_component.inventory, verbosity = verbosity, toolkit = toolkit) while 1: result = dlg.ShowModal() if result != toolkit.ID_OK : break error = False inventory = InventoryProxy(pyre_component.inventory) for prop in inventory.properties(verbosity = verbosity): newValue = dlg.getUserInput( prop ) inventory.setProperty( prop.name(), newValue ) continue for fac in inventory.facilities(verbosity = verbosity): newName, newComponent = dlg.getUserInput( fac ) if newComponent != fac.value(): fac.setValue( newComponent ) continue if not error: break continue dlg.Destroy() print return result
def __init__(self, parent=None, pyre_component=None, pyre_inventory=None, verbosity=1, toolkit=None, indentLevel=0): self.indentLevel = indentLevel self.indentation = indentation = self.indent * self.indentLevel self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity apptitle = "Configure '%s'" % pyre_component.name print indentation, '=' * len(apptitle) print indentation, apptitle print indentation, '=' * len(apptitle) if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.get_action_window() return
def _find_inventory(invp, path): """get inventory proxy of a component inventory invp: proxy of an inventory path: path in the inventory that leads to the component Ex: invp: reducer normalizer _find_inventory( invp, 'reducer/normalizer' ) --> proxy( normalizer.inventory ) """ if path is None or len(path) == 0: return invp from pyregui.inventory.proxies.InventoryProxy import InventoryProxy paths = path.split('/') if len(paths) == 0: return invp name = paths[0] compinvp = InventoryProxy(invp.getComponentInventory(name)) return _find_inventory(compinvp, '/'.join(paths[1:]))
def __init__( self, parent = None, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None, indentLevel = 0 ): self.indentLevel = indentLevel self.indentation = indentation = self.indent * self.indentLevel self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity apptitle = "Configure '%s'" % pyre_component.name print indentation, '='*len(apptitle) print indentation, apptitle print indentation, '='*len(apptitle) if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.get_action_window() return
def __init__(self, parent = None, size = (600,400), # wx.DefaultSize, pos = wx.DefaultPosition, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None ): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity #apptitle = "Component: %s" % pyre_component.name apptitle = "Settings of %s" % pyre_component.name pre = wx.PreDialog() pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) pre.Create(parent, -1, apptitle, pos, size, style) self.PostCreate(pre) # dialog created. get the main view configure_panel, cpsize = self.get_action_window() # add ok and cancel buttons to sizer ok = wx.Button(self, wx.ID_OK, "OK") cancel = wx.Button(self, wx.ID_CANCEL, "Cancel") helpbutton = wx.Button(self, -1, "Help") if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.Bind(wx.EVT_BUTTON, self.OnHelpButton(docstr), helpbutton) okcancelSizer = wx.BoxSizer(wx.HORIZONTAL) okcancelSizer.Add(ok) okcancelSizer.AddSpacer( (7,7) ) okcancelSizer.Add(cancel) topSizer = wx.BoxSizer( wx.HORIZONTAL ) topSizer.Add( okcancelSizer ) topSizer.AddSpacer( (50,40) ) topSizer.Add( helpbutton ) sizer = wx.BoxSizer( wx.VERTICAL ) sizer.Add( topSizer ) sizer.Add( configure_panel, 1, wx.GROW|wx.ALL, 5)#, 0, wx.FIXED_MINSIZE ) # now paint the screen border = wx.BoxSizer() border.Add(sizer, 1, wx.GROW|wx.ALL, 25) border.Fit(self) self.SetSizer(border) w, h = cpsize w+=150 h+=200 w = min(w, 800) h = min(h, 600) w = max(w, 300) h = max(h, 200) self.SetSize( (w,h) ) self.SetAutoLayout( 1 ) #self.Layout() #print "%s.__init__ done" % self.__class__.__name__ return
def find_inventory(app, path): print "find_inventory", path from pyregui.inventory.proxies.InventoryProxy import InventoryProxy appinvp = InventoryProxy(app.inventory) return _find_inventory(appinvp, path)
class InventoryDialog(wx.Dialog): def registerInputBox(self, trait, box): self._registry.register("inputBox", trait, box) return def getUserInput(self, trait): inputBox = self._registry.get("inputBox", trait) return inputBox.GetValue().strip() def setUserInput(self, trait, value): inputBox = self._registry.get("inputBox", trait) inputBox.SetValue(value) return def getGuiElement(self, category, trait): return self._registry.get(category, trait) def registerGuiElement(self, category, trait, element): self._registry.register(category, trait, element) return def __init__( self, parent=None, size=(600, 400), # wx.DefaultSize, pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, pyre_component=None, pyre_inventory=None, verbosity=1, toolkit=None): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity #apptitle = "Component: %s" % pyre_component.name apptitle = "Settings of %s" % pyre_component.name pre = wx.PreDialog() pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) pre.Create(parent, -1, apptitle, pos, size, style) self.PostCreate(pre) # dialog created. get the main view configure_panel, cpsize = self.get_action_window() # add ok and cancel buttons to sizer ok = wx.Button(self, wx.ID_OK, "OK") cancel = wx.Button(self, wx.ID_CANCEL, "Cancel") helpbutton = wx.Button(self, -1, "Help") if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.Bind(wx.EVT_BUTTON, self.OnHelpButton(docstr), helpbutton) okcancelSizer = wx.BoxSizer(wx.HORIZONTAL) okcancelSizer.Add(ok) okcancelSizer.AddSpacer((7, 7)) okcancelSizer.Add(cancel) topSizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(okcancelSizer) topSizer.AddSpacer((50, 40)) topSizer.Add(helpbutton) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(topSizer) sizer.Add(configure_panel, 1, wx.GROW | wx.ALL, 5) #, 0, wx.FIXED_MINSIZE ) # now paint the screen border = wx.BoxSizer() border.Add(sizer, 1, wx.GROW | wx.ALL, 25) border.Fit(self) self.SetSizer(border) w, h = cpsize w += 150 h += 200 w = min(w, 800) h = min(h, 600) w = max(w, 300) h = max(h, 200) self.SetSize((w, h)) self.SetAutoLayout(1) #self.Layout() #print "%s.__init__ done" % self.__class__.__name__ return def get_action_window(self): traits = self.inventory.traits(verbosity=self.verbosity) import wx.lib.scrolledpanel as scrolled width = 600 height = min(len(traits) * 50, 300) dialog = self class Panel(scrolled.ScrolledPanel): def __getattribute__(self, name): try: return object.__getattribute__(self, name) except: return getattr(dialog, name) panel = Panel( self, -1, #size=(width,height ), style=wx.TAB_TRAVERSAL, #|wx.SUNKEN_BORDER, name="configuration") ## panel.registerInputBox = self.registerInputBox ## panel.registerGuiElement = self.registerGuiElement ## panel.getUserInput = self.getUserInput ## panel.getGuiElement = self.getGuiElement ## panel.setUserInput = self.setUserInput ## panel.inventory = self.inventory inputBoxFactory = self.toolkit.InputBoxFactory(panel) setButtonFactory = self.toolkit.SetButtonFactory(panel) labelFactory = self.toolkit.TraitLabelFactory(panel) sizer = wx.GridBagSizer(vgap=10, hgap=5) row = 0 for trait in traits: l = labelFactory(trait) sizer.Add(l, pos=(row, 0), flag=wx.ALIGN_RIGHT | wx.GROW | wx.ALL) t = inputBoxFactory(trait) sizer.Add(t, pos=(row, 1), flag=wx.GROW) b = setButtonFactory(trait) if b: sizer.Add(b, pos=(row, 2), flag=wx.GROW | wx.ALL) row = row + 1 continue boxSizer = wx.BoxSizer(wx.VERTICAL) boxSizer.Add(sizer, 1, wx.GROW | wx.ALL, 5) panel.SetSizer(boxSizer) w, h = panel.GetBestVirtualSize() #boxSizer.SetSizeHints( panel.GetParent() ) panel.SetAutoLayout(1) panel.SetupScrolling() return panel, (w, h) def OnHelpButton(self, docstr, title="Pyre Docstring"): def _(event): dlg = wx.lib.dialogs.ScrolledMessageDialog(self, docstr, title) dlg.ShowModal() return _
def InventoryDialogLoop(parent, pyre_component, toolkit, verbosity=1): InventoryDialog = toolkit.InventoryDialog dlg = InventoryDialog(parent=parent, pyre_component=pyre_component, pyre_inventory=pyre_component.inventory, verbosity=verbosity, toolkit=toolkit) #save current values of fields inventory = InventoryProxy(pyre_component.inventory) oldvalues = {} for prop in inventory.properties(verbosity=verbosity): oldvalues[prop.name()] = dlg.getUserInput(prop) continue while 1: result = dlg.ShowModal() if result != wx.ID_OK: break inventory = InventoryProxy(pyre_component.inventory) VALID = True for prop in inventory.properties(verbosity=verbosity): newValue = dlg.getUserInput(prop) if newValue is None: continue if newValue == oldvalues[prop.name()]: continue try: inventory.setProperty(prop.name(), newValue) except Exception, msg: newmsg = "%s\n" % msg newmsg += "Unable to set property %s to %s" % (prop.name(), newValue) wx.MessageBox(newmsg) dlg.setUserInput(prop, prop.valueAsString()) VALID = False break if not VALID: continue for fac in inventory.facilities(verbosity=verbosity): facName = fac.name() componentName = inventory.getValueAsString(fac.name()) newComponentName = dlg.getUserInput(fac) if newComponentName is None: continue if newComponentName != componentName: msg = \ "Error: facility %s has been changed to %s, " \ "but it is not configured.\n" \ "Please configure it using the Set button\n" % ( facName, newComponentName,) wx.MessageBox(msg) VALID = False break continue if VALID: inventory.notifyObservers() break continue
def __init__( self, parent=None, size=(600, 400), # wx.DefaultSize, pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, pyre_component=None, pyre_inventory=None, verbosity=1, toolkit=None): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity #apptitle = "Component: %s" % pyre_component.name apptitle = "Settings of %s" % pyre_component.name pre = wx.PreDialog() pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) pre.Create(parent, -1, apptitle, pos, size, style) self.PostCreate(pre) # dialog created. get the main view configure_panel, cpsize = self.get_action_window() # add ok and cancel buttons to sizer ok = wx.Button(self, wx.ID_OK, "OK") cancel = wx.Button(self, wx.ID_CANCEL, "Cancel") helpbutton = wx.Button(self, -1, "Help") if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.Bind(wx.EVT_BUTTON, self.OnHelpButton(docstr), helpbutton) okcancelSizer = wx.BoxSizer(wx.HORIZONTAL) okcancelSizer.Add(ok) okcancelSizer.AddSpacer((7, 7)) okcancelSizer.Add(cancel) topSizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(okcancelSizer) topSizer.AddSpacer((50, 40)) topSizer.Add(helpbutton) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(topSizer) sizer.Add(configure_panel, 1, wx.GROW | wx.ALL, 5) #, 0, wx.FIXED_MINSIZE ) # now paint the screen border = wx.BoxSizer() border.Add(sizer, 1, wx.GROW | wx.ALL, 25) border.Fit(self) self.SetSizer(border) w, h = cpsize w += 150 h += 200 w = min(w, 800) h = min(h, 600) w = max(w, 300) h = max(h, 200) self.SetSize((w, h)) self.SetAutoLayout(1) #self.Layout() #print "%s.__init__ done" % self.__class__.__name__ return
def InventoryDialogLoop( parent, pyre_component, toolkit, verbosity = 1 ): InventoryDialog = toolkit.InventoryDialog dlg = InventoryDialog( parent = parent, pyre_component = pyre_component, pyre_inventory = pyre_component.inventory, verbosity = verbosity, toolkit = toolkit) #save current values of fields inventory = InventoryProxy(pyre_component.inventory) oldvalues = {} for prop in inventory.properties(verbosity = verbosity): oldvalues[prop.name()] = dlg.getUserInput( prop ) continue while 1: result = dlg.ShowModal() if result != wx.ID_OK : break inventory = InventoryProxy(pyre_component.inventory) VALID = True for prop in inventory.properties(verbosity = verbosity): newValue = dlg.getUserInput( prop ) if newValue is None: continue if newValue == oldvalues[prop.name()]: continue try: inventory.setProperty( prop.name(), newValue ) except Exception, msg: newmsg = "%s\n" % msg newmsg += "Unable to set property %s to %s" % (prop.name(), newValue) wx.MessageBox( newmsg ) dlg.setUserInput( prop, prop.valueAsString() ) VALID = False break if not VALID: continue for fac in inventory.facilities(verbosity = verbosity): facName = fac.name() componentName = inventory.getValueAsString( fac.name() ) newComponentName = dlg.getUserInput( fac ) if newComponentName is None: continue if newComponentName != componentName: msg = \ "Error: facility %s has been changed to %s, " \ "but it is not configured.\n" \ "Please configure it using the Set button\n" % ( facName, newComponentName,) wx.MessageBox( msg ) VALID = False break continue if VALID: inventory.notifyObservers() break continue
class InventoryDialog: spacer = "=====" def registerInputBox( self, trait, box ): self._registry.register( "inputBox", trait, box ) return def getUserInput( self, trait ): inputBox = self._registry.get( "inputBox", trait ) return inputBox.GetValue() def setUserInput( self, trait, value): inputBox = self._registry.get( "inputBox", trait ) inputBox.SetValue( value ) return def getGuiElement( self, category, trait): return self._registry.get(category, trait ) def registerGuiElement(self, category, trait, element): self._registry.register( category, trait, element) return def ShowModal(self): toolkit = self.toolkit df = toolkit.dlgFactory while 1: (code, tag) = df.menu( self.dlgTitle, width=70, item_help = 1, choices=self.choices) if code in (df.DIALOG_CANCEL, df.DIALOG_ESC): return toolkit.ID_CANCEL if tag == self.spacer: continue if tag == "*Done": break traitName = tag inputBox = self.getGuiElement( "inputBox", traitName ) inputBox.show() continue return toolkit.ID_OK def Destroy(self): return def __init__( self, parent = None, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None, ): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity self.dlgTitle = "Settings of '%s'" % pyre_component.name #self.dlgTitle += "\n When done, type <*> and then <enter>" if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.choices = [] self.get_action_window() return def addEntry( self, trait): from pyregui.inventory.proxies.PropertyProxy import PropertyProxy from pyregui.inventory.proxies.FacilityProxy import FacilityProxy guihint = "<Enter>-OK to change settings, <Enter>-Cancel or <ESC> to cancel" self.choices.append( (trait.name(), trait.tip(), guihint) ) self.inputBoxFactory( trait ) return def get_action_window(self): traits = self.inventory.traits( verbosity = self.verbosity ) toolkit = self.toolkit for trait in traits: self.addEntry( trait ) if len(traits): self.choices.append( (self.spacer,"====================",'') ) self.choices.append( ("*Done", "finish configuration", '<Enter>-OK to use new settings, <Enter>-Cancel or <ESC> to restore' ) ) return
class InventoryDialog: indent = ' ' def registerInputBox( self, trait, box ): self._registry.register( "inputBox", trait, box ) return def getUserInput( self, trait ): inputBox = self._registry.get( "inputBox", trait ) return inputBox.GetValue() def setUserInput( self, trait, value): inputBox = self._registry.get( "inputBox", trait ) inputBox.SetValue( value ) return def getGuiElement( self, category, trait): return self._registry.get(category, trait ) def registerGuiElement(self, category, trait, element): self._registry.register( category, trait, element) return def ShowModal(self): name = self.pyre_component.name print print title = "Configuration report of %s" % name print self.indentation, '='*len(title) print "%s %s" % (self.indentation, title) self.printConfiguration() print self.indentation, '='*len(title) ## print "%s configuration of %s done." % ( ## self.indentation, self.pyre_component.name) print ok = raw_input ( "%s OK <y> or Cancel <n>: " % self.indentation) print if ok == 'y': print "%s Configuration accepted :)" % self.indentation return self.toolkit.ID_OK else: print "%s Canceled :(" % self.indentation return self.toolkit.ID_CANCEL raise def printConfiguration(self): traits = self.inventory.traits( verbosity = self.verbosity ) for trait in traits: value = self.getUserInput( trait ) print "%s * %s: %s" % (self.indentation, trait.name(), value ) continue if len(traits) == 0: print "%s * Nothing configurable" % self.indentation return def Destroy(self): return def __init__( self, parent = None, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None, indentLevel = 0 ): self.indentLevel = indentLevel self.indentation = indentation = self.indent * self.indentLevel self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity apptitle = "Configure '%s'" % pyre_component.name print indentation, '='*len(apptitle) print indentation, apptitle print indentation, '='*len(apptitle) if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.get_action_window() return def get_action_window(self): traits = self.inventory.traits( verbosity = self.verbosity ) toolkit = self.toolkit sizer = toolkit.GridSizer( 3, len(traits) ) row = 1 for trait in traits: print self.indentation, l = self.labelFactory( trait ); sizer.Add( l, pos=(row, 0) ) t = self.inputBoxFactory( trait ); sizer.Add( t, pos=(row, 1)) ## b = self.setButtonFactory( trait ) ## if b: sizer.Add(b, pos = (row, 2) ) row = row+1 continue return sizer
class InventoryDialog: indent = ' ' def registerInputBox(self, trait, box): self._registry.register("inputBox", trait, box) return def getUserInput(self, trait): inputBox = self._registry.get("inputBox", trait) return inputBox.GetValue() def setUserInput(self, trait, value): inputBox = self._registry.get("inputBox", trait) inputBox.SetValue(value) return def getGuiElement(self, category, trait): return self._registry.get(category, trait) def registerGuiElement(self, category, trait, element): self._registry.register(category, trait, element) return def ShowModal(self): name = self.pyre_component.name print print title = "Configuration report of %s" % name print self.indentation, '=' * len(title) print "%s %s" % (self.indentation, title) self.printConfiguration() print self.indentation, '=' * len(title) ## print "%s configuration of %s done." % ( ## self.indentation, self.pyre_component.name) print ok = raw_input("%s OK <y> or Cancel <n>: " % self.indentation) print if ok == 'y': print "%s Configuration accepted :)" % self.indentation return self.toolkit.ID_OK else: print "%s Canceled :(" % self.indentation return self.toolkit.ID_CANCEL raise def printConfiguration(self): traits = self.inventory.traits(verbosity=self.verbosity) for trait in traits: value = self.getUserInput(trait) print "%s * %s: %s" % (self.indentation, trait.name(), value) continue if len(traits) == 0: print "%s * Nothing configurable" % self.indentation return def Destroy(self): return def __init__(self, parent=None, pyre_component=None, pyre_inventory=None, verbosity=1, toolkit=None, indentLevel=0): self.indentLevel = indentLevel self.indentation = indentation = self.indent * self.indentLevel self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inputBoxFactory = self.toolkit.InputBoxFactory(self) self.setButtonFactory = self.toolkit.SetButtonFactory(self) self.labelFactory = self.toolkit.TraitLabelFactory(self) self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity apptitle = "Configure '%s'" % pyre_component.name print indentation, '=' * len(apptitle) print indentation, apptitle print indentation, '=' * len(apptitle) if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.get_action_window() return def get_action_window(self): traits = self.inventory.traits(verbosity=self.verbosity) toolkit = self.toolkit sizer = toolkit.GridSizer(3, len(traits)) row = 1 for trait in traits: print self.indentation, l = self.labelFactory(trait) sizer.Add(l, pos=(row, 0)) t = self.inputBoxFactory(trait) sizer.Add(t, pos=(row, 1)) ## b = self.setButtonFactory( trait ) ## if b: sizer.Add(b, pos = (row, 2) ) row = row + 1 continue return sizer
class InventoryDialog(wx.Dialog): def registerInputBox( self, trait, box ): self._registry.register( "inputBox", trait, box ) return def getUserInput( self, trait ): inputBox = self._registry.get( "inputBox", trait ) return inputBox.GetValue().strip() def setUserInput( self, trait, value): inputBox = self._registry.get( "inputBox", trait ) inputBox.SetValue( value ) return def getGuiElement( self, category, trait): return self._registry.get(category, trait ) def registerGuiElement(self, category, trait, element): self._registry.register( category, trait, element) return def __init__(self, parent = None, size = (600,400), # wx.DefaultSize, pos = wx.DefaultPosition, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, pyre_component = None, pyre_inventory = None, verbosity = 1, toolkit = None ): self.parent = parent self.toolkit = toolkit self._registry = GuiElementRegistry() self.inventory = InventoryProxy(pyre_inventory) self.pyre_component = pyre_component self.verbosity = verbosity #apptitle = "Component: %s" % pyre_component.name apptitle = "Settings of %s" % pyre_component.name pre = wx.PreDialog() pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) pre.Create(parent, -1, apptitle, pos, size, style) self.PostCreate(pre) # dialog created. get the main view configure_panel, cpsize = self.get_action_window() # add ok and cancel buttons to sizer ok = wx.Button(self, wx.ID_OK, "OK") cancel = wx.Button(self, wx.ID_CANCEL, "Cancel") helpbutton = wx.Button(self, -1, "Help") if pyre_component.__class__.__doc__ is not None: docstr = pyre_component.__class__.__doc__ else: docstr = "Please consider writing a docstring for %s" % pyre_component.__class__ self.Bind(wx.EVT_BUTTON, self.OnHelpButton(docstr), helpbutton) okcancelSizer = wx.BoxSizer(wx.HORIZONTAL) okcancelSizer.Add(ok) okcancelSizer.AddSpacer( (7,7) ) okcancelSizer.Add(cancel) topSizer = wx.BoxSizer( wx.HORIZONTAL ) topSizer.Add( okcancelSizer ) topSizer.AddSpacer( (50,40) ) topSizer.Add( helpbutton ) sizer = wx.BoxSizer( wx.VERTICAL ) sizer.Add( topSizer ) sizer.Add( configure_panel, 1, wx.GROW|wx.ALL, 5)#, 0, wx.FIXED_MINSIZE ) # now paint the screen border = wx.BoxSizer() border.Add(sizer, 1, wx.GROW|wx.ALL, 25) border.Fit(self) self.SetSizer(border) w, h = cpsize w+=150 h+=200 w = min(w, 800) h = min(h, 600) w = max(w, 300) h = max(h, 200) self.SetSize( (w,h) ) self.SetAutoLayout( 1 ) #self.Layout() #print "%s.__init__ done" % self.__class__.__name__ return def get_action_window(self): traits = self.inventory.traits( verbosity = self.verbosity ) import wx.lib.scrolledpanel as scrolled width = 600 height = min( len(traits)*50, 300 ) dialog = self class Panel( scrolled.ScrolledPanel ): def __getattribute__(self, name): try: return object.__getattribute__(self, name) except: return getattr( dialog, name ) panel = Panel( self, -1, #size=(width,height ), style = wx.TAB_TRAVERSAL, #|wx.SUNKEN_BORDER, name = "configuration" ) ## panel.registerInputBox = self.registerInputBox ## panel.registerGuiElement = self.registerGuiElement ## panel.getUserInput = self.getUserInput ## panel.getGuiElement = self.getGuiElement ## panel.setUserInput = self.setUserInput ## panel.inventory = self.inventory inputBoxFactory = self.toolkit.InputBoxFactory(panel) setButtonFactory = self.toolkit.SetButtonFactory(panel) labelFactory = self.toolkit.TraitLabelFactory(panel) sizer = wx.GridBagSizer(vgap = 10, hgap = 5) row = 0 for trait in traits: l = labelFactory( trait ); sizer.Add( l, pos=(row,0), flag = wx.ALIGN_RIGHT|wx.GROW|wx.ALL) t = inputBoxFactory( trait ); sizer.Add( t, pos=(row, 1), flag = wx.GROW) b = setButtonFactory( trait ) if b: sizer.Add( b , pos = (row, 2), flag = wx.GROW|wx.ALL) row = row+1 continue boxSizer = wx.BoxSizer( wx.VERTICAL ) boxSizer.Add( sizer, 1, wx.GROW|wx.ALL, 5 ) panel.SetSizer( boxSizer ) w, h = panel.GetBestVirtualSize() #boxSizer.SetSizeHints( panel.GetParent() ) panel.SetAutoLayout(1) panel.SetupScrolling() return panel, (w,h) def OnHelpButton(self, docstr, title="Pyre Docstring"): def _(event): dlg = wx.lib.dialogs.ScrolledMessageDialog(self, docstr, title) dlg.ShowModal() return _