]> git.0d.be Git - empathy.git/commitdiff
Add UI in the preference dialog to select the path to adium theme
authorXavier Claessens <xclaesse@gmail.com>
Thu, 17 Jul 2008 20:19:43 +0000 (22:19 +0200)
committerXavier Claessens <xclaesse@gmail.com>
Thu, 11 Jun 2009 16:06:30 +0000 (18:06 +0200)
data/empathy.schemas.in
libempathy-gtk/empathy-conf.h
libempathy-gtk/empathy-theme-adium.c
libempathy-gtk/empathy-theme-adium.h
src/Makefile.am
src/empathy-preferences.c
src/empathy-preferences.ui

index 572eb887117430a580f6dbe5ea7720c2219a728f..81ea5e864ff6e07df5864661d8f124a5b9cf0017 100644 (file)
       </locale>
     </schema>
 
+    <schema>
+      <key>/schemas/apps/empathy/conversation/adium_path</key>
+      <applyto>/apps/empathy/conversation/adium_path</applyto>
+      <owner>empathy</owner>
+      <type>string</type>
+      <default></default>
+      <locale name="C">
+         <short>Path of the adium theme to use</short>
+         <long>
+           Path of the adium theme to use if the theme used for chat is adium.
+         </long>
+      </locale>
+    </schema>
+
     <schema>
       <key>/schemas/apps/empathy/conversation/theme_chat_room</key>
       <applyto>/apps/empathy/conversation/theme_chat_room</applyto>
index 07026df5c9b1ff0ee6698a78807caaa03a14e82a..47949139e67ddbd2ff141e41e9191f9bba674273 100644 (file)
@@ -60,6 +60,7 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_POPUPS_WHEN_AVAILABLE        EMPATHY_PREFS_PATH "/notifications/popups_when_available"
 #define EMPATHY_PREFS_CHAT_SHOW_SMILEYS            EMPATHY_PREFS_PATH "/conversation/graphical_smileys"
 #define EMPATHY_PREFS_CHAT_THEME                   EMPATHY_PREFS_PATH "/conversation/theme"
+#define EMPATHY_PREFS_CHAT_ADIUM_PATH              EMPATHY_PREFS_PATH "/conversation/adium_path"
 #define EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES EMPATHY_PREFS_PATH "/conversation/spell_checker_languages"
 #define EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED   EMPATHY_PREFS_PATH "/conversation/spell_checker_enabled"
 #define EMPATHY_PREFS_CHAT_NICK_COMPLETION_CHAR    EMPATHY_PREFS_PATH "/conversation/nick_completion_char"
index 876744018174d31f2cb71cf9b7f8bc9ae8b2aa63..a878715b660e6542045d4816a021ae73ecd55075 100644 (file)
@@ -580,3 +580,9 @@ empathy_theme_adium_new (void)
        return g_object_new (EMPATHY_TYPE_THEME_ADIUM, NULL);
 }
 
