Refactor frame stuff naming some
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import gtk
|
||||
import goocanvas
|
||||
|
||||
from sugar.canvas.IconItem import IconItem
|
||||
from sugar.canvas.IconColor import IconColor
|
||||
from sugar import conf
|
||||
from frame.Panel import Panel
|
||||
import logging
|
||||
|
||||
class ActivityItem(IconItem):
|
||||
def __init__(self, activity, size):
|
||||
icon_name = activity.get_icon()
|
||||
if not icon_name:
|
||||
act_type = activity.get_default_type()
|
||||
raise RuntimeError("Activity %s did not have an icon!" % act_type)
|
||||
IconItem.__init__(self, icon_name=icon_name,
|
||||
color=IconColor('white'), size=size)
|
||||
self._activity = activity
|
||||
|
||||
def get_activity_id(self):
|
||||
return self._activity.get_id()
|
||||
|
||||
class ActivityBar(goocanvas.Group):
|
||||
def __init__(self, shell, height):
|
||||
goocanvas.Group.__init__(self)
|
||||
|
||||
self._shell = shell
|
||||
self._height = height
|
||||
|
||||
registry = conf.get_activity_registry()
|
||||
for activity in registry.list_activities():
|
||||
if activity.get_show_launcher():
|
||||
self.add_activity(activity)
|
||||
|
||||
def add_activity(self, activity):
|
||||
# Need an icon to show up on the bar
|
||||
if not activity.get_icon():
|
||||
name = activity.get_name()
|
||||
logging.info("Activity %s did not have an icon. Won't show it." % name)
|
||||
return
|
||||
|
||||
item = ActivityItem(activity, self._height)
|
||||
|
||||
icon_size = self._height
|
||||
x = (icon_size + 6) * self.get_n_children()
|
||||
item.set_property('x', x)
|
||||
|
||||
self.add_child(item)
|
||||
|
||||
class BottomPanel(Panel):
|
||||
def __init__(self, shell):
|
||||
Panel.__init__(self)
|
||||
|
||||
self._shell = shell
|
||||
|
||||
view = self.get_view()
|
||||
view.connect("item_view_created", self.__item_view_created_cb)
|
||||
|
||||
def construct(self):
|
||||
Panel.construct(self)
|
||||
|
||||
root = self.get_root()
|
||||
|
||||
activity_bar = ActivityBar(self._shell, self.get_height())
|
||||
root.add_child(activity_bar)
|
||||
|
||||
def __item_view_created_cb(self, view, item_view, item):
|
||||
if isinstance(item, ActivityItem):
|
||||
item_view.connect("button_press_event",
|
||||
self.__activity_button_press_cb,
|
||||
item.get_activity_id())
|
||||
|
||||
def __activity_button_press_cb(self, view, target, event, activity_id):
|
||||
self._shell.start_activity(activity_id)
|
||||
@@ -0,0 +1,55 @@
|
||||
import gtk
|
||||
import gobject
|
||||
|
||||
from frame.BottomPanel import BottomPanel
|
||||
from frame.RightPanel import RightPanel
|
||||
from frame.TopPanel import TopPanel
|
||||
from frame.Panel import Panel
|
||||
|
||||
class Frame:
|
||||
def __init__(self, shell, owner):
|
||||
size = 30
|
||||
|
||||
self._verbs_panel = BottomPanel(shell)
|
||||
self._verbs_panel.set_position(size, 0)
|
||||
self._verbs_panel.move(0, gtk.gdk.screen_height() - size)
|
||||
self._verbs_panel.resize(gtk.gdk.screen_width(), size)
|
||||
|
||||
self._friends_panel = RightPanel(shell, owner.get_friends())
|
||||
self._friends_panel.move(gtk.gdk.screen_width() - size, size)
|
||||
self._friends_panel.resize(size, gtk.gdk.screen_height() - size * 2)
|
||||
|
||||
self._top_panel = TopPanel(shell)
|
||||
self._top_panel.set_position(size, 0)
|
||||
self._top_panel.move(0, 0)
|
||||
self._top_panel.resize(gtk.gdk.screen_width(), size)
|
||||
|
||||
self._left_panel = Panel()
|
||||
self._left_panel.move(0, size)
|
||||
self._left_panel.resize(size, gtk.gdk.screen_height() - size * 2)
|
||||
|
||||
def __hide_timeout_cb(self):
|
||||
self.hide()
|
||||
return False
|
||||
|
||||
def show_and_hide(self, seconds):
|
||||
self.show()
|
||||
gobject.timeout_add(seconds * 1000, self.__hide_timeout_cb)
|
||||
|
||||
def show(self):
|
||||
self._verbs_panel.show()
|
||||
self._friends_panel.show()
|
||||
self._top_panel.show()
|
||||
self._left_panel.show()
|
||||
|
||||
def hide(self):
|
||||
self._verbs_panel.hide()
|
||||
self._friends_panel.hide()
|
||||
self._top_panel.hide()
|
||||
self._left_panel.hide()
|
||||
|
||||
def toggle_visibility(self):
|
||||
if self._verbs_panel.props.visible:
|
||||
self.hide()
|
||||
else:
|
||||
self.show()
|
||||
@@ -0,0 +1,8 @@
|
||||
sugardir = $(pkgdatadir)/shell/panel
|
||||
sugar_PYTHON = \
|
||||
__init__.py \
|
||||
RightPanel.py \
|
||||
Panel.py \
|
||||
Frame.py \
|
||||
TopPanel.py \
|
||||
BottomPanel.py
|
||||
@@ -0,0 +1,72 @@
|
||||
import gtk
|
||||
import goocanvas
|
||||
|
||||
class PanelView(goocanvas.CanvasView):
|
||||
BORDER = 4
|
||||
|
||||
def construct(self, x, y):
|
||||
model = goocanvas.CanvasModelSimple()
|
||||
root = model.get_root_item()
|
||||
|
||||
item = goocanvas.Rect(x=0, y=0,
|
||||
width=self.get_allocation().width,
|
||||
height=self.get_allocation().height,
|
||||
line_width=0, fill_color="#4f4f4f")
|
||||
root.add_child(item)
|
||||
|
||||
self._group = goocanvas.Group()
|
||||
root.add_child(self._group)
|
||||
self._group.translate(x + PanelView.BORDER, y + PanelView.BORDER)
|
||||
|
||||
self.set_model(model)
|
||||
|
||||
def get_root_group(self):
|
||||
return self._group
|
||||
|
||||
class Panel(gtk.Window):
|
||||
def __init__(self):
|
||||
gtk.Window.__init__(self)
|
||||
self._x = 0
|
||||
self._y = 0
|
||||
self._constructed = False
|
||||
|
||||
self._view = PanelView()
|
||||
self.add(self._view)
|
||||
self._view.show()
|
||||
|
||||
self.set_decorated(False)
|
||||
|
||||
self.realize()
|
||||
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
|
||||
self.window.set_accept_focus(False)
|
||||
|
||||
screen = gtk.gdk.screen_get_default()
|
||||
self.window.set_transient_for(screen.get_root_window())
|
||||
|
||||
def get_view(self):
|
||||
return self._view
|
||||
|
||||
def get_root(self):
|
||||
return self._view.get_root_group()
|
||||
|
||||
def get_height(self):
|
||||
height = self._view.get_allocation().height
|
||||
return height - PanelView.BORDER * 2
|
||||
|
||||
def get_width(self):
|
||||
width = self._view.get_allocation().width
|
||||
return width - PanelView.BORDER * 2
|
||||
|
||||
def set_position(self, x, y):
|
||||
self._x = x
|
||||
self._y = y
|
||||
|
||||
def construct(self):
|
||||
self._view.construct(self._x, self._y)
|
||||
self._constructed = True
|
||||
|
||||
def show(self):
|
||||
gtk.Window.show(self)
|
||||
|
||||
if not self._constructed:
|
||||
self.construct()
|
||||
@@ -0,0 +1,173 @@
|
||||
import goocanvas
|
||||
|
||||
from frame.Panel import Panel
|
||||
from sugar.canvas.IconItem import IconItem
|
||||
from sugar.canvas.IconColor import IconColor
|
||||
from sugar.presence import PresenceService
|
||||
|
||||
class FriendsGroup(goocanvas.Group):
|
||||
N_BUDDIES = 10
|
||||
|
||||
def __init__(self, shell, friends, width):
|
||||
goocanvas.Group.__init__(self)
|
||||
self._shell = shell
|
||||
self._friends = friends
|
||||
self._width = width
|
||||
self._activity_ps = None
|
||||
self._joined_hid = -1
|
||||
self._left_hid = -1
|
||||
|
||||
self._pservice = PresenceService.get_instance()
|
||||
self._pservice.connect('activity-appeared',
|
||||
self.__activity_appeared_cb)
|
||||
|
||||
self._buddies = []
|
||||
i = 0
|
||||
while i < FriendsGroup.N_BUDDIES:
|
||||
self.add_child(self._create_placeholder(i))
|
||||
self._buddies.append(None)
|
||||
i += 1
|
||||
|
||||
shell.connect('activity-changed', self.__activity_changed_cb)
|
||||
|
||||
def add(self, buddy):
|
||||
i = 0
|
||||
while i < FriendsGroup.N_BUDDIES:
|
||||
if self._buddies[i] == None:
|
||||
self._add_buddy(buddy, i)
|
||||
break
|
||||
i += 1
|
||||
|
||||
def remove(self, buddy):
|
||||
i = 0
|
||||
while i < FriendsGroup.N_BUDDIES:
|
||||
if self._buddies[i] == buddy.get_name():
|
||||
self._remove_buddy(buddy, i)
|
||||
break
|
||||
i += 1
|
||||
|
||||
def clear(self):
|
||||
i = 0
|
||||
while i < FriendsGroup.N_BUDDIES:
|
||||
if self._buddies[i] != None:
|
||||
self._remove_buddy(i)
|
||||
i += 1
|
||||
|
||||
def _get_y(self, i):
|
||||
return i * (self._width + 6)
|
||||
|
||||
def _add_buddy(self, buddy, i):
|
||||
self.remove_child(i)
|
||||
icon = IconItem(icon_name='stock-buddy',
|
||||
color=IconColor(buddy.get_color()),
|
||||
size=self._width, y=self._get_y(i))
|
||||
icon.connect('clicked', self.__buddy_clicked_cb, buddy)
|
||||
self.add_child(icon, i)
|
||||
self._buddies[i] = buddy.get_name()
|
||||
|
||||
def _create_placeholder(self, i):
|
||||
icon = IconItem(icon_name='stock-buddy', color=IconColor('white'),
|
||||
y=self._get_y(i), size=self._width)
|
||||
return icon
|
||||
|
||||
def _remove_buddy(self, i):
|
||||
self.remove_child(i)
|
||||
self.add_child(self._create_placeholder(i), i)
|
||||
self._buddies[i] = None
|
||||
|
||||
def __activity_appeared_cb(self, pservice, activity_ps):
|
||||
activity = self._shell.get_current_activity()
|
||||
if activity_ps.get_id() == activity.get_id():
|
||||
self._set_activity_ps(activity_ps)
|
||||
|
||||
def _set_activity_ps(self, activity_ps):
|
||||
if self._activity_ps == activity_ps:
|
||||
return
|
||||
|
||||
self._activity_ps = activity_ps
|
||||
|
||||
self.clear()
|
||||
|
||||
if self._joined_hid > 0:
|
||||
self.disconnect(self._joined_hid)
|
||||
self._joined_hid = -1
|
||||
if self._left_hid > 0:
|
||||
self.disconnect(self._left_hid)
|
||||
self._left_hid = -1
|
||||
|
||||
if activity_ps != None:
|
||||
for buddy in activity_ps.get_joined_buddies():
|
||||
self.add(buddy)
|
||||
|
||||
self._joined_hid = activity_ps.connect(
|
||||
'buddy-joined', self.__buddy_joined_cb)
|
||||
self._left_hid = activity_ps.connect(
|
||||
'buddy-left', self.__buddy_left_cb)
|
||||
|
||||
def __activity_changed_cb(self, group, activity):
|
||||
activity_ps = self._pservice.get_activity(activity.get_id())
|
||||
self._set_activity_ps(activity_ps)
|
||||
|
||||
def __buddy_joined_cb(self, activity, buddy):
|
||||
self.add(buddy)
|
||||
|
||||
def __buddy_left_cb(self, activity, buddy):
|
||||
self.remove(buddy)
|
||||
|
||||
def __buddy_clicked_cb(self, icon, buddy):
|
||||
self._friends.add_buddy(buddy)
|
||||
|
||||
class ActionsBar(goocanvas.Group):
|
||||
def __init__(self, shell, width):
|
||||
goocanvas.Group.__init__(self)
|
||||
self._width = width
|
||||
self._shell = shell
|
||||
|
||||
self._y = 0
|
||||
|
||||
icon = IconItem(icon_name='stock-share', size=self._width)
|
||||
icon.connect('clicked', self.__share_clicked_cb)
|
||||
self.add_icon(icon)
|
||||
|
||||
icon = IconItem(icon_name='stock-invite', size=self._width)
|
||||
icon.connect('clicked', self.__invite_clicked_cb)
|
||||
self.add_icon(icon)
|
||||
|
||||
icon = IconItem(icon_name='stock-chat', size=self._width)
|
||||
icon.connect('clicked', self.__chat_clicked_cb)
|
||||
self.add_icon(icon)
|
||||
|
||||
def add_icon(self, icon):
|
||||
icon.set_property('y', self._y)
|
||||
self._y += (self._width + 6)
|
||||
self.add_child(icon)
|
||||
|
||||
def __share_clicked_cb(self, item):
|
||||
activity = self._shell.get_current_activity()
|
||||
if activity != None:
|
||||
activity.share()
|
||||
|
||||
def __invite_clicked_cb(self, item):
|
||||
pass
|
||||
|
||||
def __chat_clicked_cb(self, item):
|
||||
pass
|
||||
|
||||
class RightPanel(Panel):
|
||||
def __init__(self, shell, friends):
|
||||
Panel.__init__(self)
|
||||
self._shell = shell
|
||||
self._friends = friends
|
||||
|
||||
def construct(self):
|
||||
Panel.construct(self)
|
||||
|
||||
root = self.get_root()
|
||||
|
||||
actions_bar = ActionsBar(self._shell, self.get_width())
|
||||
root.add_child(actions_bar)
|
||||
|
||||
friends_group = FriendsGroup(self._shell, self._friends,
|
||||
self.get_width())
|
||||
friends_group.translate(0, 150)
|
||||
root.add_child(friends_group)
|
||||
@@ -0,0 +1,40 @@
|
||||
import goocanvas
|
||||
|
||||
from frame.Panel import Panel
|
||||
from sugar.canvas.IconItem import IconItem
|
||||
import sugar
|
||||
|
||||
class ZoomBar(goocanvas.Group):
|
||||
def __init__(self, shell, height):
|
||||
goocanvas.Group.__init__(self)
|
||||
self._height = height
|
||||
self._shell = shell
|
||||
|
||||
self.add_zoom_level(sugar.ZOOM_ACTIVITY, 'stock-zoom-activity')
|
||||
self.add_zoom_level(sugar.ZOOM_HOME, 'stock-zoom-home')
|
||||
self.add_zoom_level(sugar.ZOOM_FRIENDS, 'stock-zoom-friends')
|
||||
self.add_zoom_level(sugar.ZOOM_MESH, 'stock-zoom-mesh')
|
||||
|
||||
def add_zoom_level(self, level, icon_name):
|
||||
icon = IconItem(icon_name=icon_name, size=self._height)
|
||||
icon.connect('clicked', self.__level_clicked_cb, level)
|
||||
|
||||
icon_size = self._height
|
||||
x = (icon_size + 6) * self.get_n_children()
|
||||
icon.set_property('x', x)
|
||||
|
||||
self.add_child(icon)
|
||||
|
||||
def __level_clicked_cb(self, item, level):
|
||||
self._shell.set_zoom_level(level)
|
||||
|
||||
class TopPanel(Panel):
|
||||
def __init__(self, shell):
|
||||
Panel.__init__(self)
|
||||
self._shell = shell
|
||||
|
||||
def construct(self):
|
||||
Panel.construct(self)
|
||||
|
||||
zoom_bar = ZoomBar(self._shell, self.get_height())
|
||||
self.get_root().add_child(zoom_bar)
|
||||
Reference in New Issue
Block a user