Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin@sipsolutions.net>2011-11-03 20:34:47 (GMT)
committer Benjamin Berg <benjamin@sipsolutions.net>2011-11-03 20:34:47 (GMT)
commitbc724843e89babdb001ddd922939ef20cc50e737 (patch)
treeb408974da3a3b674f20a79550445280a0ad17529
parent1c9ddf47d97030294f88204662ee92cd8f1eb06d (diff)
Some palette work, the menu palettes are still blinking.
-rw-r--r--src/sugar3/graphics/animator.py5
-rw-r--r--src/sugar3/graphics/palette.py12
-rw-r--r--src/sugar3/graphics/palettegroup.py12
-rw-r--r--src/sugar3/graphics/palettewindow.py74
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: