From a4cd6f37b9b655a0f31684982d3f27ad0f4d27a4 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 2 Mar 2005 22:34:16 +0000 Subject: [PATCH] merge tabbed_chat_window and chat_window no need to restart gajim to take into account the use_tabbed_window option (already opened windows are not concerned for the moment) --- plugins/gtkgui/gtkgui.glade | 735 ++++++++++++++++++------------------ plugins/gtkgui/gtkgui.py | 565 ++++++++------------------- 2 files changed, 518 insertions(+), 782 deletions(-) diff --git a/plugins/gtkgui/gtkgui.glade b/plugins/gtkgui/gtkgui.glade index 4feab5779..b035dcd17 100644 --- a/plugins/gtkgui/gtkgui.glade +++ b/plugins/gtkgui/gtkgui.glade @@ -313,359 +313,6 @@ - - True - Chat - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 400 - 300 - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - - - - - - - 5 - True - False - 0 - - - - 5 - True - False - 5 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-justify-fill - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - History - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-clear - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Clear - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - gtk-no - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NONE - False - False - False - - - - True - gtk-dialog-authentication - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - 20 - True - - - - 0 - 0 - True - Click to see contact's information - True - Anonymous <id@server/res> - True - GTK_RELIEF_NONE - True - - - - 0 - 0 - - - - - 0 - True - True - - - - - 0 - False - True - - - - - - True - True - 170 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - False - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - True - True - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - True - True - - - - - 0 - True - True - - - - - - True Accounts @@ -8155,7 +7802,7 @@ Custom - + True Chat GTK_WINDOW_TOPLEVEL @@ -8164,39 +7811,383 @@ Custom 400 320 True - False + True True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST - - - + + + - + True False True GTK_POS_TOP False False - + - + + 5 True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 + False + 0 + + + + 5 + True + False + 5 + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-justify-fill + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + History + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-clear + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Clear + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + + True + gtk-no + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NONE + False + False + False + + + + True + gtk-dialog-authentication + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + 20 + True + + + + 0 + 0 + True + Click to see contact's information + True + Anonymous <id@server/res> + True + GTK_RELIEF_NONE + True + + + + 0 + 0 + + + + + 0 + True + True + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-close + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + False + True + + + + + + True + True + 170 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_WORD + False + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + True + True + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_WORD + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + True + True + + + + + 0 + True + True + + False @@ -8207,7 +8198,7 @@ Custom True - jid + False False GTK_JUSTIFY_LEFT diff --git a/plugins/gtkgui/gtkgui.py b/plugins/gtkgui/gtkgui.py index 0de948a13..9a50ed736 100644 --- a/plugins/gtkgui/gtkgui.py +++ b/plugins/gtkgui/gtkgui.py @@ -75,8 +75,6 @@ from config import * GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade' -USE_TABBED_CHAT = 0 - class ImageCellRenderer(gtk.GenericCellRenderer): __gproperties__ = { @@ -98,7 +96,8 @@ class ImageCellRenderer(gtk.GenericCellRenderer): if model.get_value(iter, 0) == image: self.redraw = 1 cell_area = tree.get_cell_area(path, tree.get_column(0)) - tree.queue_draw_area(cell_area.x, cell_area.y, cell_area.width, cell_area.height) + tree.queue_draw_area(cell_area.x, cell_area.y, cell_area.width, \ + cell_area.height) def animation_timeout(self, tree, image): if image.get_storage_type() == gtk.IMAGE_ANIMATION: @@ -107,14 +106,16 @@ class ImageCellRenderer(gtk.GenericCellRenderer): model = tree.get_model() model.foreach(self.func, (image, tree)) if self.redraw: - gobject.timeout_add(image.get_data('iter').get_delay_time(), self.animation_timeout, tree, image) + gobject.timeout_add(image.get_data('iter').get_delay_time(), \ + self.animation_timeout, tree, image) else: image.set_data('iter', None) def on_render(self, window, widget, background_area,cell_area, \ expose_area, flags): pix_rect = gtk.gdk.Rectangle() - pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height = self.on_get_size(widget, cell_area) + pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height = \ + self.on_get_size(widget, cell_area) pix_rect.x += cell_area.x pix_rect.y += cell_area.y @@ -128,7 +129,8 @@ class ImageCellRenderer(gtk.GenericCellRenderer): if not self.image.get_data('iter'): animation = self.image.get_animation() self.image.set_data('iter', animation.get_iter()) - gobject.timeout_add(self.image.get_data('iter').get_delay_time(), self.animation_timeout, widget, self.image) + gobject.timeout_add(self.image.get_data('iter').get_delay_time(), \ + self.animation_timeout, widget, self.image) pix = self.image.get_data('iter').get_pixbuf() elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: @@ -155,8 +157,10 @@ class ImageCellRenderer(gtk.GenericCellRenderer): x_offset = 0 y_offset = 0 if cell_area and pixbuf_width > 0 and pixbuf_height > 0: - x_offset = self.get_property("xalign") * (cell_area.width - calc_width - self.get_property("xpad")) - y_offset = self.get_property("yalign") * (cell_area.height - calc_height - self.get_property("ypad")) + x_offset = self.get_property("xalign") * (cell_area.width - \ + calc_width - self.get_property("xpad")) + y_offset = self.get_property("yalign") * (cell_area.height - \ + calc_height - self.get_property("ypad")) return x_offset, y_offset, calc_width, calc_height gobject.type_register(ImageCellRenderer) @@ -192,25 +196,31 @@ class User: class tabbed_chat_window: """Class for tabbed chat window""" def __init__(self, user, plugin, account): - self.xml = gtk.glade.XML(GTKGUI_GLADE, 'tabbed_chat', APP) - self.xml.get_widget('notebook').remove_page(0) + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'tabbed_chat_window', APP) + self.chat_notebook = self.xml.get_widget('chat_notebook') + self.chat_notebook.remove_page(0) self.plugin = plugin self.account = account - self.widgets = {} + self.xmls = {} self.tagIn = {} self.tagOut = {} self.tagStatus = {} - self.users = {user.jid: user} - self.nb_unread = {user.jid: 0} - self.window = self.xml.get_widget('tabbed_chat') + self.users = {} + self.nb_unread = {} + self.window = self.xml.get_widget('tabbed_chat_window') self.new_user(user) self.show_title() - self.xml.signal_connect('gtk_widget_destroy', self.delete_event) - self.xml.signal_connect('on_focus', self.on_focus) - self.xml.signal_connect('on_chat_key_press_event', \ - self.on_chat_key_press_event) - self.xml.signal_connect('on_notebook_switch_page', \ - self.on_notebook_switch_page) + self.xml.signal_connect('on_tabbed_chat_window_destroy', \ + self.on_tabbed_chat_window_destroy) + self.xml.signal_connect('on_tabbed_chat_window_focus_in_event', \ + self.on_tabbed_chat_window_focus_in_event) + self.xml.signal_connect('on_tabbed_chat_window_key_press_event', \ + self.on_tabbed_chat_window_key_press_event) + self.xml.signal_connect('on_chat_notebook_switch_page', \ + self.on_chat_notebook_switch_page) + #TODO +# if use_tab: +# plugin.windows[account]['chats']['tabbed'] = self def update_tags(self): for jid in self.tagIn: @@ -222,6 +232,7 @@ class tabbed_chat_window: self.plugin.config['statusmsgcolor']) def show_title(self): + """redraw the window's title""" unread = 0 for jid in self.nb_unread: unread += self.nb_unread[jid] @@ -233,68 +244,73 @@ class tabbed_chat_window: self.window.set_title(start + "Chat (" + self.account + ")") def draw_widgets(self, user): - widget_img = self.widgets[user.jid]['image_status'] + """draw the widgets in a tab (status_image, contact_button ...) + according to the the information in the user variable""" + jid = user.jid + status_image = self.xmls[jid].get_widget('status_image') image = self.plugin.roster.pixbufs[user.show] if image.get_storage_type() == gtk.IMAGE_ANIMATION: - widget_img.set_from_animation(image.get_animation()) + status_image.set_from_animation(image.get_animation()) elif image.get_storage_type() == gtk.IMAGE_PIXBUF: - widget_img.set_from_pixbuf(image.get_pixbuf()) - self.widgets[user.jid]['button_contact'].set_label(\ - user.name + ' <' + user.jid + '>') + status_image.set_from_pixbuf(image.get_pixbuf()) + contact_button = self.xmls[jid].get_widget('contact_button') + contact_button.set_label(user.name + ' <' + jid + '>') if not user.keyID: - self.widgets[user.jid]['toggle_gpg'].set_sensitive(False) + self.xmls[jid].get_widget('gpg_togglebutton').set_sensitive(False) def redraw_tab(self, jid): + """redraw the label of the tab""" start = '' if self.nb_unread[jid] > 1: start = "[" + str(self.nb_unread[jid]) + "] " elif self.nb_unread[jid] == 1: start = "* " - nb = self.xml.get_widget("notebook") - child = self.widgets[jid]['vbox_tab'] - nb.set_tab_label_text(child, start + self.users[jid].name) + child = self.xmls[jid].get_widget('chat_vbox') + self.chat_notebook.set_tab_label_text(child, start + self.users[jid].name) def set_image(self, image, jid): if image.get_storage_type() == gtk.IMAGE_ANIMATION: - self.widgets[jid]['image_status'].\ + self.xmls[jid].get_widget('status_image').\ set_from_animation(image.get_animation()) elif image.get_storage_type() == gtk.IMAGE_PIXBUF: - self.widgets[jid]['image_status'].\ + self.xmls[jid].get_widget('status_image').\ set_from_pixbuf(image.get_pixbuf()) - def delete_event(self, widget): + def on_tabbed_chat_window_destroy(self, widget): """close window""" #clean self.plugin.windows[self.account]['chats'] for jid in self.users: del self.plugin.windows[self.account]['chats'][jid] - del self.plugin.windows[self.account]['chats']['tabbed'] + if self.plugin.windows[self.account]['chats'].has_key('tabbed'): + del self.plugin.windows[self.account]['chats']['tabbed'] def get_active_jid(self): - nb = self.xml.get_widget("notebook") - child = nb.get_nth_page(nb.get_current_page()) - jid = '' - for j in self.widgets: - c = self.widgets[j]['vbox_tab'] - if c == child: - jid = j + active_child = self.chat_notebook.get_nth_page(\ + self.chat_notebook.get_current_page()) + active_jid = '' + for jid in self.xmls: + child = self.xmls[jid].get_widget('chat_vbox') + if child == active_child: + active_jid = jid break - return jid + return active_jid - def on_clear(self, widget): + def on_clear_button_clicked(self, widget): """When clear button is pressed : clear the conversation""" jid = self.get_active_jid() - buffer = self.widgets[jid]['conversation'].get_buffer() - deb, end = buffer.get_bounds() - buffer.delete(deb, end) + conversation_buffer = self.xmls[jid].get_widget('conversation_textview').\ + get_buffer() + deb, end = conversation_buffer.get_bounds() + conversation_buffer.delete(deb, end) - def on_close_clicked(self, button): + def on_close_button_clicked(self, button): """When close button is pressed : close a tab""" jid = self.get_active_jid() self.remove_tab(jid) - def on_focus(self, widget, event): + def on_tabbed_chat_window_focus_in_event(self, widget, event): """When window get focus""" jid = self.get_active_jid() if self.nb_unread[jid] > 0: @@ -303,140 +319,74 @@ class tabbed_chat_window: self.show_title() self.plugin.systray.remove_jid(jid, self.account) - def on_history(self, widget): - """When history button is pressed : call log window""" + def on_history_button_clicked(self, widget): + """When history button is pressed : call history window""" jid = self.get_active_jid() if not self.plugin.windows['logs'].has_key(jid): self.plugin.windows['logs'][jid] = history_window(self.plugin, jid) - def on_notebook_switch_page(self, nb, page, page_num): - child = nb.get_nth_page(page_num) - jid = '' - for j in self.widgets: - c = self.widgets[j]['vbox_tab'] - if c == child: - jid = j + def on_chat_notebook_switch_page(self, notebook, page, page_num): + new_child = notebook.get_nth_page(page_num) + new_jid = '' + for jid in self.xmls: + child = self.xmls[jid].get_widget('chat_vbox') + if child == new_child: + new_jid = jid break - if self.nb_unread[jid] > 0: - self.nb_unread[jid] = 0 - self.redraw_tab(jid) + if self.nb_unread[new_jid] > 0: + self.nb_unread[new_jid] = 0 + self.redraw_tab(new_jid) self.show_title() - self.plugin.systray.remove_jid(jid, self.account) + self.plugin.systray.remove_jid(new_jid, self.account) def active_tab(self, jid): - child = self.widgets[jid]['vbox_tab'] - nb = self.xml.get_widget("notebook") - nb.set_current_page(nb.page_num(child)) - self.widgets[jid]['message'].grab_focus() + child = self.xmls[jid].get_widget('chat_vbox') + self.chat_notebook.set_current_page(\ + self.chat_notebook.page_num(child)) + self.xmls[jid].get_widget('message_textview').grab_focus() def remove_tab(self, jid): - if len(self.widgets) == 1: + if len(self.xmls) == 1: self.window.destroy() else: - nb = self.xml.get_widget('notebook') - nb.remove_page(nb.get_current_page()) + self.chat_notebook.remove_page(\ + self.chat_notebook.get_current_page()) del self.plugin.windows[self.account]['chats'][jid] del self.users[jid] del self.nb_unread[jid] - del self.widgets[jid] + del self.xmls[jid] del self.tagIn[jid] del self.tagOut[jid] del self.tagStatus[jid] - if len(self.widgets) == 1: - nb.set_show_tabs(False) + if len(self.xmls) == 1: + self.chat_notebook.set_show_tabs(False) def new_user(self, user): self.nb_unread[user.jid] = 0 self.users[user.jid] = user - - self.widgets[user.jid] = {} - vb = gtk.VBox() - vb.set_border_width(5) - self.widgets[user.jid]['vbox_tab'] = vb - hb = gtk.HBox(spacing=5) - hb.set_border_width(5) - vb.pack_start(hb, expand=False) + self.xmls[user.jid] = gtk.glade.XML(GTKGUI_GLADE, 'chat_vbox', APP) - button = gtk.Button(stock=gtk.STOCK_JUSTIFY_FILL) - button.get_children()[0].get_children()[0].get_children()[1].set_text("History") - button.connect("clicked", self.on_history) - hb.pack_start(button, expand=False, fill=False) - - button = gtk.Button(stock=gtk.STOCK_CLEAR) - button.connect("clicked", self.on_clear) - hb.pack_start(button, expand=False, fill=False) - - img = gtk.Image() - hb.pack_start(img, expand=False, fill=False) - self.widgets[user.jid]['image_status'] = img - - img = gtk.Image() - img.set_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_BUTTON) - button = gtk.ToggleButton() - button.add(img) - button.set_relief(gtk.RELIEF_NONE) - hb.pack_start(button, expand=False, fill=False) - self.widgets[user.jid]['toggle_gpg'] = button - - fixed = gtk.Fixed() - fixed.set_size_request(20, -1) - hb.pack_start(fixed) - button = gtk.Button("Anonymous") - button.set_relief(gtk.RELIEF_NONE) - button.connect("clicked", self.on_button_contact_clicked) - button.set_use_underline(False) - fixed.put(button, 0, 0) - self.widgets[user.jid]['button_contact'] = button - - img = gtk.Image() - img.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_BUTTON) - button = gtk.Button() - button.add(img) - button.connect("clicked", self.on_close_clicked) - hb.pack_start(button, expand=False, fill=False) - - vp = gtk.VPaned() - vb.pack_start(vp) - vp.set_position(170) - - sw = gtk.ScrolledWindow() - sw.set_shadow_type(gtk.SHADOW_IN) - vp.add1(sw) - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - tv = gtk.TextView() - tv.set_wrap_mode(gtk.WRAP_WORD) - tv.set_editable(False) - tv.set_cursor_visible(False) - sw.add(tv) - self.widgets[user.jid]['conversation'] = tv - buffer = tv.get_buffer() - end_iter = buffer.get_end_iter() - buffer.create_mark('end', end_iter, 0) - self.tagIn[user.jid] = buffer.create_tag("incoming") + conversation_textview = \ + self.xmls[user.jid].get_widget('conversation_textview') + conversation_buffer = conversation_textview.get_buffer() + end_iter = conversation_buffer.get_end_iter() + conversation_buffer.create_mark('end', end_iter, 0) + self.tagIn[user.jid] = conversation_buffer.create_tag('incoming') color = self.plugin.config['inmsgcolor'] - self.tagIn[user.jid].set_property("foreground", color) - self.tagOut[user.jid] = buffer.create_tag("outgoing") + self.tagIn[user.jid].set_property('foreground', color) + self.tagOut[user.jid] = conversation_buffer.create_tag('outgoing') color = self.plugin.config['outmsgcolor'] - self.tagOut[user.jid].set_property("foreground", color) - self.tagStatus[user.jid] = buffer.create_tag("status") + self.tagOut[user.jid].set_property('foreground', color) + self.tagStatus[user.jid] = conversation_buffer.create_tag('status') color = self.plugin.config['statusmsgcolor'] - self.tagStatus[user.jid].set_property("foreground", color) + self.tagStatus[user.jid].set_property('foreground', color) - sw = gtk.ScrolledWindow() - sw.set_shadow_type(gtk.SHADOW_IN) - vp.add2(sw) - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - tv = gtk.TextView() - tv.set_wrap_mode(gtk.WRAP_WORD) - sw.add(tv) - self.widgets[user.jid]['message'] = tv - tv.connect('key_press_event', self.on_msg_key_press_event) - - vb.show_all() - nb = self.xml.get_widget("notebook") - nb.append_page(vb) - if len(self.widgets) > 1: - nb.set_show_tabs(True) + self.xmls[user.jid].signal_autoconnect(self) + + self.chat_notebook.append_page(self.xmls[user.jid].\ + get_widget('chat_vbox')) + if len(self.xmls) > 1: + self.chat_notebook.set_show_tabs(True) self.redraw_tab(user.jid) self.draw_widgets(user) @@ -448,53 +398,53 @@ class tabbed_chat_window: self.print_conversation(_("%s is now %s (%s)") % (user.name, \ user.show, user.status), user.jid, 'status') - def on_msg_key_press_event(self, widget, event): + def on_message_textview_key_press_event(self, widget, event): """When a key is pressed : if enter is pressed without the shit key, message (if not empty) is sent and printed in the conversation""" if event.keyval == gtk.keysyms.Return: if (event.state & gtk.gdk.SHIFT_MASK): return 0 - txt_buffer = widget.get_buffer() - start_iter = txt_buffer.get_start_iter() - end_iter = txt_buffer.get_end_iter() - txt = txt_buffer.get_text(start_iter, end_iter, 0) - if txt != '': + message_buffer = widget.get_buffer() + start_iter = message_buffer.get_start_iter() + end_iter = message_buffer.get_end_iter() + message = message_buffer.get_text(start_iter, end_iter, 0) + if message != '': keyID = '' jid = self.get_active_jid() - if self.widgets[jid]['toggle_gpg'].get_active(): + if self.xmls[jid].get_widget('gpg_togglebutton').get_active(): keyID = self.users[jid].keyID - self.plugin.send('MSG', self.account, (jid, txt, keyID)) - txt_buffer.set_text('', -1) - self.print_conversation(txt, jid, jid) + self.plugin.send('MSG', self.account, (jid, message, keyID)) + message_buffer.set_text('', -1) + self.print_conversation(message, jid, jid) return 1 return 0 - def on_chat_key_press_event(self, widget, event): - nb = self.xml.get_widget("notebook") + def on_tabbed_chat_window_key_press_event(self, widget, event): st = "1234567890" if event.keyval == gtk.keysyms.Escape: jid = self.get_active_jid() self.remove_tab(jid) elif event.string and event.string in st \ and (event.state & gtk.gdk.MOD1_MASK): - nb.set_current_page(st.index(event.string)) + self.chat_notebook.set_current_page(st.index(event.string)) elif event.keyval == gtk.keysyms.Page_Down and \ (event.state & gtk.gdk.CONTROL_MASK): - current = nb.get_current_page() + current = self.chat_notebook.get_current_page() if current > 0: - nb.set_current_page(current-1) + self.chat_notebook.set_current_page(current-1) else: - nb.set_current_page(nb.get_n_pages()-1) + self.chat_notebook.set_current_page(\ + self.chat_notebook.get_n_pages()-1) elif event.keyval == gtk.keysyms.Page_Up and \ (event.state & gtk.gdk.CONTROL_MASK): - current = nb.get_current_page() - if current < (nb.get_n_pages()-1): - nb.set_current_page(current+1) + current = self.chat_notebook.get_current_page() + if current < (self.chat_notebook.get_n_pages()-1): + self.chat_notebook.set_current_page(current+1) else: - nb.set_current_page(0) + self.chat_notebook.set_current_page(0) - def on_button_contact_clicked(self, widget): + def on_contact_button_clicked(self, widget): """When button contact is clicked""" jid = self.get_active_jid() user = self.users[jid] @@ -505,8 +455,8 @@ class tabbed_chat_window: jid = self.get_active_jid() user = self.users[jid] while not q.empty(): - evt = q.get() - self.print_conversation(evt[0], jid, tim = evt[1]) + event = q.get() + self.print_conversation(event[0], jid, tim = event[1]) self.plugin.roster.nb_unread -= 1 self.plugin.roster.show_title() del self.plugin.queues[self.account][jid] @@ -518,27 +468,27 @@ class tabbed_chat_window: if len(self.plugin.roster.contacts[self.account][jid]) == 1: self.plugin.roster.remove_user(user, self.account) - def print_conversation(self, txt, jid, contact = None, tim = None): + def print_conversation(self, text, jid, contact = None, tim = None): """Print a line in the conversation : if contact is set to status : it's a status message if contact is set to another value : it's an outgoing message if contact is not set : it's an incomming message""" user = self.users[jid] - conversation = self.widgets[jid]['conversation'] - buffer = conversation.get_buffer() - if not txt: - txt = "" - end_iter = buffer.get_end_iter() + conversation_textview = self.xmls[jid].get_widget('conversation_textview') + conversation_buffer = conversation_textview.get_buffer() + if not text: + text = "" + end_iter = conversation_buffer.get_end_iter() if not tim: tim = time.localtime() tims = time.strftime("[%H:%M:%S]", tim) - buffer.insert(end_iter, tims + ' ') + conversation_buffer.insert(end_iter, tims + ' ') - otxt = '' - ttxt = '' + otext = '' + ttext = '' if contact == 'status': tag = 'status' - ttxt = txt + '\n' + ttext = text + '\n' else: if contact: tag = 'outgoing' @@ -547,241 +497,39 @@ class tabbed_chat_window: tag = 'incoming' name = user.name - if string.find(txt, '/me ') == 0: - ttxt = name + ' ' + txt[4:] + '\n' + if string.find(text, '/me ') == 0: + ttext = name + ' ' + text[4:] + '\n' else: - ttxt = '<' + name + '> ' - otxt = txt + '\n' + ttext = '<' + name + '> ' + otext = text + '\n' - buffer.insert_with_tags_by_name(end_iter, ttxt, tag) - if len(otxt) > 0: + conversation_buffer.insert_with_tags_by_name(end_iter, ttext, tag) + if len(otext) > 0: beg = 0 if self.plugin.config['useemoticons']: index = 0 - while index < len(otxt): - if otxt[index] in self.plugin.roster.begin_emot: + while index < len(otext): + if otext[index] in self.plugin.roster.begin_emot: for s in self.plugin.roster.emoticons: l = len(s) - if s == otxt[index:index+l]: - buffer.insert(end_iter, otxt[beg:index]) - buffer.insert_pixbuf(end_iter, \ + if s == otext[index:index+l]: + conversation_buffer.insert(end_iter, otext[beg:index]) + conversation_buffer.insert_pixbuf(end_iter, \ self.plugin.roster.emoticons[s]) index+=l beg = index index+=1 - buffer.insert(end_iter, otxt[beg:]) + conversation_buffer.insert(end_iter, otext[beg:]) #scroll to the end of the textview - conversation.scroll_to_mark(buffer.get_mark('end'), 0.1, 0, 0, 0) + conversation_textview.scroll_to_mark(conversation_buffer.get_mark('end'),\ + 0.1, 0, 0, 0) if (jid != self.get_active_jid() or not self.window.is_active()) and \ contact != 'status': self.nb_unread[jid] += 1 self.redraw_tab(jid) self.show_title() - -class chat_window: - """Class for chat window""" - def delete_event(self, widget): - """close window""" - del self.plugin.windows[self.account]['chats'][self.user.jid] - - def print_conversation(self, txt, jid, contact = None, tim = None): - """Print a line in the conversation : - if contact is set to status : it's a status message - if contact is set to another value : it's an outgoing message - if contact is not set : it's an incomming message""" - conversation_textview = self.xml.get_widget('conversation_textview') - conversation_buffer = conversation_textview.get_buffer() - if not txt: - txt = "" - end_iter = conversation_buffer.get_end_iter() - if not tim: - tim = time.localtime() - tims = time.strftime("[%H:%M:%S]", tim) - conversation_buffer.insert(end_iter, tims + ' ') - - otxt = '' - ttxt = '' - if contact and contact == 'status': - tag = 'status' - ttxt = txt + '\n' - else: - if contact: - tag = 'outgoing' - name = self.plugin.nicks[self.account] - else: - tag = 'incoming' - name = self.user.name - - if string.find(txt, '/me ') == 0: - ttxt = name + ' ' + txt[4:] + '\n' - else: - ttxt = '<' + name + '> ' - otxt = txt + '\n' - - conversation_buffer.insert_with_tags_by_name(end_iter, ttxt, tag) - if len(otxt) > 0: - beg = 0 - if self.plugin.config['useemoticons']: - index = 0 - while index < len(otxt): - if otxt[index] in self.plugin.roster.begin_emot: - for s in self.plugin.roster.emoticons: - l = len(s) - if s == otxt[index:index+l]: - conversation_buffer.insert(end_iter, otxt[beg:index]) - conversation_buffer.insert_pixbuf(end_iter, self.plugin.roster.emoticons[s]) - index+=l - beg = index - index+=1 - conversation_buffer.insert(end_iter, otxt[beg:]) - - #scroll to the end of the textview - conversation_textview.scroll_to_mark(conversation_buffer.get_mark('end'),\ - 0.1, 0, 0, 0) - if not self.window.is_active() and contact != 'status': - self.nb_unread += 1 - self.show_title() - - def show_title(self): - start = "" - if self.nb_unread > 1: - start = "[" + str(self.nb_unread) + "] " - elif self.nb_unread == 1: - start = "* " - self.window.set_title(start + self.user.name + " (" + self.account + ")") - - def update_tags(self): - self.tagIn.set_property("foreground", self.plugin.config['inmsgcolor']) - self.tagOut.set_property("foreground", self.plugin.config['outmsgcolor']) - self.tagStatus.set_property("foreground", \ - self.plugin.config['statusmsgcolor']) - - def set_image(self, image, jid): - if image.get_storage_type() == gtk.IMAGE_ANIMATION: - self.status_image.set_from_animation(image.get_animation()) - elif image.get_storage_type() == gtk.IMAGE_PIXBUF: - self.status_image.set_from_pixbuf(image.get_pixbuf()) - - def read_queue(self, q): - """read queue and print messages containted in it""" - while not q.empty(): - evt = q.get() - self.print_conversation(evt[0], self.user.jid, tim = evt[1]) - self.plugin.roster.nb_unread -= 1 - self.plugin.roster.show_title() - del self.plugin.queues[self.account][self.user.jid] - self.plugin.roster.redraw_jid(self.user.jid, self.account) - self.plugin.systray.remove_jid(self.user.jid, self.account) - showOffline = self.plugin.config['showoffline'] - if (self.user.show == 'offline' or self.user.show == 'error') and \ - not showOffline: - if len(self.plugin.roster.contacts[self.account][self.user.jid]) == 1: - self.plugin.roster.remove_user(self.user, self.account) - - def on_chat_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: - widget.get_toplevel().destroy() - - def on_msg_key_press_event(self, widget, event): - """When a key is pressed : - if enter is pressed without the shit key, message (if not empty) is sent - and printed in the conversation""" - if event.keyval == gtk.keysyms.Return: - if (event.state & gtk.gdk.SHIFT_MASK): - return 0 - message_buffer = widget.get_buffer() - start_iter = message_buffer.get_start_iter() - end_iter = message_buffer.get_end_iter() - txt = message_buffer.get_text(start_iter, end_iter, 0) - if txt != '': - keyID = '' - if self.xml.get_widget('gpg_toggle_button').get_active(): - keyID = self.keyID - self.plugin.send('MSG', self.account, (self.user.jid, txt, keyID)) - message_buffer.set_text('', -1) - self.print_conversation(txt, self.user.jid, self.user.jid) - widget.grab_focus() - return 1 - return 0 - - def on_clear(self, widget): - """When clear button is pressed : - clear the conversation""" - conversation_buffer = self.xml.get_widget('conversation_textview').\ - get_buffer() - deb, end = conversation_buffer.get_bounds() - conversation_buffer.delete(deb, end) - - def on_history(self, widget): - """When history button is pressed : call log window""" - if not self.plugin.windows['logs'].has_key(self.user.jid): - self.plugin.windows['logs'][self.user.jid] = history_window(self.plugin, self.user.jid) - - def on_focus(self, widget, event): - """When window get focus""" - self.plugin.systray.remove_jid(self.user.jid, self.account) - if self.nb_unread > 0: - self.nb_unread = 0 - self.show_title() - - def on_button_contact_clicked(self, widget): - """When button contact is clicked""" - self.plugin.roster.on_info(widget, self.user, self.account) - - def __init__(self, user, plugin, account): - self.user = user - self.plugin = plugin - self.account = account - self.keyID = self.user.keyID - self.nb_unread = 0 - self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Chat', APP) - self.window = self.xml.get_widget('Chat') - self.show_title() - self.status_image = self.xml.get_widget('status_image') - image = self.plugin.roster.pixbufs[user.show] - if image.get_storage_type() == gtk.IMAGE_ANIMATION: - self.status_image.set_from_animation(image.get_animation()) - elif image.get_storage_type() == gtk.IMAGE_PIXBUF: - self.status_image.set_from_pixbuf(image.get_pixbuf()) - contact_button = self.xml.get_widget('contact_button') - contact_button.set_label(user.name + ' <' + user.jid + '>') - if not self.keyID: - self.xml.get_widget('gpg_toggle_button').set_sensitive(False) - message_textview = self.xml.get_widget('message_textview') - message_textview.grab_focus() - conversation_textview = self.xml.get_widget('conversation_textview') - conversation_buffer = conversation_textview.get_buffer() - end_iter = conversation_buffer.get_end_iter() - conversation_buffer.create_mark('end', end_iter, 0) - self.xml.signal_connect('gtk_widget_destroy', self.delete_event) - self.xml.signal_connect('on_clear_clicked', self.on_clear) - self.xml.signal_connect('on_button_contact_clicked', \ - self.on_button_contact_clicked) - self.xml.get_widget('button_contact').set_use_underline(False) - self.xml.signal_connect('on_focus', self.on_focus) - self.xml.signal_connect('on_history_clicked', self.on_history) - self.xml.signal_connect('on_msg_key_press_event', \ - self.on_msg_key_press_event) - self.xml.signal_connect('on_chat_key_press_event', \ - self.on_chat_key_press_event) - self.tagIn = conversation_buffer.create_tag("incoming") - color = self.plugin.config['inmsgcolor'] - self.tagIn.set_property("foreground", color) - self.tagOut = conversation_buffer.create_tag("outgoing") - color = self.plugin.config['outmsgcolor'] - self.tagOut.set_property("foreground", color) - self.tagStatus = conversation_buffer.create_tag("status") - color = self.plugin.config['statusmsgcolor'] - self.tagStatus.set_property("foreground", color) - #print queued messages - if plugin.queues[account].has_key(user.jid): - self.read_queue(plugin.queues[account][user.jid]) - if self.user.show != 'online': - self.print_conversation(_("%s is now %s (%s)") % (user.name, \ - user.show, user.status), user.jid, 'status') - class gc: def delete_event(self, widget): """close window""" @@ -1952,7 +1700,7 @@ class roster_window: self.set_cb() def new_chat(self, user, account): - if USE_TABBED_CHAT: + if self.plugin.config['usetabbedchat']: if not self.plugin.windows[account]['chats'].has_key('tabbed'): self.plugin.windows[account]['chats']['tabbed'] = \ tabbed_chat_window(user, self.plugin, account) @@ -1963,7 +1711,7 @@ class roster_window: self.plugin.windows[account]['chats']['tabbed'].window.present() else: self.plugin.windows[account]['chats'][user.jid] = \ - chat_window(user, self.plugin, account) + tabbed_chat_window(user, self.plugin, account) def on_message(self, jid, msg, tim, account): """when we receive a message""" @@ -2098,12 +1846,12 @@ class roster_window: self.tree.expand_row(path, False) else: if self.plugin.windows[account]['chats'].has_key(jid): - if USE_TABBED_CHAT: + if self.plugin.config['usetabbedchat']: self.plugin.windows[account]['chats'][jid].active_tab(jid) self.plugin.windows[account]['chats'][jid].window.present() elif self.contacts[account].has_key(jid): self.new_chat(self.contacts[account][jid][0], account) - self.plugin.windows[account]['chats']['tabbed'].active_tab(jid) + self.plugin.windows[account]['chats'][jid].active_tab(jid) def on_roster_treeview_row_expanded(self, widget, iter, path): """When a row is expanded : @@ -3149,9 +2897,6 @@ class plugin: break if pix: gtk.window_set_default_icon(pix) - if self.config['usetabbedchat']: - global USE_TABBED_CHAT - USE_TABBED_CHAT = 1 self.roster = roster_window(self) gtk.timeout_add(100, self.read_queue) gtk.timeout_add(100, self.read_sleepy)