[geany/geany-plugins] 0c77ad: git-changebar: Don't rely on the caret position too much

Colomban Wendling git-noreply at xxxxx
Sat Aug 19 13:46:17 UTC 2017


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Mon, 22 May 2017 13:06:14 UTC
Commit:      0c77ad778c84209ecf0237bd5f76162a619ef235
             https://github.com/geany/geany-plugins/commit/0c77ad778c84209ecf0237bd5f76162a619ef235

Log Message:
-----------
git-changebar: Don't rely on the caret position too much

Don't rely on the caret position when altering the document to undo a
hunk, and use the hunk position itself instead.

This allows to use the same mechanism anywhere in the document
regardless of the caret position, making the code more easily reusable.


Modified Paths:
--------------
    git-changebar/src/gcb-plugin.c

Modified: git-changebar/src/gcb-plugin.c
26 lines changed, 10 insertions(+), 16 deletions(-)
===================================================================
@@ -123,7 +123,6 @@ struct UndoHunkData {
   guint    doc_id;
   gint     line;
   gboolean found;
-  gboolean first_line_removed;
   gint     old_start;
   gint     old_lines;
   gint     new_start;
@@ -1151,17 +1150,15 @@ undo_hunk_diff_hunk_cb (const git_diff_delta *delta,
                         void                 *udata)
 {
   UndoHunkData *data = udata;
-  gboolean first_line_removed = is_first_line_removed (data->line, hunk->new_start, hunk->new_lines);
-
-  if (first_line_removed ||
+  
+  if (is_first_line_removed (data->line, hunk->new_start, hunk->new_lines) ||
       (data->line >= hunk->new_start &&
        data->line < hunk->new_start + MAX (1, hunk->new_lines))) {
     data->old_start = hunk->old_start;
     data->old_lines = hunk->old_lines;
     data->new_start = hunk->new_start;
     data->new_lines = hunk->new_lines;
     data->found = TRUE;
-    data->first_line_removed = first_line_removed;
     return 1;
   }
   
@@ -1180,33 +1177,30 @@ undo_hunk_cb (const gchar *path,
     diff_buf_to_doc (contents, doc, undo_hunk_diff_hunk_cb, data);
 
     if (data->found) {
-      ScintillaObject *sci = doc->editor->sci;
+      ScintillaObject  *sci   = doc->editor->sci;
+      gint              line  = data->new_start - (data->new_lines ? 1 : 0);
 
       sci_start_undo_action (sci);
 
       if (data->new_lines > 0) {
-        gint pos = sci_get_position_from_line (sci, data->new_start - 1);
+        gint pos = sci_get_position_from_line (sci, line);
         sci_set_target_start (sci, pos);
-        pos = sci_get_position_from_line (sci, data->new_start + data->new_lines - 1);
+        pos = sci_get_position_from_line (sci, line + data->new_lines);
         sci_set_target_end (sci, pos);
         sci_replace_target (sci, "", FALSE);
       }
 
       if (data->old_lines > 0) {
-        gint line = sci_get_current_line (sci);
-        gint pos;
-
-        if (data->new_lines == 0 && !data->first_line_removed) {
-          line++; /* marker for deleted hunk is on previous line except the 1st line */
-        }
-        pos = sci_get_position_from_line (sci, line);
+        gint pos = sci_get_position_from_line (sci, line);
 
         insert_buf_range (doc, contents, pos,
                           data->old_start - 1,
                           data->old_lines);
       }
 
-      sci_scroll_caret (sci);
+      scintilla_send_message (sci, SCI_SCROLLRANGE,
+                              sci_get_position_from_line (sci, line + data->old_lines),
+                              sci_get_position_from_line (sci, line));
 
       sci_end_undo_action (sci);
     }



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list