diff options
author | Marco 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) |
commit | 1456c872bc53c9f14b0a000522449c537e977a42 (patch) | |
tree | f707111bb8b7fa9229829d4b84417123ab48af70 /shell/view/frame/frame.py | |
parent | 0c66dd5fa29a39cf9b29541c50d33fd03a215e1d (diff) |
Split EventFrame to his own file, fixup caps
Diffstat (limited to 'shell/view/frame/frame.py')
-rw-r--r-- | shell/view/frame/frame.py | 242 |
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 |