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