3 import Wbase
, Wcontrols
, Ctl
, Controls
7 _arrowright
= Qd
.GetPicture(472)
8 _arrowdown
= Qd
.GetPicture(473)
11 class PopupControl(Wcontrols
.ControlWidget
):
13 def __init__(self
, possize
, items
=None, callback
=None):
16 procID
= Controls
.popupMenuProc|Controls
.popupFixedWidth|Controls
.useWFont
17 Wcontrols
.ControlWidget
.__init
__(self
, possize
, "", procID
, callback
, 0, 0, 0)
18 self
._items
= items
[:]
21 self
._control
.SetControlValue(value
+1)
24 return self
._control
.GetControlValue() - 1
27 self
.menu
= menu
= FrameWork
.Menu(self
._parentwindow
.parent
.menubar
, 'Foo', -1)
29 for i
in range(len(self
._items
)):
31 if type(item
) == StringType
:
32 menuitemtext
= object = item
33 elif type(item
) == TupleType
and len(item
) == 2:
34 menuitemtext
, object = item
35 self
._items
[i
] = object
37 raise Wbase
.WidgetsError
, "illegal itemlist for popup menu"
38 menuitem
= FrameWork
.MenuItem(menu
, menuitemtext
, None, None)
41 self
._control
= Ctl
.NewControl(self
._parentwindow
.wid
,
51 self
.enable(self
._enabled
)
55 return Wcontrols
.ControlWidget
.close(self
)
57 def click(self
, point
, modifiers
):
60 part
= self
._control
.TrackControl(point
, -1)
63 Wbase
.CallbackCall(self
._callback
, 0, self
._items
[self
.get()])
66 class PopupWidget(Wbase
.ClickableWidget
):
68 """Simple title-less popup widget. Should be 16x16 pixels.
69 Builds the menu items on the fly, good for dynamic popup menus."""
71 def __init__(self
, possize
, items
=None, callback
=None):
72 Wbase
.ClickableWidget
.__init
__(self
, possize
)
77 self
._callback
= callback
81 Wbase
.ClickableWidget
.close(self
)
85 def draw(self
, visRgn
= None):
87 Qd
.FrameRect(self
._bounds
)
88 Qd
.EraseRect(Qd
.InsetRect(self
._bounds
, 1, 1))
89 l
, t
, r
, b
= self
._bounds
92 pictframe
= (l
, t
, l
+ 10, t
+ 10)
93 Qd
.DrawPicture(_arrowright
, pictframe
)
95 def click(self
, point
, modifiers
):
98 self
.menu
= FrameWork
.Menu(self
._parentwindow
.parent
.menubar
, 'Foo', -1)
99 self
._additems
(self
._items
, self
.menu
)
101 l
, t
, r
, b
= self
._bounds
102 l
, t
= Qd
.LocalToGlobal((l
+1, t
+1))
103 Wbase
.SetCursor("arrow")
104 self
.menu
.menu
.EnableItem(0)
105 reply
= self
.menu
.menu
.PopUpMenuSelect(t
, l
, 1)
107 id = (reply
& 0xffff0000) >> 16
108 item
= reply
& 0xffff
109 self
._menu
_callback
(id, item
)
112 def set(self
, items
):
118 def _additems(self
, items
, menu
):
119 from FrameWork
import SubMenu
, MenuItem
125 elif type(item
) == ListType
:
126 submenu
= SubMenu(menu
, item
[0])
127 self
._additems
(item
[1:], submenu
)
129 elif type(item
) == StringType
:
130 menuitemtext
= object = item
131 elif type(item
) == TupleType
and len(item
) == 2:
132 menuitemtext
, object = item
134 raise Wbase
.WidgetsError
, "illegal itemlist for popup menu"
136 if menuitemtext
[:1] == '\0':
137 check
= ord(menuitemtext
[1])
138 menuitemtext
= menuitemtext
[2:]
141 menuitem
= MenuItem(menu
, menuitemtext
, None, None)
144 self
._itemsdict
[(menu_id
, menuitem
.item
)] = object
146 def _emptymenu(self
):
147 menus
= self
._parentwindow
.parent
.menubar
.menus
148 for id, item
in self
._itemsdict
.keys():
149 if menus
.has_key(id):
150 self
.menu
= menus
[id]
154 def _menu_callback(self
, id, item
):
155 thing
= self
._itemsdict
[(id, item
)]
159 Wbase
.CallbackCall(self
._callback
, 0, thing
)
162 class PopupMenu(PopupWidget
):
164 """Simple title-less popup widget. Should be 16x16 pixels.
165 Prebuilds the menu items, good for static (non changing) popup menus."""
169 self
.menu
= Wapplication
.Menu(self
._parentwindow
.parent
.menubar
, 'Foo', -1)
170 self
._additems
(self
._items
, self
.menu
)
174 Wbase
.Widget
.close(self
)
179 def set(self
, items
):
182 self
.menu
= Wapplication
.Menu(self
._parentwindow
.parent
.menubar
, 'Foo', -1)
184 self
._additems
(self
._items
, self
.menu
)
186 def click(self
, point
, modifiers
):
187 if not self
._enabled
:
190 l
, t
, r
, b
= self
._bounds
191 l
, t
= Qd
.LocalToGlobal((l
+1, t
+1))
192 Wbase
.SetCursor("arrow")
193 self
.menu
.menu
.EnableItem(0)
194 reply
= self
.menu
.menu
.PopUpMenuSelect(t
, l
, 1)
196 id = (reply
& 0xffff0000) >> 16
197 item
= reply
& 0xffff
198 self
._menu
_callback
(id, item
)
201 class FontMenu(PopupMenu
):
203 """A font popup menu."""
207 def __init__(self
, possize
, callback
):
208 PopupMenu
.__init
__(self
, possize
)
210 self
._callback
= callback
220 raise Wbase
.WidgetsError
, "can't change font menu widget"
222 def _menu_callback(self
, id, item
):
223 fontname
= self
.menu
.menu
.GetMenuItemText(item
)
225 Wbase
.CallbackCall(self
._callback
, 0, fontname
)
227 def click(self
, point
, modifiers
):
228 if not self
._enabled
:
231 return PopupMenu
.click(self
, point
, modifiers
)
235 """helper for font menu"""
236 if FontMenu
.menu
is not None:
239 FontMenu
.menu
= Wapplication
.Menu(W
.getapplication().menubar
, 'Foo', -1)
241 for i
in range(FontMenu
.menu
.menu
.CountMItems(), 0, -1):
242 FontMenu
.menu
.menu
.DeleteMenuItem(i
)
243 FontMenu
.menu
.menu
.AppendResMenu('FOND')
249 for i
in range(1, Res
.CountResources('FOND') + 1):
250 r
= Res
.GetIndResource('FOND', i
)
251 fontnames
.append(r
.GetResInfo()[2])