home *** CD-ROM | disk | FTP | other *** search
- 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
-