+gboolean
+empathy_theme_adium_is_valid (const gchar *path)
+{
+       return TRUE;
+}
+
index c31105a1b0fabf6457c73cb66e6d20b57870b752..24fe986f6e11be374d260e84c3fbe6126aafdf8a 100644 (file)
@@ -49,6 +49,7 @@ struct _EmpathyThemeAdiumClass {
 
 GType              empathy_theme_adium_get_type (void) G_GNUC_CONST;
 EmpathyThemeAdium *empathy_theme_adium_new      (void);
+gboolean           empathy_theme_adium_is_valid (const gchar *path);
 
 G_END_DECLS
 
index 60f9ada3406f892237736b8d3e9304a466d83862..dbcd6d43d79a5f4ace0d6e905b75c969f62983d6 100644 (file)
@@ -7,6 +7,7 @@ AM_CPPFLAGS =                                           \
        $(LIBNOTIFY_CFLAGS)                             \
        $(LIBCHAMPLAIN_CFLAGS)                          \
        $(DISABLE_DEPRECATED)                           \
+       $(WEBKIT_CFLAGS)                                \
        $(WARN_CFLAGS)
 
 LDADD =                                                                \
@@ -15,7 +16,8 @@ LDADD =                                                               \
        $(top_builddir)/extensions/libemp-extensions.la         \
        $(LIBNOTIFY_LIBS)                                       \
        $(EMPATHY_LIBS)                                         \
-       $(LIBCHAMPLAIN_LIBS)
+       $(LIBCHAMPLAIN_LIBS)                                    \
+       $(WEBKIT_LIBS)
 
 bin_PROGRAMS =                 \
        empathy                 \
index 406db4c9f2ccd16a032fcc206031eb6eb4f314d5..211ad5c076fcbb4f8de26357bb3e575b2d344de1 100644 (file)
@@ -34,6 +34,7 @@
 #include <libempathy-gtk/empathy-conf.h>
 #include <libempathy-gtk/empathy-ui-utils.h>
 #include <libempathy-gtk/empathy-theme-manager.h>
+#include <libempathy-gtk/empathy-theme-adium.h>
 #include <libempathy-gtk/empathy-spell.h>
 #include <libempathy-gtk/empathy-contact-list-store.h>
 #include <libempathy-gtk/empathy-gtk-enum-types.h>
@@ -49,6 +50,9 @@ typedef struct {
        GtkWidget *checkbutton_compact_contact_list;
        GtkWidget *checkbutton_show_smileys;
        GtkWidget *combobox_chat_theme;
+       GtkWidget *hbox_adium_theme;
+       GtkWidget *filechooserbutton_adium_theme;
+       GtkWidget *label_invalid_adium_theme;
        GtkWidget *checkbutton_separate_chat_windows;
        GtkWidget *checkbutton_autoconnect;
        GtkWidget *radiobutton_contact_list_sort_by_name;
@@ -89,19 +93,13 @@ static gboolean preferences_languages_load_foreach       (GtkTreeModel
 static void     preferences_languages_cell_toggled_cb    (GtkCellRendererToggle  *cell,
                                                          gchar                  *path_string,
                                                          EmpathyPreferences      *preferences);
-static void     preferences_themes_setup                 (EmpathyPreferences      *preferences);
 static void     preferences_widget_sync_bool             (const gchar            *key,
                                                          GtkWidget              *widget);
 static void     preferences_widget_sync_string           (const gchar            *key,
                                                          GtkWidget              *widget);
-static void     preferences_widget_sync_string_combo     (const gchar            *key,
-                                                         GtkWidget              *widget);
 static void     preferences_notify_string_cb             (EmpathyConf             *conf,
                                                          const gchar            *key,
                                                          gpointer                user_data);
-static void     preferences_notify_string_combo_cb       (EmpathyConf             *conf,
-                                                         const gchar            *key,
-                                                         gpointer                user_data);
 static void     preferences_notify_bool_cb               (EmpathyConf             *conf,
                                                          const gchar            *key,
                                                          gpointer                user_data);
@@ -114,9 +112,6 @@ static void     preferences_hookup_toggle_button         (EmpathyPreferences
 static void     preferences_hookup_radio_button          (EmpathyPreferences      *preferences,
                                                          const gchar            *key,
                                                          GtkWidget              *widget);
-static void     preferences_hookup_string_combo          (EmpathyPreferences      *preferences,
-                                                         const gchar            *key,
-                                                         GtkWidget              *widget);
 static void     preferences_hookup_sensitivity           (EmpathyPreferences      *preferences,
                                                          const gchar            *key,
                                                          GtkWidget              *widget);
@@ -124,8 +119,6 @@ static void     preferences_toggle_button_toggled_cb     (GtkWidget
                                                          gpointer                user_data);
 static void     preferences_radio_button_toggled_cb      (GtkWidget              *button,
                                                          gpointer                user_data);
-static void     preferences_string_combo_changed_cb      (GtkWidget *button,
-                                                         gpointer                user_data);
 static void     preferences_destroy_cb                   (GtkWidget              *widget,
                                                          EmpathyPreferences      *preferences);
 static void     preferences_response_cb                  (GtkWidget              *widget,
@@ -241,10 +234,6 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
                                          EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
                                          preferences->checkbutton_show_smileys);
 
-       preferences_hookup_string_combo (preferences,
-                                        EMPATHY_PREFS_CHAT_THEME,
-                                        preferences->combobox_chat_theme);
-
        preferences_hookup_radio_button (preferences,
                                         EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
                                         preferences->radiobutton_contact_list_sort_by_name);
@@ -638,43 +627,6 @@ preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
        preferences_languages_save (preferences);
 }
 
-static void
-preferences_themes_setup (EmpathyPreferences *preferences)
-{
-       GtkComboBox   *combo;
-       GtkCellLayout *cell_layout;
-       GtkCellRenderer *renderer;
-       GtkListStore  *store;
-       const gchar  **themes;
-       gint           i;
-
-       combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
-       cell_layout = GTK_CELL_LAYOUT (combo);
-
-       /* Create the model */
-       store = gtk_list_store_new (COL_COMBO_COUNT,
-                                   G_TYPE_STRING,  /* Display name */
-                                   G_TYPE_STRING); /* Theme name */
-
-       /* Fill the model */
-       themes = empathy_theme_manager_get_themes ();
-       for (i = 0; themes[i]; i += 2) {
-               gtk_list_store_insert_with_values (store, NULL, -1,
-                       COL_COMBO_VISIBLE_NAME, _(themes[i + 1]),
-                       COL_COMBO_NAME, themes[i],
-                       -1);
-       }
-
-       /* Add cell renderer */
-       renderer = gtk_cell_renderer_text_new ();
-       gtk_cell_layout_pack_start (cell_layout, renderer, TRUE);
-       gtk_cell_layout_set_attributes (cell_layout, renderer,
-               "text", COL_COMBO_VISIBLE_NAME, NULL);
-
-       gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store));
-       g_object_unref (store);
-}
-
 static void
 preferences_widget_sync_bool (const gchar *key, GtkWidget *widget)
 {
@@ -720,48 +672,6 @@ preferences_widget_sync_string (const gchar *key, GtkWidget *widget)
        }
 }
 
