diff options
author | Just van Rossum <just@lettererror.com> | 1999-01-30 22:39:17 (GMT) |
---|---|---|
committer | Just van Rossum <just@lettererror.com> | 1999-01-30 22:39:17 (GMT) |
commit | 40f9b7bd7cb54645a7c15668b683a8d830ba5219 (patch) | |
tree | baea660d6ef599cd9c4ecc72d009fa75853de577 /Mac/Tools/IDE/Wmenus.py | |
parent | f59a89b5e34ac7db9e69b02a5b558c7cb49a4d9a (diff) | |
download | cpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.zip cpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.tar.gz cpython-40f9b7bd7cb54645a7c15668b683a8d830ba5219.tar.bz2 |
First Checked In.
Diffstat (limited to 'Mac/Tools/IDE/Wmenus.py')
-rw-r--r-- | Mac/Tools/IDE/Wmenus.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/Mac/Tools/IDE/Wmenus.py b/Mac/Tools/IDE/Wmenus.py new file mode 100644 index 0000000..387590b --- /dev/null +++ b/Mac/Tools/IDE/Wmenus.py @@ -0,0 +1,196 @@ +import FrameWork +import Qd +import Wbase +from types import * +import Wapplication + +_arrowright = Qd.GetPicture(472) +_arrowdown = Qd.GetPicture(473) + + + +class PopupWidget(Wbase.ClickableWidget): + + """Simple title-less popup widget. Should be 16x16 pixels. + Builds the menu items on the fly, good for dynamic popup menus.""" + + def __init__(self, possize, items = [], callback = None): + Wbase.Widget.__init__(self, possize) + self._items = items + self._itemsdict = {} + self._callback = callback + self._enabled = 1 + + def close(self): + Wbase.Widget.close(self) + self._items = None + self._itemsdict = {} + + def draw(self, visRgn = None): + if self._visible: + Qd.FrameRect(self._bounds) + Qd.EraseRect(Qd.InsetRect(self._bounds, 1, 1)) + l, t, r, b = self._bounds + l = l + 2 + t = t + 3 + pictframe = (l, t, l + 10, t + 10) + Qd.DrawPicture(_arrowright, pictframe) + + def click(self, point, modifiers): + if not self._enabled: + return + self.menu = FrameWork.Menu(self._parentwindow.parent.menubar, 'Foo', -1) + self._additems(self._items, self.menu) + self.SetPort() + l, t, r, b = self._bounds + l, t = Qd.LocalToGlobal((l+1, t+1)) + Wbase.SetCursor("arrow") + self.menu.menu.EnableItem(0) + reply = self.menu.menu.PopUpMenuSelect(t, l, 1) + if reply: + id = (reply & 0xffff0000) >> 16 + item = reply & 0xffff + self._menu_callback(id, item) + self._emptymenu() + + def set(self, items): + self._items = items + + def get(self): + return self._items + + def _additems(self, items, menu): + from FrameWork import SubMenu, MenuItem + menu_id = menu.id + for item in items: + if item == "-": + menu.addseparator() + continue + elif type(item) == ListType: + submenu = SubMenu(menu, item[0]) + self._additems(item[1:], submenu) + continue + elif type(item) == StringType: + menuitemtext = object = item + elif type(item) == TupleType and len(item) == 2: + menuitemtext, object = item + else: + raise Wbase.WidgetsError, "illegal itemlist for popup menu" + + if menuitemtext[:1] == '\0': + check = ord(menuitemtext[1]) + menuitemtext = menuitemtext[2:] + else: + check = 0 + menuitem = MenuItem(menu, menuitemtext, None, None) + if check: + menuitem.check(1) + self._itemsdict[(menu_id, menuitem.item)] = object + + def _emptymenu(self): + menus = self._parentwindow.parent.menubar.menus + for id, item in self._itemsdict.keys(): + if menus.has_key(id): + self.menu = menus[id] + self.menu.delete() + self._itemsdict = {} + + def _menu_callback(self, id, item): + thing = self._itemsdict[(id, item)] + if callable(thing): + thing() + elif self._callback: + Wbase.CallbackCall(self._callback, 0, thing) + + +class PopupMenu(PopupWidget): + + """Simple title-less popup widget. Should be 16x16 pixels. + Prebuilds the menu items, good for static (non changing) popup menus.""" + + def open(self): + self._calcbounds() + self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1) + self._additems(self._items, self.menu) + + def close(self): + self._emptymenu() + Wbase.Widget.close(self) + self._items = None + self._itemsdict = {} + self.menu = None + + def set(self, items): + if self._itemsdict: + self._emptymenu() + self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1) + self._items = items + self._additems(self._items, self.menu) + + def click(self, point, modifiers): + if not self._enabled: + return + self.SetPort() + l, t, r, b = self._bounds + l, t = Qd.LocalToGlobal((l+1, t+1)) + Wbase.SetCursor("arrow") + self.menu.menu.EnableItem(0) + reply = self.menu.menu.PopUpMenuSelect(t, l, 1) + if reply: + id = (reply & 0xffff0000) >> 16 + item = reply & 0xffff + self._menu_callback(id, item) + + +class FontMenu(PopupMenu): + + """A font popup menu.""" + + menu = None + + def __init__(self, possize, callback): + PopupMenu.__init__(self, possize) + _makefontmenu() + self._callback = callback + self._enabled = 1 + + def open(self): + self._calcbounds() + + def close(self): + del self._callback + + def set(self): + raise Wbase.WidgetsError, "can't change font menu widget" + + def _menu_callback(self, id, item): + fontname = self.menu.menu.GetMenuItemText(item) + if self._callback: + Wbase.CallbackCall(self._callback, 0, fontname) + + def click(self, point, modifiers): + if not self._enabled: + return + _makefontmenu() + return PopupMenu.click(self, point, modifiers) + + +def _makefontmenu(): + """helper for font menu""" + if FontMenu.menu is not None: + return + import W + FontMenu.menu = Wapplication.Menu(W.getapplication().menubar, 'Foo', -1) + W.SetCursor('watch') + for i in range(FontMenu.menu.menu.CountMItems(), 0, -1): + FontMenu.menu.menu.DeleteMenuItem(i) + FontMenu.menu.menu.AppendResMenu('FOND') + + +def _getfontlist(): + import Res + fontnames = [] + for i in range(1, Res.CountResources('FOND') + 1): + r = Res.GetIndResource('FOND', i) + fontnames.append(r.GetResInfo()[2]) + return fontnames |