Compare commits

...

4 Commits

Author SHA1 Message Date
Ghost User
858e3f8b88 Merge branch 'wip/albfan/keyboard-stage' into 'master'
WIP: Stage selection improvements

See merge request GNOME/gitg!114
2024-06-21 22:24:21 +00:00
Yuri Chornoivan
7121d995ee Update Ukrainian translation 2024-06-20 15:38:33 +00:00
Martin
99f29c5cc9 Update Slovenian translation 2024-06-19 22:03:56 +00:00
Alberto Fanjul
8cc5fd7d1a Add keyboard for diff selection 2022-10-01 12:51:34 +02:00
8 changed files with 294 additions and 49 deletions

View File

@ -143,14 +143,43 @@ 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;
} else if (event.keyval == Gdk.Key.Right)
{
d_main.diff_view.move_highlight_mark_right ();
return true;
} else if (event.keyval == Gdk.Key.Left)
{
d_main.diff_view.move_highlight_mark_left ();
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;
}

View File

@ -25,8 +25,8 @@ class Gitg.DiffViewFileRendererTextSplit : Gtk.Box, DiffSelectable, DiffViewFile
[GtkChild( name = "scroll_right" )]
private unowned Gtk.ScrolledWindow d_scroll_right;
private Gitg.DiffViewFileRendererText d_renderer_left;
private Gitg.DiffViewFileRendererText d_renderer_right;
public Gitg.DiffViewFileRendererText d_renderer_left;
public Gitg.DiffViewFileRendererText d_renderer_right;
public DiffViewFileInfo info { get; construct set; }
@ -107,12 +107,6 @@ class Gitg.DiffViewFileRendererTextSplit : Gtk.Box, DiffSelectable, DiffViewFile
d_scroll_right.add(d_renderer_right);
}
construct
{
//can_select = d_renderer_left.can_select() || d_renderer_right.can_select();
can_select = false;
}
public void add_hunk(Ggit.DiffHunk hunk, Gee.ArrayList<Ggit.DiffLine> lines)
{
d_renderer_left.add_hunk(hunk, lines);
@ -123,8 +117,7 @@ class Gitg.DiffViewFileRendererTextSplit : Gtk.Box, DiffSelectable, DiffViewFile
{
get
{
//return d_renderer_left.has_selection() || d_renderer_right.has_selection();
return false;
return d_renderer_left.has_selection || d_renderer_right.has_selection;
}
}
@ -132,17 +125,21 @@ class Gitg.DiffViewFileRendererTextSplit : Gtk.Box, DiffSelectable, DiffViewFile
{
}
public bool can_select { get; construct set; }
public bool can_select {
get {
return d_renderer_left.can_select || d_renderer_right.can_select;
}
construct set {}
}
public PatchSet selection
{
owned get
{
/*if (d_renderer_left.has_selection())
return d_renderer_left.get_selection();
if (d_renderer_right.has_selection())
return d_renderer_right.get_selection();
*/
if (d_renderer_left.has_selection)
return d_renderer_left.selection;
if (d_renderer_right.has_selection)
return d_renderer_right.selection;
return new PatchSet();
}
}

View File

@ -185,7 +185,7 @@ class Gitg.DiffViewFileRendererText : Gtk.SourceView, DiffSelectable, DiffViewFi
public DiffViewFileRendererText(DiffViewFileInfo info, bool can_select, Style style)
{
Object(info: info, can_select: can_select, d_style: style);
Object(info: info, can_select: can_select, d_style: style, show_line_marks: true);
}
construct
@ -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();
@ -652,6 +667,7 @@ class Gitg.DiffViewFileRendererText : Gtk.SourceView, DiffSelectable, DiffViewFi
var header_attributes = new Gtk.SourceMarkAttributes();
var added_attributes = new Gtk.SourceMarkAttributes();
var removed_attributes = new Gtk.SourceMarkAttributes();
var empty_attributes = new Gtk.SourceMarkAttributes();
var dark = new Theme().is_theme_dark();
@ -671,6 +687,7 @@ class Gitg.DiffViewFileRendererText : Gtk.SourceView, DiffSelectable, DiffViewFi
this.set_mark_attributes("header", header_attributes, 0);
this.set_mark_attributes("added", added_attributes, 0);
this.set_mark_attributes("removed", removed_attributes, 0);
this.set_mark_attributes("empty", empty_attributes, 0);
}
protected override void constructed()

