Updating branch refs/heads/master
         to 58b85e2a739ffc11575b53173392c1909c9d323d (commit)
       from a8e4f4fe7e438234f918a7b3862eb397312808ae (commit)

commit 58b85e2a739ffc11575b53173392c1909c9d323d
Author: Mike Massonnet <[email protected]>
Date:   Thu May 27 23:57:08 2010 +0200

    Get the tree view columns reorderable
    
    The tree view columns can be reordered, the state will be saved in the
    configuration and reloaded at next start.

 src/process-tree-view.c |   96 +++++++++++++++++++++++++++++++++++++++-------
 src/settings.c          |    3 +
 2 files changed, 84 insertions(+), 15 deletions(-)

diff --git a/src/process-tree-view.c b/src/process-tree-view.c
index 8e1dc19..afc761d 100644
--- a/src/process-tree-view.c
+++ b/src/process-tree-view.c
@@ -21,8 +21,7 @@
 
 
 
-/* Static positions of columns in tree view */
-// TODO get the columns reorderable (more tree view hell)
+/* Tree view columns */
 enum
 {
        COLUMN_COMMAND = 0,
@@ -34,6 +33,7 @@ enum
        COLUMN_UID,
        COLUMN_CPU,
        COLUMN_PRIORITY,
+       N_COLUMNS,
 };
 
 typedef struct _XtmProcessTreeViewClass XtmProcessTreeViewClass;
@@ -48,6 +48,7 @@ struct _XtmProcessTreeView
        GtkListStore *          model;
        GtkTreeModel *          model_filter;
        GtkTreeViewColumn *     sort_column;
+       gushort                 columns_positions[N_COLUMNS];
        XtmSettings *           settings;
        guint                   owner_uid;
        gboolean                show_all_processes_cached;
@@ -55,6 +56,9 @@ struct _XtmProcessTreeView
 G_DEFINE_TYPE (XtmProcessTreeView, xtm_process_tree_view, GTK_TYPE_TREE_VIEW)
 
 static gboolean                treeview_clicked                                
(XtmProcessTreeView *treeview, GdkEventButton *event);
+static void            columns_changed                                 
(XtmProcessTreeView *treeview);
+static void            read_columns_positions                          
(XtmProcessTreeView *treeview);
+static void            save_columns_positions                          
(XtmProcessTreeView *treeview);
 static void            column_clicked                                  
(GtkTreeViewColumn *column, XtmProcessTreeView *treeview);
 static gboolean                visible_func                                    
(GtkTreeModel *model, GtkTreeIter *iter, XtmProcessTreeView *treeview);
 static gboolean                search_func                                     
(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, 
gpointer user_data);
@@ -103,24 +107,27 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        cell_cmdline = gtk_cell_renderer_text_new ();
        g_object_set (cell_cmdline, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 
+       /* Retrieve initial tree view columns positions */
+       read_columns_positions (treeview);
+
        /* Create tree view columns */
-#define COLUMN_PROPERTIES "expand", TRUE, "clickable", TRUE, "reorderable", 
FALSE, "resizable", TRUE, "visible", TRUE
+#define COLUMN_PROPERTIES "expand", TRUE, "clickable", TRUE, "reorderable", 
TRUE, "resizable", TRUE, "visible", TRUE
        column = gtk_tree_view_column_new_with_attributes (_("Task"), 
cell_cmdline, "text", XTM_PTV_COLUMN_COMMAND, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
        g_object_set (column, COLUMN_PROPERTIES, NULL);
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_COMMAND));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_COMMAND));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_COMMAND]);
 
 #undef COLUMN_PROPERTIES
