File: menu.txt

package info (click to toggle)
python-wpy 0.53-0.1
  • links: PTS
  • area: main
  • in suites: hamm
  • size: 832 kB
  • ctags: 1,991
  • sloc: python: 8,624; makefile: 57; sh: 24
file content (236 lines) | stat: -rw-r--r-- 9,529 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
Menu Bar Creation
=================

In WPY a menu bar is a class with a number of menu items.  Each menu item
has a specified parent which controls where it appears in the menu.
Menu items are the usual buttons, check and radio buttons, and dividing
lines.  You don't create an instance of your class.  Just create a
class derived from CMenu and create the menu items in the __init__()
method.  Then register the menu in your template in your app's
InitInstance() method.  The system will create the menu from your
class when it needs to.  For example:

class MyMenu(CMenu):		# The only method is __init__()
  def __init__(self):
    CMenu.__init__(self)	# Must call the base class!
    file = MenuFile(self)
    edit = MenuEdit(self)
    # file items:
    MenuFileNew(file)
    MenuFileClose(file)
    CMenuLine(file)
    # etc....

class MyApp(CWinApp):
  def InitInstance(self):
    templ = CMultiDocTemplate(MyDoc, MyFrame, MyView, MyMenu)

Menu Items
==========

In practice, most menu items you use will be the standard menu items
discussed below.  But for your own custom menu items use these classes.
The "parent" is "self" within the menu class derived from CMenu.  This
represents the top menu bar.  For non-top items, the parent is the
button below which the item appears.

The "text" is the text to appear on the button.  Place the "&" character
in the text to underline the next character.  The system will use the
underlined character for keyboard menu traversal.  For example, "E&xit"
will cause the "x" to be underlined.

class CMenuButton	# A normal menu button
  def __init__(self, parent, text):

class CMenuCheck	# Shows a check mark
  # The checked state of this button is self.wpyCheckValue (0 or 1)
  def __init__(self, parent, text):
  def SetCheck(self, check = 1):

Call SetCheck to set/unset the checked state from your code.  The
WPY system maintains the checked state itself for user menu selections.

class CMenuRadio	# Part of a radio group
  # Specify the head button of the radio group as "group = None"
  # Specify the other buttons of the radio group as "group"  = head button
  def __init__(self, parent, text, group = None):
  def SetCheck(self):

Call SetCheck to make this button the selected button.  The
WPY system maintains the checked state itself for user menu selections.
For any button in a radio group, the selected button is self.wpyRadioSelected.

class CMenuLine
  def __init__(self, parent):

Menu items on a menu bar may be positioned on the right
side by setting the attribute item.wpyRightSide = 1.  This
is ineffective on Windows.

Menu Message Handlers
=====================

When the user selects a menu item, the handler for the item is searched
for in the same way as a button press.  See the button class for the
search order.  When a button is constructed, the default handler name
(except for standard menu items) is "OnMenu" plus the capitalized text
from each level of the menu.  For example, the handler name for a
File/Fix item is "OnMenuFileFix".  You can change the handler name if
you want:
    b = CMenuButton(file, "Fix")
    b.wpyHandler = "FixFile"
The standard menu items have their own non-standard handler names.  If
you change the handler name, it converts the button to use your handler.

Menu Update Handlers
====================

When a menu is about to be shown, it may be convenient to get a message
so that the state of the menu can be altered, for example in order
to enable or disable certain menu items.  The WPY system will send a
message in exactly the same way as the menu message handlers discussed
above.  The handler name is the same as the regular handler plus "UI".
For example, "OnMenuFileFixUI" would be called.  Each menu item may specify
its own handler, or you could put all updates in a single handler.

Popup Menus
===========

A WPY popup menu is a menu not on the menu bar which probably was
created by clicking a mouse button.  For example:

  def OnRButtonDown(self, x, y, flags):
    pop = CMenu()	# Construct a popup menu
    rect = self.GetWindowRect()		# Get our window position
    pop.wpyLocX = rect.wpyLocX + x	# Place popup at mouse position
    pop.wpyLocY = rect.wpyLocY + y
    i1  = CMenuButton(pop, "Button 1")	# Make some menu items
    i2  = CMenuButton(pop, "Button 2")
    i3  = CMenuButton(pop, "Button 3")
    pop.TrackPopupMenu(self.wpyParent)	# Show the popup

Note that TrackPopupMenu(win) needs a frame window as win.
The name of a popup is "", so the handler name of item "Button 1" is
"OnMenuButton1".  Menu items behave as usual, so you can change the
handler names if you want.

Accelerators
============

