]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-status-preset-dialog.c
Updated Basque language
[empathy.git] / libempathy-gtk / empathy-status-preset-dialog.c
index 22cba1a5309e6d77127cc97b72871768fb048ac7..802d116e73ae5b83af5450f27028fd6e5576dca6 100644 (file)
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
  *
  * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
  */
+/**
+ * SECTION:empathy-status-preset-dialog
+ * @title: EmpathyStatusPresetDialog
+ * @short_description: a dialog for editing the saved status messages
+ * @include: libempathy-gtk/empathy-status-preset-dialog.h
+ *
+ * #EmpathyStatusPresetDialog is a dialog allowing the user to add/remove/edit
+ * their saved status messages.
+ */
 
 #include "config.h"
 
 #include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
 
-#include <libmissioncontrol/mc-enum-types.h>
-
 #include <libempathy/empathy-utils.h>
 #include <libempathy/empathy-status-presets.h>
 
 
 G_DEFINE_TYPE (EmpathyStatusPresetDialog, empathy_status_preset_dialog, GTK_TYPE_DIALOG);
 
-static McPresence states[] = {
-       MC_PRESENCE_AVAILABLE,
-       MC_PRESENCE_DO_NOT_DISTURB,
-       MC_PRESENCE_AWAY
+static TpConnectionPresenceType states[] = {
+       TP_CONNECTION_PRESENCE_TYPE_AVAILABLE,
+       TP_CONNECTION_PRESENCE_TYPE_BUSY,
+       TP_CONNECTION_PRESENCE_TYPE_AWAY,
 };
 
 typedef struct _EmpathyStatusPresetDialogPriv EmpathyStatusPresetDialogPriv;
 struct _EmpathyStatusPresetDialogPriv
 {
+       /* block status_preset_dialog_add_combo_changed () when > 0 */
        int block_add_combo_changed;
 
        GtkWidget *presets_treeview;
        GtkWidget *add_combobox;
        GtkWidget *add_button;
 
-       McPresence selected_state;
+       GtkTreeIter selected_iter;
        gboolean add_combo_changed;
+       char *saved_status;
 };
 
 enum
@@ -81,19 +90,30 @@ enum
        ADD_COMBO_N_COLS
 };
 
+static void
+empathy_status_preset_dialog_finalize (GObject *self)
+{
+       EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+
+       g_free (priv->saved_status);
+
+       G_OBJECT_CLASS (empathy_status_preset_dialog_parent_class)->finalize (self);
+}
+
 static void
 empathy_status_preset_dialog_class_init (EmpathyStatusPresetDialogClass *class)
 {
        GObjectClass *gobject_class;
 
        gobject_class = G_OBJECT_CLASS (class);
+       gobject_class->finalize = empathy_status_preset_dialog_finalize;
 
        g_type_class_add_private (gobject_class,
                        sizeof (EmpathyStatusPresetDialogPriv));
 }
 
 static void
-status_preset_dialog_setup_presets_update (EmpathyStatusPresetDialog *self)
+status_preset_dialog_presets_update (EmpathyStatusPresetDialog *self)
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
        GtkListStore *store;
@@ -108,8 +128,9 @@ status_preset_dialog_setup_presets_update (EmpathyStatusPresetDialog *self)
                GList *presets, *l;
                const char *icon_name;
 
-               presets = empathy_status_presets_get (states[i], -1);
                icon_name = empathy_icon_name_for_presence (states[i]);
+               presets = empathy_status_presets_get (states[i], -1);
+               presets = g_list_sort (presets, (GCompareFunc) g_utf8_collate);
 
                for (l = presets; l; l = l->next) {
                        char *preset = (char *) l->data;
@@ -130,8 +151,13 @@ static void
 status_preset_add_combo_reset (EmpathyStatusPresetDialog *self)
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+       GtkWidget *entry;
+
+       entry = gtk_bin_get_child (GTK_BIN (priv->add_combobox));
+       gtk_entry_set_text (GTK_ENTRY (entry), "");
 
-       gtk_combo_box_set_active (GTK_COMBO_BOX (priv->add_combobox), 0);
+       gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->add_combobox),
+                       &priv->selected_iter);
 }
 
 static void
