diff --git a/src/chat.py b/src/chat.py index bb6a09d1a..96c2df194 100644 --- a/src/chat.py +++ b/src/chat.py @@ -1338,11 +1338,13 @@ class Chat: textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') # the backgrounds are colored by using an eventbox by # setting the bg color of the eventbox and the fg of the name_label - self.xmls[jid].get_widget('banner_eventbox').modify_bg( - gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) - banner_name_label = self.xmls[jid].get_widget('banner_name_label') - banner_name_label.modify_fg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(textcolor)) + if bgcolor: + self.xmls[jid].get_widget('banner_eventbox').modify_bg( + gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) + if textcolor: + banner_name_label = self.xmls[jid].get_widget('banner_name_label') + banner_name_label.modify_fg(gtk.STATE_NORMAL, + gtk.gdk.color_parse(textcolor)) def repaint_colored_widgets(self): """Repaint widgets (banner) in the window/tab with theme color""" diff --git a/src/common/config.py b/src/common/config.py index a74de341e..3237fc464 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -30,7 +30,7 @@ OPT_DESC = 2 opt_int = [ 'integer', 0 ] opt_str = [ 'string', 0 ] opt_bool = [ 'boolean', 0 ] -opt_color = [ 'color', '^#[0-9a-fA-F]{6}$' ] +opt_color = [ 'color', '^(#[0-9a-fA-F]{6})|()$' ] class Config: diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index df303c6b4..454b8f521 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -19,6 +19,8 @@ import gtk import gtk.glade +import gobject +import pango from config import mk_color_string from common import gajim @@ -39,24 +41,17 @@ class GajimThemesWindow: self.window = self.xml.get_widget('gajim_themes_window') self.plugin = plugin - self.xml.get_widget('banner_text_fontbutton').set_no_show_all(True) - - self.color_widgets = { - 'account_text_colorbutton': 'accounttextcolor', - 'group_text_colorbutton': 'grouptextcolor', - 'user_text_colorbutton': 'contacttextcolor', - 'banner_colorbutton': 'bannertextcolor', - 'account_text_bg_colorbutton': 'accountbgcolor', - 'group_text_bg_colorbutton': 'groupbgcolor', - 'user_text_bg_colorbutton': 'contactbgcolor', - 'banner_bg_colorbutton': 'bannerbgcolor', - } - self.font_widgets = { - 'account_text_fontbutton': 'accountfont', - 'group_text_fontbutton': 'groupfont', - 'user_text_fontbutton': 'contactfont', - } - + self.options = ['account', 'group', 'contact', 'banner', 'lastmessage'] + self.options_combobox = self.xml.get_widget('options_combobox') + self.textcolor_checkbutton = self.xml.get_widget('textcolor_checkbutton') + self.background_checkbutton = self.xml.get_widget('background_checkbutton') + self.textfont_checkbutton = self.xml.get_widget('textfont_checkbutton') + self.text_colorbutton = self.xml.get_widget('text_colorbutton') + self.background_colorbutton = self.xml.get_widget('background_colorbutton') + self.text_fontbutton = self.xml.get_widget('text_fontbutton') + self.bold_togglebutton = self.xml.get_widget('bold_togglebutton') + self.italic_togglebutton = self.xml.get_widget('italic_togglebutton') + self.underline_togglebutton = self.xml.get_widget('underline_togglebutton') self.themes_tree = self.xml.get_widget('themes_treeview') model = gtk.ListStore(str) self.themes_tree.set_model(model) @@ -67,11 +62,8 @@ class GajimThemesWindow: col.set_attributes(renderer, text = 0) renderer.connect('edited', self.on_theme_cell_edited) renderer.set_property('editable', True) - self.fill_themes_treeview() - - self.current_theme = gajim.config.get('roster_theme') - self.set_widgets(self.current_theme) + self.fill_themes_treeview() self.xml.signal_autoconnect(self) self.window.show_all() @@ -102,7 +94,7 @@ class GajimThemesWindow: def fill_themes_treeview(self): self.xml.get_widget('remove_button').set_sensitive(False) - self.xml.get_widget('fonts_colors_table').set_sensitive(False) + self.xml.get_widget('theme_options_vbox').set_sensitive(False) model = self.themes_tree.get_model() model.clear() for config_theme in gajim.config.get_per('themes'): @@ -111,17 +103,17 @@ class GajimThemesWindow: if gajim.config.get('roster_theme') == config_theme: self.themes_tree.get_selection().select_iter(iter) self.xml.get_widget('remove_button').set_sensitive(True) - self.xml.get_widget('fonts_colors_table').set_sensitive(True) + self.xml.get_widget('theme_options_vbox').set_sensitive(True) def on_themes_treeview_cursor_changed(self, widget): (model, iter) = self.themes_tree.get_selection().get_selected() if not iter: return self.xml.get_widget('remove_button').set_sensitive(True) - self.xml.get_widget('fonts_colors_table').set_sensitive(True) + self.xml.get_widget('theme_options_vbox').set_sensitive(True) self.current_theme = model.get_value(iter, 0).decode('utf-8') self.current_theme = self.current_theme.replace(' ', '_') - self.set_widgets(self.current_theme) + self.set_theme_options(self.current_theme) def on_add_button_clicked(self, widget): model = self.themes_tree.get_model() @@ -142,60 +134,96 @@ class GajimThemesWindow: gajim.config.del_per('themes', config_name) model.remove(iter) self.plugin.windows['preferences'].update_preferences_window() - - def set_widgets(self, theme): - for w in self.color_widgets: - widg = self.xml.get_widget(w) - widg.set_color(gtk.gdk.color_parse(gajim.config.get_per('themes', - theme, self.color_widgets[w]))) - for w in self.font_widgets: - widg = self.xml.get_widget(w) - widg.set_font_name(gajim.config.get_per('themes', theme, - self.font_widgets[w])) - def on_roster_widget_color_set(self, widget, option): - color = widget.get_color() - color_string = mk_color_string(color) - gajim.config.set_per('themes', self.current_theme, option, color_string) - self.plugin.roster.repaint_themed_widgets() + def set_theme_options(self, theme, option = 'account'): + self.options_combobox.set_active(self.options.index(option)) + textcolor = gajim.config.get_per('themes', theme, + option + 'textcolor') + if textcolor: + state = True + self.text_colorbutton.set_color(gtk.gdk.color_parse(textcolor)) + else: + state = False + self.textcolor_checkbutton.set_active(state) + self.text_colorbutton.set_sensitive(state) + bgcolor = gajim.config.get_per('themes', theme, + option + 'bgcolor') + if bgcolor: + state = True + self.background_colorbutton.set_color(gtk.gdk.color_parse( + bgcolor)) + else: + state = False + self.background_checkbutton.set_active(state) + self.background_colorbutton.set_sensitive(state) + font_name = gajim.config.get_per('themes', theme, + option + 'font') + if font_name: + state = True + self.text_fontbutton.set_font_name(font_name) + else: + state = False + self.textfont_checkbutton.set_active(state) + self.text_fontbutton.set_sensitive(state) + + def on_textcolor_checkbutton_toggled(self, widget): + state = widget.get_active() + self.text_colorbutton.set_sensitive(state) + self._set_color(state, self.text_colorbutton, + 'textcolor') + + def on_background_checkbutton_toggled(self, widget): + state = widget.get_active() + self.background_colorbutton.set_sensitive(state) + self._set_color(state, self.background_colorbutton, + 'bgcolor') + + def on_textfont_checkbutton_toggled(self, widget): + state = widget.get_active() + self.text_fontbutton.set_sensitive(state) + self._set_font(state, self.text_fontbutton, 'font') + + def on_text_colorbutton_color_set(self, widget): + self._set_color(True, widget, 'textcolor') + + def on_background_colorbutton_color_set(self, widget): + self._set_color(True, widget, 'bgcolor') + + def on_text_fontbutton_font_set(self, widget): + self._set_font(True, widget, 'font') + + def on_options_combobox_changed(self, widget): + index = self.options_combobox.get_active() + if index == -1: + return + self.current_option = self.options[index] + self.set_theme_options(self.current_theme, + self.current_option) + + + def _set_color(self, state, widget, option): + ''' set color value in prefs and update the UI ''' + if state: + color = widget.get_color() + color_string = mk_color_string(color) + else: + color_string = '' + gajim.config.set_per('themes', self.current_theme, + self.current_option + option, color_string) + if option == 'banner': + self.plugin.roster.repaint_themed_widgets() self.plugin.roster.draw_roster() self.plugin.save_config() - - def on_account_text_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'accounttextcolor') - - def on_group_text_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'grouptextcolor') - - def on_user_text_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'contacttextcolor') - - def on_account_text_bg_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'accountbgcolor') - - def on_group_text_bg_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'groupbgcolor') - - def on_user_text_bg_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'contactbgcolor') - - def on_banner_text_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'bannertextcolor') - - def on_banner_bg_colorbutton_color_set(self, widget): - self.on_roster_widget_color_set(widget, 'bannerbgcolor') - - def on_widget_font_set(self, widget, option): - font_string = widget.get_font_name() - gajim.config.set_per('themes', self.current_theme, option, font_string) + + def _set_font(self, state, widget, option): + ''' set font value in prefs and update the UI ''' + if state: + font_string = widget.get_font_name() + else: + font_string = '' + gajim.config.set_per('themes', self.current_theme, + self.current_option + option, font_string) + if option == 'banner': + self.plugin.roster.repaint_themed_widgets() self.plugin.roster.draw_roster() self.plugin.save_config() - - def on_account_text_fontbutton_font_set(self, widget): - self.on_widget_font_set(widget, 'accountfont') - - def on_group_text_fontbutton_font_set(self, widget): - self.on_widget_font_set(widget, 'groupfont') - - def on_user_text_fontbutton_font_set(self, widget): - self.on_widget_font_set(widget, 'contactfont')