| 1 |
# -*- coding: utf-8 -*- |
|---|
| 2 |
import dabo |
|---|
| 3 |
from dabo.dLocalize import _ |
|---|
| 4 |
import dabo.dEvents as dEvents |
|---|
| 5 |
from ClassDesignerPropSheet import PropSheet |
|---|
| 6 |
from ClassDesignerTreeSheet import TreeSheet |
|---|
| 7 |
from ClassDesignerMethodSheet import MethodSheet |
|---|
| 8 |
from ClassDesignerObjectPropertySheet import ObjectPropertySheet |
|---|
| 9 |
from ClassDesignerComponents import LayoutPanel |
|---|
| 10 |
from ClassDesignerComponents import LayoutSpacerPanel |
|---|
| 11 |
from ClassDesignerComponents import LayoutSizer |
|---|
| 12 |
from ClassDesignerComponents import LayoutGridSizer |
|---|
| 13 |
import ClassDesignerMenu |
|---|
| 14 |
|
|---|
| 15 |
if __name__ == "__main__": |
|---|
| 16 |
dabo.ui.loadUI("wx") |
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
class PemForm(dabo.ui.dForm): |
|---|
| 20 |
"""This form contains the PropSheet, the MethodSheet, and |
|---|
| 21 |
the Object Tree. |
|---|
| 22 |
""" |
|---|
| 23 |
def afterSetMenuBar(self): |
|---|
| 24 |
self.ShowStatusBar = False |
|---|
| 25 |
ClassDesignerMenu.mkDesignerMenu(self) |
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
def onMenuOpen(self, evt): |
|---|
| 29 |
self.Controller.menuUpdate(evt, self.MenuBar) |
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
def afterInit(self): |
|---|
| 33 |
self._defaultLeft = 610 |
|---|
| 34 |
self._defaultTop = 50 |
|---|
| 35 |
self._defaultWidth = 370 |
|---|
| 36 |
self._defaultHeight = 580 |
|---|
| 37 |
|
|---|
| 38 |
self.Caption = _("Object Info") |
|---|
| 39 |
pnl = dabo.ui.dPanel(self) |
|---|
| 40 |
self.Sizer.append1x(pnl) |
|---|
| 41 |
sz = pnl.Sizer = dabo.ui.dSizer("v") |
|---|
| 42 |
|
|---|
| 43 |
txt = dabo.ui.dTextBox(pnl, ReadOnly=True, RegID="txtObj") |
|---|
| 44 |
hsz = dabo.ui.dSizer("h") |
|---|
| 45 |
hsz.append1x(txt) |
|---|
| 46 |
self.treeBtn = dabo.ui.dToggleButton(pnl, Height=txt.Height, |
|---|
| 47 |
Width=txt.Height, Caption="", Picture="downTriangleBlack", |
|---|
| 48 |
DownPicture="upTriangleBlack") |
|---|
| 49 |
self.treeBtn.bindEvent(dEvents.Hit, self.onToggleTree) |
|---|
| 50 |
hsz.append(self.treeBtn) |
|---|
| 51 |
|
|---|
| 52 |
brdr = 10 |
|---|
| 53 |
sz.appendSpacer(brdr) |
|---|
| 54 |
sz.DefaultBorderLeft = sz.DefaultBorderRight = True |
|---|
| 55 |
sz.DefaultBorder = brdr |
|---|
| 56 |
sz.append(hsz, "x") |
|---|
| 57 |
sz.appendSpacer(5) |
|---|
| 58 |
|
|---|
| 59 |
self.mainPager = mp = dabo.ui.dPageFrameNoTabs(pnl, PageClass=dabo.ui.dPanel) |
|---|
| 60 |
mp.PageCount=2 |
|---|
| 61 |
mp.bindEvent(dEvents.PageChanged, self.onMainPageChanged) |
|---|
| 62 |
sz.append1x(mp) |
|---|
| 63 |
sz.appendSpacer(brdr) |
|---|
| 64 |
self.pemPage = pp = mp.Pages[0] |
|---|
| 65 |
self.treePage = tp = mp.Pages[1] |
|---|
| 66 |
psz = pp.Sizer = dabo.ui.dSizer("v") |
|---|
| 67 |
tsz = tp.Sizer = dabo.ui.dSizer("v") |
|---|
| 68 |
|
|---|
| 69 |
dabo.ui.dSlidePanelControl(pp, SingleClick=True, Singleton=True, |
|---|
| 70 |
CollapseToBottom=True, RegID="mainContainer") |
|---|
| 71 |
psz.append1x(self.mainContainer) |
|---|
| 72 |
# This helps restore the sash position on the prop grid page |
|---|
| 73 |
self._propSashPct = 80 |
|---|
| 74 |
# Bind to panel changes |
|---|
| 75 |
self.mainContainer.bindEvent(dEvents.SlidePanelChange, self.onPanelChange) |
|---|
| 76 |
dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Properties"), RegID="propPage", |
|---|
| 77 |
CaptionForeColor="blue") |
|---|
| 78 |
dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Methods"), RegID="methodPage", |
|---|
| 79 |
CaptionForeColor="blue") |
|---|
| 80 |
dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Custom Properties"), RegID="objPropPage", |
|---|
| 81 |
CaptionForeColor="blue") |
|---|
| 82 |
|
|---|
| 83 |
# Add the PropSheet |
|---|
| 84 |
ps = PropSheet(self.propPage, RegID="_propSheet") |
|---|
| 85 |
self.propPage.Sizer = dabo.ui.dSizer("v") |
|---|
| 86 |
self.propPage.Sizer.appendSpacer(self.propPage.CaptionHeight) |
|---|
| 87 |
self.propPage.Sizer.append1x(ps) |
|---|
| 88 |
|
|---|
| 89 |
# Create the MethodSheet |
|---|
| 90 |
ms = MethodSheet(self.methodPage, RegID="_methodSheet") |
|---|
| 91 |
self.methodPage.Sizer = dabo.ui.dSizer("v") |
|---|
| 92 |
self.methodPage.Sizer.appendSpacer(self.methodPage.CaptionHeight) |
|---|
| 93 |
self.methodPage.Sizer.append1x(ms) |
|---|
| 94 |
self._methodList = ms.MethodList |
|---|
| 95 |
|
|---|
| 96 |
# Create the tree |
|---|
| 97 |
self._tree = TreeSheet(tp) |
|---|
| 98 |
tp.Sizer.append1x(self._tree, border=10) |
|---|
| 99 |
|
|---|
| 100 |
# Create the Object Properties sheet |
|---|
| 101 |
ops = ObjectPropertySheet(self.objPropPage, RegID="_objPropSheet") |
|---|
| 102 |
self.objPropPage.Sizer = dabo.ui.dSizer("v") |
|---|
| 103 |
self.objPropPage.Sizer.appendSpacer(self.methodPage.CaptionHeight) |
|---|
| 104 |
self.objPropPage.Sizer.append1x(ops) |
|---|
| 105 |
|
|---|
| 106 |
mp.SelectedPage = pp |
|---|
| 107 |
|
|---|
| 108 |
ps.Controller = ms.Controller = self._tree.Controller = ops.Controller = self.Controller |
|---|
| 109 |
self.layout() |
|---|
| 110 |
dabo.ui.callAfter(self.mainContainer.expand, self.propPage) |
|---|
| 111 |
|
|---|
| 112 |
|
|---|
| 113 |
def onToggleTree(self, evt): |
|---|
| 114 |
self.mainPager.nextPage() |
|---|
| 115 |
|
|---|
| 116 |
|
|---|
| 117 |
def onMainPageChanged(self, evt): |
|---|
| 118 |
self.treeBtn.Value = self.mainPager.SelectedPage is self.treePage |
|---|
| 119 |
|
|---|
| 120 |
|
|---|
| 121 |
def hideTree(self): |
|---|
| 122 |
self.mainPager.SelectedPage = self.pemPage |
|---|
| 123 |
|
|---|
| 124 |
|
|---|
| 125 |
def onPanelChange(self, evt): |
|---|
| 126 |
if evt.panel is self.propPage: |
|---|
| 127 |
try: |
|---|
| 128 |
if evt.expanded: |
|---|
| 129 |
dabo.ui.setAfter(self._propSheet.mainSplit, "SashPercent", self._propSheet._sashPct) |
|---|
| 130 |
except: |
|---|
| 131 |
# Probably isn't constructed yet |
|---|
| 132 |
pass |
|---|
| 133 |
|
|---|
| 134 |
|
|---|
| 135 |
def onResize(self, evt): |
|---|
| 136 |
try: |
|---|
| 137 |
dabo.ui.callAfter(self.mainContainer.refresh) |
|---|
| 138 |
except: |
|---|
| 139 |
# 'mainContainer' might not be defined yet, so ignore |
|---|
| 140 |
pass |
|---|
| 141 |
|
|---|
| 142 |
|
|---|
| 143 |
def showPropPage(self): |
|---|
| 144 |
self.mainPager.SelectedPage = self.pemPage |
|---|
| 145 |
self.refresh() |
|---|
| 146 |
self.propPage.Expanded = True |
|---|
| 147 |
self.bringToFront() |
|---|
| 148 |
|
|---|
| 149 |
|
|---|
| 150 |
def showTreePage(self): |
|---|
| 151 |
self.mainPager.SelectedPage = self.treePage |
|---|
| 152 |
self.bringToFront() |
|---|
| 153 |
|
|---|
| 154 |
|
|---|
| 155 |
def showMethodsPage(self): |
|---|
| 156 |
self.mainPager.SelectedPage = self.pemPage |
|---|
| 157 |
self.methodPage.Expanded = True |
|---|
| 158 |
self.bringToFront() |
|---|
| 159 |
|
|---|
| 160 |
|
|---|
| 161 |
def select(self, obj): |
|---|
| 162 |
"""Called when the selected object changes. 'obj' will |
|---|
| 163 |
be a list containing either a single object or multiple |
|---|
| 164 |
objects. We then need to update the components of this |
|---|
| 165 |
form appropriately. |
|---|
| 166 |
""" |
|---|
| 167 |
mult = len(obj) > 1 |
|---|
| 168 |
if len(obj) == 0: |
|---|
| 169 |
lbl = _(" -none- ") |
|---|
| 170 |
ob = None |
|---|
| 171 |
else: |
|---|
| 172 |
ob = obj[0] |
|---|
| 173 |
# If the selected object is an empty sizer slot, the way that this |
|---|
| 174 |
# is passed along is a tuple containing the sizer item and its sizer, |
|---|
| 175 |
# since there is no way to determine the sizer given the SizerItem. |
|---|
| 176 |
isSpacer = isinstance(ob, LayoutSpacerPanel) |
|---|
| 177 |
isSlot = isinstance(ob, LayoutPanel) and not isSpacer |
|---|
| 178 |
isSizer = isinstance(ob, dabo.ui.dSizerMixin) |
|---|
| 179 |
isColumn = isinstance(ob, dabo.ui.dColumn) |
|---|
| 180 |
isNode = isinstance(ob, dabo.ui.dTreeView.getBaseNodeClass()) |
|---|
| 181 |
if isSlot or isSpacer: |
|---|
| 182 |
szItem = ob.ControllingSizerItem |
|---|
| 183 |
sz = ob.ControllingSizer |
|---|
| 184 |
if isSizer: |
|---|
| 185 |
sz = ob |
|---|
| 186 |
obRest = obj[1:] |
|---|
| 187 |
# Determine the 'name' to display |
|---|
| 188 |
if mult: |
|---|
| 189 |
lbl = _(" -multiple- ") |
|---|
| 190 |
else: |
|---|
| 191 |
if isSlot or isSizer: |
|---|
| 192 |
ornt = sz.Orientation[0].lower() |
|---|
| 193 |
if ornt == "h": |
|---|
| 194 |
lbl = _("Horizontal") |
|---|
| 195 |
elif ornt == "v": |
|---|
| 196 |
lbl = _("Vertical") |
|---|
| 197 |
else: |
|---|
| 198 |
lbl = _("Grid") |
|---|
| 199 |
if isSlot: |
|---|
| 200 |
lbl += _(" Sizer Slot") |
|---|
| 201 |
if ornt in ("r", "c"): |
|---|
| 202 |
lbl += ": (%s, %s)" % sz.getGridPos(ob) |
|---|
| 203 |
else: |
|---|
| 204 |
if isinstance(ob, dabo.ui.dBorderSizer): |
|---|
| 205 |
lbl += _(" BorderSizer") |
|---|
| 206 |
else: |
|---|
| 207 |
lbl += _(" Sizer") |
|---|
| 208 |
elif isSpacer: |
|---|
| 209 |
spc = ob.Spacing |
|---|
| 210 |
if isinstance(sz, dabo.ui.dSizer): |
|---|
| 211 |
# We want the first position for vertical; second for horiz. |
|---|
| 212 |
isHoriz = sz.Orientation[0].lower() == "h" |
|---|
| 213 |
typ = (_("Vertical"), _("Horizontal"))[isHoriz] |
|---|
| 214 |
else: |
|---|
| 215 |
# Grid spacer; use both |
|---|
| 216 |
typ = _("Grid") |
|---|
| 217 |
lbl = "%s Spacer - (%s)" % (typ, spc) |
|---|
| 218 |
elif isColumn: |
|---|
| 219 |
lbl = "Column %s ('%s')" % (ob.Parent.Columns.index(ob)+1, ob.Caption) |
|---|
| 220 |
elif isNode: |
|---|
| 221 |
lbl = "TreeNode: ('%s')" % (ob.Caption) |
|---|
| 222 |
else: |
|---|
| 223 |
if hasattr(ob, "Name"): |
|---|
| 224 |
lbl = ob.Name |
|---|
| 225 |
else: |
|---|
| 226 |
lbl = str(ob.__class__) |
|---|
| 227 |
self.txtObj.Value = lbl |
|---|
| 228 |
self.PropSheet.select(obj) |
|---|
| 229 |
self.MethodList.clear() |
|---|
| 230 |
self._objPropSheet.select(obj) |
|---|
| 231 |
|
|---|
| 232 |
if ob is not None: |
|---|
| 233 |
# Get the events |
|---|
| 234 |
evts = ob.DesignerEvents |
|---|
| 235 |
# Get the dict of all events that have method code defined for them. |
|---|
| 236 |
obEvtCode = self.Controller.getCodeForObject(ob) |
|---|
| 237 |
codeEvents = nonCodeEvents = [] |
|---|
| 238 |
if obEvtCode is not None: |
|---|
| 239 |
codeEvents = obEvtCode.keys() |
|---|
| 240 |
nonCodeEvents = [ev for ev in evts |
|---|
| 241 |
if ev not in codeEvents] |
|---|
| 242 |
# Add the events with code first |
|---|
| 243 |
for evt in codeEvents: |
|---|
| 244 |
newItem = self.MethodList.append(evt) |
|---|
| 245 |
self.MethodList.setItemBackColor(newItem, "lightblue") |
|---|
| 246 |
|
|---|
| 247 |
for evt in nonCodeEvents: |
|---|
| 248 |
newItem = self.MethodList.append(evt) |
|---|
| 249 |
self.MethodList.setItemBackColor(newItem, "lightgrey") |
|---|
| 250 |
self.refresh() |
|---|
| 251 |
self.layout() |
|---|
| 252 |
|
|---|
| 253 |
|
|---|
| 254 |
def _getController(self): |
|---|
| 255 |
try: |
|---|
| 256 |
return self._controller |
|---|
| 257 |
except AttributeError: |
|---|
| 258 |
self._controller = self.Application |
|---|
| 259 |
return self._controller |
|---|
| 260 |
|
|---|
| 261 |
def _setController(self, val): |
|---|
| 262 |
if self._constructed(): |
|---|
| 263 |
self._controller = val |
|---|
| 264 |
else: |
|---|
| 265 |
self._properties["Controller"] = val |
|---|
| 266 |
|
|---|
| 267 |
|
|---|
| 268 |
def _getMethodList(self): |
|---|
| 269 |
return self._methodList |
|---|
| 270 |
|
|---|
| 271 |
def _setMethodList(self, val): |
|---|
| 272 |
self._methodList = val |
|---|
| 273 |
|
|---|
| 274 |
|
|---|
| 275 |
def _getMethodSheet(self): |
|---|
| 276 |
return self._methodSheet |
|---|
| 277 |
|
|---|
| 278 |
def _setMethodSheet(self, val): |
|---|
| 279 |
self._methodSheet = val |
|---|
| 280 |
|
|---|
| 281 |
|
|---|
| 282 |
def _getObjectPropertySheet(self): |
|---|
| 283 |
return self._objPropSheet |
|---|
| 284 |
|
|---|
| 285 |
def _setObjectPropertySheet(self, val): |
|---|
| 286 |
self._objPropSheet = val |
|---|
| 287 |
|
|---|
| 288 |
|
|---|
| 289 |
def _getPropSheet(self): |
|---|
| 290 |
return self._propSheet |
|---|
| 291 |
|
|---|
| 292 |
def _setPropSheet(self, val): |
|---|
| 293 |
self._propSheet = val |
|---|
| 294 |
|
|---|
| 295 |
|
|---|
| 296 |
def _getTree(self): |
|---|
| 297 |
return self._tree |
|---|
| 298 |
|
|---|
| 299 |
def _setTree(self, val): |
|---|
| 300 |
self._tree = val |
|---|
| 301 |
|
|---|
| 302 |
|
|---|
| 303 |
Controller = property(_getController, _setController, None, |
|---|
| 304 |
_("Object to which this one reports events (object (varies))")) |
|---|
| 305 |
|
|---|
| 306 |
MethodList = property(_getMethodList, _setMethodList, None, |
|---|
| 307 |
_("""List control containing all available methods for the |
|---|
| 308 |
selected object (dListControl)""")) |
|---|
| 309 |
|
|---|
| 310 |
MethodSheet = property(_getMethodSheet, _setMethodSheet, None, |
|---|
| 311 |
_("Reference to the panel containing the MethodList (MethodSheet)")) |
|---|
| 312 |
|
|---|
| 313 |
ObjectPropertySheet = property(_getObjectPropertySheet, |
|---|
| 314 |
_setObjectPropertySheet, None, _("""Reference to the panel |
|---|
| 315 |
containing the ObjectPropertySheet (ObjectPropertySheet)""")) |
|---|
| 316 |
|
|---|
| 317 |
Tree = property(_getTree, _setTree, None, |
|---|
| 318 |
_("Reference to the contained object tree (TreeSheet)")) |
|---|
| 319 |
|
|---|
| 320 |
PropSheet = property(_getPropSheet, _setPropSheet, None, |
|---|
| 321 |
_("Reference to the contained prop sheet (PropSheet)")) |
|---|