diff options
-rw-r--r-- | Lib/lib-stdwin/WindowParent.py | 82 | ||||
-rwxr-xr-x | Lib/stdwin/WindowParent.py | 82 |
2 files changed, 102 insertions, 62 deletions
diff --git a/Lib/lib-stdwin/WindowParent.py b/Lib/lib-stdwin/WindowParent.py index 2388443..7b965f9 100644 --- a/Lib/lib-stdwin/WindowParent.py +++ b/Lib/lib-stdwin/WindowParent.py @@ -2,23 +2,23 @@ # It is the root of the tree. # It should have exactly one child when realized. # -# There is also some support for a standard main loop here. +# There is also an alternative interface to "mainloop" here. import stdwin from stdwinevents import * +import mainloop from TransParent import ManageOneChild Error = 'WindowParent.Error' # Exception -WindowList = [] # List containing all windows - class WindowParent() = ManageOneChild(): # def create(self, (title, size)): self.title = title self.size = size # (width, height) self._reset() + self.close_hook = WindowParent.delayed_destroy return self # def _reset(self): @@ -31,10 +31,10 @@ class WindowParent() = ManageOneChild(): self.do_altdraw = 0 self.pending_destroy = 0 self.close_hook = None + self.menu_hook = None # def destroy(self): - if self.win in WindowList: - WindowList.remove(self.win) + mainloop.unregister(self.win) if self.child: self.child.destroy() self._reset() # @@ -47,11 +47,19 @@ class WindowParent() = ManageOneChild(): def close_trigger(self): if self.close_hook: self.close_hook(self) # + def menu_trigger(self, (menu, item)): + if self.menu_hook: + self.menu_hook(self, menu, item) + # def need_mouse(self, child): self.do_mouse = 1 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_keybd(self, child): + self.do_keybd = 1 + self.child.activate() + def no_keybd(self, child): + self.do_keybd = 0 + self.child.deactivate() # def need_timer(self, child): self.do_timer = 1 def no_timer(self, child): self.do_timer = 0 @@ -64,28 +72,46 @@ class WindowParent() = ManageOneChild(): raise Error, 'realize(): called twice' if not self.child: raise Error, 'realize(): no child' - size = self.child.minsize(self.beginmeasuring()) - self.size = max(self.size[0], size[0]), \ - max(self.size[1], size[1]) - # XXX Don't... stdwin.setdefscrollbars(0, 0) - stdwin.setdefwinsize(self.size) + # Compute suggested size + self.size = self.child.getminsize(self.beginmeasuring(), \ + self.size) + save_defsize = stdwin.getdefwinsize() + scrwidth, scrheight = stdwin.getscrsize() + width, height = self.size + if width > scrwidth: + width = scrwidth * 2/3 + if height > scrheight: + height = scrheight * 2/3 + stdwin.setdefwinsize(width, height) + self.hbar, self.vbar = stdwin.getdefscrollbars() self.win = stdwin.open(self.title) + stdwin.setdefwinsize(save_defsize) self.win.setdocsize(self.size) if self.itimer: self.win.settimer(self.itimer) - bounds = (0, 0), self.win.getwinsize() - self.child.setbounds(bounds) + width, height = self.win.getwinsize() + if self.hbar: + width = self.size[0] + if self.vbar: + height = self.size[1] + self.child.setbounds((0, 0), (width, height)) self.child.realize() self.win.dispatch = self.dispatch - WindowList.append(self.win) + mainloop.register(self.win) # def fixup(self): - self.size = self.child.minsize(self.beginmeasuring()) + # XXX This could share code with realize() above + self.size = self.child.getminsize(self.beginmeasuring(), \ + self.win.getwinsize()) self.win.setdocsize(self.size) - bounds = (0, 0), self.win.getwinsize() - self.child.setbounds(bounds) + width, height = self.win.getwinsize() + if self.hbar: + width = self.size[0] + if self.vbar: + height = self.size[1] + self.child.setbounds((0, 0), (width, height)) # Force a redraw of the entire window: - self.win.change((0, 0), (10000, 10000)) + self.win.change((0, 0), self.size) # def beginmeasuring(self): # Return something with which a child can measure text @@ -142,28 +168,22 @@ class WindowParent() = ManageOneChild(): self.fixup() elif type = WE_CLOSE: self.close_trigger() + elif type = WE_MENU: + self.menu_trigger(detail) if self.pending_destroy: self.destroy() # def MainLoop(): - while WindowList: - Dispatch(stdwin.getevent()) + mainloop.mainloop() def Dispatch(event): - window = event[1] - if window in WindowList: - window.dispatch(event) - else: - stdwin.fleep() + mainloop.dispatch(event) # Interface used by WindowSched: def CountWindows(): - return len(WindowList) + return mainloop.countwindows() def AnyWindow(): - if not WindowList: - return None - else: - return WindowList[0] + return mainloop.anywindow() diff --git a/Lib/stdwin/WindowParent.py b/Lib/stdwin/WindowParent.py index 2388443..7b965f9 100755 --- a/Lib/stdwin/WindowParent.py +++ b/Lib/stdwin/WindowParent.py @@ -2,23 +2,23 @@ # It is the root of the tree. # It should have exactly one child when realized. # -# There is also some support for a standard main loop here. +# There is also an alternative interface to "mainloop" here. import stdwin from stdwinevents import * +import mainloop from TransParent import ManageOneChild Error = 'WindowParent.Error' # Exception -WindowList = [] # List containing all windows - class WindowParent() = ManageOneChild(): # def create(self, (title, size)): self.title = title self.size = size # (width, height) self._reset() + self.close_hook = WindowParent.delayed_destroy return self # def _reset(self): @@ -31,10 +31,10 @@ class WindowParent() = ManageOneChild(): self.do_altdraw = 0 self.pending_destroy = 0 self.close_hook = None + self.menu_hook = None # def destroy(self): - if self.win in WindowList: - WindowList.remove(self.win) + mainloop.unregister(self.win) if self.child: self.child.destroy() self._reset() # @@ -47,11 +47,19 @@ class WindowParent() = ManageOneChild(): def close_trigger(self): if self.close_hook: self.close_hook(self) # + def menu_trigger(self, (menu, item)): + if self.menu_hook: + self.menu_hook(self, menu, item) + # def need_mouse(self, child): self.do_mouse = 1 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_keybd(self, child): + self.do_keybd = 1 + self.child.activate() + def no_keybd(self, child): + self.do_keybd = 0 + self.child.deactivate() # def need_timer(self, child): self.do_timer = 1 def no_timer(self, child): self.do_timer = 0 @@ -64,28 +72,46 @@ class WindowParent() = ManageOneChild(): raise Error, 'realize(): called twice' if not self.child: raise Error, 'realize(): no child' - size = self.child.minsize(self.beginmeasuring()) - self.size = max(self.size[0], size[0]), \ - max(self.size[1], size[1]) - # XXX Don't... stdwin.setdefscrollbars(0, 0) - stdwin.setdefwinsize(self.size) + # Compute suggested size + self.size = self.child.getminsize(self.beginmeasuring(), \ + self.size) + save_defsize = stdwin.getdefwinsize() + scrwidth, scrheight = stdwin.getscrsize() + width, height = self.size + if width > scrwidth: + width = scrwidth * 2/3 + if height > scrheight: + height = scrheight * 2/3 + stdwin.setdefwinsize(width, height) + self.hbar, self.vbar = stdwin.getdefscrollbars() self.win = stdwin.open(self.title) + stdwin.setdefwinsize(save_defsize) self.win.setdocsize(self.size) if self.itimer: self.win.settimer(self.itimer) - bounds = (0, 0), self.win.getwinsize() - self.child.setbounds(bounds) + width, height = self.win.getwinsize() + if self.hbar: + width = self.size[0] + if self.vbar: + height = self.size[1] + self.child.setbounds((0, 0), (width, height)) self.child.realize() self.win.dispatch = self.dispatch - WindowList.append(self.win) + mainloop.register(self.win) # def fixup(self): - self.size = self.child.minsize(self.beginmeasuring()) + # XXX This could share code with realize() above + self.size = self.child.getminsize(self.beginmeasuring(), \ + self.win.getwinsize()) self.win.setdocsize(self.size) - bounds = (0, 0), self.win.getwinsize() - self.child.setbounds(bounds) + width, height = self.win.getwinsize() + if self.hbar: + width = self.size[0] + if self.vbar: + height = self.size[1] + self.child.setbounds((0, 0), (width, height)) # Force a redraw of the entire window: - self.win.change((0, 0), (10000, 10000)) + self.win.change((0, 0), self.size) # def beginmeasuring(self): # Return something with which a child can measure text @@ -142,28 +168,22 @@ class WindowParent() = ManageOneChild(): self.fixup() elif type = WE_CLOSE: self.close_trigger() + elif type = WE_MENU: + self.menu_trigger(detail) if self.pending_destroy: self.destroy() # def MainLoop(): - while WindowList: - Dispatch(stdwin.getevent()) + mainloop.mainloop() def Dispatch(event): - window = event[1] - if window in WindowList: - window.dispatch(event) - else: - stdwin.fleep() + mainloop.dispatch(event) # Interface used by WindowSched: def CountWindows(): - return len(WindowList) + return mainloop.countwindows() def AnyWindow(): - if not WindowList: - return None - else: - return WindowList[0] + return mainloop.anywindow() |