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
示例#2
0
 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
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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
示例#7
0
    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
示例#8
0
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
示例#10
0
    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
示例#11
0
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)
示例#12
0
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 _
示例#13
0
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
示例#14
0
    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
示例#15
0
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
示例#16
0
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 
示例#17
0
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
示例#18
0
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
示例#19
0
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 _