mirror of
https://github.com/python/cpython.git
synced 2025-07-23 19:25:40 +00:00
Added window list management functionality.
Automatically call self.destroy() if WE_CLOSE event dispatched. Added keyboard, alternate drawing and getwindow interface. Call child's realize method.
This commit is contained in:
parent
4f4794a9a0
commit
117dbcb2fe
2 changed files with 126 additions and 12 deletions
|
@ -1,6 +1,8 @@
|
||||||
# A 'WindowParent' is the only module that uses real stdwin functionality.
|
# A 'WindowParent' is the only module that uses real stdwin functionality.
|
||||||
# It is the root of the tree.
|
# It is the root of the tree.
|
||||||
# It should have exactly one child when realized.
|
# It should have exactly one child when realized.
|
||||||
|
#
|
||||||
|
# There is also some support for a standard main loop here.
|
||||||
|
|
||||||
import stdwin
|
import stdwin
|
||||||
from stdwinevents import *
|
from stdwinevents import *
|
||||||
|
@ -9,6 +11,8 @@ from TransParent import ManageOneChild
|
||||||
|
|
||||||
Error = 'WindowParent.Error' # Exception
|
Error = 'WindowParent.Error' # Exception
|
||||||
|
|
||||||
|
WindowList = [] # List containing all windows
|
||||||
|
|
||||||
class WindowParent() = ManageOneChild():
|
class WindowParent() = ManageOneChild():
|
||||||
#
|
#
|
||||||
def create(self, (title, size)):
|
def create(self, (title, size)):
|
||||||
|
@ -22,18 +26,29 @@ class WindowParent() = ManageOneChild():
|
||||||
self.win = 0
|
self.win = 0
|
||||||
self.itimer = 0
|
self.itimer = 0
|
||||||
self.do_mouse = 0
|
self.do_mouse = 0
|
||||||
|
self.do_keybd = 0
|
||||||
self.do_timer = 0
|
self.do_timer = 0
|
||||||
|
self.do_altdraw = 0
|
||||||
#
|
#
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
|
if self.win in WindowList:
|
||||||
|
import util
|
||||||
|
util.remove(self.win, WindowList)
|
||||||
if self.child: self.child.destroy()
|
if self.child: self.child.destroy()
|
||||||
self._reset()
|
self._reset()
|
||||||
#
|
#
|
||||||
def need_mouse(self, child): self.do_mouse = 1
|
def need_mouse(self, child): self.do_mouse = 1
|
||||||
def no_mouse(self, child): self.do_mouse = 0
|
def no_mouse(self, child): self.do_mouse = 0
|
||||||
#
|
#
|
||||||
|
def need_keybd(self, child): self.do_keybd = 1
|
||||||
|
def no_keybd(self, child): self.do_keybd = 0
|
||||||
|
#
|
||||||
def need_timer(self, child): self.do_timer = 1
|
def need_timer(self, child): self.do_timer = 1
|
||||||
def no_timer(self, child): self.do_timer = 0
|
def no_timer(self, child): self.do_timer = 0
|
||||||
#
|
#
|
||||||
|
def need_altdraw(self, child): self.do_altdraw = 1
|
||||||
|
def no_altdraw(self, child): self.do_altdraw = 0
|
||||||
|
#
|
||||||
def realize(self):
|
def realize(self):
|
||||||
if self.win:
|
if self.win:
|
||||||
raise Error, 'realize(): called twice'
|
raise Error, 'realize(): called twice'
|
||||||
|
@ -42,14 +57,24 @@ class WindowParent() = ManageOneChild():
|
||||||
size = self.child.minsize(self.beginmeasuring())
|
size = self.child.minsize(self.beginmeasuring())
|
||||||
self.size = max(self.size[0], size[0]), \
|
self.size = max(self.size[0], size[0]), \
|
||||||
max(self.size[1], size[1])
|
max(self.size[1], size[1])
|
||||||
#stdwin.setdefwinsize(self.size)
|
# XXX stdwin.setdefwinsize(self.size)
|
||||||
# XXX Compensate stdwin bug:
|
# XXX Compensate stdwin bug:
|
||||||
stdwin.setdefwinsize(self.size[0]+4, self.size[1]+2)
|
stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2))
|
||||||
self.win = stdwin.open(self.title)
|
self.win = stdwin.open(self.title)
|
||||||
|
self.win.setdocsize(self.size)
|
||||||
if self.itimer:
|
if self.itimer:
|
||||||
self.win.settimer(self.itimer)
|
self.win.settimer(self.itimer)
|
||||||
bounds = (0, 0), self.win.getwinsize()
|
bounds = (0, 0), self.win.getwinsize()
|
||||||
self.child.setbounds(bounds)
|
self.child.setbounds(bounds)
|
||||||
|
self.child.realize()
|
||||||
|
self.win.dispatch = self.dispatch
|
||||||
|
WindowList.append(self.win)
|
||||||
|
#
|
||||||
|
def fixup(self):
|
||||||
|
self.size = self.child.minsize(self.beginmeasuring())
|
||||||
|
self.win.setdocsize(self.size)
|
||||||
|
bounds = (0, 0), self.win.getwinsize()
|
||||||
|
self.child.setbounds(bounds)
|
||||||
#
|
#
|
||||||
def beginmeasuring(self):
|
def beginmeasuring(self):
|
||||||
# Return something with which a child can measure text
|
# Return something with which a child can measure text
|
||||||
|
@ -64,6 +89,12 @@ class WindowParent() = ManageOneChild():
|
||||||
else:
|
else:
|
||||||
raise Error, 'begindrawing(): not realized yet'
|
raise Error, 'begindrawing(): not realized yet'
|
||||||
#
|
#
|
||||||
|
def getwindow(self):
|
||||||
|
if self.win:
|
||||||
|
return self.win
|
||||||
|
else:
|
||||||
|
raise Error, 'getwindow(): not realized yet'
|
||||||
|
#
|
||||||
def change(self, area):
|
def change(self, area):
|
||||||
if self.win:
|
if self.win:
|
||||||
self.win.change(area)
|
self.win.change(area)
|
||||||
|
@ -86,16 +117,42 @@ class WindowParent() = ManageOneChild():
|
||||||
elif type = WE_DRAW:
|
elif type = WE_DRAW:
|
||||||
d = self.win.begindrawing()
|
d = self.win.begindrawing()
|
||||||
self.child.draw(d, detail)
|
self.child.draw(d, detail)
|
||||||
|
del d
|
||||||
|
if self.do_altdraw: self.child.altdraw(detail)
|
||||||
elif type = WE_MOUSE_DOWN:
|
elif type = WE_MOUSE_DOWN:
|
||||||
if self.do_mouse: self.child.mouse_down(detail)
|
if self.do_mouse: self.child.mouse_down(detail)
|
||||||
elif type = WE_MOUSE_MOVE:
|
elif type = WE_MOUSE_MOVE:
|
||||||
if self.do_mouse: self.child.mouse_move(detail)
|
if self.do_mouse: self.child.mouse_move(detail)
|
||||||
elif type = WE_MOUSE_UP:
|
elif type = WE_MOUSE_UP:
|
||||||
if self.do_mouse: self.child.mouse_up(detail)
|
if self.do_mouse: self.child.mouse_up(detail)
|
||||||
|
elif type in (WE_CHAR, WE_COMMAND):
|
||||||
|
if self.do_keybd: self.child.keybd(type, detail)
|
||||||
elif type = WE_TIMER:
|
elif type = WE_TIMER:
|
||||||
if self.do_timer: self.child.timer()
|
if self.do_timer: self.child.timer()
|
||||||
elif type = WE_SIZE:
|
elif type = WE_SIZE:
|
||||||
self.win.change((0, 0), (10000, 10000)) # XXX
|
self.fixup()
|
||||||
bounds = (0, 0), self.win.getwinsize()
|
elif type = WE_CLOSE:
|
||||||
self.child.setbounds(bounds)
|
self.destroy()
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def MainLoop():
|
||||||
|
while WindowList:
|
||||||
|
Dispatch(stdwin.getevent())
|
||||||
|
|
||||||
|
def Dispatch(event):
|
||||||
|
window = event[1]
|
||||||
|
if window in WindowList:
|
||||||
|
window.dispatch(event)
|
||||||
|
else:
|
||||||
|
stdwin.fleep()
|
||||||
|
|
||||||
|
# Interface used by WindowSched:
|
||||||
|
|
||||||
|
def CountWindows():
|
||||||
|
return len(WindowList)
|
||||||
|
|
||||||
|
def AnyWindow():
|
||||||
|
if not WindowList:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return WindowList[0]
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
# A 'WindowParent' is the only module that uses real stdwin functionality.
|
# A 'WindowParent' is the only module that uses real stdwin functionality.
|
||||||
# It is the root of the tree.
|
# It is the root of the tree.
|
||||||
# It should have exactly one child when realized.
|
# It should have exactly one child when realized.
|
||||||
|
#
|
||||||
|
# There is also some support for a standard main loop here.
|
||||||
|
|
||||||
import stdwin
|
import stdwin
|
||||||
from stdwinevents import *
|
from stdwinevents import *
|
||||||
|
@ -9,6 +11,8 @@ from TransParent import ManageOneChild
|
||||||
|
|
||||||
Error = 'WindowParent.Error' # Exception
|
Error = 'WindowParent.Error' # Exception
|
||||||
|
|
||||||
|
WindowList = [] # List containing all windows
|
||||||
|
|
||||||
class WindowParent() = ManageOneChild():
|
class WindowParent() = ManageOneChild():
|
||||||
#
|
#
|
||||||
def create(self, (title, size)):
|
def create(self, (title, size)):
|
||||||
|
@ -22,18 +26,29 @@ class WindowParent() = ManageOneChild():
|
||||||
self.win = 0
|
self.win = 0
|
||||||
self.itimer = 0
|
self.itimer = 0
|
||||||
self.do_mouse = 0
|
self.do_mouse = 0
|
||||||
|
self.do_keybd = 0
|
||||||
self.do_timer = 0
|
self.do_timer = 0
|
||||||
|
self.do_altdraw = 0
|
||||||
#
|
#
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
|
if self.win in WindowList:
|
||||||
|
import util
|
||||||
|
util.remove(self.win, WindowList)
|
||||||
if self.child: self.child.destroy()
|
if self.child: self.child.destroy()
|
||||||
self._reset()
|
self._reset()
|
||||||
#
|
#
|
||||||
def need_mouse(self, child): self.do_mouse = 1
|
def need_mouse(self, child): self.do_mouse = 1
|
||||||
def no_mouse(self, child): self.do_mouse = 0
|
def no_mouse(self, child): self.do_mouse = 0
|
||||||
#
|
#
|
||||||
|
def need_keybd(self, child): self.do_keybd = 1
|
||||||
|
def no_keybd(self, child): self.do_keybd = 0
|
||||||
|
#
|
||||||
def need_timer(self, child): self.do_timer = 1
|
def need_timer(self, child): self.do_timer = 1
|
||||||
def no_timer(self, child): self.do_timer = 0
|
def no_timer(self, child): self.do_timer = 0
|
||||||
#
|
#
|
||||||
|
def need_altdraw(self, child): self.do_altdraw = 1
|
||||||
|
def no_altdraw(self, child): self.do_altdraw = 0
|
||||||
|
#
|
||||||
def realize(self):
|
def realize(self):
|
||||||
if self.win:
|
if self.win:
|
||||||
raise Error, 'realize(): called twice'
|
raise Error, 'realize(): called twice'
|
||||||
|
@ -42,14 +57,24 @@ class WindowParent() = ManageOneChild():
|
||||||
size = self.child.minsize(self.beginmeasuring())
|
size = self.child.minsize(self.beginmeasuring())
|
||||||
self.size = max(self.size[0], size[0]), \
|
self.size = max(self.size[0], size[0]), \
|
||||||
max(self.size[1], size[1])
|
max(self.size[1], size[1])
|
||||||
#stdwin.setdefwinsize(self.size)
|
# XXX stdwin.setdefwinsize(self.size)
|
||||||
# XXX Compensate stdwin bug:
|
# XXX Compensate stdwin bug:
|
||||||
stdwin.setdefwinsize(self.size[0]+4, self.size[1]+2)
|
stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2))
|
||||||
self.win = stdwin.open(self.title)
|
self.win = stdwin.open(self.title)
|
||||||
|
self.win.setdocsize(self.size)
|
||||||
if self.itimer:
|
if self.itimer:
|
||||||
self.win.settimer(self.itimer)
|
self.win.settimer(self.itimer)
|
||||||
bounds = (0, 0), self.win.getwinsize()
|
bounds = (0, 0), self.win.getwinsize()
|
||||||
self.child.setbounds(bounds)
|
self.child.setbounds(bounds)
|
||||||
|
self.child.realize()
|
||||||
|
self.win.dispatch = self.dispatch
|
||||||
|
WindowList.append(self.win)
|
||||||
|
#
|
||||||
|
def fixup(self):
|
||||||
|
self.size = self.child.minsize(self.beginmeasuring())
|
||||||
|
self.win.setdocsize(self.size)
|
||||||
|
bounds = (0, 0), self.win.getwinsize()
|
||||||
|
self.child.setbounds(bounds)
|
||||||
#
|
#
|
||||||
def beginmeasuring(self):
|
def beginmeasuring(self):
|
||||||
# Return something with which a child can measure text
|
# Return something with which a child can measure text
|
||||||
|
@ -64,6 +89,12 @@ class WindowParent() = ManageOneChild():
|
||||||
else:
|
else:
|
||||||
raise Error, 'begindrawing(): not realized yet'
|
raise Error, 'begindrawing(): not realized yet'
|
||||||
#
|
#
|
||||||
|
def getwindow(self):
|
||||||
|
if self.win:
|
||||||
|
return self.win
|
||||||
|
else:
|
||||||
|
raise Error, 'getwindow(): not realized yet'
|
||||||
|
#
|
||||||
def change(self, area):
|
def change(self, area):
|
||||||
if self.win:
|
if self.win:
|
||||||
self.win.change(area)
|
self.win.change(area)
|
||||||
|
@ -86,16 +117,42 @@ class WindowParent() = ManageOneChild():
|
||||||
elif type = WE_DRAW:
|
elif type = WE_DRAW:
|
||||||
d = self.win.begindrawing()
|
d = self.win.begindrawing()
|
||||||
self.child.draw(d, detail)
|
self.child.draw(d, detail)
|
||||||
|
del d
|
||||||
|
if self.do_altdraw: self.child.altdraw(detail)
|
||||||
elif type = WE_MOUSE_DOWN:
|
elif type = WE_MOUSE_DOWN:
|
||||||
if self.do_mouse: self.child.mouse_down(detail)
|
if self.do_mouse: self.child.mouse_down(detail)
|
||||||
elif type = WE_MOUSE_MOVE:
|
elif type = WE_MOUSE_MOVE:
|
||||||
if self.do_mouse: self.child.mouse_move(detail)
|
if self.do_mouse: self.child.mouse_move(detail)
|
||||||
elif type = WE_MOUSE_UP:
|
elif type = WE_MOUSE_UP:
|
||||||
if self.do_mouse: self.child.mouse_up(detail)
|
if self.do_mouse: self.child.mouse_up(detail)
|
||||||
|
elif type in (WE_CHAR, WE_COMMAND):
|
||||||
|
if self.do_keybd: self.child.keybd(type, detail)
|
||||||
elif type = WE_TIMER:
|
elif type = WE_TIMER:
|
||||||
if self.do_timer: self.child.timer()
|
if self.do_timer: self.child.timer()
|
||||||
elif type = WE_SIZE:
|
elif type = WE_SIZE:
|
||||||
self.win.change((0, 0), (10000, 10000)) # XXX
|
self.fixup()
|
||||||
bounds = (0, 0), self.win.getwinsize()
|
elif type = WE_CLOSE:
|
||||||
self.child.setbounds(bounds)
|
self.destroy()
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def MainLoop():
|
||||||
|
while WindowList:
|
||||||
|
Dispatch(stdwin.getevent())
|
||||||
|
|
||||||
|
def Dispatch(event):
|
||||||
|
window = event[1]
|
||||||
|
if window in WindowList:
|
||||||
|
window.dispatch(event)
|
||||||
|
else:
|
||||||
|
stdwin.fleep()
|
||||||
|
|
||||||
|
# Interface used by WindowSched:
|
||||||
|
|
||||||
|
def CountWindows():
|
||||||
|
return len(WindowList)
|
||||||
|
|
||||||
|
def AnyWindow():
|
||||||
|
if not WindowList:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return WindowList[0]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue