Ejemplo n.º 1
0
    def on_join(self, room):
        self.room = room
        self.label.set_text(room.name)

        self.entry.set_sensitive(True)
        self.send_button.set_sensitive(True)

        self.refresh()
        self.stream = StreamingRoom(self.room, self.history.on_message)
        self.stream.start()
Ejemplo n.º 2
0
class ChatDialog(gtk.VBox, HasController):
    stream = None
    refreshing = False
    room = None

    def create_user_list_widget(self):
        user_store = gtk.ListStore(str)
        user_list = gtk.TreeView(user_store)

        user_list.set_size_request(120, 0)

        col = gtk.TreeViewColumn("Users", gtk.CellRendererText(), text=0)
        col.set_sort_column_id(0)
        user_list.append_column(col)

        self.user_list = user_list

        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        sw.add(user_list)
        return sw

    def __init__(self, controller, room_id, label):
        super(ChatDialog, self).__init__(False, 4)
        self.label = label
        self.controller = controller

        self.set_border_width(6)

        self.send_button = gtk.Button("Send")
        self.send_button.connect("clicked", self.on_activate)

        self.entry = gtk.Entry()
        self.entry.connect("activate", self.on_activate)

        self.entry.set_sensitive(False)
        self.send_button.set_sensitive(False)

        hbox = gtk.HBox(False, 4)
        hbox.pack_start(self.entry, True, True)
        hbox.pack_start(self.send_button, False, False)

        self.history = ChatHistory(self)

        user_list = self.create_user_list_widget()
        pane = gtk.HPaned()
        pane.pack1(self.history, True)
        pane.pack2(user_list, False)

        self.pack_start(pane, True, True)
        self.pack_start(hbox, False)
        self.show_all()

        self.network.join_by_id(self.on_join, room_id)

        self.user_id_to_name = {}

    def shutdown(self):
        if self.stream is not None:
            self.stream.queue_finish()
        self.room.leave(None)

    def refresh(self):
        if self.refreshing:
            return
        self.refreshing = True
        self.room.get_users(self.on_refresh)

    def on_refresh(self, users):
        store = self.user_list.get_model()
        store.clear()

        for user in users:
            self.user_id_to_name[user["id"]] = user["name"]
            store.append([user["name"]])

        self.refreshing = False
        self.history.on_chat_dialog_ready()

    def on_activate(self, widget):
        text = self.entry.get_text()
        if not text:
            return
        print "sending:", text
        self.room.speak(None, text)
        self.history.text.write_line(self.controller.me["name"], text, True)
        self.entry.set_text("")

    def on_join(self, room):
        self.room = room
        self.label.set_text(room.name)

        self.entry.set_sensitive(True)
        self.send_button.set_sensitive(True)

        self.refresh()
        self.stream = StreamingRoom(self.room, self.history.on_message)
        self.stream.start()