View File

@ -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,6 +139,8 @@ 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();
Gdk.RGBA theme_selected_bg_color, theme_selected_fg_color;
@ -146,13 +149,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 +277,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 +368,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 +458,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 +473,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 +490,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)

View File

@ -1070,6 +1070,95 @@ 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)
{
Gitg.DiffViewFileRendererText renderer_text = null;
if (renderer is DiffViewFileRendererText)
renderer_text = renderer as DiffViewFileRendererText;
else if (renderer is DiffViewFileRendererTextSplit) {
if (left)
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_left;
else
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_right;
}
if(renderer_text == null) {
continue;
}
renderer_text.move_highlight_mark_down ();
}
}
}
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)
{
Gitg.DiffViewFileRendererText renderer_text = null;
if (renderer is DiffViewFileRendererText)
renderer_text = renderer as DiffViewFileRendererText;
else if (renderer is DiffViewFileRendererTextSplit) {
if (left)
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_left;
else
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_right;
}
if(renderer_text == null) {
continue;
}
renderer_text.move_highlight_mark_up ();
}
}
}
bool left = true;
public void move_highlight_mark_right ()
{
left = false;
}
public void move_highlight_mark_left ()
{
left = true;
}
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)
{
Gitg.DiffViewFileRendererText renderer_text = null;
if (renderer is DiffViewFileRendererText)
renderer_text = renderer as DiffViewFileRendererText;
else if (renderer is DiffViewFileRendererTextSplit) {
if (left)
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_left;
else
renderer_text = (renderer as DiffViewFileRendererTextSplit).d_renderer_right;
}
if(renderer_text == null) {
continue;
}
renderer_text.selection_update (shiftPressed);
}
}
}
private void update_hide_show_options(Gdk.Window window, int ex, int ey)
{
void *data;

View File

@ -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);
}

View File

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitg master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gitg/issues\n"
"POT-Creation-Date: 2024-04-01 21:44+0000\n"
"PO-Revision-Date: 2024-04-02 10:33+0200\n"
"POT-Creation-Date: 2024-06-19 10:42+0000\n"
"PO-Revision-Date: 2024-06-20 00:03+0200\n"
"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: sl_SI\n"
@ -1499,7 +1499,7 @@ msgstr "Izbor predmetov"
msgid "“%s” is not a Git repository."
msgstr "Mesto »%s« ni skladišče Git."
#: gitg/gitg-window.vala:1245
#: gitg/gitg-window.vala:1243
msgid ""
"Your user name and email are not configured yet. Please go to the user "
"configuration and provide your name and email."
@ -1507,14 +1507,14 @@ msgstr ""
"Uporabniško ime in elektronski naslov še nista nastavljena. Ta in druge "
"podatke uporabnika je mogoče vpisati med nastavitvami uporabnika."
#: gitg/gitg-window.vala:1249
#: gitg/gitg-window.vala:1247
msgid ""
"Your user name is not configured yet. Please go to the user configuration "
"and provide your name."
msgstr ""
"Vaše ime še ni nastavljeno. Odprite nastavitve uporabnika in vnesite podatek."
#: gitg/gitg-window.vala:1253
#: gitg/gitg-window.vala:1251
msgid ""
"Your email is not configured yet. Please go to the user configuration and "
"provide your email."
@ -1522,7 +1522,7 @@ msgstr ""
"Vaš elektronski naslov še ni nastavljen. Odprite nastavitve uporabnika in "
"vnesite podatek."
#: gitg/gitg-window.vala:1256
#: gitg/gitg-window.vala:1254
msgid "Missing author details"
msgstr "Manjkajo podrobnosti avtorja"
@ -2160,6 +2160,14 @@ msgstr "Najdi besedo ali niz"
msgid "General settings and options"
msgstr "Splošne nastavitve in možnosti"
#: gitg/resources/ui/gitg-window.ui:266
msgid "Previous result"
msgstr "Prejšnji rezultat"
#: gitg/resources/ui/gitg-window.ui:282
msgid "Next result"
msgstr "Naslednji rezultat"
#. Translators: %s will be replaced with a URL indicating the resource
#. for which the authentication is required.
#: libgitg/gitg-authentication-dialog.vala:69

