[sound-juicer/wip/better-editing: 7/13] Add vertical movement to SjTreeView



commit 77d0456272099564e90d3160f86e20964d6da8cc
Author: Phillip Wood <phillip wood dunelm org uk>
Date:   Fri May 9 11:16:14 2014 +0100

    Add vertical movement to SjTreeView
    
    When trying to move vertically check if it's possible to move before
    stopping editing. If the current cell is being edited start editing
    the next cell after moving.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=151469

 src/sj-tree-view.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 1 deletions(-)
---
diff --git a/src/sj-tree-view.c b/src/sj-tree-view.c
index 2aa9f0a..ce68f92 100644
--- a/src/sj-tree-view.c
+++ b/src/sj-tree-view.c
@@ -101,6 +101,49 @@ sj_tree_view_start_editing (GtkTreeView *self)
     g_signal_emit_by_name (self, "select-cursor-row", TRUE, &ret);
 }
 
+
+/**
+ * Stop editing, move cursor up/down.
+ */
+static gboolean
+move_vertical (GtkTreeView     *self,
+               GtkMovementStep  step,
+               int              count)
+{
+  GtkTreeIter iter;
+  GtkTreePath *path;
+  GtkTreeModel *model;
+
+  g_return_val_if_fail (count != 0, FALSE);
+  g_return_val_if_fail (step == GTK_MOVEMENT_DISPLAY_LINES ||
+                        step == GTK_MOVEMENT_PAGES ||
+                        step == GTK_MOVEMENT_BUFFER_ENDS, FALSE);
+
+  model = gtk_tree_view_get_model (self);
+  gtk_tree_view_get_cursor (self, &path, NULL);
+  if (path == NULL || !gtk_tree_model_get_iter (model, &iter, path)) {
+    gtk_tree_path_free (path);
+    return FALSE;
+  }
+  gtk_tree_path_free (path);
+
+  if (count < 0) {
+    if (!gtk_tree_model_iter_previous (model, &iter)) {
+      return FALSE; /* Do nothing if we are already at the top */
+    }
+  } else {
+    if (!gtk_tree_model_iter_next (model, &iter)) {
+      return FALSE; /* Do nothing if we are already at the bottom */
+    }
+  }
+
+  /* We have to explicitly stop editing to ensure that self has the
+     keyboard focus before calling parent_class->move_cursor */
+  sj_tree_view_stop_editing (self);
+  parent_class->move_cursor (self, step, count);
+  return TRUE;
+}
+
 /**
  * Find the next activatable column in the given direction and return
  * the column index and row offset. Wrap up/down. Assume activatable
@@ -241,7 +284,10 @@ sj_tree_view_move_cursor (GtkTreeView     *self,
 
   g_return_val_if_fail (GTK_IS_TREE_VIEW (self), FALSE);
   g_return_val_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS ||
-                        step == GTK_MOVEMENT_VISUAL_POSITIONS, FALSE);
+                       step == GTK_MOVEMENT_VISUAL_POSITIONS ||
+                       step == GTK_MOVEMENT_DISPLAY_LINES ||
+                       step == GTK_MOVEMENT_PAGES ||
+                       step == GTK_MOVEMENT_BUFFER_ENDS, FALSE);
 
   start_editing = sj_tree_view_is_editing (self);
 
@@ -267,6 +313,11 @@ sj_tree_view_move_cursor (GtkTreeView     *self,
       g_return_val_if_reached (FALSE);
     }
     break;
+  case GTK_MOVEMENT_DISPLAY_LINES:
+  case GTK_MOVEMENT_PAGES:
+  case GTK_MOVEMENT_BUFFER_ENDS:
+    moved = move_vertical (self, step, count);
+    break;
   default:
     g_return_val_if_reached (FALSE);
   }


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