root/trunk/ide/MenuDesignerForm.py

Revision 4120, 7.5 kB (checked in by ed, 6 months ago)

Removed deprecated use of 'bindfunc' parameter.

Incremental improvement in display stability; still needs work.

  • Property svn:eol-style set to native
Line 
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 import os
4 import dabo
5 dabo.ui.loadUI("wx")
6 from dabo.dLocalize import _
7 import dabo.dEvents as dEvents
8 import dabo.lib.xmltodict as xtd
9 from ClassDesignerExceptions import PropertyUpdateException
10 from MenuBarPanel import MenuBarPanel
11 from MenuPanel import MenuPanel
12 from MenuDesignerPropForm import MenuPropForm
13 from MenuDesignerComponents import CaptionBitmapPanel
14 from MenuDesignerComponents import SeparatorPanel
15
16
17
18 class MenuDesignerForm(dabo.ui.dForm):
19     def __init__(self, *args, **kwargs):
20         self._selection = None
21         self._menuFile = None
22         self._propForm = None
23         self._propSheet = None
24         super(MenuDesignerForm, self).__init__(*args, **kwargs)
25         self.autoClearDrawings = True
26         self.Caption = "Dabo Menu Designer"
27         self.mainPanel = dabo.ui.dPanel(self)
28         self.Sizer.append1x(self.mainPanel)
29         sz = self.mainPanel.Sizer = dabo.ui.dSizer("v")
30         self.previewButton = btn = dabo.ui.dButton(self.mainPanel,
31                 Caption="Preview", OnHit=self.onPreview)
32         sz.append(btn, border=10, halign="center")
33         sz.append(dabo.ui.dLine(self.mainPanel), "x", border=10)
34         self.menubar = MenuBarPanel(self.mainPanel)
35         sz.append(self.menubar, border=30)
36         self.menubar.Controller = self
37         self.clear()
38         self.layout()
39    
40    
41     def onPreview(self, evt):
42         class PreviewWindow(dabo.ui.dForm):
43             def initProperties(self):
44                 self.Caption = "Menu Preview"
45                 self.ShowMenuBar = False
46             def afterInit(self):
47                 mp = dabo.ui.dPanel(self)
48                 self.Sizer.append1x(mp)
49                 sz = mp.Sizer = dabo.ui.dSizer("v")
50                 sz.appendSpacer(30)
51                 self.lblResult = dabo.ui.dLabel(mp, Caption="Menu Selection: \n ", FontBold=True,
52                         ForeColor="darkred", AutoResize=True, Alignment="Center")
53                 self.lblResult.FontSize += 4
54                 sz.append(self.lblResult, halign="center", border=10)
55                 btn = dabo.ui.dButton(mp, Caption="Close Menu Preview",
56                         OnHit=self.onDeactivate)
57                 sz.append(btn, halign="center", border=30)
58                 mp.fitToSizer()
59             def onDeactivate(self, evt):
60                 self.release()
61             def notify(self, evt):
62                 itm = evt.EventObject
63                 cap = "Menu Selection: %s\n" % itm.Caption
64                 fncText = itm._bindingText
65                 if fncText:
66                     cap = "%sFunction: %s" % (cap, fncText)
67                 self.lblResult.Caption = cap
68                 self.layout()
69                
70         propDict = self.menubar.getDesignerDict()
71         xml = xtd.dicttoxml(propDict)
72         win = PreviewWindow(self, Centered=True)
73         mb = dabo.ui.createMenuBar(xml, win, win.notify)
74         win.MenuBar = mb
75         win.show()
76        
77        
78     def afterInitAll(self):
79         self.PropSheet.Controller = self
80         self.PropForm.show()
81         self.Selection = None
82         #dabo.ui.callAfterInterval(300, self.initialLayout)
83         self.initialLayout()
84    
85    
86     def initialLayout(self):
87 #       print "INITLAY"
88         self.menubar.clear()
89         self.mainPanel.clear()
90 #       self.menubar.quickMenu()
91         self.layout()
92 #       dabo.ui.callAfterInterval(500, self.foo)
93 #   def foo(self):
94 #       try:
95 #           firstMenu = self.menubar.Menus[0]
96 # #             self.menubar.hideAllBut(firstMenu)
97 #           self.Selection = firstMenu
98 #           firstMenu.PanelVisible = True
99 #       except IndexError:
100 #           # No such menu
101 #           pass
102        
103    
104     def afterSetMenuBar(self):
105         mbar = self.MenuBar
106         fm = mbar.getMenu(_("File"))
107         fm.append(_("Save"), HotKey="Ctrl+S", OnHit=self.onSave,
108                 help=_("Save the menu"))
109    
110    
111     def getObjectHierarchy(self, parent=None, level=0):
112         """Returns a list of 2-tuples representing the structure of
113         the objects on this form. The first element is the nesting level,
114         and the second is the object. The objects are in the order
115         created, irrespective of sizer position.
116         """
117         if parent is None:
118             parent = self.menubar
119         ret = [(level, parent)]
120         for kid in parent.Children:
121             ret += self.getObjectHierarchy(kid, level+1)
122         return ret
123    
124    
125     def updateLayout(self):
126         try:
127             self.PropForm.updateLayout()
128         except AttributeError:
129             # Prop form not yet created
130             pass
131        
132    
133     def onSave(self, evt):
134         self.saveMenu()
135    
136    
137     def saveMenu(self):
138         if not self._menuFile:
139             self._menuFile = dabo.ui.getSaveAs(wildcard="mnxml")
140             if not self._menuFile:
141                 # User canceled
142                 return
143             else:
144                 if not os.path.splitext(self._menuFile)[1] == ".mnxml":
145                     self._menuFile += ".mnxml"
146        
147         propDict = self.menubar.getDesignerDict()
148         xml = xtd.dicttoxml(propDict)
149         open(self._menuFile, "wb").write(xml)
150
151
152     def openFile(self, pth):
153         if not os.path.exists(pth):
154             dabo.ui.stop("The file '%s' does not exist" % pth)
155             return
156         xml = open(pth).read()
157         try:
158             dct = xtd.xmltodict(xml)
159         except:
160             raise IOError, _("This does not appear to be a valid menu file.")
161             return
162         self.menubar.restore(dct)
163         self.layout()
164        
165    
166     def updatePropVal(self, prop, val, typ):
167         obj = self.Selection
168         if obj is None:
169             return
170         if typ is bool:
171             val = bool(val)
172         if isinstance(val, basestring):
173             strVal = val
174         else:
175             strVal = unicode(val)
176         if typ in (str, unicode) or ((typ is list) and isinstance(val, basestring)):
177             # Escape any single quotes, and then enclose
178             # the value in single quotes
179             strVal = "u'" + self.escapeQt(strVal) + "'"
180         try:
181             exec("obj.%s = %s" % (prop, strVal) )
182         except StandardError, e:
183             raise PropertyUpdateException, e
184         self.PropForm.updatePropGrid()
185         # This is necessary to force a redraw when some props change.
186         self.select(obj)
187         try:
188             obj.setWidth()
189         except AttributeError:
190             pass
191         self.layout()
192                    
193
194     def onShowPanel(self, menu):
195         """Called when code makes a menu panel visible."""
196         self.menubar.hideAllBut(menu)
197        
198        
199     def select(self, obj):
200         if obj is self._selection:
201             return
202         self.lockDisplay()
203         if self._selection is not None:
204             self._selection.Selected = False
205         self._selection = obj
206         self.PropForm.select(obj)
207         obj.Selected = True
208         self.ensureVisible(obj)
209         dabo.ui.callAfterInterval(100, self._selectAfter)
210     def _selectAfter(self):
211         self.update()
212         self.refresh()
213         self.unlockDisplay()
214
215
216     def treeSelect(self):
217         """Called by the tree when a new selection has been made
218         by the user.
219         """
220         dabo.ui.callAfter(self.afterTreeSelect)
221        
222        
223     def afterTreeSelect(self):
224         self.PropForm.Tree._inAppSelection = True
225         try:
226             selObj = self.PropForm.Tree.getSelection()
227         except AttributeError:
228             # The tree hasn't been instantiated yet
229             return
230         self.select(selObj)
231         self.PropForm.Tree._inAppSelection = False
232        
233    
234     def ensureVisible(self, obj):
235         """When selecting a menu item, make sure that its menu is open."""
236         if isinstance(obj, (list, tuple)):
237             obj = obj[-1]
238         if isinstance(obj, (CaptionBitmapPanel, SeparatorPanel)):
239             obj.Controller.PanelVisible = True
240         elif isinstance(obj, MenuPanel):
241             obj.PanelVisible = True
242            
243    
244     def escapeQt(self, s):
245         sl = "\\"
246         qt = "\'"
247         return s.replace(sl, sl+sl).replace(qt, sl+qt)
248
249
250     def _getPropForm(self):
251         noProp = self._propForm is None
252         if not noProp:
253             # Make sure it's still a live object
254             try:
255                 junk = self._propForm.Visible
256             except dabo.ui.deadObjectException:
257                 noProp = True
258         if noProp:
259             pf = self._propForm = MenuPropForm(self, Visible=False,
260                     Controller=self)
261             pf.restoreSizeAndPosition()
262             self.updateLayout()
263             pf.Visible = True
264         return self._propForm
265
266
267     def _getPropSheet(self):
268         if self._propSheet is None:
269             self._propSheet = self.PropForm.PropSheet
270         return self._propSheet
271        
272        
273     def _getSelection(self):
274         return self._selection
275
276     def _setSelection(self, val):
277         self.select(val)
278
279
280     PropForm = property(_getPropForm, None, None,
281             _("""Reference to the form that contains the PropSheet
282             object (MenuPropForm)"""))
283    
284     PropSheet = property(_getPropSheet, None, None,
285             _("Reference to the Property Sheet (PropSheet)") )
286    
287     Selection = property(_getSelection, _setSelection, None,
288             _("Currently selected item  (CaptionPanel)"))
289    
Note: See TracBrowser for help on using the browser.