113 lines
3.2 KiB
Python
113 lines
3.2 KiB
Python
import string
|
|
import Tkinter
|
|
import Pmw
|
|
|
|
def aligngrouptags(groups):
|
|
# Adjust the y position of the tags in /groups/ so that they all
|
|
# have the height of the highest tag.
|
|
|
|
maxTagHeight = 0
|
|
for group in groups:
|
|
if group._tag is None:
|
|
height = (string.atoi(str(group._ring.cget('borderwidth'))) +
|
|
string.atoi(str(group._ring.cget('highlightthickness'))))
|
|
else:
|
|
height = group._tag.winfo_reqheight()
|
|
if maxTagHeight < height:
|
|
maxTagHeight = height
|
|
|
|
for group in groups:
|
|
ringBorder = (string.atoi(str(group._ring.cget('borderwidth'))) +
|
|
string.atoi(str(group._ring.cget('highlightthickness'))))
|
|
topBorder = maxTagHeight / 2 - ringBorder / 2
|
|
group._hull.grid_rowconfigure(0, minsize = topBorder)
|
|
group._ring.grid_rowconfigure(0,
|
|
minsize = maxTagHeight - topBorder - ringBorder)
|
|
if group._tag is not None:
|
|
group._tag.place(y = maxTagHeight / 2)
|
|
|
|
class Group( Pmw.MegaWidget ):
|
|
def __init__(self, parent = None, **kw):
|
|
|
|
# Define the megawidget options.
|
|
INITOPT = Pmw.INITOPT
|
|
optiondefs = (
|
|
('collapsedsize', 6, INITOPT),
|
|
('ring_borderwidth', 2, None),
|
|
('ring_relief', 'groove', None),
|
|
('tagindent', 10, INITOPT),
|
|
)
|
|
self.defineoptions(kw, optiondefs)
|
|
|
|
# Initialise the base class (after defining the options).
|
|
Pmw.MegaWidget.__init__(self, parent)
|
|
|
|
# Create the components.
|
|
interior = Pmw.MegaWidget.interior(self)
|
|
|
|
self._ring = self.createcomponent(
|
|
'ring',
|
|
(), None,
|
|
Tkinter.Frame, (interior,),
|
|
)
|
|
|
|
self._groupChildSite = self.createcomponent(
|
|
'groupchildsite',
|
|
(), None,
|
|
Tkinter.Frame, (self._ring,)
|
|
)
|
|
|
|
self._tag = self.createcomponent(
|
|
'tag',
|
|
(), None,
|
|
Tkinter.Label, (interior,),
|
|
)
|
|
|
|
ringBorder = (string.atoi(str(self._ring.cget('borderwidth'))) +
|
|
string.atoi(str(self._ring.cget('highlightthickness'))))
|
|
if self._tag is None:
|
|
tagHeight = ringBorder
|
|
else:
|
|
tagHeight = self._tag.winfo_reqheight()
|
|
self._tag.place(
|
|
x = ringBorder + self['tagindent'],
|
|
y = tagHeight / 2,
|
|
anchor = 'w')
|
|
|
|
topBorder = tagHeight / 2 - ringBorder / 2
|
|
self._ring.grid(column = 0, row = 1, sticky = 'nsew')
|
|
interior.grid_columnconfigure(0, weight = 1)
|
|
interior.grid_rowconfigure(1, weight = 1)
|
|
interior.grid_rowconfigure(0, minsize = topBorder)
|
|
|
|
self._groupChildSite.grid(column = 0, row = 1, sticky = 'nsew')
|
|
self._ring.grid_columnconfigure(0, weight = 1)
|
|
self._ring.grid_rowconfigure(1, weight = 1)
|
|
self._ring.grid_rowconfigure(0,
|
|
minsize = tagHeight - topBorder - ringBorder)
|
|
|
|
self.showing = 1
|
|
|
|
# Check keywords and initialise options.
|
|
self.initialiseoptions()
|
|
|
|
def toggle(self):
|
|
if self.showing:
|
|
self.collapse()
|
|
else:
|
|
self.expand()
|
|
self.showing = not self.showing
|
|
|
|
def expand(self):
|
|
self._groupChildSite.grid(column = 0, row = 1, sticky = 'nsew')
|
|
|
|
def collapse(self):
|
|
self._groupChildSite.grid_forget()
|
|
if self._tag is None:
|
|
tagHeight = 0
|
|
else:
|
|
tagHeight = self._tag.winfo_reqheight()
|
|
self._ring.configure(height=(tagHeight / 2) + self['collapsedsize'])
|
|
|
|
def interior(self):
|
|
return self._groupChildSite
|