-static void
-preferences_widget_sync_string_combo (const gchar *key, GtkWidget *widget)
-{
-       gchar        *value;
-       GtkTreeModel *model;
-       GtkTreeIter   iter;
-       gboolean      found;
-
-       if (!empathy_conf_get_string (empathy_conf_get (), key, &value)) {
-               return;
-       }
-
-       model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-
-       found = FALSE;
-       if (value && gtk_tree_model_get_iter_first (model, &iter)) {
-
-               do {
-                       gchar *name;
-                       gtk_tree_model_get (model, &iter,
-                                           COL_COMBO_NAME, &name,
-                                           -1);
-
-                       if (strcmp (name, value) == 0) {
-                               found = TRUE;
-                               gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
-                       }
-
-                       g_free (name);
-               } while (!found && gtk_tree_model_iter_next (model, &iter));
-       }
-
-       /* Fallback to the first one. */
-       if (!found) {
-               if (gtk_tree_model_get_iter_first (model, &iter)) {
-                       gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
-               }
-       }
-
-       g_free (value);
-}
-
 static void
 preferences_notify_string_cb (EmpathyConf  *conf,
                              const gchar *key,
@@ -770,13 +680,6 @@ preferences_notify_string_cb (EmpathyConf  *conf,
        preferences_widget_sync_string (key, user_data);
 }
 
-static void
-preferences_notify_string_combo_cb (EmpathyConf  *conf,
-                                   const gchar *key,
-                                   gpointer     user_data)
-{
-       preferences_widget_sync_string_combo (key, user_data);
-}
 
 static void
 preferences_notify_bool_cb (EmpathyConf  *conf,
@@ -954,32 +857,6 @@ preferences_hookup_radio_button (EmpathyPreferences *preferences,
        }
 }
 
-static void
-preferences_hookup_string_combo (EmpathyPreferences *preferences,
-                                const gchar       *key,
-                                GtkWidget         *widget)
-{
-       guint id;
-
-       preferences_widget_sync_string_combo (key, widget);
-
-       g_object_set_data_full (G_OBJECT (widget), "key",
-                               g_strdup (key), g_free);
-
-       g_signal_connect (widget,
-                         "changed",
-                         G_CALLBACK (preferences_string_combo_changed_cb),
-                         NULL);
-
-       id = empathy_conf_notify_add (empathy_conf_get (),
-                                     key,
-                                     preferences_notify_string_combo_cb,
-                                     widget);
-       if (id) {
-               preferences_add_id (preferences, id);
-       }
-}
-
 static void
 preferences_hookup_sensitivity (EmpathyPreferences *preferences,
                                const gchar       *key,
@@ -1054,28 +931,206 @@ preferences_radio_button_toggled_cb (GtkWidget *button,
        empathy_conf_set_string (empathy_conf_get (), key, value);
 }
 
+
 static void
-preferences_string_combo_changed_cb (GtkWidget *combo,
-                                    gpointer   user_data)
+preferences_theme_adium_update_visibility (EmpathyPreferences *preferences,
+                                          const gchar        *name)
+{
+       if (name && strcmp (name, "adium") == 0) {
+               gtk_widget_show (preferences->hbox_adium_theme);
+       } else {
+               gtk_widget_hide (preferences->hbox_adium_theme);
+               gtk_widget_hide (preferences->label_invalid_adium_theme);
+       }
+}
+
+static void
+preferences_theme_adium_update_validity (EmpathyPreferences *preferences,
+                                        const gchar        *path)
+{
+       if (empathy_theme_adium_is_valid (path)) {
+               gtk_widget_hide (preferences->label_invalid_adium_theme);
+       } else {
+               gtk_widget_show (preferences->label_invalid_adium_theme);
+       }
+}
+
+static void
+preferences_theme_adium_path_notify_cb (EmpathyConf *conf,
+                                       const gchar *key,
+                                       gpointer     user_data)
+{
+       EmpathyPreferences *preferences = user_data;
+       GtkFileChooser     *chooser;
+       gchar              *value;
+
+       if (!empathy_conf_get_string (conf, key, &value)) {
+               return;
+       }
+
+       chooser = GTK_FILE_CHOOSER (preferences->filechooserbutton_adium_theme);
+       gtk_file_chooser_set_current_folder (chooser, value);
+       preferences_theme_adium_update_validity (preferences, value);
+       g_free (value);
+}
+
+static void
+preferences_theme_adium_file_set_cb (GtkFileChooser     *chooser,
+                                    EmpathyPreferences *preferences)
+{
+       gchar *path;
+
+       path = gtk_file_chooser_get_current_folder (chooser);
+       empathy_conf_set_string (empathy_conf_get (),
+                                EMPATHY_PREFS_CHAT_ADIUM_PATH,
+                                path);
+       preferences_theme_adium_update_validity (preferences, path);
+
+       g_free (path);
+}
+
+static void
+preferences_theme_notify_cb (EmpathyConf *conf,
+                            const gchar *key,
+                            gpointer     user_data)
+{
+       EmpathyPreferences *preferences = user_data;
+       GtkComboBox        *combo;
+       gchar              *value;
+       GtkTreeModel       *model;
+       GtkTreeIter         iter;
+       gboolean            found = FALSE;
+
+       if (!empathy_conf_get_string (conf, key, &value)) {
+               return;
+       }
+
+       preferences_theme_adium_update_visibility (preferences, value);
+
+       combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
+       model = gtk_combo_box_get_model (combo);
+       if (value && gtk_tree_model_get_iter_first (model, &iter)) {
+               gchar *name;
+
+               do {
+                       gtk_tree_model_get (model, &iter,
+                                           COL_COMBO_NAME, &name,
+                                           -1);
+
+                       if (strcmp (name, value) == 0) {
+                               found = TRUE;
+                               gtk_combo_box_set_active_iter (combo, &iter);
+                               break;
+                       }
+
+                       g_free (name);
+               } while (gtk_tree_model_iter_next (model, &iter));
+       }
+
+       /* Fallback to the first one. */
+       if (!found) {
+               if (gtk_tree_model_get_iter_first (model, &iter)) {
+                       gtk_combo_box_set_active_iter (combo, &iter);
+               }
+       }
+
+       g_free (value);
+}
+
+static void
+preferences_theme_changed_cb (GtkComboBox        *combo,
+                             EmpathyPreferences *preferences)
 {
-       const gchar  *key;
        GtkTreeModel *model;
        GtkTreeIter   iter;
        gchar        *name;
 
-       key = g_object_get_data (G_OBJECT (combo), "key");
-
-       if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter)) {
-               model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+       if (gtk_combo_box_get_active_iter (combo, &iter)) {
+               model = gtk_combo_box_get_model (combo);
 
                gtk_tree_model_get (model, &iter,
                                    COL_COMBO_NAME, &name,
                                    -1);
-               empathy_conf_set_string (empathy_conf_get (), key, name);
+
+               preferences_theme_adium_update_visibility (preferences, name);
+
+               empathy_conf_set_string (empathy_conf_get (),
+                                        EMPATHY_PREFS_CHAT_THEME,
+                                        name);
                g_free (name);
        }
 }
 
+static void
+preferences_themes_setup (EmpathyPreferences *preferences)
+{
+       GtkComboBox   *combo;
+       GtkCellLayout *cell_layout;
+       GtkCellRenderer *renderer;
+       GtkListStore  *store;
+       const gchar  **themes;
+       gint           i;
+       guint          id;
+
+       combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
+       cell_layout = GTK_CELL_LAYOUT (combo);
+
+       /* Create the model */
+       store = gtk_list_store_new (COL_COMBO_COUNT,
+                                   G_TYPE_STRING,  /* Display name */
+                                   G_TYPE_STRING); /* Theme name */
+
+       /* Fill the model */
+       themes = empathy_theme_manager_get_themes ();
+       for (i = 0; themes[i]; i += 2) {
+               gtk_list_store_insert_with_values (store, NULL, -1,
+                       COL_COMBO_VISIBLE_NAME, _(themes[i + 1]),
+                       COL_COMBO_NAME, themes[i],
+                       -1);
+       }
+
+       /* Add cell renderer */
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_layout_pack_start (cell_layout, renderer, TRUE);
+       gtk_cell_layout_set_attributes (cell_layout, renderer,
+               "text", COL_COMBO_VISIBLE_NAME, NULL);
+
+       gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store));
+       g_object_unref (store);
+
+       g_signal_connect (combo, "changed",
+                         G_CALLBACK (preferences_theme_changed_cb),
+                         preferences);
+
+       /* Select the theme from the gconf key and track changes */
+       preferences_theme_notify_cb (empathy_conf_get (),
+                                    EMPATHY_PREFS_CHAT_THEME,
+                                    preferences);
+       id = empathy_conf_notify_add (empathy_conf_get (),
+                                     EMPATHY_PREFS_CHAT_THEME,
+                                     preferences_theme_notify_cb,
+                                     preferences);
+       if (id) {
+               preferences_add_id (preferences, id);
+       }
+
+       g_signal_connect (preferences->filechooserbutton_adium_theme,
+                         "file-set",
+                         G_CALLBACK (preferences_theme_adium_file_set_cb),
+                         preferences);
+       /* Select the adium path from the gconf key and track changes */
+       preferences_theme_adium_path_notify_cb (empathy_conf_get (),
+                                               EMPATHY_PREFS_CHAT_ADIUM_PATH,
+                                               preferences);
+       id = empathy_conf_notify_add (empathy_conf_get (),
+                                     EMPATHY_PREFS_CHAT_ADIUM_PATH,
+                                     preferences_theme_adium_path_notify_cb,
+                                     preferences);
+       if (id) {
+               preferences_add_id (preferences, id);
+       }
+}
+
 static void
 preferences_response_cb (GtkWidget         *widget,
                         gint               response,
@@ -1124,6 +1179,9 @@ empathy_preferences_show (GtkWindow *parent)
                "checkbutton_compact_contact_list", &preferences->checkbutton_compact_contact_list,
                "checkbutton_show_smileys", &preferences->checkbutton_show_smileys,
                "combobox_chat_theme", &preferences->combobox_chat_theme,
+               "hbox_adium_theme", &preferences->hbox_adium_theme,
+               "filechooserbutton_adium_theme", &preferences->filechooserbutton_adium_theme,
+               "label_invalid_adium_theme", &preferences->label_invalid_adium_theme,
                "checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
                "checkbutton_autoconnect", &preferences->checkbutton_autoconnect,
                "radiobutton_contact_list_sort_by_name", &preferences->radiobutton_contact_list_sort_by_name,
index d92fc8f88458e25bef00a2e7d6a4e1c807e68173..eaec717eaedaab04a08e086f4ce9f339c92bc030 100644 (file)
                                 <property name="position">0</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox_adium_theme">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkLabel" id="label1">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Adium theme to use:</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkFileChooserButton" id="filechooserbutton_adium_theme">
+                                    <property name="visible">True</property>
+                                    <property name="preview_widget_active">False</property>
+                                    <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
+                                    <property name="title" translatable="yes">Sélectionner un dossier</property>
+                                  </object>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_invalid_adium_theme">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">&lt;span foreground="red"&gt;Not a valid adium theme&lt;/span&gt;</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
                           </object>
                         </child>
                       </object>