Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2006-06-15 03:24:11 (GMT)
committer Marco Pesenti Gritti <mpg@redhat.com>2006-06-15 03:24:11 (GMT)
commit4fda4b8cb41300c09be2d83dce2d2a8ae73beb2b (patch)
treee50cba456ee2beb908ba15b4e9a9b05d9e4d4723
parent7e6f6ec34901805cb0c057781c9ba383ba7142cc (diff)
Start refactoring chat. Get the UI to show as a slide in (ctrl+up)
-rw-r--r--[-rwxr-xr-x]sugar/chat/Chat.py (copied from sugar/chat/chat.py)197
-rw-r--r--sugar/chat/GroupChat.py45
-rw-r--r--sugar/chat/bubble.pngbin255 -> 0 bytes
-rw-r--r--sugar/chat/bubbleOutline.pngbin284 -> 0 bytes
-rw-r--r--sugar/chat/chat.activity2
-rwxr-xr-xsugar/chat/old_chat.py (renamed from sugar/chat/chat.py)0
-rw-r--r--sugar/shell/WindowManager.py45
-rwxr-xr-xsugar/shell/shell.py16
8 files changed, 115 insertions, 190 deletions
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__":