[gitg/wip/albfan/keyboard-stage] Add keyboard for diff selection
- From: Alberto Fanjul <albfan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg/wip/albfan/keyboard-stage] Add keyboard for diff selection
- Date: Sat, 3 Sep 2022 09:49:46 +0000 (UTC)
commit 876836a02b532b8884ed7d3040d6068c0b4bfe45
Author: Alberto Fanjul <albertofanjul gmail com>
Date: Sat Sep 3 11:48:02 2022 +0200
Add keyboard for diff selection
gitg/commit/gitg-commit.vala | 23 ++++-
libgitg/gitg-diff-view-file-renderer-text.vala | 15 ++++
libgitg/gitg-diff-view-file-selectable.vala | 111 +++++++++++++++++++++----
libgitg/gitg-diff-view.vala | 53 ++++++++++++
libgitg/gitg-sidebar.vala | 16 +++-
5 files changed, 202 insertions(+), 16 deletions(-)
---
diff --git a/gitg/commit/gitg-commit.vala b/gitg/commit/gitg-commit.vala
index cb561a09..d8791490 100644
--- a/gitg/commit/gitg-commit.vala
+++ b/gitg/commit/gitg-commit.vala
@@ -143,14 +143,35 @@ namespace GitgCommit
public bool on_key_pressed (Gdk.EventKey event) {
var mmask = Gtk.accelerator_get_default_mod_mask();
+ var modifiers = event.state;
+ bool control = Gdk.ModifierType.CONTROL_MASK in modifiers;
+ bool shift = Gdk.ModifierType.SHIFT_MASK in modifiers;
- if ((mmask & event.state) == Gdk.ModifierType.CONTROL_MASK)
+ if (control && shift)
+ {
+ if (event.keyval == Gdk.Key.Up)
+ {
+ d_main.diff_view.move_highlight_mark_up ();
+ return true;
+ } else if (event.keyval == Gdk.Key.Down)
+ {
+ d_main.diff_view.move_highlight_mark_down ();
+ return true;
+ }
+ }
+
+ if (control)
{
if ((event.keyval == Gdk.Key.Return || event.keyval == Gdk.Key.KP_Enter))
{
on_commit_clicked ();
return true;
}
+ else if ((event.keyval == Gdk.Key.space || event.keyval == Gdk.Key.KP_Space))
+ {
+ d_main.diff_view.selection_update (shift);
+ return true;
+ }
}
return false;
}
diff --git a/libgitg/gitg-diff-view-file-renderer-text.vala b/libgitg/gitg-diff-view-file-renderer-text.vala
index fe6c15d7..b96ed2a5 100644
--- a/libgitg/gitg-diff-view-file-renderer-text.vala
+++ b/libgitg/gitg-diff-view-file-renderer-text.vala
@@ -260,6 +260,21 @@ class Gitg.DiffViewFileRendererText : Gtk.SourceView, DiffSelectable, DiffViewFi
highlight = true;
}
+ public void move_highlight_mark_down ()
+ {
+ d_selectable.move_highlight_mark_down ();
+ }
+
+ public void move_highlight_mark_up ()
+ {
+ d_selectable.move_highlight_mark_up ();
+ }
+
+ public void selection_update (bool shiftPressed)
+ {
+ d_selectable.selection_update (shiftPressed);
+ }
+
protected override void dispose()
{
base.dispose();
diff --git a/libgitg/gitg-diff-view-file-selectable.vala b/libgitg/gitg-diff-view-file-selectable.vala
index c80fe9a5..b18d9920 100644
--- a/libgitg/gitg-diff-view-file-selectable.vala
+++ b/libgitg/gitg-diff-view-file-selectable.vala
@@ -26,6 +26,7 @@ enum Gitg.DiffSelectionMode {
class Gitg.DiffViewFileSelectable : Object
{
private string d_selection_category = "selection";
+ private string d_highlight_category = "highlight";
private Gtk.TextTag d_selection_tag;
private DiffSelectionMode d_selection_mode;
private Gtk.TextMark d_start_selection_mark;
@@ -138,7 +139,10 @@ class Gitg.DiffViewFileSelectable : Object
private void update_theme()
{
var selection_attributes = new Gtk.SourceMarkAttributes();
+ var highlight_attributes = new Gtk.SourceMarkAttributes();
+ highlight_attributes.icon_name = "pan-end-symbolic";
var context = source_view.get_style_context();
+ source_view.show_line_marks = true;
Gdk.RGBA theme_selected_bg_color, theme_selected_fg_color;
@@ -146,13 +150,14 @@ class Gitg.DiffViewFileSelectable : Object
{
selection_attributes.background = theme_selected_bg_color;
}
-
+
if (context.lookup_color("theme_selected_fg_color", out theme_selected_fg_color))
{
d_selection_tag.foreground_rgba = theme_selected_fg_color;
}
- source_view.set_mark_attributes(d_selection_category, selection_attributes, 0);
+ source_view.set_mark_attributes(d_highlight_category, highlight_attributes, 0);
+ source_view.set_mark_attributes(d_selection_category, selection_attributes, 1);
}
private bool get_line_selected(Gtk.TextIter iter)
@@ -273,6 +278,11 @@ class Gitg.DiffViewFileSelectable : Object
}
buffer.apply_tag(d_selection_tag, current, line_end);
+ Gtk.TextIter start_iter, end_iter;
+ buffer.get_start_iter (out start_iter);
+ buffer.get_end_iter (out end_iter);
+ buffer.remove_source_marks (start_iter, end_iter,
d_highlight_category);
+ buffer.create_source_mark(null, d_highlight_category, current);
}
}
@@ -359,6 +369,80 @@ class Gitg.DiffViewFileSelectable : Object
update_selection_range(iter, end, select);
}
+ public void move_highlight_mark_up() {
+ Gtk.TextIter start_iter, end_iter;
+ var buffer = source_view.buffer as Gtk.SourceBuffer;
+ buffer.get_start_iter (out start_iter);
+ buffer.get_end_iter (out end_iter);
+
+ Gtk.TextIter iter;
+ buffer.get_start_iter (out iter);
+ if (buffer.forward_iter_to_source_mark (ref iter, d_highlight_category))
+ {
+ iter.backward_line ();
+ }
+ while (iter.get_line () >= start_iter.get_line ())
+ {
+ if (get_line_is_diff(iter))
+ {
+ buffer.remove_source_marks (start_iter, end_iter, d_highlight_category);
+ buffer.create_source_mark(null, d_highlight_category, iter);
+ break;
+ }
+ if (!iter.backward_line ())
+ {
+ break;
+ }
+ }
+ }
+
+ public void move_highlight_mark_down() {
+ Gtk.TextIter start_iter, end_iter;
+ var buffer = source_view.buffer as Gtk.SourceBuffer;
+ buffer.get_start_iter (out start_iter);
+ buffer.get_end_iter (out end_iter);
+
+ Gtk.TextIter iter;
+ buffer.get_start_iter(out iter);
+ if (buffer.forward_iter_to_source_mark (ref iter, d_highlight_category))
+ {
+ iter.forward_line ();
+ }
+ while (iter.get_line () <= end_iter.get_line ())
+ {
+ if (get_line_is_diff(iter))
+ {
+ buffer.remove_source_marks (start_iter, end_iter, d_highlight_category);
+ buffer.create_source_mark(null, d_highlight_category, iter);
+ break;
+ }
+ if (!iter.forward_line ())
+ {
+ break;
+ }
+ }
+ }
+
+ public void selection_update(bool shiftPressed)
+ {
+ var buffer = source_view.buffer as Gtk.SourceBuffer;
+ Gtk.TextIter iter;
+ buffer.get_start_iter (out iter);
+ if (buffer.forward_iter_to_source_mark (ref iter, d_highlight_category))
+ {
+ if (shiftPressed)
+ {
+ update_selection(iter);
+ }
+ else
+ {
+ toggle_selection(iter);
+ }
+ update_has_selection();
+ //TODO: Allow to highlight hunks to select them with shortcuts
+ }
+ }
+
private bool button_press_event_on_view(Gdk.EventButton event)
{
if (event.button != 1)
@@ -375,7 +459,9 @@ class Gitg.DiffViewFileSelectable : Object
var buffer = source_view.buffer;
- if ((event.state & Gdk.ModifierType.SHIFT_MASK) != 0)
+ var mmask = Gtk.accelerator_get_default_mod_mask();
+
+ if ((mmask & event.state) == Gdk.ModifierType.SHIFT_MASK)
{
update_selection(iter);
return true;
@@ -388,17 +474,16 @@ class Gitg.DiffViewFileSelectable : Object
}
d_is_rubber_band = true;
+ toggle_selection(iter);
+ return true;
+ }
- var select = !get_line_selected(iter);
+ private void toggle_selection(Gtk.TextIter iter)
+ {
+ var buffer = source_view.buffer;
+ var select = get_line_selected(iter);
- if (select)
- {
- d_selection_mode = DiffSelectionMode.SELECTING;
- }
- else
- {
- d_selection_mode = DiffSelectionMode.DESELECTING;
- }
+ d_selection_mode = select ? DiffSelectionMode.DESELECTING : DiffSelectionMode.SELECTING;
d_originally_selected.clear();
@@ -406,8 +491,6 @@ class Gitg.DiffViewFileSelectable : Object
buffer.move_mark(d_end_selection_mark, iter);
update_selection(iter);
-
- return true;
}
private void update_selection(Gtk.TextIter cursor)
diff --git a/libgitg/gitg-diff-view.vala b/libgitg/gitg-diff-view.vala
index 0894bd26..630709a6 100644
--- a/libgitg/gitg-diff-view.vala
+++ b/libgitg/gitg-diff-view.vala
@@ -1070,6 +1070,59 @@ public class Gitg.DiffView : Gtk.Grid
}
}
+ public void move_highlight_mark_down ()
+ {
+ //TODO: select only the current one
+ //TODO: There's a selection for any of them
+ //TODO: Remove all this pile of function call
+ //Make sure highlight file is shown (scroll)
+ foreach (var file in d_grid_files.get_children())
+ {
+ var renderer_list = (file as Gitg.DiffViewFile).renderer_list;
+ foreach (DiffViewFileRenderer renderer in renderer_list)
+ {
+ var renderer_text = renderer as DiffViewFileRendererText;
+ if(renderer_text == null)
+ continue;
+ renderer_text.move_highlight_mark_down ();
+ }
+ break;
+ }
+ }
+
+ public void move_highlight_mark_up ()
+ {
+ //TODO: select only the current one
+ foreach (var file in d_grid_files.get_children())
+ {
+ var renderer_list = (file as Gitg.DiffViewFile).renderer_list;
+ foreach (DiffViewFileRenderer renderer in renderer_list)
+ {
+ var renderer_text = renderer as DiffViewFileRendererText;
+ if(renderer_text == null)
+ continue;
+ renderer_text.move_highlight_mark_up ();
+ }
+ break;
+ }
+ }
+
+ public void selection_update (bool shiftPressed)
+ {
+ //TODO: select only the current one
+ foreach (var file in d_grid_files.get_children())
+ {
+ var renderer_list = (file as Gitg.DiffViewFile).renderer_list;
+ foreach (DiffViewFileRenderer renderer in renderer_list)
+ {
+ var renderer_text = renderer as DiffViewFileRendererText;
+ if(renderer_text == null)
+ continue;
+ renderer_text.selection_update (shiftPressed);
+ }
+ break;
+ }
+ }
private void update_hide_show_options(Gdk.Window window, int ex, int ey)
{
void *data;
diff --git a/libgitg/gitg-sidebar.vala b/libgitg/gitg-sidebar.vala
index deebbeae..f20c14ef 100644
--- a/libgitg/gitg-sidebar.vala
+++ b/libgitg/gitg-sidebar.vala
@@ -423,7 +423,21 @@ public class Sidebar : Gtk.TreeView
protected override bool key_press_event(Gdk.EventKey event)
{
- if ((event.state & Gtk.accelerator_get_default_mod_mask()) != 0)
+ var mmask = Gtk.accelerator_get_default_mod_mask();
+ var modifiers = event.state;
+
+ if (Gdk.ModifierType.CONTROL_MASK in modifiers && Gdk.ModifierType.SHIFT_MASK in modifiers
+ && (event.keyval == Gdk.Key.Up || event.keyval == Gdk.Key.Down))
+ {
+ return false;
+ }
+
+ if (Gdk.ModifierType.CONTROL_MASK in modifiers && (event.keyval == Gdk.Key.space ||
event.keyval == Gdk.Key.KP_Space))
+ {
+ return false;
+ }
+
+ if ((event.state & mmask) != 0)
{
return base.key_press_event(event);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]