Rework menu positioning logic

This commit is contained in:
Marco Pesenti Gritti 2006-10-18 17:57:41 +02:00
parent 54dcb672e5
commit f3fbea70a3
2 changed files with 47 additions and 14 deletions

View File

@ -26,6 +26,7 @@ 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.grid import Grid from sugar.graphics.grid import Grid
from sugar.graphics.menushell import MenuShell
class EventFrame(gobject.GObject): class EventFrame(gobject.GObject):
__gsignals__ = { __gsignals__ = {
@ -151,6 +152,7 @@ class Frame:
# Top panel # Top panel
[menu_shell, root] = self._create_panel(grid, 0, 0, 16, 1) [menu_shell, root] = self._create_panel(grid, 0, 0, 16, 1)
menu_shell.set_position(MenuShell.BOTTOM)
box = ZoomBox(self._shell, menu_shell) box = ZoomBox(self._shell, menu_shell)
@ -173,6 +175,7 @@ class Frame:
# Bottom panel # Bottom panel
[menu_shell, root] = self._create_panel(grid, 0, 11, 16, 1) [menu_shell, root] = self._create_panel(grid, 0, 11, 16, 1)
menu_shell.set_position(MenuShell.TOP)
box = ActivitiesBox(self._shell) box = ActivitiesBox(self._shell)
root.append(box, hippo.PACK_FIXED) root.append(box, hippo.PACK_FIXED)
@ -182,6 +185,7 @@ class Frame:
# Right panel # Right panel
[menu_shell, root] = self._create_panel(grid, 15, 1, 1, 10) [menu_shell, root] = self._create_panel(grid, 15, 1, 1, 10)
menu_shell.set_position(MenuShell.LEFT)
box = FriendsBox(self._shell, menu_shell) box = FriendsBox(self._shell, menu_shell)
root.append(box) root.append(box)

View File

@ -16,6 +16,7 @@
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
import gobject import gobject
import gtk
class MenuShell(gobject.GObject): class MenuShell(gobject.GObject):
__gsignals__ = { __gsignals__ = {
@ -25,11 +26,21 @@ class MenuShell(gobject.GObject):
gobject.TYPE_NONE, ([])), gobject.TYPE_NONE, ([])),
} }
AUTO = 0
LEFT = 1
RIGHT = 2
TOP = 3
BOTTOM = 4
def __init__(self, parent_canvas): def __init__(self, parent_canvas):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._parent_canvas = parent_canvas self._parent_canvas = parent_canvas
self._menu_controller = None self._menu_controller = None
self._position = MenuShell.AUTO
def set_position(self, position):
self._position = position
def is_active(self): def is_active(self):
return (self._menu_controller != None) return (self._menu_controller != None)
@ -44,29 +55,47 @@ class MenuShell(gobject.GObject):
self._menu_controller.popdown() self._menu_controller.popdown()
self._menu_controller = controller self._menu_controller = controller
def _get_item_origin(self, item): def _get_item_rect(self, item):
[x, y] = item.get_context().translate_to_widget(item) [x, y] = item.get_context().translate_to_widget(item)
[origin_x, origin_y] = self._parent_canvas.window.get_origin() [origin_x, origin_y] = self._parent_canvas.window.get_origin()
x += origin_x x += origin_x
y += origin_y y += origin_y
return [x, y] [w, h] = item.get_allocation()
return [x, y, w, h]
def get_position(self, menu, item): def get_position(self, menu, item):
[x, y] = self._get_item_origin(item) [item_x, item_y, item_w, item_h] = self._get_item_rect(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_w, menu_h] = menu.size_request()
menu_x = x left_x = item_x - menu_w
menu_y = y + height left_y = item_y
right_x = item_x + item_w
right_y = item_y
top_x = item_x
top_y = item_y - menu_h
bottom_x = item_x
bottom_y = item_y + item_h
if (menu_x + menu_w > canvas_x) and \ if self._position == MenuShell.LEFT:
(menu_y < canvas_y + canvas_rect.height): [x, y] = [left_x, left_y]
menu_x = x - menu_w elif self._position == MenuShell.RIGHT:
menu_y = y [x, y] = [right_x, right_y]
elif self._position == MenuShell.TOP:
[x, y] = [top_x, top_y]
elif self._position == MenuShell.BOTTOM:
[x, y] = [bottom_x, bottom_y]
elif self._position == MenuShell.AUTO:
[x, y] = [right_x, right_y]
if x + menu_w > gtk.gdk.screen_width():
[x, y] = [left_x, left_y]
return [menu_x, menu_y] x = min(x, gtk.gdk.screen_width())
x = max(0, x)
y = min(y, gtk.gdk.screen_height())
y = max(0, y)
return [x, y]