@@ -144,7 +170,7 @@ status_preset_dialog_setup_add_combobox (EmpathyStatusPresetDialog *self)
        int i;
 
        store = gtk_list_store_new (ADD_COMBO_N_COLS,
-                       MC_TYPE_PRESENCE,       /* ADD_COMBO_STATE */
+                       G_TYPE_UINT,            /* ADD_COMBO_STATE */
                        G_TYPE_STRING,          /* ADD_COMBO_ICON_NAME */
                        G_TYPE_STRING,          /* ADD_COMBO_STATUS */
                        G_TYPE_STRING);         /* ADD_COMBO_DEFAULT_TEXT */
@@ -181,7 +207,54 @@ status_preset_dialog_setup_add_combobox (EmpathyStatusPresetDialog *self)
                        "foreground", "Gray", /* FIXME - theme */
                        NULL);
 
-       status_preset_add_combo_reset (self);
+       gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+}
+
+static void
+status_preset_dialog_status_edited (GtkCellRendererText *renderer,
+                                   char *path_str,
+                                   char *new_status,
+                                   EmpathyStatusPresetDialog *self)
+{
+       EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+       GtkTreeModel *model;
+       GtkTreePath *path;
+       GtkTreeIter iter;
+       TpConnectionPresenceType state;
+       char *old_status;
+       gboolean valid;
+
+       if (strlen (new_status) == 0) {
+               /* status is empty, ignore */
+               return;
+       }
+
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->presets_treeview));
+       path = gtk_tree_path_new_from_string (path_str);
+       valid = gtk_tree_model_get_iter (model, &iter, path);
+       gtk_tree_path_free (path);
+
+       if (!valid) return;
+
+       gtk_tree_model_get (model, &iter,
+                       PRESETS_STORE_STATE, &state,
+                       PRESETS_STORE_STATUS, &old_status,
+                       -1);
+
+       if (!strcmp (old_status, new_status)) {
+               /* statuses are the same */
+               g_free (old_status);
+               return;
+       }
+
+       DEBUG ("EDITED STATUS (%s) -> (%s)\n", old_status, new_status);
+
+       empathy_status_presets_remove (state, old_status);
+       empathy_status_presets_set_last (state, new_status);
+
+       g_free (old_status);
+
+       status_preset_dialog_presets_update (self);
 }
 
 static void
@@ -194,7 +267,7 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
        GtkCellRenderer *renderer;
 
        store = gtk_list_store_new (PRESETS_STORE_N_COLS,
-                       MC_TYPE_PRESENCE,       /* PRESETS_STORE_STATE */
+                       G_TYPE_UINT,            /* PRESETS_STORE_STATE */
                        G_TYPE_STRING,          /* PRESETS_STORE_ICON_NAME */
                        G_TYPE_STRING);         /* PRESETS_STORE_STATUS */
 
@@ -202,7 +275,7 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
                                 GTK_TREE_MODEL (store));
        g_object_unref (store);
 
-       status_preset_dialog_setup_presets_update (self);
+       status_preset_dialog_presets_update (self);
 
        column = gtk_tree_view_column_new ();
        gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
@@ -216,6 +289,11 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
        gtk_tree_view_column_pack_start (column, renderer, TRUE);
        gtk_tree_view_column_add_attribute (column, renderer,
                        "text", PRESETS_STORE_STATUS);
+       g_object_set (renderer,
+                       "editable", TRUE,
+                       NULL);
+       g_signal_connect (renderer, "edited",
+                       G_CALLBACK (status_preset_dialog_status_edited), self);
 }
 
 static void
