Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar

This commit is contained in:
Marco Pesenti Gritti 2007-07-06 17:30:23 +02:00
commit 0b59c682da
6 changed files with 61 additions and 6 deletions

View File

@ -24,12 +24,14 @@ from sugar.graphics.iconbutton import IconButton
from sugar import profile from sugar import profile
from model import bundleregistry from model import bundleregistry
from frameinvoker import FrameCanvasInvoker
class ActivityButton(IconButton): class ActivityButton(IconButton):
def __init__(self, activity): def __init__(self, activity):
IconButton.__init__(self, icon_name=activity.get_icon()) IconButton.__init__(self, icon_name=activity.get_icon())
palette = Palette(activity.get_name()) palette = Palette(activity.get_name())
palette.props.invoker = FrameCanvasInvoker(self)
palette.set_group_id('frame') palette.set_group_id('frame')
self.set_palette(palette) self.set_palette(palette)

View File

@ -4,6 +4,7 @@ sugar_PYTHON = \
ActivitiesBox.py \ ActivitiesBox.py \
clipboardbox.py \ clipboardbox.py \
clipboardpanelwindow.py \ clipboardpanelwindow.py \
frameinvoker.py \
FriendsBox.py \ FriendsBox.py \
eventarea.py \ eventarea.py \
frame.py \ frame.py \

View File

@ -336,3 +336,4 @@ class Frame(object):
def notify_key_release(self): def notify_key_release(self):
self._key_listener.key_release() self._key_listener.key_release()

View File

@ -0,0 +1,33 @@
# Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
import gtk
from sugar.graphics import units
from sugar.graphics.palette import CanvasInvoker
class FrameCanvasInvoker(CanvasInvoker):
def __init__(self, item):
CanvasInvoker.__init__(self, item)
def get_screen_area(self):
x = units.grid_to_pixels(1)
y = units.grid_to_pixels(1)
width = gtk.gdk.screen_width() - units.grid_to_pixels(1)
height = gtk.gdk.screen_height() - units.grid_to_pixels(1)
return gtk.gdk.Rectangle(x, y, width, height)

View File

@ -373,7 +373,8 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
def set_palette(self, palette): def set_palette(self, palette):
self._palette = palette self._palette = palette
self._palette.props.invoker = CanvasInvoker(self) if not self._palette.props.invoker:
self._palette.props.invoker = CanvasInvoker(self)
def set_tooltip(self, text): def set_tooltip(self, text):
self.set_palette(Palette(text)) self.set_palette(Palette(text))

View File

@ -62,6 +62,7 @@ class Palette(gobject.GObject):
def __init__(self, label, accel_path=None): def __init__(self, label, accel_path=None):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._invoker = None
self._group_id = None self._group_id = None
self._up = False self._up = False
self._position = self.AUTOMATIC self._position = self.AUTOMATIC
@ -151,6 +152,14 @@ class Palette(gobject.GObject):
else: else:
raise AssertionError raise AssertionError
def do_get_property(self, pspec):
if pspec.name == 'invoker':
return self._invoker
elif pspec.name == 'position':
return self._position
else:
raise AssertionError
def _get_position(self, alignment): def _get_position(self, alignment):
# Invoker: x, y, width and height # Invoker: x, y, width and height
inv_rect = self._invoker.get_rect() inv_rect = self._invoker.get_rect()
@ -185,12 +194,12 @@ class Palette(gobject.GObject):
def _in_screen(self, x, y): def _in_screen(self, x, y):
[width, height] = self._menu.size_request() [width, height] = self._menu.size_request()
screen_width = gtk.gdk.screen_width() - units.grid_to_pixels(1) screen_area = self._invoker.get_screen_area()
screen_height = gtk.gdk.screen_height() - units.grid_to_pixels(1)
return x + width <= screen_width and \ return x >= screen_area.x and \
y + height <= screen_height and \ y >= screen_area.y and \
x >= units.grid_to_pixels(1) and y >= units.grid_to_pixels(1) x + width <= screen_area.width and \
y + height <= screen_area.height
def _get_automatic_position(self): def _get_automatic_position(self):
alignments = [ _BOTTOM_LEFT, _BOTTOM_RIGHT, alignments = [ _BOTTOM_LEFT, _BOTTOM_RIGHT,
@ -203,6 +212,9 @@ class Palette(gobject.GObject):
if self._in_screen(x, y): if self._in_screen(x, y):
return x, y return x, y
# We fail
return (0, 0)
def _show(self): def _show(self):
x = y = 0 x = y = 0
@ -381,6 +393,11 @@ class Invoker(object):
for listener in self._listeners: for listener in self._listeners:
listener.invoker_mouse_leave() listener.invoker_mouse_leave()
def get_screen_area(self):
width = gtk.gdk.screen_width()
height = gtk.gdk.screen_height()
return gtk.gdk.Rectangle(0, 0, width, height)
class WidgetInvoker(Invoker): class WidgetInvoker(Invoker):
def __init__(self, widget): def __init__(self, widget):
Invoker.__init__(self) Invoker.__init__(self)