daboide Commit
Revision 811
Date: 2007-03-16 16:40:17 -0700 (Fri, 16 Mar 2007)
Author: Ed
Trac: http://svn.dabodev.com/trac/daboide/changeset/811

Changed:
U   trunk/ClassDesigner.py
U   trunk/ClassDesignerMenu.py
A   trunk/ClassDesignerSizerPalette.py

Log:
Added the SizerPalette to the Class Designer. This is a complete re-write of 
the palette I showed at PyCon, since that was causing segfaults in Gtk and 
Windows. The problem was that I was constantly creating and destroying the 
controls as needed, and for some reason this worked fine on the Mac, but not on 
the other two platforms. Now I create all the controls ahead of time, and 
selectively show/hide them as required.

NOTE: I haven't tested this yet on anything other than the Mac. Once this is 
committed, I will test on Windows and Gtk.


Diff:
Modified: trunk/ClassDesigner.py
===================================================================
--- trunk/ClassDesigner.py      2007-03-12 21:28:26 UTC (rev 810)
+++ trunk/ClassDesigner.py      2007-03-16 23:40:17 UTC (rev 811)
@@ -23,6 +23,7 @@
 from ClassDesignerComponents import NoSizerBasePanel
 from ClassDesignerControlMixin import ClassDesignerControlMixin as cmix
 from ClassDesignerCustomPropertyDialog import ClassDesignerCustomPropertyDialog
+from ClassDesignerSizerPalette import SizerPaletteForm
 from dabo.lib.DesignerXmlConverter import DesignerXmlConverter
 import ClassDesignerMenu
 import dabo.lib.xmltodict as xtd
@@ -48,6 +49,7 @@
                self._pemForm = None
                self._tree = None
                self._palette = None
+               self._sizerPalette = None
                self._selection = []
                self._editors = []
                self._srcObj = None
@@ -190,6 +192,10 @@
                palette = self.ControlPalette
                palette.Controller = self
                palette.Visible = False
+
+               palette = self.SizerPalette
+               palette.Controller = self
+               dabo.ui.callAfter(palette.show)
                
                # Create the Code Editor
                ed = self.EditorForm
@@ -1428,6 +1434,8 @@
                                self._selection.remove(ct)
                if self.UseSizers:
                        cf = self.currentForm
+                       if not cf:
+                               return
                        sz = cf.mainPanel.Sizer
                        if sz is None or sz.SlotCount == 0:
                                # They deleted the main sizer; replace it.
@@ -1440,6 +1448,7 @@
                dabo.ui.callAfterInterval(200, self.currentForm.layout)
                dabo.ui.callAfterInterval(200, self.currentForm.refresh)
                dabo.ui.callAfterInterval(200, self.ControlPalette.update)
+               dabo.ui.callAfterInterval(200, self.SizerPalette.update)
 
        
        def flushCodeEditor(self):
@@ -1632,6 +1641,9 @@
                                elif _("Tool Palette") in cap:
                                        old, new = 
prmDict[self.ControlPalette.Visible]
                                        doReplace = True
+                               elif _("Sizer Palette") in cap:
+                                       old, new = 
prmDict[self.SizerPalette.Visible]
+                                       doReplace = True
 
                                if doReplace:
                                        item.Caption = cap.replace(old, new)
@@ -1685,6 +1697,10 @@
                self.togglePalette(self.barShowPalette)
                
                
+       def onToggleSizerPalette(self, evt=None):
+               self.toggleSizerPalette(self.barShowSizerPalette)
+               
+               
        def togglePropSheet(self, menubar):
                # Ensure that the object is still alive
                junk = self.PemForm
@@ -1703,6 +1719,12 @@
                self._menuToggle(self.ControlPalette, menubar)
        
        
+       def toggleSizerPalette(self, menubar):
+               # Ensure that the object is still alive
+               junk = self.SizerPalette
+               self._menuToggle(self.SizerPalette, menubar)
+       
+       
        def _menuToggle(self, itm, bar):
                try:
                        newVis = not itm.Visible
@@ -1863,7 +1885,7 @@
                        select = self.Selection
                        badsel = []
                        for sel in select:
-                               if sel is frm or sel.Form is frm:
+                               if (sel is frm) or (hasattr(self, "Form") and 
(sel.Form is frm)):
                                        badsel.append(sel)
                        self.deselect(badsel)
                
@@ -1911,6 +1933,7 @@
                self.Tree.select(self._selection)
                if self.EditorForm:
                        self.EditorForm.select(self._selection)
