[Sugar-devel] [PATCH sugar] Frame: new behavior for revealing/hiding the Frame with the mouse

Simon Schampijer simon at schampijer.de
Fri Aug 17 04:35:28 EDT 2012


After discussing with Gary I prepared this patch to change the
interaction with the Frame in the following manner:

- you can reveal the Frame by going with the cursor in one of the
  hot corners

- you can hide the Frame by going with the cursor in one of the
  hot corners (and the Frame is visible)

- the Frame is not hidden on mouse out (leaving the Frame)

- (as before) you can hide/reveal the Frame with the designated keys

- the Frame is hidden when you switch between activities
  (todo: hide as well when resume in the Palette is clicked)

- the Frame is hidden when a zoom level is selected

- (as before) you can use 'alt-tab' to cycle through the
  running activities

- drag & drop is currently not working, SL #3811

v2: fixed cycling through running activities

Signed-off-by: Simon Schampijer <simon at laptop.org>
---
 src/jarabe/frame/activitiestray.py |  2 ++
 src/jarabe/frame/frame.py          | 53 ++++++++++----------------------------
 src/jarabe/frame/zoomtoolbar.py    |  6 +++++
 src/jarabe/view/tabbinghandler.py  |  2 +-
 4 files changed, 22 insertions(+), 41 deletions(-)

diff --git a/src/jarabe/frame/activitiestray.py b/src/jarabe/frame/activitiestray.py
index 9590bce..d386b3b 100644
--- a/src/jarabe/frame/activitiestray.py
+++ b/src/jarabe/frame/activitiestray.py
@@ -287,6 +287,8 @@ class ActivitiesTray(HTray):
             window = home_activity.get_window()
             if window:
                 window.activate(gtk.get_current_event_time())
+                frame = jarabe.frame.get_view()
+                frame.hide()
 
     def __remove_invite_cb(self, icon, invite):
         self._invites.remove_invite(invite)
diff --git a/src/jarabe/frame/frame.py b/src/jarabe/frame/frame.py
index 7407e18..ee112a1 100644
--- a/src/jarabe/frame/frame.py
+++ b/src/jarabe/frame/frame.py
@@ -57,29 +57,12 @@ class _Animation(animator.Animation):
 class _MouseListener(object):
     def __init__(self, frame):
         self._frame = frame
-        self._hide_sid = 0
 
     def mouse_enter(self):
-        self._show_frame()
-
-    def mouse_leave(self):
-        if self._frame.mode == Frame.MODE_MOUSE:
-            self._hide_frame()
-
-    def _show_frame(self):
-        if self._hide_sid != 0:
-            gobject.source_remove(self._hide_sid)
-        self._frame.show(Frame.MODE_MOUSE)
-
-    def _hide_frame_timeout_cb(self):
-        self._frame.hide()
-        return False
-
-    def _hide_frame(self):
-        if self._hide_sid != 0:
-            gobject.source_remove(self._hide_sid)
-        self._hide_sid = gobject.timeout_add(
-                  _FRAME_HIDING_DELAY, self._hide_frame_timeout_cb)
+        if self._frame.visible:
+            self._frame.hide()
+        else:
+            self._frame.show()
 
 
 class _KeyListener(object):
@@ -88,23 +71,16 @@ class _KeyListener(object):
 
     def key_press(self):
         if self._frame.visible:
-            if self._frame.mode == Frame.MODE_KEYBOARD:
-                self._frame.hide()
+            self._frame.hide()
         else:
-            self._frame.show(Frame.MODE_KEYBOARD)
+            self._frame.show()
 
 
 class Frame(object):
-    MODE_MOUSE = 0
-    MODE_KEYBOARD = 1
-    MODE_NON_INTERACTIVE = 2
-
     def __init__(self):
         logging.debug('STARTUP: Loading the frame')
-        self.mode = None
 
         self._palette_group = palettegroup.get_group('frame')