View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitg\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gitg/issues\n"
"POT-Creation-Date: 2024-04-01 21:44+0000\n"
"PO-Revision-Date: 2024-04-02 09:42+0300\n"
"POT-Creation-Date: 2024-06-19 10:42+0000\n"
"PO-Revision-Date: 2024-06-20 18:38+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian\n"
"Language: uk\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 23.04.1\n"
"X-Generator: Lokalize 23.04.3\n"
#: contrib/xml/xml-reader.c:327
#, c-format
@ -999,8 +999,8 @@ msgstr "Перевизначення загальних параметрів с
msgid ""
"Disable override will clean existing local author details. Are you sure?"
msgstr ""
"Вимикання перевизначення призведе до вилучення наявних локальних даних щодо"
" авторства. Ви впевнені?"
"Вимикання перевизначення призведе до вилучення наявних локальних даних щодо "
"авторства. Ви впевнені?"
# Не вдалося створити тег
#: gitg/gitg-author-details-dialog.vala:228
@ -1619,7 +1619,7 @@ msgstr "Вибрати елементи"
msgid "“%s” is not a Git repository."
msgstr "«%s» — не сховище Git."
#: gitg/gitg-window.vala:1245
#: gitg/gitg-window.vala:1243
msgid ""
"Your user name and email are not configured yet. Please go to the user "
"configuration and provide your name and email."
@ -1627,7 +1627,7 @@ msgstr ""
"Ще не налаштовано користувача та пошту. Перейдіть у користувацькі параметри "
"і вкажіть їх."
#: gitg/gitg-window.vala:1249
#: gitg/gitg-window.vala:1247
msgid ""
"Your user name is not configured yet. Please go to the user configuration "
"and provide your name."
@ -1635,7 +1635,7 @@ msgstr ""
"Ще не налаштовано користувача. Перейдіть у користувацькі параметри і вкажіть "
"його."
#: gitg/gitg-window.vala:1253
#: gitg/gitg-window.vala:1251
msgid ""
"Your email is not configured yet. Please go to the user configuration and "
"provide your email."
@ -1643,7 +1643,7 @@ msgstr ""
"Ще не налаштовано пошту. Перейдіть у користувацькі параметри і вкажіть її."
# Детальна інформація
#: gitg/gitg-window.vala:1256
#: gitg/gitg-window.vala:1254
msgid "Missing author details"
msgstr "Немає подробиць щодо автора"
@ -2349,6 +2349,16 @@ msgstr "Знайти слово або фразу"
msgid "General settings and options"
msgstr "Загальні параметри"
#: gitg/resources/ui/gitg-window.ui:266
#| msgctxt "shortcut window"
#| msgid "Move to previous search result"
msgid "Previous result"
msgstr "Попередній результат"
#: gitg/resources/ui/gitg-window.ui:282
msgid "Next result"
msgstr "Наступний результат"
#. Translators: %s will be replaced with a URL indicating the resource
#. for which the authentication is required.
#: libgitg/gitg-authentication-dialog.vala:69
@ -2466,7 +2476,6 @@ msgstr "<small>Авторство</small> %s"
#: libgitg/gitg-diff-view-commit-details.vala:243
#: libgitg/gitg-diff-view-commit-details.vala:247
#, c-format
#| msgid "Committed by %s"
msgid "<small>Committed by</small> %s"
msgstr "<small>Внесено</small> %s"