Esempio n. 1
0
 def on_smileyButton_clicked(self, *args):
     if self.smileyWindow == None:
         self.smileyWindow = SmileyWindow(self.addSmiley)
     self.smileyWindow.show()
Esempio n. 2
0
class ChatWindow:
    def __init__(self, mxit):
        self.mxit = mxit
        self.smileyWindow = None
        self.smileyList = []
        self.tabList = {}
        self.vibesBox = None

        self.initGui()
        self.window.show_all()

        self.initCallbacks()

    def initGui(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file(os.path.join('gui', 'glade', 'ChatWindow.glade'))
        self.window = self.builder.get_object('ChatWindow')
        self.builder.connect_signals(self)

        self.notebook = self.builder.get_object('ChatBoxNotebook')
        self.notebook.connect('switch-page', self.on_notebook_pageChanged)

        #Removed because it introduces too many bugs
        #gtk.notebook_set_window_creation_hook(self.windowCreate)

        try:
            import gtkspell
            self.spell = gtkspell.Spell(self.builder.get_object('entryView'))
        except:
            pass

    def on_contact_modified(self, modification, contact, changed):
        try:
            tab = self.tabList[contact.contactAddress]
            tab.contact_modified(modification, changed)
        except KeyError:
            #When a key error is thrown its most likely becauseuser hasn't opened a tab for them yet
            pass

    def initCallbacks(self):
        self.mxit.contact_callback.append(self.on_contact_modified)

    def get_active_tab(self):
        return self.notebook.get_nth_page(self.notebook.get_current_page())

    def create_tab_label(self, gotMessage, contact):
        box = gtk.HBox()
        if not gotMessage:
            label = gtk.Label(contact.nickname)
        else:
            label = gtk.Label()
            label.set_markup('<b><span color="grey" style="italic">%s</span></b>' % contact.nickname)

        presenceimage = gtk.image_new_from_file(os.path.join(PRESENCE_IMAGES_BASE_DIR, PRESENCE_IMAGES_FILENAMES[contact.presence]))
        closeimage = gtk.Image()
        closeimage.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
        closebutton = gtk.Button()
        closebutton.set_image(closeimage)
        closebutton.set_relief(gtk.RELIEF_NONE)
        closebutton.connect('clicked', self.close_tab, contact)

        box.add(presenceimage)
        box.add(label)
        box.add(closebutton)
        box.show_all()
        return box

    def create_chat_tab(self, contact):
        label = self.create_tab_label(False, contact)

        if self.tabList.has_key(contact.contactAddress):
            tab = self.tabList[contact.contactAddress]
        else:
            if contact.contactType == CONTACT_TYPE_MULTIMIX:
                self.tabList[contact.contactAddress] = tab = MultiMxTab(contact, self, self.mxit)
            else:
                self.tabList[contact.contactAddress] = tab = ChatTab(contact, self, self.mxit)
            contact.set_chat_tab(tab)

        if tab.isOpen():
            return

        self.notebook.append_page(tab)
        self.notebook.set_tab_reorderable(tab, True)
        self.notebook.set_tab_label(tab, label)

        tab.open_tab()
        #Make sure this window is showing
        self.window.show_all()

    def close_tab(self, button, contact):
        tab = self.tabList[contact.contactAddress]
        tab.close_tab()
        self.notebook.remove_page(self.notebook.page_num(tab))

        numPages = self.notebook.get_n_pages()
        if numPages == 0:
            self.window.hide()
            return

    def on_text_inserted(self, textview, string, *args):
        print 'on_text_inserted'
        if '\n' in string:
            buffer = textview.get_buffer()
            buffer.delete(buffer.get_iter_at_offset(-1), buffer.get_end_iter())

    def on_smileyButton_clicked(self, *args):
        if self.smileyWindow == None:
            self.smileyWindow = SmileyWindow(self.addSmiley)
        self.smileyWindow.show()

    def on_vibesButton_clicked(self, *args):
        if self.vibesBox == None:
            self.vibesBox = VibesBox(self.appendToEntry)
        self.vibesBox.show()

    def addSmiley(self, pixbuf, smiley_code):
        buf = self.builder.get_object('entryView').get_buffer()
        iter = buf.get_end_iter()
        buf.insert_pixbuf(iter, pixbuf)
        self.smileyList.append((iter, smiley_code))

    def appendToEntry(self, addition):
        buf = self.builder.get_object('entryView').get_buffer()
        buf.insert(buf.get_end_iter(), addition)

    def on_keypress(self, widget, event, *args):
        #We are only looking for enter button presses
        #Todo: Replace 65293 with actual constant
        if not event.keyval == 65293:
            return

        buf = self.builder.get_object('entryView').get_buffer()
        for iter, smiley_code in self.smileyList:
            buf.insert(iter, smiley_code)
        msg = buf.get_text(buf.get_start_iter(),buf.get_end_iter())
        buf.set_text('')

        #Get contactAddress of active tab
        print self.get_active_tab().contact
        contactAddress = self.get_active_tab().contact.contactAddress

        message = Message(contactAddress, msg)
        self.mxit.send_message(message)

        self.get_active_tab()._insert_message(0, time.time(), 0, msg)

        return False

    def on_notebook_pageChanged(self, notebook, page, page_num, userdata=None):
        tab = notebook.get_nth_page(page_num)
        self.window.set_title(tab.contact.nickname)
        notebook.set_tab_label(tab, self.create_tab_label(False, tab.contact))

    def on_closeWindow_activate(self, *args):
        #Had to create this function to ensure window's widgets never get destroyed
        self.window.hide()
        return True