mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00

- removed default button drawing code: this doesn't work well under OSX. Needs to be replaced by SetWindowDefaultButton() calls, once we have those.
367 lines
9.1 KiB
Python
367 lines
9.1 KiB
Python
from Carbon import Ctl, Controls
|
|
from Carbon import Evt, Qd, Win
|
|
import Wbase
|
|
|
|
|
|
class ControlWidget(Wbase.ClickableWidget):
|
|
|
|
"""Baseclass for all native controls."""
|
|
|
|
def __init__(self, possize, title = "Control", procID = 0, callback = None, value = 0, min = 0, max = 1):
|
|
Wbase.ClickableWidget.__init__(self, possize)
|
|
self._control = None
|
|
self._title = title
|
|
self._callback = callback
|
|
self._procID = procID
|
|
self._value = value
|
|
self._min = min
|
|
self._max = max
|
|
self._enabled = 1
|
|
|
|
def open(self):
|
|
self._calcbounds()
|
|
self._control = Ctl.NewControl(self._parentwindow.wid,
|
|
self._bounds,
|
|
self._title,
|
|
1,
|
|
self._value,
|
|
self._min,
|
|
self._max,
|
|
self._procID,
|
|
0)
|
|
self.SetPort()
|
|
#self.GetWindow().ValidWindowRect(self._bounds)
|
|
self.enable(self._enabled)
|
|
|
|
def adjust(self, oldbounds):
|
|
self.SetPort()
|
|
self._control.HideControl()
|
|
self._control.MoveControl(self._bounds[0], self._bounds[1])
|
|
self._control.SizeControl(self._bounds[2] - self._bounds[0], self._bounds[3] - self._bounds[1])
|
|
if self._visible:
|
|
Qd.EraseRect(self._bounds)
|
|
self._control.ShowControl()
|
|
self.GetWindow().ValidWindowRect(self._bounds)
|
|
|
|
def close(self):
|
|
self._control.HideControl()
|
|
self._control = None
|
|
Wbase.ClickableWidget.close(self)
|
|
|
|
def enable(self, onoff):
|
|
if self._control and self._enabled <> onoff:
|
|
self._control.HiliteControl((not onoff) and 255)
|
|
self._enabled = onoff
|
|
|
|
def show(self, onoff):
|
|
self._visible = onoff
|
|
for w in self._widgets:
|
|
w.show(onoff)
|
|
if onoff:
|
|
self._control.ShowControl()
|
|
else:
|
|
self._control.HideControl()
|
|
|
|
def activate(self, onoff):
|
|
self._activated = onoff
|
|
if self._enabled:
|
|
self._control.HiliteControl((not onoff) and 255)
|
|
|
|
def draw(self, visRgn = None):
|
|
if self._visible:
|
|
self._control.Draw1Control()
|
|
|
|
def test(self, point):
|
|
ctltype, control = Ctl.FindControl(point, self._parentwindow.wid)
|
|
if self._enabled and control == self._control:
|
|
return 1
|
|
|
|
def click(self, point, modifiers):
|
|
if not self._enabled:
|
|
return
|
|
part = self._control.TrackControl(point)
|
|
if part:
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0)
|
|
|
|
def settitle(self, title):
|
|
if self._control:
|
|
self._control.SetControlTitle(title)
|
|
self._title = title
|
|
|
|
def gettitle(self):
|
|
return self._title
|
|
|
|
class Button(ControlWidget):
|
|
|
|
"""Standard push button."""
|
|
|
|
def __init__(self, possize, title = "Button", callback = None):
|
|
procID = Controls.pushButProc | Controls.useWFont
|
|
ControlWidget.__init__(self, possize, title, procID, callback, 0, 0, 1)
|
|
self._isdefault = 0
|
|
|
|
def push(self):
|
|
if not self._enabled:
|
|
return
|
|
import time
|
|
self._control.HiliteControl(1)
|
|
time.sleep(0.1)
|
|
self._control.HiliteControl(0)
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0)
|
|
|
|
def enable(self, onoff):
|
|
if self._control and self._enabled <> onoff:
|
|
self._control.HiliteControl((not onoff) and 255)
|
|
self._enabled = onoff
|
|
|
|
def activate(self, onoff):
|
|
self._activated = onoff
|
|
if self._enabled:
|
|
self._control.HiliteControl((not onoff) and 255)
|
|
|
|
def show(self, onoff):
|
|
ControlWidget.show(self, onoff)
|
|
|
|
def draw(self, visRgn = None):
|
|
if self._visible:
|
|
self._control.Draw1Control()
|
|
|
|
def _setdefault(self, onoff):
|
|
self._isdefault = onoff
|
|
|
|
def adjust(self, oldbounds):
|
|
if self._isdefault:
|
|
old = Qd.InsetRect(oldbounds, -4, -4)
|
|
new = Qd.InsetRect(self._bounds, -4, -4)
|
|
Qd.EraseRect(old)
|
|
self.GetWindow().InvalWindowRect(old)
|
|
self.GetWindow().InvalWindowRect(new)
|
|
ControlWidget.adjust(self, oldbounds)
|
|
|
|
|
|
class CheckBox(ControlWidget):
|
|
|
|
"""Standard checkbox."""
|
|
|
|
def __init__(self, possize, title = "Checkbox", callback = None, value = 0):
|
|
procID = Controls.checkBoxProc | Controls.useWFont
|
|
ControlWidget.__init__(self, possize, title, procID, callback, value, 0, 1)
|
|
|
|
def click(self, point, modifiers):
|
|
if not self._enabled:
|
|
return
|
|
part = self._control.TrackControl(point)
|
|
if part:
|
|
self.toggle()
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0, self.get())
|
|
|
|
def push(self):
|
|
if not self._enabled:
|
|
return
|
|
self.toggle()
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0, self.get())
|
|
|
|
def toggle(self):
|
|
self.set(not self.get())
|
|
|
|
def set(self, value):
|
|
if self._control:
|
|
self._control.SetControlValue(value)
|
|
else:
|
|
self._value = value
|
|
|
|
def get(self):
|
|
if self._control:
|
|
return self._control.GetControlValue()
|
|
else:
|
|
return self._value
|
|
|
|
|
|
class RadioButton(ControlWidget):
|
|
|
|
"""Standard radiobutton."""
|
|
|
|
# XXX We need a radiogroup widget; this is too kludgy.
|
|
|
|
def __init__(self, possize, title, thebuttons, callback = None, value = 0):
|
|
procID = Controls.radioButProc | Controls.useWFont
|
|
ControlWidget.__init__(self, possize, title, procID, callback, value, 0, 1)
|
|
self.thebuttons = thebuttons
|
|
thebuttons.append(self)
|
|
|
|
def close(self):
|
|
self.thebuttons = None
|
|
ControlWidget.close(self)
|
|
|
|
def click(self, point, modifiers):
|
|
if not self._enabled:
|
|
return
|
|
part = self._control.TrackControl(point)
|
|
if part:
|
|
self.set(1)
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0, 1)
|
|
|
|
def push(self):
|
|
if not self._enabled:
|
|
return
|
|
self.set(1)
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 0, 1)
|
|
|
|
def set(self, value):
|
|
for button in self.thebuttons:
|
|
if button._control:
|
|
button._control.SetControlValue(button == self)
|
|
else:
|
|
button._value = (button == self)
|
|
|
|
def get(self):
|
|
if self._control:
|
|
return self._control.GetControlValue()
|
|
else:
|
|
return self._value
|
|
|
|
|
|
class Scrollbar(ControlWidget):
|
|
|
|
"""Standard scrollbar."""
|
|
|
|
def __init__(self, possize, callback = None, value = 0, min = 0, max = 0):
|
|
procID = Controls.scrollBarProc
|
|
ControlWidget.__init__(self, possize, "", procID, callback, value, min, max)
|
|
|
|
# interface
|
|
def set(self, value):
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, value)
|
|
|
|
def up(self):
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, '+')
|
|
|
|
def down(self):
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, '-')
|
|
|
|
def pageup(self):
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, '++')
|
|
|
|
def pagedown(self):
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, '--')
|
|
|
|
def setmin(self, min):
|
|
self._control.SetControlMinimum(min)
|
|
|
|
def setmax(self, min):
|
|
self._control.SetControlMinimum(max)
|
|
|
|
def getmin(self):
|
|
return self._control.GetControlMinimum()
|
|
|
|
def getmax(self):
|
|
return self._control.GetControlMinimum()
|
|
|
|
# internals
|
|
def click(self, point, modifiers):
|
|
if not self._enabled:
|
|
return
|
|
# custom TrackControl. A mousedown in a scrollbar arrow or page area should
|
|
# generate _control hits as long as the mouse is a) down, b) still in the same part
|
|
part = self._control.TestControl(point)
|
|
if Controls.inUpButton <= part <= Controls.inPageDown:
|
|
self._control.HiliteControl(part)
|
|
self._hit(part)
|
|
oldpart = part
|
|
# slight delay before scrolling at top speed...
|
|
now = Evt.TickCount()
|
|
while Evt.StillDown():
|
|
if (Evt.TickCount() - now) > 18: # 0.3 seconds
|
|
break
|
|
while Evt.StillDown():
|
|
part = self._control.TestControl(point)
|
|
if part == oldpart:
|
|
self._control.HiliteControl(part)
|
|
self._hit(part)
|
|
else:
|
|
self._control.HiliteControl(0)
|
|
self.SetPort()
|
|
point = Evt.GetMouse()
|
|
self._control.HiliteControl(0)
|
|
elif part == Controls.inThumb:
|
|
part = self._control.TrackControl(point)
|
|
if part:
|
|
self._hit(part)
|
|
|
|
def _hit(self, part):
|
|
if part == Controls.inThumb:
|
|
value = self._control.GetControlValue()
|
|
elif part == Controls.inUpButton:
|
|
value = "+"
|
|
elif part == Controls.inDownButton:
|
|
value = "-"
|
|
elif part == Controls.inPageUp:
|
|
value = "++"
|
|
elif part == Controls.inPageDown:
|
|
value = "--"
|
|
if self._callback:
|
|
Wbase.CallbackCall(self._callback, 1, value)
|
|
|
|
def draw(self, visRgn = None):
|
|
if self._visible:
|
|
self._control.Draw1Control()
|
|
Qd.FrameRect(self._bounds)
|
|
|
|
def adjust(self, oldbounds):
|
|
self.SetPort()
|
|
self.GetWindow().InvalWindowRect(oldbounds)
|
|
self._control.HideControl()
|
|
self._control.MoveControl(self._bounds[0], self._bounds[1])
|
|
self._control.SizeControl(self._bounds[2] - self._bounds[0], self._bounds[3] - self._bounds[1])
|
|
if self._visible:
|
|
Qd.EraseRect(self._bounds)
|
|
if self._activated:
|
|
self._control.ShowControl()
|
|
else:
|
|
Qd.FrameRect(self._bounds)
|
|
self.GetWindow().ValidWindowRect(self._bounds)
|
|
|
|
def activate(self, onoff):
|
|
self._activated = onoff
|
|
if self._visible:
|
|
if onoff:
|
|
self._control.ShowControl()
|
|
else:
|
|
self._control.HideControl()
|
|
self.draw(None)
|
|
self.GetWindow().ValidWindowRect(self._bounds)
|
|
|
|
def set(self, value):
|
|
if self._control:
|
|
self._control.SetControlValue(value)
|
|
else:
|
|
self._value = value
|
|
|
|
def get(self):
|
|
if self._control:
|
|
return self._control.GetControlValue()
|
|
else:
|
|
return self._value
|
|
|
|
|
|
def _scalebarvalue(absmin, absmax, curmin, curmax):
|
|
if curmin <= absmin and curmax >= absmax:
|
|
return None
|
|
if curmin <= absmin:
|
|
return 0
|
|
if curmax >= absmax:
|
|
return 32767
|
|
perc = float(curmin-absmin) / float((absmax - absmin) - (curmax - curmin))
|
|
return int(perc*32767)
|
|
|