From 4fda4b8cb41300c09be2d83dce2d2a8ae73beb2b Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 15 Jun 2006 03:24:11 +0000 Subject: Start refactoring chat. Get the UI to show as a slide in (ctrl+up) --- diff --git a/sugar/chat/chat.py b/sugar/chat/Chat.py index e90604c..7a80f57 100755..100644 --- a/sugar/chat/chat.py +++ b/sugar/chat/Chat.py @@ -35,24 +35,34 @@ GROUP_CHAT_SERVICE_TYPE = "_olpc_group_chat._udp" GROUP_CHAT_SERVICE_ADDRESS = "224.0.0.221" GROUP_CHAT_SERVICE_PORT = 6200 -class Chat(activity.Activity): +class Chat(gtk.Window): def __init__(self, controller): - Buddy.recognize_buddy_service_type(CHAT_SERVICE_TYPE) + gtk.Window.__init__(self) + + #Buddy.recognize_buddy_service_type(CHAT_SERVICE_TYPE) self._controller = controller - activity.Activity.__init__(self) - self._stream_writer = None - + self._stream_writer = None self._emt_popup = None - bus = dbus.SessionBus() - proxy_obj = bus.get_object('com.redhat.Sugar.Browser', '/com/redhat/Sugar/Browser') - self._browser_shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.BrowserShell') + vbox = gtk.VBox(False, 6) + + self._hbox = gtk.HBox(False, 12) + self._hbox.set_border_width(12) + + [chat_vbox, buf] = self._create_chat() + self._hbox.pack_start(chat_vbox) + chat_vbox.show() + + vbox.pack_start(self._hbox) + self._hbox.show() + + toolbar = self._create_toolbar(buf) + vbox.pack_start(toolbar, False) + toolbar.show() + + self.add(vbox) + vbox.show() - def on_connected_to_shell(self): - self.set_tab_text(self._act_name) - self._ui_setup(self._plug) - self._plug.show_all() - def _create_toolbox(self): vbox = gtk.VBox(False, 12) @@ -135,28 +145,13 @@ class Chat(activity.Activity): return chat_vbox, self._editor.get_buffer() - def _ui_setup(self, base): - vbox = gtk.VBox(False, 6) - - self._hbox = gtk.HBox(False, 12) - self._hbox.set_border_width(12) - - [chat_vbox, buf] = self._create_chat() - self._hbox.pack_start(chat_vbox) - chat_vbox.show() - - vbox.pack_start(self._hbox) - self._hbox.show() - - toolbar = self._create_toolbar(buf) - vbox.pack_start(toolbar, False) - toolbar.show() - - base.add(vbox) - vbox.show() + def __get_browser_shell(): + bus = dbus.SessionBus() + proxy_obj = bus.get_object('com.redhat.Sugar.Browser', '/com/redhat/Sugar/Browser') + self._browser_shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.BrowserShell') def __link_clicked_cb(self, view, address): - self._browser_shell.open_browser(address) + self.__get_browser_shell().open_browser(address) def __key_press_event_cb(self, text_view, event): if event.keyval == gtk.keysyms.Return: @@ -265,7 +260,7 @@ class Chat(activity.Activity): def __show_link_menu_cb(self, button): menu = gtk.Menu() - links = self._browser_shell.get_links() + links = self.__get_browser_shell().get_links() for link in links: item = gtk.MenuItem(link['title'], False) @@ -421,137 +416,3 @@ class Chat(activity.Activity): self._stream_writer.write(text) owner = self._controller.get_group().get_owner() self._insert_rich_message(owner.get_nick_name(), text) - - -class BuddyChat(Chat): - def __init__(self, controller, buddy): - self._buddy = buddy - self._act_name = "Chat: %s" % buddy.get_nick_name() - Chat.__init__(self, controller) - - def on_connected_to_shell(self): - Chat.on_connected_to_shell(self) - self.set_can_close(True) - self.set_tab_icon(icon_name="im") - self.set_show_tab_icon(True) - self._stream_writer = self._controller.new_buddy_writer(self._buddy) - - def recv_message(self, sender, msg): - Chat.recv_message(self, self._buddy, msg) - - def on_close_from_user(self): - Chat.on_close_from_user(self) - del self._chats[self._buddy] - - -class GroupChat(Chat): - def __init__(self): - self._group = Group.get_from_id('local') - self._act_name = "Chat" - self._chats = {} - - Chat.__init__(self, self) - - def get_group(self): - return self._group - - def new_buddy_writer(self, buddy): - service = buddy.get_service(CHAT_SERVICE_TYPE) - return self._buddy_stream.new_writer(service) - - def _start(self): - name = self._group.get_owner().get_nick_name() - - # Group controls the Stream for incoming messages for - # specific buddy chats - buddy_service = Service(name, CHAT_SERVICE_TYPE, CHAT_SERVICE_PORT) - self._buddy_stream = Stream.new_from_service(buddy_service, self._group) - self._buddy_stream.set_data_listener(getattr(self, "_buddy_recv_message")) - buddy_service.register(self._group) - - # Group chat Stream - group_service = Service(name, GROUP_CHAT_SERVICE_TYPE, - GROUP_CHAT_SERVICE_PORT, - GROUP_CHAT_SERVICE_ADDRESS) - self._group.add_service(group_service) - - self._group_stream = Stream.new_from_service(group_service, self._group) - self._group_stream.set_data_listener(self._group_recv_message) - self._stream_writer = self._group_stream.new_writer() - - def _ui_setup(self, base): - Chat._ui_setup(self, base) - - vbox = gtk.VBox(False, 12) - - toolbox = self._create_toolbox() - vbox.pack_start(toolbox, False) - toolbox.show() - - self._hbox.pack_start(vbox, False) - vbox.show() - - self._plug.show_all() - - def on_connected_to_shell(self): - Chat.on_connected_to_shell(self) - - self.set_tab_icon(name="stock_help-chat") - self.set_show_tab_icon(True) - - self._start() - - def on_disconnected_from_shell(self): - Chat.on_disconnected_from_shell(self) - gtk.main_quit() - - def _group_recv_message(self, buddy, msg): - self.recv_message(buddy, msg) - - def _buddy_recv_message(self, buddy, msg): - if not self._chats.has_key(buddy): - chat = BuddyChat(self, buddy) - self._chats[buddy] = chat - chat.connect_to_shell() - else: - chat = self._chats[buddy] - chat.recv_message(buddy, msg) - - -class ChatShellDbusService(dbus.service.Object): - def __init__(self, parent): - self._parent = parent - session_bus = dbus.SessionBus() - bus_name = dbus.service.BusName('com.redhat.Sugar.Chat', bus=session_bus) - object_path = '/com/redhat/Sugar/Chat' - dbus.service.Object.__init__(self, bus_name, object_path) - - @dbus.service.method('com.redhat.Sugar.ChatShell') - def send_text_message(self, message): - self._parent.send_text_message(message) - -class ChatShell(object): - instance = None - _lock = threading.Lock() - - def get_instance(): - ChatShell._lock.acquire() - if not ChatShell.instance: - ChatShell.instance = ChatShell() - ChatShell._lock.release() - return ChatShell.instance - get_instance = staticmethod(get_instance) - - def open_group_chat(self): - self._group_chat = GroupChat() - self._group_chat.connect_to_shell() - - def send_text_message(self, message): - self._group_chat.send_text_message(message) - -log_writer = LogWriter("Chat") -log_writer.start() - -ChatShell.get_instance().open_group_chat() - -gtk.main() diff --git a/sugar/chat/GroupChat.py b/sugar/chat/GroupChat.py new file mode 100644 index 0000000..e5d3a00 --- /dev/null +++ b/sugar/chat/GroupChat.py @@ -0,0 +1,45 @@ +from sugar.chat.Chat import Chat + +class GroupChat(Chat): + def __init__(self): + Chat.__init__(self, self) + self._chats = {} + + def get_group(self): + return self._group + + def new_buddy_writer(self, buddy): + service = buddy.get_service(CHAT_SERVICE_TYPE) + return self._buddy_stream.new_writer(service) + + def _start(self): + name = self._group.get_owner().get_nick_name() + + # Group controls the Stream for incoming messages for + # specific buddy chats + buddy_service = Service(name, CHAT_SERVICE_TYPE, CHAT_SERVICE_PORT) + self._buddy_stream = Stream.new_from_service(buddy_service, self._group) + self._buddy_stream.set_data_listener(getattr(self, "_buddy_recv_message")) + buddy_service.register(self._group) + + # Group chat Stream + group_service = Service(name, GROUP_CHAT_SERVICE_TYPE, + GROUP_CHAT_SERVICE_PORT, + GROUP_CHAT_SERVICE_ADDRESS) + self._group.add_service(group_service) + + self._group_stream = Stream.new_from_service(group_service, self._group) + self._group_stream.set_data_listener(self._group_recv_message) + self._stream_writer = self._group_stream.new_writer() + + def _group_recv_message(self, buddy, msg): + self.recv_message(buddy, msg) + + def _buddy_recv_message(self, buddy, msg): + if not self._chats.has_key(buddy): + chat = BuddyChat(self, buddy) + self._chats[buddy] = chat + chat.connect_to_shell() + else: + chat = self._chats[buddy] + chat.recv_message(buddy, msg) diff --git a/sugar/chat/bubble.png b/sugar/chat/bubble.png deleted file mode 100644 index 3d1503d..0000000 --- a/sugar/chat/bubble.png +++ /dev/null Binary files differ diff --git a/sugar/chat/bubbleOutline.png b/sugar/chat/bubbleOutline.png deleted file mode 100644 index 334ddca..0000000 --- a/sugar/chat/bubbleOutline.png +++ /dev/null Binary files differ diff --git a/sugar/chat/chat.activity b/sugar/chat/chat.activity deleted file mode 100644 index 3c6137b..0000000 --- a/sugar/chat/chat.activity +++ /dev/null @@ -1,2 +0,0 @@ -[Activity] -python_class = sugar/chat/chat diff --git a/sugar/chat/chat.py b/sugar/chat/old_chat.py index e90604c..e90604c 100755 --- a/sugar/chat/chat.py +++ b/sugar/chat/old_chat.py diff --git a/sugar/shell/WindowManager.py b/sugar/shell/WindowManager.py index 2ae1cba..c4a5804 100644 --- a/sugar/shell/WindowManager.py +++ b/sugar/shell/WindowManager.py @@ -9,7 +9,8 @@ class WindowManager: CENTER = 0 LEFT = 1 RIGHT = 2 - BOTTOM = 3 + TOP = 3 + BOTTOM = 4 ABSOLUTE = 0 SCREEN_RELATIVE = 1 @@ -31,25 +32,24 @@ class WindowManager: def has_focus(self): return self._window.has_toplevel_focus() - def _update_visibility(self): - show_slided_in = False - - for manager in WindowManager.__managers_list: - if manager.has_focus(): - show_slided_in = True - - if manager._visibility is WindowManager.VISIBLE: - manager._window.show() - elif manager._visibility is WindowManager.HIDDEN: - manager._window.hide() - elif manager._visibility is WindowManager.SLIDED_IN: - if show_slided_in: - manager._window.show() - else: - manager._window.hide() + def _update_visibility(self): + visible = False + + if self._visibility is WindowManager.VISIBLE: + visible = True + elif self._visibility is WindowManager.HIDDEN: + visible = False + elif self._visibility is WindowManager.SLIDED_IN: + for manager in WindowManager.__managers_list: + if manager.has_focus(): + visible = True + + if self._window.get_property('visible') != visible: + self._window.set_property('visible', visible) def __focus_change_idle(self): - self._update_visibility() + for manager in WindowManager.__managers_list: + manager._update_visibility() return False def __focus_in_event_cb(self, window, event): @@ -67,6 +67,12 @@ class WindowManager: if wm._position == WindowManager.LEFT: manager = wm + if event.keyval == gtk.keysyms.Up and \ + event.state & gtk.gdk.CONTROL_MASK: + for wm in WindowManager.__managers_list: + if wm._position == WindowManager.TOP: + manager = wm + if manager and manager._window.get_property('visible'): manager.slide_window_out() elif manager: @@ -103,6 +109,9 @@ class WindowManager: elif self._position is WindowManager.LEFT: x = 0 y = int((screen_height - height) / 2) + elif self._position is WindowManager.TOP: + x = int((screen_width - width) / 2) + y = 0 self._window.move(x, y) self._window.resize(width, height) diff --git a/sugar/shell/shell.py b/sugar/shell/shell.py index ee44042..893e291 100755 --- a/sugar/shell/shell.py +++ b/sugar/shell/shell.py @@ -12,6 +12,7 @@ from sugar.shell.PresenceWindow import PresenceWindow from sugar.shell.Owner import ShellOwner from sugar.shell.StartPage import StartPage from sugar.shell.WindowManager import WindowManager +from sugar.chat.GroupChat import GroupChat class ActivityHost(dbus.service.Object): @@ -372,8 +373,6 @@ def main(): activity_container = ActivityContainer(service, session_bus) activity_container.show() - - presence_window = PresenceWindow(activity_container) wm = WindowManager(activity_container.window) wm.set_width(640, WindowManager.ABSOLUTE) @@ -382,6 +381,8 @@ def main(): wm.show() wm.manage() + presence_window = PresenceWindow(activity_container) + wm = WindowManager(presence_window) wm.set_width(0.15, WindowManager.SCREEN_RELATIVE) @@ -389,6 +390,17 @@ def main(): wm.set_position(WindowManager.LEFT) wm.manage() + group_chat = GroupChat() + group_chat.set_decorated(False) + group_chat.set_skip_taskbar_hint(True) + + wm = WindowManager(group_chat) + + wm.set_width(0.5, WindowManager.SCREEN_RELATIVE) + wm.set_height(0.5, WindowManager.SCREEN_RELATIVE) + wm.set_position(WindowManager.TOP) + wm.manage() + console.set_parent_window(activity_container.window) if __name__ == "__main__": -- cgit v0.9.1