diff options
author | Benjamin Berg <benjamin@sipsolutions.net> | 2011-11-03 20:34:47 (GMT) |
---|---|---|
committer | Benjamin Berg <benjamin@sipsolutions.net> | 2011-11-03 20:34:47 (GMT) |
commit | bc724843e89babdb001ddd922939ef20cc50e737 (patch) | |
tree | b408974da3a3b674f20a79550445280a0ad17529 | |
parent | 1c9ddf47d97030294f88204662ee92cd8f1eb06d (diff) |
Some palette work, the menu palettes are still blinking.
-rw-r--r-- | src/sugar3/graphics/animator.py | 5 | ||||
-rw-r--r-- | src/sugar3/graphics/palette.py | 12 | ||||
-rw-r--r-- | src/sugar3/graphics/palettegroup.py | 12 | ||||
-rw-r--r-- | src/sugar3/graphics/palettewindow.py | 74 |
4 files changed, 87 insertions, 16 deletions
diff --git a/src/sugar3/graphics/animator.py b/src/sugar3/graphics/animator.py index 5cb4ca1..39befd2 100644 --- a/src/sugar3/graphics/animator.py +++ b/src/sugar3/graphics/animator.py @@ -99,6 +99,11 @@ class Animator(GObject.GObject): self._timeout_sid = 0 self.emit('completed') + def abort(self): + if self._timeout_sid: + GObject.source_remove(self._timeout_sid) + self._timeout_sid = 0 + def _next_frame_cb(self): current_time = min(self._duration, time.time() - self._start_time) current_time = max(current_time, 0.0) diff --git a/src/sugar3/graphics/palette.py b/src/sugar3/graphics/palette.py index 7d5833e..777da19 100644 --- a/src/sugar3/graphics/palette.py +++ b/src/sugar3/graphics/palette.py @@ -1,6 +1,8 @@ # Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com> # Copyright (C) 2008, One Laptop Per Child # Copyright (C) 2009, Tomeu Vizoso +# Copyright (C) 2011, Benjamin Berg <benjamin@sipsolutions.net> +# Copyright (C) 2011, Marco Pesenti Gritti <marco@marcopg.org> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -137,11 +139,11 @@ class Palette(PaletteWindow): self.popup(immediate=True, state=self.SECONDARY) def __destroy_cb(self, palette): - self._secondary_anim.stop() + self._secondary_anim.abort() self.popdown(immediate=True) def __popdown_cb(self, widget): - self._secondary_anim.stop() + self._secondary_anim.abort() def __notify_invoker_cb(self, palette, pspec): invoker = self.props.invoker @@ -169,13 +171,15 @@ class Palette(PaletteWindow): if state == self.PRIMARY: self._secondary_anim.start() else: - self._secondary_anim.stop() + self._secondary_anim.abort() def popdown(self, immediate=False): if immediate: - self._secondary_anim.stop() + self._secondary_anim.abort() # to suppress glitches while later re-opening self.set_palette_state(self.PRIMARY) + if self._widget: + self._widget.size_request() PaletteWindow.popdown(self, immediate) def on_enter(self, event): diff --git a/src/sugar3/graphics/palettegroup.py b/src/sugar3/graphics/palettegroup.py index cf38927..1ab51f6 100644 --- a/src/sugar3/graphics/palettegroup.py +++ b/src/sugar3/graphics/palettegroup.py @@ -104,3 +104,15 @@ class Group(GObject.GObject): if down: self._up = False self.emit('popdown') + + def _propagate_enter_notify_event(self, event): + for palette in self._palettes: + invoker = palette.invoker + invoker.grabbed_enter_notify_event(event) + + + def _propagate_leave_notify_event(self, event): + for palette in self._palettes: + invoker = palette.invoker + invoker.grabbed_leave_notify_event(event) + diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py index fa612b4..38848ac 100644 --- a/src/sugar3/graphics/palettewindow.py +++ b/src/sugar3/graphics/palettewindow.py @@ -1,6 +1,8 @@ # Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com> # Copyright (C) 2008, One Laptop Per Child # Copyright (C) 2009, Tomeu Vizoso +# Copyright (C) 2011, Benjamin Berg <benjamin@sipsolutions.net> +# Copyright (C) 2011, Marco Pesenti Gritti <marco@marcopg.org> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -269,6 +271,7 @@ class PaletteWindow(GObject.GObject): self._alignment = None self._up = False self._palette_state = None + self._widget = None self._popup_anim = animator.Animator(.5, 10) self._popup_anim.add(_PopupAnimation(self)) @@ -376,7 +379,6 @@ class PaletteWindow(GObject.GObject): return self._widget.size_request() def popup(self, immediate=False): - logging.error("hello from popup") if self._invoker is not None: full_size_request = self.get_full_size_request() self._alignment = self._invoker.get_alignment(full_size_request) @@ -396,20 +398,16 @@ class PaletteWindow(GObject.GObject): self.update_position() def popdown(self, immediate=False): - self._popup_anim.stop() + self._popup_anim.abort() self._mouse_detector.stop() if not immediate: self._popdown_anim.start() else: - self._popdown_anim.stop() - # XXX: Please, someone remove or explain this :-) - # I am commenting this out cause its broken for me - rgs - """ + self._popdown_anim.abort() + if self._widget is not None: - self._widget.size_request() self._widget.popdown() - """ def on_invoker_enter(self): self._popdown_anim.stop() @@ -435,10 +433,38 @@ class PaletteWindow(GObject.GObject): self.popup(immediate=True) def __enter_notify_event_cb(self, widget, event): - self.on_enter(event) + if event.mode != Gdk.CrossingMode.NORMAL: + return + + group = palettegroup.get_group(self._group_id) + group._propagate_enter_notify_event(event) + + if event.detail != Gdk.NotifyType.INFERIOR: + self.on_enter(event) def __leave_notify_event_cb(self, widget, event): - self.on_leave(event) + if event.mode != Gdk.CrossingMode.NORMAL: + return + + #if event.subwindow is None: + # logging.error('Ignoring leave with no subwindow') + # return + + # XXX: This kind of works, but is this correct? + if event.detail == Gdk.NotifyType.NONLINEAR_VIRTUAL: + logging.error('Ignoring nonlinear virtual notification type') + return + + # XXX: Why does this happen on a grab? That doesn't make much sense! + if event.window is event.subwindow: + logging.error('Ignoring leave to the same window') + return + + group = palettegroup.get_group(self._group_id) + group._propagate_leave_notify_event(event) + + if event.detail != Gdk.NotifyType.INFERIOR: + self.on_leave(event) def __show_cb(self, widget): if self._invoker is not None: @@ -841,10 +867,34 @@ class WidgetInvoker(Invoker): self._widget.allocation.height) def __enter_notify_event_cb(self, widget, event): - self.notify_mouse_enter() + if event.mode == Gdk.CrossingMode.NORMAL: + self.notify_mouse_enter() def __leave_notify_event_cb(self, widget, event): - self.notify_mouse_leave() + # XXX: Ignore the leave if there is a grab active. Apparently we do get + # a leave which does not have GDK_CROSSING_MODE_GRAB. + if Gdk.pointer_is_grabbed(): + return + + if event.mode == Gdk.CrossingMode.NORMAL: + self.notify_mouse_leave() + + def grabbed_enter_notify_event(self, event): + if self._widget.get_window() is event.window: + a = self._widget.get_allocation() + + if a.x <= event.x and a.x + a.width >= event.x and \ + a.y <= event.y and a.y + a.height >= event.y: + #self.notify_mouse_enter() + pass + + def grabbed_leave_notify_event(self, event): + if self._widget.get_window() is event.window: + a = self._widget.get_allocation() + + if a.x <= event.x and a.x + a.width >= event.x and \ + a.y <= event.y and a.y + a.height >= event.y: + pass def __button_release_event_cb(self, widget, event): if event.button == 3: |