[sound-juicer] Focus default cell before moving cursor



commit abf793e612d052f59ac00cc05771c8a49ea00603
Author: Phillip Wood <phillip wood dunelm org uk>
Date:   Sun Jul 13 18:48:04 2014 +0100

    Focus default cell before moving cursor
    
    If GtkTreeView::move-cursor is called when the cursor isn't currently
    set then focus the default cell. This avoids the cursor being moved
    before it is shown.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=151469

 src/sj-tree-view.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)
---
diff --git a/src/sj-tree-view.c b/src/sj-tree-view.c
index 80bdc8d..472e5f9 100644
--- a/src/sj-tree-view.c
+++ b/src/sj-tree-view.c
@@ -101,6 +101,48 @@ sj_tree_view_start_editing (GtkTreeView *self)
     g_signal_emit_by_name (self, "select-cursor-row", TRUE, &ret);
 }
 
+/**
+ * Focus the default cell if no cell has the focus
+ */
+static void
+sj_tree_view_focus_default_cell (GtkTreeView *self)
+{
+  GtkTreePath *path;
+  GtkTreeViewColumn *column;
+  GtkCellRenderer *renderer;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+
+  gtk_tree_view_get_cursor (self, &path, &column);
+  model = gtk_tree_view_get_model (self);
+
+  if (path == NULL) {
+    if (model != NULL && gtk_tree_model_get_iter_first (model, &iter))
+      path = gtk_tree_model_get_path (model, &iter);
+    else
+      return;
+  }
+  if (column == NULL) {
+    GList *list = gtk_tree_view_get_columns (self);
+    column = list->data;
+    g_list_free (list);
+    list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+    renderer = list->data;
+    g_list_free (list);
+  } else {
+    GtkCellArea *area;
+    area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (column));
+    renderer = gtk_cell_area_get_focus_cell (area);
+    if (renderer == NULL) {
+      GList *list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+      renderer = list->data;
+      g_list_free (list);
+    }
+  }
+
+  gtk_tree_view_set_cursor_on_cell (self, path, column, renderer, FALSE);
+  gtk_tree_path_free (path);
+}
 
 /**
  * Stop editing, move cursor up/down.
@@ -289,6 +331,14 @@ sj_tree_view_move_cursor (GtkTreeView     *self,
                        step == GTK_MOVEMENT_PAGES ||
                        step == GTK_MOVEMENT_BUFFER_ENDS, FALSE);
 
+  gtk_tree_view_get_cursor (self, &path, &column);
+  if (path == NULL || column == NULL) {
+    sj_tree_view_focus_default_cell (self);
+    gtk_tree_path_free (path);
+    return TRUE;
+  }
+  gtk_tree_path_free (path);
+
   start_editing = sj_tree_view_is_editing (self);
 
   switch (step) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]