mirror of
https://gitlab.gnome.org/GNOME/gitg
synced 2024-07-17 11:08:17 +00:00
Improve restore refs list selection
This commit is contained in:
parent
5c678a29b4
commit
9616f91afc
|
@ -146,7 +146,7 @@ private class RefRow : RefTyped, Gtk.ListBoxRow
|
||||||
return pn.shortname;
|
return pn.shortname;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool is_head
|
public bool is_head
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -328,6 +328,11 @@ private class RefHeader : RefTyped, Gtk.ListBoxRow
|
||||||
get { return d_rtype; }
|
get { return d_rtype; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string ref_name
|
||||||
|
{
|
||||||
|
get { return d_name; }
|
||||||
|
}
|
||||||
|
|
||||||
public RefHeader(Gitg.RefType rtype, string name)
|
public RefHeader(Gitg.RefType rtype, string name)
|
||||||
{
|
{
|
||||||
d_label = new Gtk.Label(null);
|
d_label = new Gtk.Label(null);
|
||||||
|
@ -377,6 +382,7 @@ public class RefsList : Gtk.ListBox
|
||||||
{
|
{
|
||||||
private Gitg.Repository? d_repository;
|
private Gitg.Repository? d_repository;
|
||||||
private Gee.HashMap<Gitg.Ref, RefRow> d_ref_map;
|
private Gee.HashMap<Gitg.Ref, RefRow> d_ref_map;
|
||||||
|
private Gtk.ListBoxRow? d_selected_row;
|
||||||
|
|
||||||
private class RemoteHeader
|
private class RemoteHeader
|
||||||
{
|
{
|
||||||
|
@ -400,9 +406,8 @@ public class RefsList : Gtk.ListBox
|
||||||
if (d_repository != value)
|
if (d_repository != value)
|
||||||
{
|
{
|
||||||
d_repository = value;
|
d_repository = value;
|
||||||
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,8 +417,6 @@ public class RefsList : Gtk.ListBox
|
||||||
d_ref_map = new Gee.HashMap<Gitg.Ref, RefRow>();
|
d_ref_map = new Gee.HashMap<Gitg.Ref, RefRow>();
|
||||||
selection_mode = Gtk.SelectionMode.BROWSE;
|
selection_mode = Gtk.SelectionMode.BROWSE;
|
||||||
|
|
||||||
row_selected.connect(on_row_selected);
|
|
||||||
|
|
||||||
set_sort_func(sort_rows);
|
set_sort_func(sort_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,6 +466,60 @@ public class RefsList : Gtk.ListBox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void reselect_row(Gtk.ListBoxRow a)
|
||||||
|
{
|
||||||
|
if (d_selected_row == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ah = a as RefHeader;
|
||||||
|
var bh = d_selected_row as RefHeader;
|
||||||
|
|
||||||
|
if ((ah != null) != (bh != null))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ah != null)
|
||||||
|
{
|
||||||
|
if (ah.ref_type == bh.ref_type && ah.ref_name == bh.ref_name)
|
||||||
|
{
|
||||||
|
select_row(a);
|
||||||
|
d_selected_row = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ar = a as RefRow;
|
||||||
|
var br = d_selected_row as RefRow;
|
||||||
|
|
||||||
|
if (ar.reference == null && br.reference == null)
|
||||||
|
{
|
||||||
|
select_row(a);
|
||||||
|
d_selected_row = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ar.reference == null || br.reference == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ar.reference.get_name() == br.reference.get_name())
|
||||||
|
{
|
||||||
|
select_row(a);
|
||||||
|
d_selected_row = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public new void add(Gtk.ListBoxRow row)
|
||||||
|
{
|
||||||
|
base.add(row);
|
||||||
|
reselect_row(row);
|
||||||
|
}
|
||||||
|
|
||||||
private void add_header(Gitg.RefType ref_type, string name)
|
private void add_header(Gitg.RefType ref_type, string name)
|
||||||
{
|
{
|
||||||
var header = new RefHeader(ref_type, name);
|
var header = new RefHeader(ref_type, name);
|
||||||
|
@ -471,16 +528,18 @@ public class RefsList : Gtk.ListBox
|
||||||
add(header);
|
add(header);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add_remote_header(string name)
|
private RefHeader add_remote_header(string name)
|
||||||
{
|
{
|
||||||
var header = new RefHeader.remote(name);
|
var header = new RefHeader.remote(name);
|
||||||
header.show();
|
header.show();
|
||||||
|
|
||||||
d_header_map[name] = new RemoteHeader(header);
|
d_header_map[name] = new RemoteHeader(header);
|
||||||
add(header);
|
add(header);
|
||||||
|
|
||||||
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add_ref_row(Gitg.Ref? reference, RefAnimation animation = RefAnimation.NONE)
|
private RefRow add_ref_row(Gitg.Ref? reference, RefAnimation animation = RefAnimation.NONE)
|
||||||
{
|
{
|
||||||
var row = new RefRow(reference, animation);
|
var row = new RefRow(reference, animation);
|
||||||
row.show();
|
row.show();
|
||||||
|
@ -491,13 +550,15 @@ public class RefsList : Gtk.ListBox
|
||||||
{
|
{
|
||||||
d_ref_map[reference] = row;
|
d_ref_map[reference] = row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return row;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add_ref_internal(Gitg.Ref reference, RefAnimation animation = RefAnimation.NONE)
|
private RefRow? add_ref_internal(Gitg.Ref reference, RefAnimation animation = RefAnimation.NONE)
|
||||||
{
|
{
|
||||||
if (d_ref_map.has_key(reference))
|
if (d_ref_map.has_key(reference))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reference.parsed_name.rtype == Gitg.RefType.REMOTE)
|
if (reference.parsed_name.rtype == Gitg.RefType.REMOTE)
|
||||||
|
@ -512,7 +573,7 @@ public class RefsList : Gtk.ListBox
|
||||||
d_header_map[remote].references.add(reference);
|
d_header_map[remote].references.add(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_ref_row(reference, animation);
|
return add_ref_row(reference, animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add_ref(Gitg.Ref reference)
|
public void add_ref(Gitg.Ref reference)
|
||||||
|
@ -600,12 +661,18 @@ public class RefsList : Gtk.ListBox
|
||||||
remove_ref_internal(reference);
|
remove_ref_internal(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void refresh()
|
private void refresh()
|
||||||
{
|
{
|
||||||
|
freeze_notify();
|
||||||
|
|
||||||
|
d_selected_row = get_selected_row();
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
if (d_repository == null)
|
if (d_repository == null)
|
||||||
{
|
{
|
||||||
|
d_selected_row = null;
|
||||||
|
thaw_notify();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,6 +682,8 @@ public class RefsList : Gtk.ListBox
|
||||||
add_header(Gitg.RefType.REMOTE, _("Remotes"));
|
add_header(Gitg.RefType.REMOTE, _("Remotes"));
|
||||||
add_header(Gitg.RefType.TAG, _("Tags"));
|
add_header(Gitg.RefType.TAG, _("Tags"));
|
||||||
|
|
||||||
|
RefRow? head = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
d_repository.references_foreach_name((nm) => {
|
d_repository.references_foreach_name((nm) => {
|
||||||
|
@ -632,10 +701,25 @@ public class RefsList : Gtk.ListBox
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_ref_internal(r);
|
var row = add_ref_internal(r);
|
||||||
|
|
||||||
|
if (row != null && row.is_head)
|
||||||
|
{
|
||||||
|
head = row;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
|
d_selected_row = null;
|
||||||
|
|
||||||
|
if (get_selected_row() == null && head != null)
|
||||||
|
{
|
||||||
|
// Select default
|
||||||
|
select_row(head);
|
||||||
|
}
|
||||||
|
|
||||||
|
thaw_notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
private RefRow? get_ref_row(Gtk.ListBoxRow? row)
|
private RefRow? get_ref_row(Gtk.ListBoxRow? row)
|
||||||
|
@ -745,11 +829,22 @@ public class RefsList : Gtk.ListBox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void on_row_selected(Gtk.ListBoxRow? row)
|
protected override void row_selected(Gtk.ListBoxRow? row)
|
||||||
{
|
{
|
||||||
notify_property("selection");
|
notify_property("selection");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void move_cursor(Gtk.MovementStep step, int n)
|
||||||
|
{
|
||||||
|
var selrow = get_selected_row();
|
||||||
|
base.move_cursor(step, n);
|
||||||
|
|
||||||
|
if (selrow != get_selected_row())
|
||||||
|
{
|
||||||
|
notify_property("selection");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void edit(Gitg.Ref reference, owned GitgExt.RefNameEditingDone done)
|
public void edit(Gitg.Ref reference, owned GitgExt.RefNameEditingDone done)
|
||||||
{
|
{
|
||||||
if (!d_ref_map.has_key(reference))
|
if (!d_ref_map.has_key(reference))
|
||||||
|
|
Loading…
Reference in a new issue