+               self.SizerPalette.select(self._selection)
        
        
        def treeSelect(self):
@@ -3656,6 +3679,20 @@
                self.select(val)
                
 
+       def _getSizerPalette(self):
+               noPalette = self._sizerPalette is None
+               if not noPalette:
+                       # Make sure it's still a live object
+                       if not self._sizerPalette:
+                               noPalette = True
+               if noPalette:
+                       sp = self._sizerPalette = SizerPaletteForm(None, 
+                                       Caption=_("Sizer Settings"),
+                                       
BasePrefKey=self.BasePrefKey+".SizerPaletteForm",
+                                       Controller = self)
+               return self._sizerPalette
+
+
        def _getTree(self):
                return self.PemForm.Tree
                
@@ -3689,6 +3726,9 @@
        Selection = property(_getSelection, _setSelection, None,
                        _("List of currently-selected objects  (list)"))
        
+       SizerPalette = property(_getSizerPalette, None, None,
+                       _("Reference to the sizer setting palette (read-only) 
(dToolForm)"))
+       
        Tree = property(_getTree, None, None, 
                        _("Reference to the Layout Tree form (TreeSheet)") )
 

Modified: trunk/ClassDesignerMenu.py
===================================================================
--- trunk/ClassDesignerMenu.py  2007-03-12 21:28:26 UTC (rev 810)
+++ trunk/ClassDesignerMenu.py  2007-03-16 23:40:17 UTC (rev 811)
@@ -31,6 +31,9 @@
                app.barShowPalette = vm.append(_("Show Tool Palette"),  
                                OnHit=app.onTogglePalette, 
                                help=_("Show/hide the Tool Palette"))
+               app.barShowSizerPalette = vm.append(_("Show Sizer Palette"),  
+                               OnHit=app.onToggleSizerPalette, 
+                               help=_("Show/hide the Sizer Palette"))
                # Add some hotkeys for displaying the various PemObject panels
                vm.appendSeparator()
                vm.append(_("Display Properties\tCtrl+Shift+P"), 

Added: trunk/ClassDesignerSizerPalette.py
===================================================================
--- trunk/ClassDesignerSizerPalette.py                          (rev 0)
+++ trunk/ClassDesignerSizerPalette.py  2007-03-16 23:40:17 UTC (rev 811)
@@ -0,0 +1,324 @@
+import dabo
+if __name__ == "__main__":
+       dabo.ui.loadUI("wx")
+dui = dabo.ui
+from dabo.dLocalize import _
+import dabo.dEvents as dEvents
+from ClassDesignerComponents import LayoutSpacerPanel
+
+
+class ContentBoxSizerPanel(dui.dPanel):
+       def afterInit(self):
+               sz = dui.dGridSizer(maxCol=2, hgap=8, vgap=5)
+               lbl = dui.dLabel(self, Caption=_("Border"))
+               ctl = dui.dSpinner(self, DataField="Sizer_Border")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Expand"))
+               ctl = dui.dCheckBox(self, DataField="Sizer_Expand")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Proportion"))
+               ctl = dui.dSpinner(self, DataField="Sizer_Proportion")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("HAlign"))
+               ctl = dui.dDropdownList(self, DataField="Sizer_HAlign",
+                               Choices=["Left", "Right", "Center"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("VAlign"))
+               ctl = dui.dDropdownList(self, DataField="Sizer_VAlign",
+                               Choices=["Top", "Bottom", "Middle"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Spacing"))
+               ctl = dui.dSpinner(self, DataField="Spacing")
+               lbl.DynamicEnabled = ctl.DynamicEnabled = self.checkIfSpacer
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               
+               self.Sizer = dui.dSizer("v")
+               self.Sizer.append1x(sz, border=20,
+                               borderSides=("left", "right", "bottom"))
+               self.Sizer.appendSpacer(20)
+
+       def checkIfSpacer(self):
+               return isinstance(self.Form.currObj, LayoutSpacerPanel)
+               
+
+class ContentGridSizerPanel(dui.dPanel):
+       def afterInit(self):
+               sz = dui.dGridSizer(maxCol=2, hgap=8, vgap=5)
+               lbl = dui.dLabel(self, Caption=_("Border"))
+               ctl = dui.dSpinner(self, DataField="Sizer_Border")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Expand"))
+               ctl = dui.dCheckBox(self, DataField="Sizer_Expand")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("ColExpand"))
+               ctl = dui.dCheckBox(self, DataField="Sizer_ColExpand")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("RowExpand"))
+               ctl = dui.dCheckBox(self, DataField="Sizer_RowExpand")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Proportion"))
+               ctl = dui.dSpinner(self, DataField="Sizer_Proportion")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("ColSpan"))
+               ctl = dui.dSpinner(self, DataField="Sizer_ColSpan")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("RowSpan"))
+               ctl = dui.dSpinner(self, DataField="Sizer_RowSpan")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("HAlign"))
+               ctl = dui.dDropdownList(self, DataField="Sizer_HAlign",
+                               Choices=["Left", "Right", "Center"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("VAlign"))
+               ctl = dui.dDropdownList(self, DataField="Sizer_VAlign",
+                               Choices=["Top", "Bottom", "Middle"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Spacing"))
+               ctl = dui.dSpinner(self, DataField="Spacing")
+               lbl.DynamicEnabled = ctl.DynamicEnabled = self.checkIfSpacer
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+
+               self.Sizer = dui.dSizer("v")
+               self.Sizer.append1x(sz, border=20,
+                               borderSides=("left", "right", "bottom"))
+               self.Sizer.appendSpacer(20)
+
+       def checkIfSpacer(self):
+               return isinstance(self.Form.currObj, LayoutSpacerPanel)
+
+
+class BoxSizerSelfPanel(dui.dPanel):
+       def afterInit(self):
+               sz = dui.dGridSizer(maxCol=2, hgap=8, vgap=5)
+               lbl = dui.dLabel(self, Caption=_("Orientation"))
+               ctl = dui.dDropdownList(self, DataField="Orientation",
+                               Choices=["Horizontal", "Vertical"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("SlotCount"))
+               ctl = dui.dSpinner(self, DataField="SlotCount")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("DefaultBorder"))
+               ctl = dui.dSpinner(self, DataField="DefaultBorder")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("DefaultBorderLeft"))
+               ctl = dui.dCheckBox(self, DataField="DefaultBorderLeft")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("DefaultBorderRight"))
+               ctl = dui.dCheckBox(self, DataField="DefaultBorderRight")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("DefaultBorderTop"))
+               ctl = dui.dCheckBox(self, DataField="DefaultBorderTop")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("DefaultBorderBottom"))
+               ctl = dui.dCheckBox(self, DataField="DefaultBorderBottom")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               
+               self.Sizer = dui.dSizer("v")
+               self.Sizer.append1x(sz, border=20,
+                               borderSides=("left", "right", "bottom"))
+               self.Sizer.appendSpacer(20)
+               
+
+class GridSizerSelfPanel(dui.dPanel):
+       def afterInit(self):
+               sz = dui.dGridSizer(maxCol=2, hgap=8, vgap=5)
+               lbl = dui.dLabel(self, Caption=_("HGap"))
+               ctl = dui.dSpinner(self, DataField="HGap")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("VGap"))
+               ctl = dui.dSpinner(self, DataField="VGap")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Rows"))
+               ctl = dui.dSpinner(self, DataField="Rows")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("Columns"))
+               ctl = dui.dSpinner(self, DataField="Columns")
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               lbl = dui.dLabel(self, Caption=_("MaxDimension"))
+               ctl = dui.dDropdownList(self, DataField="MaxDimension",
+                               Choices=["C", "R"])
+               sz.append(lbl, halign="right")
+               sz.append(ctl)
+               
+               self.Sizer = dui.dSizer("v")
+               self.Sizer.append1x(sz, border=20,
+                               borderSides=("left", "right", "bottom"))
+               self.Sizer.appendSpacer(20)
+               
+
+class SizerInfoFrame(dui.dPageFrameNoTabs):
+       boxClass = dui.dPanel
+       gridClass = dui.dPanel
+       def afterInit(self):
+               self.blankPage = self.appendPage(dui.dPanel)
+               self.blankPage.Sizer = dui.dSizer("v")
+               self.boxPage = self.appendPage(self.boxClass)
+               self.gridPage = self.appendPage(self.gridClass)
+       
+       def layout(self):
+               super(SizerInfoFrame, self).layout()
+               pg = self.SelectedPage
+               try:
+                       if pg is not self.blankPage:
+                               dui.callAfter(pg.fitToSizer)
+#                              w, h = pg.Size
+#                              self.Size = (w+40, h+40)
+               except AttributeError:
+                       # blankPage hasn't been created yet
+                       pass
+
+               
+class SizerContentFrame(SizerInfoFrame):
+       boxClass = ContentBoxSizerPanel
+       gridClass = ContentGridSizerPanel
+       
+       def setFromObject(self, obj):
+               try:
+                       csz = obj.ControllingSizer
+               except AttributeError:
+                       csz = None
+               if csz is None:
+                       self.SelectedPage = self.blankPage
+               elif isinstance(csz, dui.dGridSizer):
+                       self.SelectedPage = self.gridPage
+               else:
+                       self.SelectedPage = self.boxPage
+               self.Visible = (obj is not None)
+               self.update()
+               self.SelectedPage.setAll("DataSource", obj, filt="Enabled is 
True")
+               dabo.ui.callAfterInterval(100, self.layout)
+
+
+class SizerSelfFrame(SizerInfoFrame):
+       boxClass = BoxSizerSelfPanel
+       gridClass = GridSizerSelfPanel
+       
+       def setFromObject(self, obj):
+               if isinstance(obj, dui.dGridSizer):
+                       self.SelectedPage = self.gridPage
+               elif isinstance(obj, dui.dSizer):
+                       self.SelectedPage = self.boxPage
+               else:
+                       self.SelectedPage = self.blankPage
+               self.Visible = isinstance(obj, (dui.dGridSizer, dui.dSizer,
+                               dui.dBorderSizer))
+               self.SelectedPage.setAll("DataSource", obj, filt="Enabled is 
True")
+               self.update()
+               self.layout()
+                       
+
+class AbstractSizerPanel(dui.dPanel):
+       pgfClass = None
+
+       def afterInit(self):
+               self.Sizer = dui.dBorderSizer(self, "v", Caption=self._cap)
+#              self.Sizer = dui.dSizer("v")
+               self.pgf = self.pgfClass(self)
+               self.Sizer.append(self.pgf, halign="center")
+               self.DynamicVisible = self.notBlank
+       
+       def notBlank(self):
+               return self.pgf.SelectedPage is not self.pgf.blankPage
+       
+       def layout(self, resetMin=True):
+               super(AbstractSizerPanel, self).layout(resetMin)
+               self.Size = self.pgf.Size
+
+
+class SizerContentPanel(AbstractSizerPanel):
+       pgfClass = SizerContentFrame
+       _cap = _("Object Settings")
+               
+
+class SizerSelfPanel(AbstractSizerPanel):
+       pgfClass = SizerSelfFrame
+       _cap = _("Sizer Settings")
+               
+
+class SizerPaletteForm(dui.dToolForm):
+       def afterInit(self):
+               self.currObj = None
+               self.inFitToSizer = False
+               self.MinimumSize = (200, 100)
+               self.Sizer = dui.dSizer("V")
+               self.mainPanel = mp = dui.dPanel(self)
+               self.Sizer.append1x(mp)
+               mp.Sizer = sz = dui.dSizer("V")
+               scpnl = SizerContentPanel(mp)
+               self.contentFrame = scpnl.pgf
+               sspnl = SizerSelfPanel(mp)
+               self.sizerFrame = sspnl.pgf
+               sz.append(scpnl, halign="center", border=10)
+               sz.append(sspnl, halign="center", border=10)
+               self.layout()
+               
+       def select(self, objs):
+               if not self.Visible:
+                       return
+               if (len(objs) > 1) or not objs:
+                       self.contentFrame.setFromObject(None)
+                       self.sizerFrame.setFromObject(None)
+                       self.layout()
+                       return
+               obj = objs[0]
+               self.currObj = obj
+               self.contentFrame.setFromObject(obj)
+               self.sizerFrame.setFromObject(obj)
+               self.layout()
+               self.update()
+       
+       def layout(self):
+               if self.inFitToSizer:
+                       return
+               dui.callAfterInterval(100, self._delayedLayout)
+       def _delayedLayout(self):
+               self.lockDisplay()
+               super(SizerPaletteForm, self).layout()
+               self.inFitToSizer = True
+               self.fitToSizer()
+               self.inFitToSizer = False
+               self.unlockDisplay()
+       
+       def _getController(self):
+               try:
+                       return self._controller
+               except AttributeError:
+                       self._controller = self.Application
+                       return self._controller
+
+       def _setController(self, val):
+               if self._constructed():
+                       self._controller = val
+               else:
+                       self._properties["Controller"] = val
+
+       Controller = property(_getController, _setController, None,
+                       _("Object to which this one reports events  (object 
(varies))"))
+


Property changes on: trunk/ClassDesignerSizerPalette.py
___________________________________________________________________
Name: svn:eol-style
   + native




_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev

Reply via email to