mirror of https://github.com/python/cpython.git
197 lines
4.8 KiB
Python
197 lines
4.8 KiB
Python
|
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
|