From 008dfea48b1ef890a66216138e77101ecb5a1e96 Mon Sep 17 00:00:00 2001 From: Travis Shirk Date: Sat, 31 Dec 2005 07:19:43 +0000 Subject: [PATCH] More menus, compact mode, etc. --- src/chat.py | 1 - src/chat_control.py | 127 +++++++++++++++++++++++++++++++++++++- src/gtkgui.glade | 10 +-- src/message_window.py | 21 +++++-- src/roster_window.py | 26 ++++---- src/tabbed_chat_window.py | 4 +- 6 files changed, 159 insertions(+), 30 deletions(-) diff --git a/src/chat.py b/src/chat.py index c8b490144..40725418e 100644 --- a/src/chat.py +++ b/src/chat.py @@ -1094,7 +1094,6 @@ class Chat: def set_compact_view(self, state): '''Toggle compact view. state is bool''' - self.compact_view_current_state = state for jid in self.xmls: if self.widget_name == 'tabbed_chat_window': diff --git a/src/chat_control.py b/src/chat_control.py index 92abc273b..7d20a67ff 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -22,10 +22,17 @@ import gtkgui_helpers import message_window from common import gajim +from common import helpers from message_window import MessageControl from conversation_textview import ConversationTextview from message_textview import MessageTextView +try: + import gtkspell + HAS_GTK_SPELL = True +except: + HAS_GTK_SPELL = False + #################### # FIXME: Can't this stuff happen once? from common import i18n @@ -97,6 +104,15 @@ class ChatControlBase(MessageControl): img.set_from_file(os.path.join(gajim.DATA_DIR, 'emoticons', 'smile.png')) self.toggle_emoticons() + # Attach speller + if gajim.config.get('use_speller') and HAS_GTK_SPELL: + try: + gtkspell.Spell(self.msg_textview) + except gobject.GError, msg: + #FIXME: add a ui for this use spell.set_language() + dialogs.ErrorDialog(unicode(msg), _('If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n\nHighlighting misspelled words feature will not be used')).get_response() + gajim.config.set('use_speller', False) + def _paint_banner(self): '''Repaint banner with theme color''' theme = gajim.config.get('roster_theme') @@ -209,8 +225,7 @@ class ChatControlBase(MessageControl): self.clear(self.msg_textview) # clear message textview too return True elif message == '/compact': - # FIXME: Need this function - self.set_compact_view(not self.compact_view_current_state) + self.set_compact_view(not self.compact_view_current) # FIXME: Need this function self.clear(self.msg_textview) return True @@ -325,6 +340,15 @@ class ChatControlBase(MessageControl): self.button_clicked = widget self.emoticons_menu.popup(None, None, self.position_menu_under_button, 1, 0) + def on_actions_button_clicked(self, widget): + '''popup action menu''' + #FIXME: BUG http://bugs.gnome.org/show_bug.cgi?id=316786 + self.button_clicked = widget + + menu = self.prepare_context_menu() + menu.show_all() + menu.popup(None, None, self.position_menu_under_button, 1, 0) + def update_font(self): font = pango.FontDescription(gajim.config.get('conversation_font')) self.conv_textview.modify_font(font) @@ -333,18 +357,35 @@ class ChatControlBase(MessageControl): def update_tags(self): self.conv_textview.update_tags() + def set_compact_view(self, state): + '''Toggle compact view. state is bool''' + MessageControl.set_compact_view(self, state) + + # make the last message visible, when changing to "full view" + if not state: + gobject.idle_add(self.conv_textview.scroll_to_end_iter) + + def clear(self, tv): + buffer = tv.get_buffer() + start, end = buffer.get_bounds() + buffer.delete(start, end) class ChatControl(ChatControlBase): '''A control for standard 1-1 chat''' def __init__(self, parent_win, contact, acct): ChatControlBase.__init__(self, parent_win, 'chat_child_vbox', _('Chat'), contact, acct); - self.compact_view = gajim.config.get('always_compact_view_chat') + self.compact_view_always = gajim.config.get('always_compact_view_chat') + self.set_compact_view(self.compact_view_always) # chatstate timers and state self._schedule_activity_timers() self.reset_kbd_mouse_timeout_vars() + xm = gtk.glade.XML(GTKGUI_GLADE, 'chat_control_popup_menu', APP) + xm.signal_autoconnect(self) + self.popup_menu = xm.get_widget('chat_control_popup_menu') + def _schedule_activity_timers(self): self.possible_paused_timeout_id = gobject.timeout_add(5000, self.check_for_possible_paused_chatstate, None) @@ -634,3 +675,83 @@ class ChatControl(ChatControlBase): if num_unread: # if unread, text in the label becomes bold label_str = '' + unread + label_str + '' return (label_str, color) + + + def remove_possible_switch_to_menuitems(self, menu): + ''' remove duplicate 'Switch to' if they exist and return clean menu''' + childs = menu.get_children() + + contact = self.parent_win.get_active_contact() + jid = contact.jid + if _('not in the roster') in contact.groups: # for add_to_roster_menuitem + childs[5].show() + childs[5].set_no_show_all(False) + else: + childs[5].hide() + childs[5].set_no_show_all(True) + start_removing_from = 6 # this is from the seperator and after + +# FIXME: GC only +# elif : +# start_removing_from = 7 # # this is from the seperator and after + + for child in childs[start_removing_from:]: + menu.remove(child) + return menu + + def prepare_context_menu(self): + '''sets compact view menuitem active state + sets active and sensitivity state for toggle_gpg_menuitem + and remove possible 'Switch to' menuitems''' +# FIXME: GC only +# if self.widget_name == 'groupchat_window': +# menu = self.gc_popup_menu +# childs = menu.get_children() +# # compact_view_menuitem +# childs[5].set_active(self.compact_view_current) + menu = self.popup_menu + childs = menu.get_children() + # check if gpg capabitlies or else make gpg toggle insensitive + contact = self.parent_win.get_active_contact() + jid = contact.jid + gpg_btn = self.xml.get_widget('gpg_togglebutton') + isactive = gpg_btn.get_active() + issensitive = gpg_btn.get_property('sensitive') + childs[3].set_active(isactive) + childs[3].set_property('sensitive', issensitive) + # If we don't have resource, we can't do file transfert + if not contact.resource: + childs[2].set_sensitive(False) + else: + childs[2].set_sensitive(True) + # compact_view_menuitem + childs[4].set_active(self.compact_view_current) + menu = self.remove_possible_switch_to_menuitems(menu) + + return menu + + def set_compact_view(self, state): + '''Toggle compact view. state is bool''' + ChatControlBase.set_compact_view(self, state) + + widgets = [ + self.xml.get_widget('banner_eventbox'), + self.xml.get_widget('actions_hbox'), + ] +# FIXME GC only +# elif self.widget_name == 'groupchat_window': +# widgets = [self.xmls[jid].get_widget('banner_eventbox'), +# self.xmls[jid].get_widget('gc_actions_hbox'), +# self.xmls[jid].get_widget('list_scrolledwindow'), +# ] + for widget in widgets: + if state: + widget.set_no_show_all(True) + widget.hide() + else: + widget.set_no_show_all(False) + widget.show_all() + def on_compact_view_menuitem_activate(self, widget): + isactive = widget.get_active() + self.set_compact_view(isactive) + diff --git a/src/gtkgui.glade b/src/gtkgui.glade index 42191fbe0..bf6930382 100644 --- a/src/gtkgui.glade +++ b/src/gtkgui.glade @@ -16097,7 +16097,7 @@ Banner - + @@ -16210,7 +16210,7 @@ Banner - + @@ -19238,7 +19238,7 @@ Status message - + True False 0 @@ -19764,7 +19764,7 @@ Status message 3 - + - + 3 True False diff --git a/src/message_window.py b/src/message_window.py index 418229924..0019d3641 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -201,7 +201,7 @@ class MessageWindow: # TODO print "MessageWindow.remove_tab" - def redraw_tab(self, contact): + def redraw_tab(self, contact, chatstate = None): ctl = self._controls[contact.jid] ctl.update_state() @@ -217,8 +217,9 @@ class MessageWindow: close_button.hide() # Update nick - nickname.set_max_width_chars(10) - (tab_label_str, tab_label_color) = ctl.markup_tab_label(contact.name) + nick_label.set_max_width_chars(10) + (tab_label_str, tab_label_color) = ctl.markup_tab_label(contact.name, + chatstate) nick_label.set_markup(tab_label_str) if tab_label_color: nick_label.modify_fg(gtk.STATE_NORMAL, tab_label_color) @@ -349,7 +350,8 @@ class MessageControl(gtk.VBox): self.display_name = display_name self.contact = contact self.account = account - self.compact_view = False + self.compact_view_always = False + self.compact_view_current = False self.nb_unread = 0 self.xml = gtk.glade.XML(GTKGUI_GLADE, widget_name, APP) @@ -369,8 +371,15 @@ class MessageControl(gtk.VBox): pass # NOTE: Derived classes SHOULD implement this def update_tags(self): pass # NOTE: Derived classes SHOULD implement this - def markup_tab_label(self, label_str): - return label_str + def markup_tab_label(self, label_str, chatstate): + # NOTE: Derived classes SHOULD implement this + # Reurn a markup'd label and optional gtk.Color + return (label_str, None) + def prepare_context_menu(self): + # NOTE: Derived classes SHOULD implement this + return None + def set_compact_view(self, state): + self.compact_view_current = state def send_message(self, message, keyID = '', chatstate = None): '''Send the given message to the active tab''' diff --git a/src/roster_window.py b/src/roster_window.py index 77f2099fd..03e5d6dcd 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1654,20 +1654,20 @@ _('If "%s" accepts this request you will know his or her status.') %jid) chat_control = ChatControl(mw, contact, account) mw.new_tab(chat_control) - # REMOVE + # REMOVE: eliminate all usage of gajim.interface.instances[account]['chats'] ################################## - chats = gajim.interface.instances[account]['chats'] - if gajim.config.get('usetabbedchat'): - if not chats.has_key('tabbed'): - chats['tabbed'] = tabbed_chat_window.TabbedChatWindow(contact, - account) - else: - chats['tabbed'].new_tab(contact) - - chats[contact.jid] = chats['tabbed'] - else: - chats[contact.jid] = tabbed_chat_window.TabbedChatWindow(contact, - account) +# chats = gajim.interface.instances[account]['chats'] +# if gajim.config.get('usetabbedchat'): +# if not chats.has_key('tabbed'): +# chats['tabbed'] = tabbed_chat_window.TabbedChatWindow(contact, +# account) +# else: +# chats['tabbed'].new_tab(contact) +# +# chats[contact.jid] = chats['tabbed'] +# else: +# chats[contact.jid] = tabbed_chat_window.TabbedChatWindow(contact, +# account) ####################### def new_chat_from_jid(self, account, jid): diff --git a/src/tabbed_chat_window.py b/src/tabbed_chat_window.py index e3b6ef999..4faf68aeb 100644 --- a/src/tabbed_chat_window.py +++ b/src/tabbed_chat_window.py @@ -497,9 +497,9 @@ class TabbedChatWindow(chat.Chat): if contact.jid in gajim.encrypted_chats[self.account]: self.xmls[contact.jid].get_widget('gpg_togglebutton').set_active(True) - xm = gtk.glade.XML(GTKGUI_GLADE, 'tabbed_chat_popup_menu', APP) + xm = gtk.glade.XML(GTKGUI_GLADE, 'chat_control_popup_menu', APP) xm.signal_autoconnect(self) - self.tabbed_chat_popup_menu = xm.get_widget('tabbed_chat_popup_menu') + self.tabbed_chat_popup_menu = xm.get_widget('chat_control_popup_menu') self.redraw_tab(contact.jid) self.draw_widgets(contact)