-#define COLUMN_PROPERTIES "expand", FALSE, "clickable", TRUE, "reorderable", 
FALSE, "resizable", TRUE, "visible", visible
+#define COLUMN_PROPERTIES "expand", FALSE, "clickable", TRUE, "reorderable", 
TRUE, "resizable", TRUE, "visible", visible
        g_object_get (treeview->settings, "column-pid", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("PID"), 
cell_right_aligned, "text", XTM_PTV_COLUMN_PID, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
        g_object_set (column, COLUMN_PROPERTIES, NULL);
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_PID));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_PID));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_PID]);
 
        g_object_get (treeview->settings, "column-ppid", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("PPID"), 
cell_right_aligned, "text", XTM_PTV_COLUMN_PPID, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -128,7 +135,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_PPID));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_PPID));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_PPID]);
 
        g_object_get (treeview->settings, "column-state", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("State"), 
cell_text, "text", XTM_PTV_COLUMN_STATE, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -137,7 +144,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_STATE));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_STATE));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_STATE]);
 
        g_object_get (treeview->settings, "column-vsz", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("VSZ"), 
cell_right_aligned, "text", XTM_PTV_COLUMN_VSZ_STR, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -145,7 +152,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_VSZ));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_VSZ));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_VSZ]);
 
        g_object_get (treeview->settings, "column-rss", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("RSS"), 
cell_right_aligned, "text", XTM_PTV_COLUMN_RSS_STR, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -153,7 +160,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_RSS));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_RSS));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_RSS]);
 
        g_object_get (treeview->settings, "column-uid", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("UID"), cell_text, 
"text", XTM_PTV_COLUMN_UID_STR, "cell-background", XTM_PTV_COLUMN_BACKGROUND, 
"foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -161,7 +168,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_UID));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_UID));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_UID]);
 
        g_object_get (treeview->settings, "column-cpu", &visible, NULL);
        column = gtk_tree_view_column_new_with_attributes (_("CPU"), 
cell_right_aligned, "text", XTM_PTV_COLUMN_CPU_STR, "cell-background", 
XTM_PTV_COLUMN_BACKGROUND, "foreground", XTM_PTV_COLUMN_FOREGROUND, NULL);
@@ -169,7 +176,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_CPU));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_CPU));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_CPU]);
 
        g_object_get (treeview->settings, "column-priority", &visible, NULL);
        /* TRANSLATORS: “Prio.” is short for Priority, it appears in the tree 
view header. */
@@ -178,7 +185,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER 
(XTM_PTV_COLUMN_PRIORITY));
        g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER 
(COLUMN_PRIORITY));
        g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), 
treeview);
-       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (treeview), column, 
treeview->columns_positions[COLUMN_PRIORITY]);
 
        /* Set initial sort column */
        {
@@ -186,7 +193,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
                GtkSortType sort_type;
 
                g_object_get (treeview->settings, "sort-column-id", 
&sort_column_id, "sort-type", &sort_type, NULL);
-               treeview->sort_column = gtk_tree_view_get_column (GTK_TREE_VIEW 
(treeview), sort_column_id);
+               treeview->sort_column = gtk_tree_view_get_column (GTK_TREE_VIEW 
(treeview), treeview->columns_positions[sort_column_id]);
                gtk_tree_view_column_set_sort_indicator (treeview->sort_column, 
TRUE);
                gtk_tree_view_column_set_sort_order (treeview->sort_column, 
sort_type);
                sort_column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT 
(treeview->sort_column), "sort-column-id"));
@@ -194,6 +201,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
        }
 
        gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (treeview), 
(GtkTreeViewSearchEqualFunc)search_func, NULL, NULL);
+       g_signal_connect (treeview, "columns-changed", G_CALLBACK 
(columns_changed), NULL);
        g_signal_connect (treeview, "button-press-event", G_CALLBACK 
(treeview_clicked), NULL);
 }
 
@@ -202,6 +210,64 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
  */
 
 static void
