Move the menu positioning code inside menu shell and

unify it.
This commit is contained in:
Marco Pesenti Gritti 2006-10-18 16:23:06 +02:00
parent 7a06102b2e
commit 54dcb672e5
9 changed files with 70 additions and 99 deletions

View File

@ -25,7 +25,6 @@ from view.frame.FriendsBox import FriendsBox
from view.frame.PanelWindow import PanelWindow from view.frame.PanelWindow import PanelWindow
from view.frame.notificationtray import NotificationTray from view.frame.notificationtray import NotificationTray
from sugar.graphics.timeline import Timeline from sugar.graphics.timeline import Timeline
from sugar.graphics.menushell import MenuShell
from sugar.graphics.grid import Grid from sugar.graphics.grid import Grid
class EventFrame(gobject.GObject): class EventFrame(gobject.GObject):
@ -133,6 +132,7 @@ class Frame:
def __init__(self, shell): def __init__(self, shell):
self._windows = [] self._windows = []
self._active_menus = 0
self._shell = shell self._shell = shell
self._mode = Frame.INACTIVE self._mode = Frame.INACTIVE
@ -149,17 +149,14 @@ class Frame:
grid = Grid() grid = Grid()
self._menu_shell = MenuShell() # Top panel
self._menu_shell.connect('activated', self._menu_shell_activated_cb) [menu_shell, root] = self._create_panel(grid, 0, 0, 16, 1)
self._menu_shell.connect('deactivated', self._menu_shell_deactivated_cb)
top_panel = self._create_panel(grid, 0, 0, 16, 1) box = ZoomBox(self._shell, menu_shell)
box = ZoomBox(self._shell, self._menu_shell)
[x, y] = grid.point(1, 0) [x, y] = grid.point(1, 0)
top_panel.append(box, hippo.PACK_FIXED) root.append(box, hippo.PACK_FIXED)
top_panel.move(box, x, y) root.move(box, x, y)
tray = NotificationTray() tray = NotificationTray()
tray_box = hippo.CanvasBox(box_width=grid.dimension(1), tray_box = hippo.CanvasBox(box_width=grid.dimension(1),
@ -171,23 +168,26 @@ class Frame:
tray_box.append(tray_widget, gtk.EXPAND) tray_box.append(tray_widget, gtk.EXPAND)
[x, y] = grid.point(14, 0) [x, y] = grid.point(14, 0)
top_panel.append(tray_box, hippo.PACK_FIXED) root.append(tray_box, hippo.PACK_FIXED)
top_panel.move(tray_box, x, y) root.move(tray_box, x, y)
bottom_panel = self._create_panel(grid, 0, 11, 16, 1) # Bottom panel
[menu_shell, root] = self._create_panel(grid, 0, 11, 16, 1)
box = ActivitiesBox(self._shell) box = ActivitiesBox(self._shell)
bottom_panel.append(box, hippo.PACK_FIXED) root.append(box, hippo.PACK_FIXED)
[x, y] = grid.point(1, 0) [x, y] = grid.point(1, 0)
bottom_panel.move(box, x, y) root.move(box, x, y)
right_panel = self._create_panel(grid, 15, 1, 1, 10) # Right panel
[menu_shell, root] = self._create_panel(grid, 15, 1, 1, 10)
box = FriendsBox(self._shell, self._menu_shell) box = FriendsBox(self._shell, menu_shell)
right_panel.append(box) root.append(box)
left_panel = self._create_panel(grid, 0, 1, 1, 10) # Left panel
self._create_panel(grid, 0, 1, 1, 10)
def _create_panel(self, grid, x, y, width, height): def _create_panel(self, grid, x, y, width, height):
panel = PanelWindow() panel = PanelWindow()
@ -195,6 +195,10 @@ class Frame:
panel.connect('enter-notify-event', self._enter_notify_cb) panel.connect('enter-notify-event', self._enter_notify_cb)
panel.connect('leave-notify-event', self._leave_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)
[x, y, width, height] = grid.rectangle(x, y, width, height) [x, y, width, height] = grid.rectangle(x, y, width, height)
panel.move(x, y) panel.move(x, y)
@ -202,12 +206,14 @@ class Frame:
self._windows.append(panel) self._windows.append(panel)
return panel.get_root() return [panel.get_menu_shell(), panel.get_root()]
def _menu_shell_activated_cb(self, menu_shell): def _menu_shell_activated_cb(self, menu_shell):
self._active_menus += 1
self._timeline.goto('slide_in', True) self._timeline.goto('slide_in', True)
def _menu_shell_deactivated_cb(self, menu_shell): def _menu_shell_deactivated_cb(self, menu_shell):
self._active_menus -= 1
if self._mode != Frame.STICKY: if self._mode != Frame.STICKY:
self._timeline.play('before_slide_out', 'slide_out') self._timeline.play('before_slide_out', 'slide_out')
@ -219,9 +225,9 @@ class Frame:
if event.state == gtk.gdk.BUTTON1_MASK: if event.state == gtk.gdk.BUTTON1_MASK:
return return
if not self._menu_shell.is_active() and \ if self._active_menus == 0 and \
self._mode == Frame.HIDE_ON_LEAVE or \ (self._mode == Frame.HIDE_ON_LEAVE or \
self._mode == Frame.AUTOMATIC: self._mode == Frame.AUTOMATIC):
self._timeline.play('before_slide_out', 'slide_out') self._timeline.play('before_slide_out', 'slide_out')
def _enter_edge_cb(self, event_frame): def _enter_edge_cb(self, event_frame):

View File

@ -22,7 +22,6 @@ from sugar.graphics import style
from sugar.presence import PresenceService from sugar.presence import PresenceService
from view.BuddyIcon import BuddyIcon from view.BuddyIcon import BuddyIcon
from model.BuddyModel import BuddyModel from model.BuddyModel import BuddyModel
from view.frame.MenuStrategy import MenuStrategy
class FriendsBox(hippo.CanvasBox): class FriendsBox(hippo.CanvasBox):
def __init__(self, shell, menu_shell): def __init__(self, shell, menu_shell):
@ -44,7 +43,6 @@ class FriendsBox(hippo.CanvasBox):
model = BuddyModel(buddy=buddy) model = BuddyModel(buddy=buddy)
icon = BuddyIcon(self._shell, self._menu_shell, model) icon = BuddyIcon(self._shell, self._menu_shell, model)
style.apply_stylesheet(icon, 'frame.BuddyIcon') style.apply_stylesheet(icon, 'frame.BuddyIcon')
icon.set_menu_strategy(MenuStrategy())
self.append(icon) self.append(icon)
self._buddies[buddy.get_name()] = icon self._buddies[buddy.get_name()] = icon

View File

@ -6,5 +6,4 @@ sugar_PYTHON = \
PanelWindow.py \ PanelWindow.py \
Frame.py \ Frame.py \
ZoomBox.py \ ZoomBox.py \
MenuStrategy.py \
notificationtray.py notificationtray.py

View File

@ -1,55 +0,0 @@
# 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 hippo
from sugar.graphics.grid import Grid
class MenuStrategy:
def _get_canvas(self, item):
canvas = item
while (not isinstance(canvas, hippo.Canvas)):
canvas = canvas.get_context()
return canvas
def _get_item_origin(self, canvas, item):
[x, y] = item.get_context().translate_to_widget(item)
[origin_x, origin_y] = canvas.window.get_origin()
x += origin_x
y += origin_y
return [x, y]
def get_menu_position(self, menu, item):
canvas = self._get_canvas(item)
[x, y] = self._get_item_origin(canvas, item)
[width, height] = item.get_allocation()
[canvas_x, canvas_y] = canvas.window.get_origin()
canvas_rect = canvas.get_allocation()
[menu_w, menu_h] = menu.size_request()
menu_x = x
menu_y = y + height
if (menu_x + menu_w > canvas_x) and \
(menu_y < canvas_y + canvas_rect.height):
menu_x = x - menu_w
menu_y = y
return [menu_x, menu_y]

View File

@ -17,6 +17,8 @@
import gtk import gtk
import hippo import hippo
from sugar.graphics.menushell import MenuShell
class PanelWindow(gtk.Window): class PanelWindow(gtk.Window):
def __init__(self): def __init__(self):
gtk.Window.__init__(self) gtk.Window.__init__(self)
@ -32,6 +34,11 @@ class PanelWindow(gtk.Window):
self.add(canvas) self.add(canvas)
canvas.show() canvas.show()
self._menu_shell = MenuShell(canvas)
def get_menu_shell(self):
return self._menu_shell
def get_root(self): def get_root(self):
return self._bg return self._bg

View File

@ -20,7 +20,6 @@ from sugar.graphics.canvasicon import CanvasIcon
from sugar.graphics.menuicon import MenuIcon from sugar.graphics.menuicon import MenuIcon
from sugar.graphics.menu import Menu from sugar.graphics.menu import Menu
from sugar.graphics import style from sugar.graphics import style
from view.frame.MenuStrategy import MenuStrategy
import sugar import sugar
class ActivityMenu(Menu): class ActivityMenu(Menu):
@ -47,8 +46,6 @@ class ActivityIcon(MenuIcon):
MenuIcon.__init__(self, menu_shell, icon_name=icon_name, MenuIcon.__init__(self, menu_shell, icon_name=icon_name,
color=icon_color) color=icon_color)
self.set_menu_strategy(MenuStrategy())
def create_menu(self): def create_menu(self):
menu = ActivityMenu(self._activity_host) menu = ActivityMenu(self._activity_host)
menu.connect('action', self._action_cb) menu.connect('action', self._action_cb)

View File

@ -19,10 +19,10 @@ import hippo
import cairo import cairo
from sugar.graphics.menushell import MenuShell from sugar.graphics.menushell import MenuShell
import sugar
from view.home.MeshBox import MeshBox from view.home.MeshBox import MeshBox
from view.home.HomeBox import HomeBox from view.home.HomeBox import HomeBox
from view.home.FriendsBox import FriendsBox from view.home.FriendsBox import FriendsBox
import sugar
class HomeWindow(gtk.Window): class HomeWindow(gtk.Window):
def __init__(self, shell): def __init__(self, shell):
@ -42,8 +42,6 @@ class HomeWindow(gtk.Window):
self.add(self._nb) self.add(self._nb)
self._nb.show() self._nb.show()
menu_shell = MenuShell()
canvas = hippo.Canvas() canvas = hippo.Canvas()
box = HomeBox(shell) box = HomeBox(shell)
canvas.set_root(box) canvas.set_root(box)
@ -51,13 +49,13 @@ class HomeWindow(gtk.Window):
canvas.show() canvas.show()
canvas = hippo.Canvas() canvas = hippo.Canvas()
box = FriendsBox(shell, menu_shell) box = FriendsBox(shell, MenuShell(canvas))
canvas.set_root(box) canvas.set_root(box)
self._nb.append_page(canvas) self._nb.append_page(canvas)
canvas.show() canvas.show()
canvas = hippo.Canvas() canvas = hippo.Canvas()
box = MeshBox(shell, menu_shell) box = MeshBox(shell, MenuShell(canvas))
canvas.set_root(box) canvas.set_root(box)
self._nb.append_page(canvas) self._nb.append_page(canvas)
canvas.show() canvas.show()

View File

@ -17,14 +17,11 @@
import hippo import hippo
import gobject import gobject
import logging
from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics.canvasicon import CanvasIcon
from sugar.graphics.timeline import Timeline from sugar.graphics.timeline import Timeline
class _MenuStrategy:
def get_menu_position(self, menu, item):
return item.get_context().translate_to_widget(item)
class MenuIcon(CanvasIcon): class MenuIcon(CanvasIcon):
def __init__(self, menu_shell, **kwargs): def __init__(self, menu_shell, **kwargs):
CanvasIcon.__init__(self, **kwargs) CanvasIcon.__init__(self, **kwargs)
@ -32,7 +29,6 @@ class MenuIcon(CanvasIcon):
self._menu_shell = menu_shell self._menu_shell = menu_shell
self._menu = None self._menu = None
self._hover_menu = False self._hover_menu = False
self._menu_strategy = _MenuStrategy()
self._timeline = Timeline(self) self._timeline = Timeline(self)
self._timeline.add_tag('popup', 6, 6) self._timeline.add_tag('popup', 6, 6)
@ -41,9 +37,6 @@ class MenuIcon(CanvasIcon):
self.connect('motion-notify-event', self._motion_notify_event_cb) self.connect('motion-notify-event', self._motion_notify_event_cb)
def set_menu_strategy(self, strategy):
self._menu_strategy = strategy
def do_popup(self, current, n_frames): def do_popup(self, current, n_frames):
if self._menu: if self._menu:
return return
@ -55,8 +48,7 @@ class MenuIcon(CanvasIcon):
self._menu.connect('leave-notify-event', self._menu.connect('leave-notify-event',
self._menu_leave_notify_event_cb) self._menu_leave_notify_event_cb)
strategy = self._menu_strategy [x, y] = self._menu_shell.get_position(self._menu, self)
[x, y] = strategy.get_menu_position(self._menu, self)
self._menu.move(x, y) self._menu.move(x, y)
self._menu.show() self._menu.show()

View File

@ -25,8 +25,10 @@ class MenuShell(gobject.GObject):
gobject.TYPE_NONE, ([])), gobject.TYPE_NONE, ([])),
} }
def __init__(self): def __init__(self, parent_canvas):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._parent_canvas = parent_canvas
self._menu_controller = None self._menu_controller = None
def is_active(self): def is_active(self):
@ -41,3 +43,30 @@ class MenuShell(gobject.GObject):
if self._menu_controller: if self._menu_controller:
self._menu_controller.popdown() self._menu_controller.popdown()
self._menu_controller = controller self._menu_controller = controller
def _get_item_origin(self, item):
[x, y] = item.get_context().translate_to_widget(item)
[origin_x, origin_y] = self._parent_canvas.window.get_origin()
x += origin_x
y += origin_y
return [x, y]
def get_position(self, menu, item):
[x, y] = self._get_item_origin(item)
[width, height] = item.get_allocation()
[canvas_x, canvas_y] = self._parent_canvas.window.get_origin()
canvas_rect = self._parent_canvas.get_allocation()
[menu_w, menu_h] = menu.size_request()
menu_x = x
menu_y = y + height
if (menu_x + menu_w > canvas_x) and \
(menu_y < canvas_y + canvas_rect.height):
menu_x = x - menu_w
menu_y = y
return [menu_x, menu_y]