@@ -235,7 +313,7 @@ status_preset_dialog_preset_remove (GtkButton *button,
        GtkTreeSelection *selection;
        GtkTreeModel *model;
        GtkTreeIter iter;
-       McPresence state;
+       TpConnectionPresenceType state;
        char *status;
 
        selection = gtk_tree_view_get_selection (
@@ -254,7 +332,7 @@ status_preset_dialog_preset_remove (GtkButton *button,
 
        g_free (status);
 
-       status_preset_dialog_setup_presets_update (self);
+       status_preset_dialog_presets_update (self);
 }
 
 static void
@@ -304,8 +382,8 @@ status_preset_dialog_add_combo_changed (GtkComboBox *combo,
        if (gtk_combo_box_get_active_iter (combo, &iter)) {
                char *icon_name;
 
+               priv->selected_iter = iter;
                gtk_tree_model_get (model, &iter,
-                               PRESETS_STORE_STATE, &priv->selected_state,
                                PRESETS_STORE_ICON_NAME, &icon_name,
                                -1);
 
@@ -316,12 +394,17 @@ status_preset_dialog_add_combo_changed (GtkComboBox *combo,
                g_free (icon_name);
 
                status_preset_dialog_set_add_combo_changed (self, FALSE, TRUE);
+               if (priv->saved_status && strlen (priv->saved_status) > 0) {
+                       gtk_entry_set_text (GTK_ENTRY (entry),
+                                       priv->saved_status);
+               }
        } else {
-               const char *status;
+               g_free (priv->saved_status);
+               priv->saved_status = g_strdup (
+                               gtk_entry_get_text (GTK_ENTRY (entry)));
 
-               status = gtk_entry_get_text (GTK_ENTRY (entry));
                status_preset_dialog_set_add_combo_changed (self,
-                               strlen (status) > 0, FALSE);
+                               strlen (priv->saved_status) > 0, FALSE);
        }
 }
 
@@ -330,18 +413,62 @@ status_preset_dialog_add_preset (GtkWidget *widget,
                                 EmpathyStatusPresetDialog *self)
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+       GtkTreeModel *model;
+       GtkTreeIter iter;
        GtkWidget *entry;
+       TpConnectionPresenceType state, cstate;
        const char *status;
+       char *cstatus;
+       gboolean valid, match = FALSE;
 
        g_return_if_fail (priv->add_combo_changed);
 
+       model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->add_combobox));
        entry = gtk_bin_get_child (GTK_BIN (priv->add_combobox));
+
        status = gtk_entry_get_text (GTK_ENTRY (entry));
+       gtk_tree_model_get (model, &priv->selected_iter,
+                       PRESETS_STORE_STATE, &state,
+                       -1);
 
-       DEBUG ("ADD PRESET (%i, %s)\n", priv->selected_state, status);
-       empathy_status_presets_set_last (priv->selected_state, status);
+       DEBUG ("ADD PRESET (%i, %s)\n", state, status);
+       empathy_status_presets_set_last (state, status);
+
+       status_preset_dialog_presets_update (self);
+
+       /* select the added status*/
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->presets_treeview));
+       for (valid = gtk_tree_model_get_iter_first (model, &iter);
+             valid;
+             valid = gtk_tree_model_iter_next (model, &iter)) {
+
+               gtk_tree_model_get (model, &iter,
+                               PRESETS_STORE_STATE, &cstate,
+                               PRESETS_STORE_STATUS, &cstatus,
+                               -1);
+
+               match = (cstate == state) && (strcmp (cstatus, status) == 0);
+
+               g_free (cstatus);
+
+               if (match) {
+                       GtkTreePath *path;
+
+                       path = gtk_tree_model_get_path (model, &iter);
+
+                       gtk_tree_selection_select_iter (
+                               gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->presets_treeview)),
+                               &iter);
+                       gtk_tree_view_scroll_to_cell (
+                                       GTK_TREE_VIEW (priv->presets_treeview),
+                                       path, NULL,
+                                       FALSE, 0., 0.);
+                       break;
+               }
+        }
+
+       if (!match) g_warning ("No match");
 
-       status_preset_dialog_setup_presets_update (self);
        status_preset_add_combo_reset (self);
 }
 
@@ -432,12 +559,21 @@ empathy_status_preset_dialog_init (EmpathyStatusPresetDialog *self)
        status_preset_dialog_setup_presets_treeview (self);
        status_preset_dialog_setup_add_combobox (self);
 
-       gtk_box_pack_start(GTK_BOX (GTK_DIALOG (self)->vbox), toplevel_vbox,
-                       TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))),
+           toplevel_vbox, TRUE, TRUE, 0);
 
        g_object_unref (gui);
 }
 
+/**
+ * empathy_status_preset_dialog_new:
+ * @parent: the parent window of this dialog (or NULL)
+ *
+ * Creates a new #EmpathyStatusPresetDialog that allows the user to
+ * add/remove/edit their saved status messages.
+ *
+ * Returns: the newly constructed dialog.
+ */
 GtkWidget *
 empathy_status_preset_dialog_new (GtkWindow *parent)
 {