Start implementing the panels.
This commit is contained in:
parent
9f674ef232
commit
f53af6af4c
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([Sugar],[0.20],[],[sugar])
|
AC_INIT([Sugar],[0.22],[],[sugar])
|
||||||
|
|
||||||
AC_PREREQ([2.59])
|
AC_PREREQ([2.59])
|
||||||
|
|
||||||
@ -39,6 +39,7 @@ activities/terminal/Makefile
|
|||||||
shell/Makefile
|
shell/Makefile
|
||||||
shell/data/Makefile
|
shell/data/Makefile
|
||||||
shell/home/Makefile
|
shell/home/Makefile
|
||||||
|
shell/panel/Makefile
|
||||||
shell/session/Makefile
|
shell/session/Makefile
|
||||||
shell/PresenceService/Makefile
|
shell/PresenceService/Makefile
|
||||||
sugar/Makefile
|
sugar/Makefile
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
SUBDIRS = data session home PresenceService
|
SUBDIRS = data session home panel PresenceService
|
||||||
|
|
||||||
bin_SCRIPTS = \
|
bin_SCRIPTS = \
|
||||||
sugar \
|
sugar \
|
||||||
|
@ -17,6 +17,7 @@ from ChatController import ChatController
|
|||||||
from sugar.activity import ActivityFactory
|
from sugar.activity import ActivityFactory
|
||||||
from sugar.activity import Activity
|
from sugar.activity import Activity
|
||||||
from FirstTimeDialog import FirstTimeDialog
|
from FirstTimeDialog import FirstTimeDialog
|
||||||
|
from panel.PanelManager import PanelManager
|
||||||
from sugar import conf
|
from sugar import conf
|
||||||
import sugar.logger
|
import sugar.logger
|
||||||
|
|
||||||
@ -102,6 +103,8 @@ class Shell(gobject.GObject):
|
|||||||
self._home_window.set_model(home_model)
|
self._home_window.set_model(home_model)
|
||||||
self._set_zoom_level(Shell.ZOOM_HOME)
|
self._set_zoom_level(Shell.ZOOM_HOME)
|
||||||
|
|
||||||
|
self._panel_manager = PanelManager(self)
|
||||||
|
|
||||||
def set_console(self, console):
|
def set_console(self, console):
|
||||||
self._console = console
|
self._console = console
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ from sugar.canvas.IconItem import IconColor
|
|||||||
from sugar.canvas.DonutItem import DonutItem
|
from sugar.canvas.DonutItem import DonutItem
|
||||||
from sugar.canvas.DonutItem import PieceItem
|
from sugar.canvas.DonutItem import PieceItem
|
||||||
from sugar.canvas.DonutItem import PieceIcon
|
from sugar.canvas.DonutItem import PieceIcon
|
||||||
from sugar import conf
|
|
||||||
|
|
||||||
class TasksItem(DonutItem):
|
class TasksItem(DonutItem):
|
||||||
def __init__(self, shell):
|
def __init__(self, shell):
|
||||||
@ -39,50 +38,16 @@ class TasksItem(DonutItem):
|
|||||||
|
|
||||||
self._items[activity.get_id()] = item
|
self._items[activity.get_id()] = item
|
||||||
|
|
||||||
class ActivityItem(IconItem):
|
|
||||||
ICON_SIZE = 30
|
|
||||||
|
|
||||||
def __init__(self, activity):
|
|
||||||
IconItem.__init__(self, activity.get_icon(),
|
|
||||||
IconColor('white'),
|
|
||||||
ActivityItem.ICON_SIZE)
|
|
||||||
self._activity = activity
|
|
||||||
|
|
||||||
def get_activity_id(self):
|
|
||||||
return self._activity.get_id()
|
|
||||||
|
|
||||||
class ActivityBar(goocanvas.Group):
|
|
||||||
def __init__(self, shell):
|
|
||||||
goocanvas.Group.__init__(self)
|
|
||||||
|
|
||||||
self._shell = shell
|
|
||||||
|
|
||||||
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):
|
|
||||||
item = ActivityItem(activity)
|
|
||||||
x = (ActivityItem.ICON_SIZE + 6) * self.get_n_children()
|
|
||||||
item.set_property('x', x)
|
|
||||||
self.add_child(item)
|
|
||||||
|
|
||||||
class Background(goocanvas.Group):
|
class Background(goocanvas.Group):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
goocanvas.Group.__init__(self)
|
goocanvas.Group.__init__(self)
|
||||||
|
|
||||||
item = goocanvas.Rect(width=1200, height=900,
|
item = goocanvas.Rect(width=1200, height=900,
|
||||||
fill_color="#4f4f4f")
|
fill_color="#d8d8d8")
|
||||||
self.add_child(item)
|
|
||||||
|
|
||||||
item = goocanvas.Rect(x=50, y=50, width=1100, height=800,
|
|
||||||
line_width=0, fill_color="#d8d8d8",
|
|
||||||
radius_x=30, radius_y=30)
|
|
||||||
self.add_child(item)
|
self.add_child(item)
|
||||||
|
|
||||||
item = goocanvas.Text(text="My Activities",
|
item = goocanvas.Text(text="My Activities",
|
||||||
x=60, y=10, fill_color="white",
|
x=12, y=12, fill_color="black",
|
||||||
font="Sans 21")
|
font="Sans 21")
|
||||||
self.add_child(item)
|
self.add_child(item)
|
||||||
|
|
||||||
@ -95,10 +60,6 @@ class Model(goocanvas.CanvasModelSimple):
|
|||||||
background = Background()
|
background = Background()
|
||||||
root.add_child(background)
|
root.add_child(background)
|
||||||
|
|
||||||
activity_bar = ActivityBar(shell)
|
|
||||||
activity_bar.translate(50, 860)
|
|
||||||
root.add_child(activity_bar)
|
|
||||||
|
|
||||||
tasks = TasksItem(shell)
|
tasks = TasksItem(shell)
|
||||||
tasks.translate(600, 450)
|
tasks.translate(600, 450)
|
||||||
root.add_child(tasks)
|
root.add_child(tasks)
|
||||||
@ -119,12 +80,8 @@ class HomeView(goocanvas.CanvasView):
|
|||||||
self.set_model(canvas_model)
|
self.set_model(canvas_model)
|
||||||
|
|
||||||
def __item_view_created_cb(self, view, item_view, item):
|
def __item_view_created_cb(self, view, item_view, item):
|
||||||
if isinstance(item, ActivityItem):
|
if isinstance(item, PieceItem) or \
|
||||||
item_view.connect("button_press_event",
|
isinstance(item, PieceIcon):
|
||||||
self.__activity_button_press_cb,
|
|
||||||
item.get_activity_id())
|
|
||||||
elif isinstance(item, PieceItem) or \
|
|
||||||
isinstance(item, PieceIcon):
|
|
||||||
item_view.connect("button_press_event",
|
item_view.connect("button_press_event",
|
||||||
self.__task_button_press_cb)
|
self.__task_button_press_cb)
|
||||||
|
|
||||||
|
5
shell/panel/FriendsPanel.py
Normal file
5
shell/panel/FriendsPanel.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from panel.Panel import Panel
|
||||||
|
|
||||||
|
class FriendsPanel(Panel):
|
||||||
|
def __init__(self, shell):
|
||||||
|
Panel.__init__(self)
|
7
shell/panel/Makefile.am
Normal file
7
shell/panel/Makefile.am
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
sugardir = $(pkgdatadir)/shell/panel
|
||||||
|
sugar_PYTHON = \
|
||||||
|
__init__.py \
|
||||||
|
FriendsPanel.py \
|
||||||
|
Panel.py \
|
||||||
|
PanelManager.py \
|
||||||
|
VerbsPanel.py
|
53
shell/panel/Panel.py
Normal file
53
shell/panel/Panel.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import gtk
|
||||||
|
import goocanvas
|
||||||
|
|
||||||
|
class PanelModel(goocanvas.CanvasModelSimple):
|
||||||
|
BORDER = 4
|
||||||
|
|
||||||
|
def __init__(self, width, height):
|
||||||
|
goocanvas.CanvasModelSimple.__init__(self)
|
||||||
|
|
||||||
|
root = self.get_root_item()
|
||||||
|
|
||||||
|
item = goocanvas.Rect(x=0, y=0, width=width, height=height,
|
||||||
|
line_width=0, fill_color="#4f4f4f")
|
||||||
|
root.add_child(item)
|
||||||
|
|
||||||
|
class PanelView(goocanvas.CanvasView):
|
||||||
|
def construct(self):
|
||||||
|
canvas_model = PanelModel(self.get_allocation().width,
|
||||||
|
self.get_allocation().height)
|
||||||
|
self.set_model(canvas_model)
|
||||||
|
|
||||||
|
class Panel(gtk.Window):
|
||||||
|
def __init__(self):
|
||||||
|
gtk.Window.__init__(self)
|
||||||
|
|
||||||
|
self._view = PanelView()
|
||||||
|
self.add(self._view)
|
||||||
|
self._view.show()
|
||||||
|
|
||||||
|
self.connect('realize', self.__realize_cb)
|
||||||
|
|
||||||
|
def get_view(self):
|
||||||
|
return self._view
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
return self._view.get_model()
|
||||||
|
|
||||||
|
def get_border(self):
|
||||||
|
return PanelModel.BORDER
|
||||||
|
|
||||||
|
def get_height(self):
|
||||||
|
height = self._view.get_allocation().height
|
||||||
|
return height - self.get_border() * 2
|
||||||
|
|
||||||
|
def __realize_cb(self, window):
|
||||||
|
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
|
||||||
|
|
||||||
|
def construct(self):
|
||||||
|
self._view.construct()
|
||||||
|
|
||||||
|
def show(self):
|
||||||
|
gtk.Window.show(self)
|
||||||
|
self.construct()
|
29
shell/panel/PanelManager.py
Normal file
29
shell/panel/PanelManager.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import gtk
|
||||||
|
|
||||||
|
from panel.VerbsPanel import VerbsPanel
|
||||||
|
from panel.FriendsPanel import FriendsPanel
|
||||||
|
from panel.Panel import Panel
|
||||||
|
|
||||||
|
class PanelManager:
|
||||||
|
def __init__(self, shell):
|
||||||
|
size = 30
|
||||||
|
|
||||||
|
self._verbs_panel = VerbsPanel(shell)
|
||||||
|
self._verbs_panel.move(0, gtk.gdk.screen_height() - size)
|
||||||
|
self._verbs_panel.resize(gtk.gdk.screen_width(), size)
|
||||||
|
self._verbs_panel.show()
|
||||||
|
|
||||||
|
self._friends_panel = FriendsPanel(shell)
|
||||||
|
self._friends_panel.move(gtk.gdk.screen_width() - size, 0)
|
||||||
|
self._friends_panel.resize(size, gtk.gdk.screen_height())
|
||||||
|
self._friends_panel.show()
|
||||||
|
|
||||||
|
panel = Panel()
|
||||||
|
panel.move(0, 0)
|
||||||
|
panel.resize(gtk.gdk.screen_width(), size)
|
||||||
|
panel.show()
|
||||||
|
|
||||||
|
panel = Panel()
|
||||||
|
panel.move(0, 0)
|
||||||
|
panel.resize(size, gtk.gdk.screen_height())
|
||||||
|
panel.show()
|
64
shell/panel/VerbsPanel.py
Normal file
64
shell/panel/VerbsPanel.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import gtk
|
||||||
|
import goocanvas
|
||||||
|
|
||||||
|
from sugar.canvas.IconItem import IconItem
|
||||||
|
from sugar.canvas.IconItem import IconColor
|
||||||
|
from sugar import conf
|
||||||
|
from panel.Panel import Panel
|
||||||
|
|
||||||
|
class ActivityItem(IconItem):
|
||||||
|
def __init__(self, activity, size):
|
||||||
|
IconItem.__init__(self, activity.get_icon(),
|
||||||
|
IconColor('white'), 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):
|
||||||
|
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 VerbsPanel(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_model().get_root_item()
|
||||||
|
|
||||||
|
activity_bar = ActivityBar(self._shell, self.get_height())
|
||||||
|
activity_bar.translate(self.get_border(), self.get_border())
|
||||||
|
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
shell/panel/__init__.py
Normal file
0
shell/panel/__init__.py
Normal file
@ -54,22 +54,6 @@ class XnestProcess(Process):
|
|||||||
Process.start(self)
|
Process.start(self)
|
||||||
os.environ['DISPLAY'] = ":%d" % (self._display)
|
os.environ['DISPLAY'] = ":%d" % (self._display)
|
||||||
|
|
||||||
class DbusProcess(Process):
|
|
||||||
def __init__(self):
|
|
||||||
config = sugar.env.get_dbus_config()
|
|
||||||
cmd = "dbus-daemon --print-address --config-file %s" % config
|
|
||||||
Process.__init__(self, cmd)
|
|
||||||
|
|
||||||
def get_name(self):
|
|
||||||
return 'Dbus'
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
Process.start(self, True)
|
|
||||||
dbus_file = os.fdopen(self._stdout)
|
|
||||||
addr = dbus_file.readline().strip()
|
|
||||||
dbus_file.close()
|
|
||||||
os.environ["DBUS_SESSION_BUS_ADDRESS"] = addr
|
|
||||||
|
|
||||||
class Emulator:
|
class Emulator:
|
||||||
"""The OLPC emulator"""
|
"""The OLPC emulator"""
|
||||||
def start(self):
|
def start(self):
|
||||||
@ -84,6 +68,3 @@ class Emulator:
|
|||||||
print 'Cannot run the emulator. You need to install \
|
print 'Cannot run the emulator. You need to install \
|
||||||
Xephyr or Xnest.'
|
Xephyr or Xnest.'
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
process = DbusProcess()
|
|
||||||
process.start()
|
|
||||||
|
@ -9,6 +9,22 @@ from ConsoleWindow import ConsoleWindow
|
|||||||
from session.Process import Process
|
from session.Process import Process
|
||||||
import sugar.env
|
import sugar.env
|
||||||
|
|
||||||
|
class DbusProcess(Process):
|
||||||
|
def __init__(self):
|
||||||
|
config = sugar.env.get_dbus_config()
|
||||||
|
cmd = "dbus-daemon --print-address --config-file %s" % config
|
||||||
|
Process.__init__(self, cmd)
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return 'Dbus'
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
Process.start(self, True)
|
||||||
|
dbus_file = os.fdopen(self._stdout)
|
||||||
|
addr = dbus_file.readline().strip()
|
||||||
|
dbus_file.close()
|
||||||
|
os.environ["DBUS_SESSION_BUS_ADDRESS"] = addr
|
||||||
|
|
||||||
class MatchboxProcess(Process):
|
class MatchboxProcess(Process):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
kbd_config = os.path.join(sugar.env.get_data_dir(), 'kbdconfig')
|
kbd_config = os.path.join(sugar.env.get_data_dir(), 'kbdconfig')
|
||||||
@ -26,6 +42,9 @@ class Session:
|
|||||||
"""Takes care of running the shell and all the sugar processes"""
|
"""Takes care of running the shell and all the sugar processes"""
|
||||||
def start(self):
|
def start(self):
|
||||||
"""Start the session"""
|
"""Start the session"""
|
||||||
|
process = DbusProcess()
|
||||||
|
process.start()
|
||||||
|
|
||||||
process = MatchboxProcess()
|
process = MatchboxProcess()
|
||||||
process.start()
|
process.start()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user