You can assign a key to a menu item so that when that key is pressed
the menu item is invoked.  This should be done with care, since this
makes the key unavailable to OnChar() and OnVChar().  You may also
assign several keys by using MakeAccel() more than once.  

CMenu::MakeAccel(self, obj, key, flags, text)
obj	The menu item.
key	The key as would be sent to OnChar() or OnVChar().
flags	The flags as would be sent to OnChar() or OnVChar().
text	Text to add to the menu item's text, such as "Ctrl+X".  Or
	use "" for no added text.

For example:
    b = CMenuButton(file, "Fix")
    # Add an accelerator key Control-F
    self.MakeAccel(b, "\006", wpycon.MK_CONTROL, "Ctrl+F")

Imitating a Menu Selection
==========================

Sometimes you may want to call the handler of a menu item from your
code.  The result is the same as the user selecting the menu button.
To do that, call the Post() or Send() method of the menu button.  For example:
    b = CMenuButton(file, "Fix..")
    global menu_file_fix = b	# Could also use attrib. of wpyApp
    ...
    menu_file_fix.Post()
You need to refer to the original menu button since it has the correct
handler name and other attributes.  But for the standard menu items, you
do not need the original button, because all attributes are built in.
So you can make a new button using a parent of None:
    MenuFileClose(None).Post()	# Easier way to call standard menu item
The Post() method will execute the menu command the next time the
system is idle.  The Send() method calls the command at once.

Standard Menu Items
===================

Most of the usual menu items such as File/Open and File/Close have
a standard implementation in WPY.  To use one, just add it to your
menu.  The WPY system provides the implementation, and there is nothing
else you need to do.  These standard buttons come with their own text,
message text and handlers.  The handlers have a non-standard name so
they don't interfere with your code.  That is, the handler for the
File/Open menu item is NOT OnMenuFileOpen().

You can override a standard menu item by just changing the handler
name.  You could choose any name, but the usual standard name is
probably a good choice.  For example:
    b = MenuFileClose(parent)		# Construct standard menu item
    b.wpyHandler = "OnMenuFileClose"	# Replace default handler
Of course, you could also just make a new custom button:
    b = CMenuButton(file, "Close")
but then you would need to create the message text.

If you need to "call the base class" of a standard menu item, use
the Post() method discussed above.

These are the standard menu items.  The constructors are all of the
usual menu item form, for example MenuFileNew(self, parent, text) but
the text is provided, and should be omitted.  So just enter the parent
argument.  For example:
    f = MenuFile(self)
    x = MenuFileNew(f)

MenuLine():	# Just an alias for CMenuLine

# Standard menu buttons for "File":
MenuFile()	Commands to open/close/save the document
MenuFileNew()	Create a new document
MenuFileOpen()	Open an existing document
MenuFileClose()	Close the active document
MenuFileSave()	Save the active document
MenuFileSaveas()	Save the active document with a new name
MenuFilePrint()	Print the current document
MenuFilePrintersetup()	Change printer settings, Windows only
MenuFileExit()	Quit the application

# Standard menu buttons for "Edit":
MenuEdit()	Commands to edit the document
MenuEditUndo()	Undoes the last change, Windows only
MenuEditRedo()	Redoes the previously undone action, Windows only
MenuEditCut()	Removes the selection and puts it on the Clipboard
MenuEditCopy()	Copies the selection and puts it on the Clipboard
MenuEditPaste()	Inserts Clipboard contents at the insertion point
MenuEditDelete()	Erases the selection
MenuEditSelectall()	Selects the entire document

# Standard menu buttons for "View":
MenuView()	Commands to change what is viewed
MenuViewStatusbar(CMenuCheck)	Show or hide the status bar

# Standard menu buttons for "Window":
MenuWindow()	Commands to arrange the windows
MenuWindowNewwindow()	Open another window for the active document
MenuWindowCascade()	Arrange windows so they overlap, Windows only
MenuWindowTilehorz()	Arrange windows as non-overlapping tiles, Windows only
MenuWindowTilevert()	Arrange windows as non-overlapping tiles, Windows only
MenuWindowArrangeicons()	Arrange icons at the bottom of the window, Windows only

# Standard menu buttons for "Help":
MenuHelp()	Commands to display program information
MenuHelpAbout()	Display program information, version number and copyright

Misc
====
class WpyMenuItem(CMenu)
	An abstract class with methods inherited by the menu buttons.

Methods

Destroy(self)
	Destroy a menu button.
Insert(self, index=999)
	Insert the menu button in its parent at "index".  Index
	is 0, 1, ..., and an index past the end means to append
	the menu item.