diff options
-rw-r--r-- | Lib/lib-stdwin/Split.py | 73 | ||||
-rwxr-xr-x | Lib/stdwin/Split.py | 73 |
2 files changed, 128 insertions, 18 deletions
diff --git a/Lib/lib-stdwin/Split.py b/Lib/lib-stdwin/Split.py index 80e1e74..a5a6542 100644 --- a/Lib/lib-stdwin/Split.py +++ b/Lib/lib-stdwin/Split.py @@ -1,11 +1,12 @@ # Generic Split implementation. # Use as a base class for other splits. # Derived classes should at least implement the methods that call -# unimpl() below: minsize(), getbounds() and setbounds(). +# unimpl() below: getminsize(), getbounds() and setbounds(). Error = 'Split.Error' # Exception import rect +from stdwinevents import * class Split(): # @@ -20,7 +21,8 @@ class Split(): self.keybd_interest = [] self.timer_interest = [] self.altdraw_interest = [] - self.mouse_focus = 0 + self.mouse_focus = None + self.keybd_focus = None return self # # Downcalls from parent to child @@ -35,10 +37,14 @@ class Split(): del self.timer_interest[:] del self.altdraw_interest[:] self.mouse_focus = None + self.keybd_focus = None # - def minsize(self, m): return unimpl() # Should ask children - def getbounds(self): return unimpl() - def setbounds(self, bounds): unimpl() # Should tell children + def getminsize(self, (m, (width, height))): + return unimpl() # Should ask children + def getbounds(self): + return unimpl() + def setbounds(self, bounds): + unimpl() # Should tell children # def realize(self): for child in self.children: @@ -53,15 +59,41 @@ class Split(): for child in self.altdraw_interest: child.altdraw(detail) # + # Keyboard focus handling (used internally) + # XXX This is not enough if two levels of splits + # XXX surround text fields! + # + def set_keybd_focus(self, child): + if self.keybd_focus <> child: + if self.keybd_focus: + self.keybd_focus.deactivate() + self.keybd_focus = None + if child: + child.activate() + self.keybd_focus = child + def next_keybd_focus(self): + if not self.keybd_interest: + self.set_keybd_focus(None) + return + if self.keybd_focus in self.keybd_interest: + i = self.keybd_interest.index(self.keybd_focus) + i = (i+1) % len(self.keybd_interest) + else: + i = 0 + self.set_keybd_focus(self.keybd_interest[i]) + # # Downcalls only made after certain upcalls # def mouse_down(self, detail): if self.mouse_focus: self.mouse_focus.mouse_down(detail) + return p = detail[0] for child in self.mouse_interest: if rect.pointinrect(p, child.getbounds()): self.mouse_focus = child + if child in self.keybd_interest: + self.set_keybd_focus(child) child.mouse_down(detail) def mouse_move(self, detail): if self.mouse_focus: @@ -69,11 +101,26 @@ class Split(): def mouse_up(self, detail): if self.mouse_focus: self.mouse_focus.mouse_up(detail) - self.mouse_focus = 0 + self.mouse_focus = None + # + def activate(self): + if self.keybd_focus: + self.keybd_focus.activate() + else: + self.next_keybd_focus() + def deactivate(self): + if self.keybd_focus: + self.keybd_focus.deactivate() # def keybd(self, type_detail): - for child in self.keybd_interest: - child.keybd(type_detail) + if not self.keybd_focus: + self.set_keybd_focus(self.keybd_interest[0]) + type, detail = type_detail + if type = WE_COMMAND and detail = WC_TAB and \ + len(self.keybd_interest) > 1: + self.next_keybd_focus() + return + self.keybd_focus.keybd(type_detail) # def timer(self): for child in self.timer_interest: @@ -98,13 +145,17 @@ class Split(): if child in self.altdraw_interest: self.altdraw_interest.remove(child) if child = self.mouse_focus: - self.mouse_focus = 0 + self.mouse_focus = None + if child = self.keybd_focus: + self.keybd_focus = None # def need_mouse(self, child): if child not in self.mouse_interest: self.mouse_interest.append(child) self.parent.need_mouse(self) def no_mouse(self, child): + if child = self.mouse_focus: + self.mouse_focus = None if child in self.mouse_interest: self.mouse_interest.remove(child) if not self.mouse_interest: @@ -114,7 +165,11 @@ class Split(): if child not in self.keybd_interest: self.keybd_interest.append(child) self.parent.need_keybd(self) + if not self.keybd_focus: + self.set_keybd_focus(child) def no_keybd(self, child): + if child = self.keybd_focus: + self.keybd_focus = None # Don't call child.deactivate() if child in self.keybd_interest: self.keybd_interest.remove(child) if not self.keybd_interest: diff --git a/Lib/stdwin/Split.py b/Lib/stdwin/Split.py index 80e1e74..a5a6542 100755 --- a/Lib/stdwin/Split.py +++ b/Lib/stdwin/Split.py @@ -1,11 +1,12 @@ # Generic Split implementation. # Use as a base class for other splits. # Derived classes should at least implement the methods that call -# unimpl() below: minsize(), getbounds() and setbounds(). +# unimpl() below: getminsize(), getbounds() and setbounds(). Error = 'Split.Error' # Exception import rect +from stdwinevents import * class Split(): # @@ -20,7 +21,8 @@ class Split(): self.keybd_interest = [] self.timer_interest = [] self.altdraw_interest = [] - self.mouse_focus = 0 + self.mouse_focus = None + self.keybd_focus = None return self # # Downcalls from parent to child @@ -35,10 +37,14 @@ class Split(): del self.timer_interest[:] del self.altdraw_interest[:] self.mouse_focus = None + self.keybd_focus = None # - def minsize(self, m): return unimpl() # Should ask children - def getbounds(self): return unimpl() - def setbounds(self, bounds): unimpl() # Should tell children + def getminsize(self, (m, (width, height))): + return unimpl() # Should ask children + def getbounds(self): + return unimpl() + def setbounds(self, bounds): + unimpl() # Should tell children # def realize(self): for child in self.children: @@ -53,15 +59,41 @@ class Split(): for child in self.altdraw_interest: child.altdraw(detail) # + # Keyboard focus handling (used internally) + # XXX This is not enough if two levels of splits + # XXX surround text fields! + # + def set_keybd_focus(self, child): + if self.keybd_focus <> child: + if self.keybd_focus: + self.keybd_focus.deactivate() + self.keybd_focus = None + if child: + child.activate() + self.keybd_focus = child + def next_keybd_focus(self): + if not self.keybd_interest: + self.set_keybd_focus(None) + return + if self.keybd_focus in self.keybd_interest: + i = self.keybd_interest.index(self.keybd_focus) + i = (i+1) % len(self.keybd_interest) + else: + i = 0 + self.set_keybd_focus(self.keybd_interest[i]) + # # Downcalls only made after certain upcalls # def mouse_down(self, detail): if self.mouse_focus: self.mouse_focus.mouse_down(detail) + return p = detail[0] for child in self.mouse_interest: if rect.pointinrect(p, child.getbounds()): self.mouse_focus = child + if child in self.keybd_interest: + self.set_keybd_focus(child) child.mouse_down(detail) def mouse_move(self, detail): if self.mouse_focus: @@ -69,11 +101,26 @@ class Split(): def mouse_up(self, detail): if self.mouse_focus: self.mouse_focus.mouse_up(detail) - self.mouse_focus = 0 + self.mouse_focus = None + # + def activate(self): + if self.keybd_focus: + self.keybd_focus.activate() + else: + self.next_keybd_focus() + def deactivate(self): + if self.keybd_focus: + self.keybd_focus.deactivate() # def keybd(self, type_detail): - for child in self.keybd_interest: - child.keybd(type_detail) + if not self.keybd_focus: + self.set_keybd_focus(self.keybd_interest[0]) + type, detail = type_detail + if type = WE_COMMAND and detail = WC_TAB and \ + len(self.keybd_interest) > 1: + self.next_keybd_focus() + return + self.keybd_focus.keybd(type_detail) # def timer(self): for child in self.timer_interest: @@ -98,13 +145,17 @@ class Split(): if child in self.altdraw_interest: self.altdraw_interest.remove(child) if child = self.mouse_focus: - self.mouse_focus = 0 + self.mouse_focus = None + if child = self.keybd_focus: + self.keybd_focus = None # def need_mouse(self, child): if child not in self.mouse_interest: self.mouse_interest.append(child) self.parent.need_mouse(self) def no_mouse(self, child): + if child = self.mouse_focus: + self.mouse_focus = None if child in self.mouse_interest: self.mouse_interest.remove(child) if not self.mouse_interest: @@ -114,7 +165,11 @@ class Split(): if child not in self.keybd_interest: self.keybd_interest.append(child) self.parent.need_keybd(self) + if not self.keybd_focus: + self.set_keybd_focus(child) def no_keybd(self, child): + if child = self.keybd_focus: + self.keybd_focus = None # Don't call child.deactivate() if child in self.keybd_interest: self.keybd_interest.remove(child) if not self.keybd_interest: |