#include <libempathy/gossip-conf.h>
#include "gossip-preferences.h"
-#include "gossip-stock.h"
#include "gossip-ui-utils.h"
#include "gossip-theme-manager.h"
#include "gossip-spell.h"
+#include "gossip-contact-list.h"
typedef struct {
GtkWidget *dialog;
GtkWidget *combobox_chat_theme;
GtkWidget *checkbutton_theme_chat_room;
GtkWidget *checkbutton_separate_chat_windows;
+ GtkWidget *radiobutton_contact_list_sort_by_name;
+ GtkWidget *radiobutton_contact_list_sort_by_state;
GtkWidget *checkbutton_sounds_for_messages;
GtkWidget *checkbutton_sounds_when_busy;
static void preferences_hookup_toggle_button (GossipPreferences *preferences,
const gchar *key,
GtkWidget *widget);
+static void preferences_hookup_radio_button (GossipPreferences *preferences,
+ const gchar *key,
+ GtkWidget *widget);
static void preferences_hookup_string_combo (GossipPreferences *preferences,
const gchar *key,
GtkWidget *widget);
gpointer user_data);
static void preferences_toggle_button_toggled_cb (GtkWidget *button,
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,
preferences_hookup_sensitivity (preferences,
GOSSIP_PREFS_CHAT_SPELL_CHECKER_ENABLED,
preferences->treeview_spell_checker);
+
+ preferences_hookup_radio_button (preferences,
+ GOSSIP_PREFS_CONTACTS_SORT_CRITERIUM,
+ preferences->radiobutton_contact_list_sort_by_name);
}
static void
gint value;
if (gossip_conf_get_int (gossip_conf_get (), key, &value)) {
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
+ if (GTK_IS_SPIN_BUTTON (widget)) {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
+ }
}
}
gchar *value;
if (gossip_conf_get_string (gossip_conf_get (), key, &value) && value) {
- gtk_entry_set_text (GTK_ENTRY (widget), value);
+ if (GTK_IS_ENTRY (widget)) {
+ gtk_entry_set_text (GTK_ENTRY (widget), value);
+ } else if (GTK_IS_RADIO_BUTTON (widget)) {
+ if (strcmp (key, GOSSIP_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
+ GType type;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+ GSList *list;
+ GtkWidget *toggle_widget;
+
+ /* Get index from new string */
+ type = gossip_contact_list_sort_get_type ();
+ enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+ enum_value = g_enum_get_value_by_nick (enum_class, value);
+
+ if (enum_value) {
+ list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
+ toggle_widget = g_slist_nth_data (list, enum_value->value);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle_widget), TRUE);
+ }
+ } else {
+ g_warning ("Unhandled key:'%s' just had string change", key);
+ }
+ }
+
g_free (value);
}
}
const gchar *key,
gpointer user_data)
{
- gint value;
-
- if (gossip_conf_get_int (conf, key, &value)) {
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (user_data), value);
- }
+ preferences_widget_sync_int (key, user_data);
}
static void
const gchar *key,
gpointer user_data)
{
- gchar *value;
-
- if (gossip_conf_get_string (conf, key, &value) && value) {
- gtk_entry_set_text (GTK_ENTRY (user_data), value);
- g_free (value);
- }
+ preferences_widget_sync_string (key, user_data);
}
static void
gpointer user_data)
{
preferences_widget_sync_bool (key, user_data);
-/*
- if (gossip_conf_get_bool (conf, key, &value)) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (user_data),
- gconf_value_get_bool (value));
- }
-*/
}
static void
NULL);
id = gossip_conf_notify_add (gossip_conf_get (),
- key,
- preferences_notify_bool_cb,
- widget);
+ key,
+ preferences_notify_bool_cb,
+ widget);
+ if (id) {
+ preferences_add_id (preferences, id);
+ }
+}
+
+static void
+preferences_hookup_radio_button (GossipPreferences *preferences,
+ const gchar *key,
+ GtkWidget *widget)
+{
+ GSList *group, *l;
+ guint id;
+
+ preferences_widget_sync_string (key, widget);
+
+ group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
+ for (l = group; l; l = l->next) {
+ g_signal_connect (l->data,
+ "toggled",
+ G_CALLBACK (preferences_radio_button_toggled_cb),
+ NULL);
+
+ g_object_set_data_full (G_OBJECT (l->data), "key",
+ g_strdup (key), g_free);
+ }
+
+ id = gossip_conf_notify_add (gossip_conf_get (),
+ key,
+ preferences_notify_string_cb,
+ widget);
if (id) {
preferences_add_id (preferences, id);
}
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
}
+static void
+preferences_radio_button_toggled_cb (GtkWidget *button,
+ gpointer user_data)
+{
+ const gchar *key;
+ const gchar *value = NULL;
+
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
+ return;
+ }
+
+ key = g_object_get_data (G_OBJECT (button), "key");
+
+ if (key && strcmp (key, GOSSIP_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
+ GSList *group;
+ GType type;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
+
+ /* Get string from index */
+ type = gossip_contact_list_sort_get_type ();
+ enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+ enum_value = g_enum_get_value (enum_class, g_slist_index (group, button));
+
+ if (!enum_value) {
+ g_warning ("No GEnumValue for GossipContactListSort with GtkRadioButton index:%d",
+ g_slist_index (group, button));
+ return;
+ }
+
+ value = enum_value->value_nick;
+ }
+
+ gossip_conf_set_string (gossip_conf_get (), key, value);
+}
+
static void
preferences_string_combo_changed_cb (GtkWidget *combo,
gpointer user_data)
g_free (preferences);
}
-void
+GtkWidget *
gossip_preferences_show (void)
{
static GossipPreferences *preferences;
if (preferences) {
gtk_window_present (GTK_WINDOW (preferences->dialog));
- return;
+ return preferences->dialog;
}
preferences = g_new0 (GossipPreferences, 1);
glade = gossip_glade_get_file (
- "main.glade",
+ "gossip-preferences.glade",
"preferences_dialog",
NULL,
"preferences_dialog", &preferences->dialog,
"combobox_chat_theme", &preferences->combobox_chat_theme,
"checkbutton_theme_chat_room", &preferences->checkbutton_theme_chat_room,
"checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
+ "radiobutton_contact_list_sort_by_name", &preferences->radiobutton_contact_list_sort_by_name,
+ "radiobutton_contact_list_sort_by_state", &preferences->radiobutton_contact_list_sort_by_state,
"checkbutton_sounds_for_messages", &preferences->checkbutton_sounds_for_messages,
"checkbutton_sounds_when_busy", &preferences->checkbutton_sounds_when_busy,
"checkbutton_sounds_when_away", &preferences->checkbutton_sounds_when_away,
}
gtk_widget_show (preferences->dialog);
+
+ return preferences->dialog;
}
+