-        self._palette_group.connect('popdown', self._palette_group_popdown_cb)
 
         self._left_panel = None
         self._right_panel = None
@@ -143,6 +119,9 @@ class Frame(object):
     visible = property(is_visible, None)
 
     def hide(self):
+        if not self.visible:
+            return
+
         if self._animator:
             self._animator.stop()
 
@@ -150,16 +129,12 @@ class Frame(object):
         self._animator.add(_Animation(self, 0.0))
         self._animator.start()
 
-        self.mode = None
-
-    def show(self, mode):
+    def show(self):
         if self.visible:
             return
         if self._animator:
             self._animator.stop()
 
-        self.mode = mode
-
         self._animator = animator.Animator(0.5)
         self._animator.add(_Animation(self, 1.0))
         self._animator.start()
@@ -180,6 +155,7 @@ class Frame(object):
         zoom_toolbar = ZoomToolbar()
         panel.append(zoom_toolbar, expand=False)
         zoom_toolbar.show()
+        zoom_toolbar.connect('level-clicked', self._level_clicked_cb)
 
         activities_tray = ActivitiesTray()
         panel.append(activities_tray)
@@ -208,7 +184,6 @@ class Frame(object):
     def _create_left_panel(self):
         panel = ClipboardPanelWindow(self, gtk.POS_LEFT)
 
-        self._connect_to_panel(panel)
         panel.connect('drag-motion', self._drag_motion_cb)
         panel.connect('drag-leave', self._drag_leave_cb)
 
@@ -216,7 +191,6 @@ class Frame(object):
 
     def _create_panel(self, orientation):
         panel = FrameWindow(orientation)
-        self._connect_to_panel(panel)
 
         return panel
 
@@ -230,9 +204,8 @@ class Frame(object):
         if not panel.props.visible:
             panel.show()
 
-    def _connect_to_panel(self, panel):
-        panel.connect('enter-notify-event', self._enter_notify_cb)
-        panel.connect('leave-notify-event', self._leave_notify_cb)
+    def _level_clicked_cb(self, zoom_toolbar):
+        self.hide()
 
     def _update_position(self):
         screen_h = gtk.gdk.screen_height()
diff --git a/src/jarabe/frame/zoomtoolbar.py b/src/jarabe/frame/zoomtoolbar.py
index c28fe1c..b71f4f3 100644
--- a/src/jarabe/frame/zoomtoolbar.py
+++ b/src/jarabe/frame/zoomtoolbar.py
@@ -20,6 +20,7 @@ import logging
 
 import glib
 import gtk
+import gobject
 
 from sugar.graphics import style
 from sugar.graphics.palette import Palette
@@ -30,6 +31,10 @@ from jarabe.model import shell
 
 
 class ZoomToolbar(gtk.Toolbar):
+    __gsignals__ = {
+        'level-clicked': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+                          ([]))
+        }
     def __init__(self):
         gtk.Toolbar.__init__(self)
 
@@ -76,6 +81,7 @@ class ZoomToolbar(gtk.Toolbar):
             return
 
         shell.get_model().set_zoom_level(level)
+        self.emit('level-clicked')
 
     def __zoom_level_changed_cb(self, **kwargs):
         self._set_zoom_level(kwargs['new_level'])
diff --git a/src/jarabe/view/tabbinghandler.py b/src/jarabe/view/tabbinghandler.py
index 0889792..0a298cd 100644
--- a/src/jarabe/view/tabbinghandler.py
+++ b/src/jarabe/view/tabbinghandler.py
@@ -58,7 +58,7 @@ class TabbingHandler(object):
 
                 self._tabbing = False
             else:
-                self._frame.show(self._frame.MODE_NON_INTERACTIVE)
+                self._frame.show()
 
     def __timeout_cb(self, event_time):
         self._activate_current(event_time)
-- 
1.7.11.4



More information about the Sugar-devel mailing list