+columns_changed (XtmProcessTreeView *treeview)
+{
+       GList *columns, *l;
+       GtkTreeViewColumn *column;
+       gint column_id;
+       gint i;
+
+       columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (treeview));
+       for (l = columns, i = 0; l != NULL; l = l->next, i++)
+       {
+               column = GTK_TREE_VIEW_COLUMN (l->data);
+               column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT 
(column), "column-id"));
+               treeview->columns_positions[column_id] = i;
+       }
+       g_list_free (columns);
+
+       save_columns_positions (treeview);
+}
+
+static void
+read_columns_positions (XtmProcessTreeView *treeview)
+{
+       gint i;
+       gchar *columns_positions;
+       gchar **columns_positions_split;
+
+       g_object_get (treeview->settings, "columns-positions", 
&columns_positions, NULL);
+
+       if (columns_positions == NULL)
+       {
+               for (i = 0; i < N_COLUMNS; i++)
+                       treeview->columns_positions[i] = i;
+       }
+       else
+       {
+               columns_positions_split = g_strsplit (columns_positions, ";", 
N_COLUMNS + 1);
+               for (i = 0; columns_positions_split[i] != NULL && i < 
N_COLUMNS; i++)
+                       treeview->columns_positions[i] = (gint)g_ascii_strtoll 
(columns_positions_split[i], NULL, 10);
+               g_strfreev (columns_positions_split);
+               g_free (columns_positions);
+       }
+}
+
+static void
+save_columns_positions (XtmProcessTreeView *treeview)
+{
+       gint i;
+       gint offset = 0;
+#define COLUMNS_POSITIONS_STRLEN (N_COLUMNS * 4 + 1)
+       gchar columns_positions[COLUMNS_POSITIONS_STRLEN] = { 0 };
+
+       for (i = 0; i < N_COLUMNS; i++)
+               offset += g_snprintf (&columns_positions[offset], 
COLUMNS_POSITIONS_STRLEN - offset, "%d;", treeview->columns_positions[i]);
+
+       g_object_set (treeview->settings, "columns-positions", 
columns_positions, NULL);
+}
+
+static void
 cb_send_signal (GtkMenuItem *mi, gpointer user_data)
 {
        GtkWidget *dialog;
@@ -451,7 +517,7 @@ settings_changed (GObject *object, GParamSpec *pspec, 
XtmProcessTreeView *treevi
                        column_id = COLUMN_PRIORITY;
 
                g_object_get (object, pspec->name, &visible, NULL);
-               gtk_tree_view_column_set_visible (gtk_tree_view_get_column 
(GTK_TREE_VIEW (treeview), column_id), visible);
+               gtk_tree_view_column_set_visible (gtk_tree_view_get_column 
(GTK_TREE_VIEW (treeview), treeview->columns_positions[column_id]), visible);
        }
        else if (!g_strcmp0 (pspec->name, "show-all-processes"))
        {
diff --git a/src/settings.c b/src/settings.c
index e4ec0b6..37daf3d 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -36,6 +36,7 @@ enum
        PROP_FULL_COMMAND_LINE,
        PROP_SHOW_STATUS_ICON,
        PROP_REFRESH_RATE,
+       PROP_COLUMNS_POSITIONS,
        PROP_COLUMN_UID,
        PROP_COLUMN_PID,
        PROP_COLUMN_PPID,
@@ -89,6 +90,8 @@ xtm_settings_class_init (XtmSettingsClass *klass)
                g_param_spec_boolean ("show-status-icon", "ShowStatusIcon", 
"Show/hide the status icon", TRUE, G_PARAM_READWRITE));
        g_object_class_install_property (class, PROP_REFRESH_RATE,
                g_param_spec_uint ("refresh-rate", "RefreshRate", "Refresh rate 
in milliseconds", 0, G_MAXUINT, 750, G_PARAM_READWRITE));
+       g_object_class_install_property (class, PROP_COLUMNS_POSITIONS,
+               g_param_spec_string ("columns-positions", "ColumnsPositions", 
"Positions of the tree view columns", NULL, G_PARAM_READWRITE));
        g_object_class_install_property (class, PROP_COLUMN_UID,
                g_param_spec_boolean ("column-uid", "ColumnUID", "Show column 
UID", FALSE, G_PARAM_READWRITE));
        g_object_class_install_property (class, PROP_COLUMN_PID,
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to