From d4cb9a27149126de64fb003aafb8673633b885b0 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Sat, 08 Jul 2006 13:47:51 +0000 Subject: More work on the new design --- (limited to 'shell') diff --git a/shell/ActivityContainer.py b/shell/ActivityContainer.py index cf961bb..0f50dc9 100644 --- a/shell/ActivityContainer.py +++ b/shell/ActivityContainer.py @@ -7,7 +7,6 @@ from sugar.chat.ChatWindow import ChatWindow from sugar.chat.MeshChat import MeshChat from ActivityHost import ActivityHost from PresenceWindow import PresenceWindow -from HomeWindow import HomeWindow from WindowManager import WindowManager from StartPage import StartPage from Owner import ShellOwner @@ -66,16 +65,6 @@ class ActivityContainer(dbus.service.Object): self._mesh_chat = MeshChat() - home_window = HomeWindow() - wm = WindowManager(home_window) - wm.set_type(WindowManager.TYPE_POPUP) - wm.set_animation(WindowManager.ANIMATION_SLIDE_IN) - wm.set_geometry(0.1, 0.1, 0.9, 0.9) - wm.set_key(gtk.keysyms.F2) - - def show(self): - self.window.show() - def set_current_activity(self, activity): self.current_activity = activity self._presence_window.set_activity(activity) @@ -93,26 +82,21 @@ class ActivityContainer(dbus.service.Object): self._signal_helper.activity_ended(activity_id) self._activities.remove((owner, activity)) - @dbus.service.method("com.redhat.Sugar.Shell.ActivityContainer", \ - in_signature="ss", \ - out_signature="s", \ - sender_keyword="sender") - def add_activity(self, activity_name, default_type, sender): - activity = ActivityHost(self, activity_name, default_type) - self._activities.append((sender, activity)) + @dbus.service.method("com.redhat.Sugar.Shell.ActivityContainer") + def add_activity(self, default_type): + activity = ActivityHost(self._service, default_type) + self._activities.append(activity) - activity_id = activity.get_host_activity_id() + activity_id = activity.get_id() self._signal_helper.activity_started(activity_id) - self.current_activity = activity + self.set_current_activity(activity) return activity_id - @dbus.service.method("com.redhat.Sugar.Shell.ActivityContainer", \ - in_signature="sss", \ - sender_keyword="sender") - def add_activity_with_id(self, activity_name, default_type, activity_id, sender): - activity = ActivityHost(self, activity_name, default_type, activity_id) - self._activities.append((sender, activity)) + @dbus.service.method("com.redhat.Sugar.Shell.ActivityContainer") + def add_activity_with_id(self, default_type, activity_id): + activity = ActivityHost(self._service, default_type, activity_id) + self._activities.append(activity) activity_id = activity.get_host_activity_id() self._signal_helper.activity_started(activity_id) self.current_activity = activity diff --git a/shell/ActivityHost.py b/shell/ActivityHost.py index fa99df2..cfc36d3 100644 --- a/shell/ActivityHost.py +++ b/shell/ActivityHost.py @@ -2,6 +2,10 @@ import dbus import gtk import gobject +from sugar.chat.ActivityChat import ActivityChat +from WindowManager import WindowManager +import sugar.util + class ActivityHostSignalHelper(gobject.GObject): __gsignals__ = { 'shared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])) @@ -15,22 +19,22 @@ class ActivityHostSignalHelper(gobject.GObject): self.emit('shared') class ActivityHost(dbus.service.Object): - def __init__(self, default_type, activity_id = None): + def __init__(self, bus_name, default_type, activity_id = None): if activity_id is None: - self.activity_id = sugar.util.unique_id() + self._activity_id = sugar.util.unique_id() else: - self.activity_id = activity_id + self._activity_id = activity_id self._default_type = default_type - self.dbus_object_name = "/com/redhat/Sugar/Shell/Activities/%s" % self.activity_id - dbus.service.Object.__init__(self, activity_container.service, self.dbus_object_name) + self.dbus_object_name = "/com/redhat/Sugar/Shell/Activities/%s" % self._activity_id + dbus.service.Object.__init__(self, bus_name, self.dbus_object_name) self._signal_helper = ActivityHostSignalHelper(self) self.peer_service = None self._shared = False - self._window = gtk.Window() + self._create_chat() - + def _create_chat(self): self._activity_chat = ActivityChat(self) @@ -54,15 +58,10 @@ class ActivityHost(dbus.service.Object): def connect(self, signal, func): self._signal_helper.connect(signal, func) - def get_host_activity_id(self): - """Real function that the shell should use for getting the - activity's ID.""" - return self.activity_id - def get_id(self): """Interface-type function to match activity.Activity's get_id() function.""" - return self.activity_id + return self._activity_id def default_type(self): """Interface-type function to match activity.Activity's @@ -81,26 +80,21 @@ class ActivityHost(dbus.service.Object): self._shared = True self._signal_helper.emit_shared() - @dbus.service.method("com.redhat.Sugar.Shell.ActivityHost", \ - in_signature="ss", \ - out_signature="") + @dbus.service.method("com.redhat.Sugar.Shell.ActivityHost") def set_peer_service_name(self, peer_service_name, peer_object_name): self.__peer_service_name = peer_service_name self.__peer_object_name = peer_object_name - self.peer_service = dbus.Interface(self.activity_container.bus.get_object( \ + session_bus = dbus.SessionBus() + self.peer_service = dbus.Interface(session_bus.get_object( \ self.__peer_service_name, self.__peer_object_name), \ "com.redhat.Sugar.Activity") - self.activity_container.bus.add_signal_receiver(self._shared_signal, + session_bus.add_signal_receiver(self._shared_signal, signal_name="ActivityShared", dbus_interface="com.redhat.Sugar.Activity", named_service=self.__peer_service_name, path=self.__peer_object_name) @dbus.service.method("com.redhat.Sugar.Shell.ActivityHost") - def set_can_close(self, can_close): - pass - - @dbus.service.method("com.redhat.Sugar.Shell.ActivityHost") def set_has_changes(self, has_changes): pass diff --git a/shell/ActivityRegistry.py b/shell/ActivityRegistry.py index 2f40640..96ec3b1 100644 --- a/shell/ActivityRegistry.py +++ b/shell/ActivityRegistry.py @@ -25,6 +25,5 @@ class ActivityRegistry(dbus.service.Object): def add(self, name, title): self._activities.append(ActivityInfo(name, title)) - @dbus.service.method("com.redhat.Sugar.ActivityRegistry") def list_activities(self): return self._activities diff --git a/shell/ConsoleLogger.py b/shell/ConsoleLogger.py index c9c968f..e7201fc 100644 --- a/shell/ConsoleLogger.py +++ b/shell/ConsoleLogger.py @@ -24,6 +24,7 @@ class ConsoleLogger(dbus.service.Object): console_wm = WindowManager(self._window) console_wm.set_type(WindowManager.TYPE_POPUP) console_wm.set_geometry(0.1, 0.1, 0.8, 0.8) + console_wm.set_key(gtk.keysyms.F3) def _create_console(self, application): sw = gtk.ScrolledWindow() diff --git a/shell/HomeWindow.py b/shell/HomeWindow.py index de26498..72e4bfd 100644 --- a/shell/HomeWindow.py +++ b/shell/HomeWindow.py @@ -1,45 +1,50 @@ +from gettext import gettext as _ + import gtk from sugar.activity import Activity -class NewActivityButton(gtk.Button): - def __init__(self): - gtk.Button.__init__(self) +class NewActivityButton(gtk.MenuToolButton): + def __init__(self, shell): + gtk.MenuToolButton.__init__(self, None, _('New Activity')) - hbox = gtk.HBox(False, 6) - - label = gtk.Label("New Activity") - hbox.pack_start(label) - label.show() + self._shell = shell - arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE) - hbox.pack_start(arrow) - arrow.show() - - self.set_image(hbox) - - self.connect("clicked", self.__clicked_cb) + self.set_menu(gtk.Menu()) + self.connect("show-menu", self.__show_menu_cb) - def __clicked_cb(self, button): - print Activity.list_activities + def __show_menu_cb(self, button): + menu = gtk.Menu() + + for activity_info in self._shell.get_registry().list_activities(): + item = gtk.MenuItem(activity_info.get_title(), False) + name = activity_info.get_name() + item.connect('activate', self.__menu_item_activate_cb, name) + menu.append(item) + item.show() + + self.set_menu(menu) + + def __menu_item_activate_cb(self, item, name): + Activity.create(name) -class Toolbar(gtk.HBox): - def __init__(self): - gtk.HBox.__init__(self) +class Toolbar(gtk.Toolbar): + def __init__(self, shell): + gtk.Toolbar.__init__(self) - new_activity_button = NewActivityButton() - self.pack_start(new_activity_button) + new_activity_button = NewActivityButton(shell) + self.insert(new_activity_button, -1) new_activity_button.show() class HomeWindow(gtk.Window): - def __init__(self): + def __init__(self, shell): gtk.Window.__init__(self) - + vbox = gtk.VBox() - toolbar = Toolbar() - vbox.pack_start(toolbar) + toolbar = Toolbar(shell) + vbox.pack_start(toolbar, False) toolbar.show() self.add(vbox) - + vbox.show() diff --git a/shell/Shell.py b/shell/Shell.py index c952dd5..dd222da 100755 --- a/shell/Shell.py +++ b/shell/Shell.py @@ -1,4 +1,5 @@ import dbus +import gtk import gobject from sugar.LogWriter import LogWriter @@ -6,6 +7,7 @@ from WindowManager import WindowManager from ConsoleLogger import ConsoleLogger from ActivityContainer import ActivityContainer from ActivityRegistry import ActivityRegistry +from HomeWindow import HomeWindow class Shell(gobject.GObject): __gsignals__ = { @@ -22,12 +24,29 @@ class Shell(gobject.GObject): log_writer = LogWriter("Shell", False) log_writer.start() - registry = ActivityRegistry() + self._registry = ActivityRegistry() + root_window = gtk.Window() + root_window.set_title('Sugar') + wm = WindowManager(root_window) + wm.set_type(WindowManager.TYPE_ROOT) + wm.show() + + home_window = HomeWindow(self) + home_window.set_transient_for(root_window) + wm = WindowManager(home_window) + wm.set_type(WindowManager.TYPE_POPUP) + wm.set_animation(WindowManager.ANIMATION_SLIDE_IN) + wm.set_geometry(0.1, 0.1, 0.8, 0.8) + wm.set_key(gtk.keysyms.F2) + wm.show() + session_bus = dbus.SessionBus() service = dbus.service.BusName("com.redhat.Sugar.Shell", bus=session_bus) - activity_container = ActivityContainer(service, session_bus) + + def get_registry(self): + return self._registry if __name__ == "__main__": shell = Shell() diff --git a/shell/WindowManager.py b/shell/WindowManager.py index af39324..2807b8f 100644 --- a/shell/WindowManager.py +++ b/shell/WindowManager.py @@ -63,8 +63,9 @@ class SlidingHelper: class WindowManager: __managers_list = [] - TYPE_ACTIVITY = 0 - TYPE_POPUP = 1 + TYPE_ROOT = 0 + TYPE_ACTIVITY = 1 + TYPE_POPUP = 2 ANIMATION_NONE = 0 ANIMATION_SLIDE_IN = 1 @@ -134,7 +135,7 @@ class WindowManager: screen_height = DEFAULT_HEIGHT for manager in WindowManager.__managers_list: - if manager._window_type == WindowManager.TYPE_ACTIVITY: + if manager._window_type == WindowManager.TYPE_ROOT: screen_width = manager._window.allocation.width screen_height = manager._window.allocation.height @@ -143,7 +144,7 @@ class WindowManager: def _get_screen_position(self): result = (0, 0) for manager in WindowManager.__managers_list: - if manager._window_type == WindowManager.TYPE_ACTIVITY: + if manager._window_type == WindowManager.TYPE_ROOT: result = manager._window.get_position() return result @@ -171,7 +172,8 @@ class WindowManager: self._window.set_skip_taskbar_hint(True) def _update_size(self): - if self._window_type == WindowManager.TYPE_ACTIVITY: + if (self._window_type == WindowManager.TYPE_ACTIVITY) or \ + (self._window_type == WindowManager.TYPE_ROOT): self._window.resize(DEFAULT_WIDTH, DEFAULT_HEIGHT) else: (width, height) = self._transform_dimensions() -- cgit v0.9.1