Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/view/frame/frame.py
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2007-01-25 11:22:37 (GMT)
committer Marco Pesenti Gritti <mpg@redhat.com>2007-01-25 11:22:37 (GMT)
commit1456c872bc53c9f14b0a000522449c537e977a42 (patch)
treef707111bb8b7fa9229829d4b84417123ab48af70 /shell/view/frame/frame.py
parent0c66dd5fa29a39cf9b29541c50d33fd03a215e1d (diff)
Split EventFrame to his own file, fixup caps
Diffstat (limited to 'shell/view/frame/frame.py')
-rw-r--r--shell/view/frame/frame.py242
1 files changed, 242 insertions, 0 deletions
diff --git a/shell/view/frame/frame.py b/shell/view/frame/frame.py
new file mode 100644
index 0000000..d08d4d2
--- /dev/null
+++ b/shell/view/frame/frame.py
@@ -0,0 +1,242 @@
+# Copyright (C) 2006, Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+import gtk
+import gobject
+import hippo
+
+from view.frame.eventframe import EventFrame
+from view.frame.ActivitiesBox import ActivitiesBox
+from view.frame.ZoomBox import ZoomBox
+from view.frame.overlaybox import OverlayBox
+from view.frame.FriendsBox import FriendsBox
+from view.frame.PanelWindow import PanelWindow
+from view.frame.clipboardpanelwindow import ClipboardPanelWindow
+from view.frame.notificationtray import NotificationTray
+from model.ShellModel import ShellModel
+from sugar.graphics.timeline import Timeline
+from sugar.graphics.grid import Grid
+from sugar.graphics.menushell import MenuShell
+
+class Frame:
+ INACTIVE = 0
+ TEMPORARY = 1
+ STICKY = 2
+ HIDE_ON_LEAVE = 3
+ AUTOMATIC = 4
+
+ def __init__(self, shell):
+ self._windows = []
+ self._hover_frame = False
+ self._shell = shell
+ self._mode = Frame.INACTIVE
+
+ self._timeline = Timeline(self)
+ self._timeline.add_tag('slide_in', 18, 24)
+ self._timeline.add_tag('before_slide_out', 48, 48)
+ self._timeline.add_tag('slide_out', 49, 54)
+
+ self._event_frame = EventFrame()
+ self._event_frame.connect('enter-edge', self._enter_edge_cb)
+ self._event_frame.connect('enter-corner', self._enter_corner_cb)
+ self._event_frame.connect('leave', self._event_frame_leave_cb)
+ self._event_frame.show()
+
+ grid = Grid()
+
+ # Top panel
+ panel = self._create_panel(grid, 0, 0, 16, 1)
+ menu_shell = panel.get_menu_shell()
+ root = panel.get_root()
+
+ menu_shell.set_position(MenuShell.BOTTOM)
+
+ box = ZoomBox(self._shell, menu_shell)
+
+ [x, y] = grid.point(1, 0)
+ root.append(box, hippo.PACK_FIXED)
+ root.set_position(box, x, y)
+
+ tray = NotificationTray()
+ tray_box = hippo.CanvasBox(box_width=grid.dimension(1),
+ box_height=grid.dimension(1),
+ xalign=hippo.ALIGNMENT_END)
+
+ tray_widget = hippo.CanvasWidget()
+ tray_widget.props.widget = tray
+ tray_box.append(tray_widget, gtk.EXPAND)
+
+ [x, y] = grid.point(13, 0)
+ root.append(tray_box, hippo.PACK_FIXED)
+ root.set_position(tray_box, x, y)
+
+ box = OverlayBox(self._shell)
+
+ [x, y] = grid.point(14, 0)
+ root.append(box, hippo.PACK_FIXED)
+ root.set_position(box, x, y)
+
+ # Bottom panel
+ panel = self._create_panel(grid, 0, 11, 16, 1)
+ menu_shell = panel.get_menu_shell()
+ root = panel.get_root()
+
+ menu_shell.set_position(MenuShell.TOP)
+
+ box = ActivitiesBox(self._shell)
+ root.append(box, hippo.PACK_FIXED)
+
+ [x, y] = grid.point(1, 0)
+ root.set_position(box, x, y)
+
+ # Right panel
+ panel = self._create_panel(grid, 15, 1, 1, 10)
+ menu_shell = panel.get_menu_shell()
+ root = panel.get_root()
+
+ menu_shell.set_position(MenuShell.LEFT)
+
+ box = FriendsBox(self._shell, menu_shell)
+ root.append(box)
+
+ # Left panel
+ panel = self._create_clipboard_panel(grid, 0, 1, 1, 10)
+
+ shell.get_model().connect('notify::state',
+ self._shell_state_changed_cb)
+
+ def _shell_state_changed_cb(self, model, pspec):
+ if model.props.state == ShellModel.STATE_SHUTDOWN:
+ self._timeline.goto('slide_out', True)
+
+ def _create_clipboard_panel(self, grid, x, y, width, height):
+ [x, y, width, height] = grid.rectangle(x, y, width, height)
+ panel = ClipboardPanelWindow(self, x, y, width, height)
+
+ self._connect_to_panel(panel)
+ panel.connect('drag-motion', self._drag_motion_cb)
+ panel.connect('drag-leave', self._drag_leave_cb)
+
+ self._windows.append(panel)
+
+ return panel
+
+ def _create_panel(self, grid, x, y, width, height):
+ [x, y, width, height] = grid.rectangle(x, y, width, height)
+ panel = PanelWindow(x, y, width, height)
+ self._connect_to_panel(panel)
+ self._windows.append(panel)
+
+ return panel
+
+ def _connect_to_panel(self, panel):
+ panel.connect('enter-notify-event', self._enter_notify_cb)
+ panel.connect('leave-notify-event', self._leave_notify_cb)
+
+ menu_shell = panel.get_menu_shell()
+ menu_shell.connect('activated',
+ self._menu_shell_activated_cb)
+ menu_shell.connect('deactivated',
+ self._menu_shell_deactivated_cb)
+
+ def _menu_shell_activated_cb(self, menu_shell):
+ self._timeline.goto('slide_in', True)
+
+ def _menu_shell_deactivated_cb(self, menu_shell):
+ if self._mode != Frame.STICKY and not self._hover_frame:
+ self._timeline.play('before_slide_out', 'slide_out')
+
+ def _enter_notify_cb(self, window, event):
+ self._enter_notify()
+ logging.debug('Frame._enter_notify_cb ' + str(self._mode))
+
+ def _drag_motion_cb(self, window, context, x, y, time):
+ self._enter_notify()
+ logging.debug('Frame._drag_motion_cb ' + str(self._mode))
+ return True
+
+ def _drag_leave_cb(self, window, drag_context, timestamp):
+ self._leave_notify(window)
+ logging.debug('Frame._drag_leave_cb ' + str(self._mode))
+
+ def _leave_notify_cb(self, window, event):
+ # FIXME for some reason every click cause also a leave-notify
+ if event.state == gtk.gdk.BUTTON1_MASK:
+ return
+
+ self._leave_notify(window)
+ logging.debug('Frame._leave_notify_cb ' + str(self._mode))
+
+ def _enter_notify(self):
+ self._hover_frame = True
+ self._timeline.goto('slide_in', True)
+
+ def _leave_notify(self, panel):
+ self._hover_frame = False
+ if not panel.get_menu_shell().is_active() and \
+ (self._mode == Frame.HIDE_ON_LEAVE or \
+ self._mode == Frame.AUTOMATIC):
+ self._timeline.play('before_slide_out', 'slide_out')
+
+ def _enter_edge_cb(self, event_frame):
+ self._mode = Frame.HIDE_ON_LEAVE
+ self._timeline.play(None, 'slide_in')
+ logging.debug('Frame._enter_edge_cb ' + str(self._mode))
+
+ def _enter_corner_cb(self, event_frame):
+ self._mode = Frame.HIDE_ON_LEAVE
+ self._timeline.play('slide_in', 'slide_in')
+ logging.debug('Frame._enter_corner_cb ' + str(self._mode))
+
+ def _event_frame_leave_cb(self, event_frame):
+ if self._mode != Frame.STICKY:
+ self._timeline.goto('slide_out', True)
+ logging.debug('Frame._event_frame_leave_cb ' + str(self._mode))
+
+ def show_and_hide(self, seconds):
+ self._mode = Frame.AUTOMATIC
+ self._timeline.play()
+
+ def notify_key_press(self):
+ if self._timeline.on_tag('slide_in'):
+ self._timeline.play('before_slide_out', 'slide_out')
+ elif self._timeline.on_tag('before_slide_out'):
+ self._mode = Frame.TEMPORARY
+ else:
+ self._mode = Frame.STICKY
+ self._timeline.play('slide_in', 'slide_in')
+
+ def notify_key_release(self):
+ if self._mode == Frame.TEMPORARY:
+ self._timeline.play('before_slide_out', 'slide_out')
+
+ def do_slide_in(self, current=0, n_frames=0):
+ if not self._windows[0].props.visible:
+ for panel in self._windows:
+ panel.show()
+ self._event_frame.hide()
+
+ def do_slide_out(self, current=0, n_frames=0):
+ if self._windows[0].props.visible:
+ for panel in self._windows:
+ panel.hide()
+ self._event_frame.show()
+
+ def is_visible(self):
+ if self._windows[0].props.visible:
+ return True
+ return False