Skip to content

Commit 8bd5bd8

Browse files
committed
feature: add context menu to switch histories filter mode to selected commit
Signed-off-by: leo <[email protected]>
1 parent e6e1e4e commit 8bd5bd8

File tree

5 files changed

+121
-0
lines changed

5 files changed

+121
-0
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@
542542
<x:String x:Key="Text.Repository.EnableReflog" xml:space="preserve">Enable '--reflog' Option</x:String>
543543
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Open in File Browser</x:String>
544544
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">Search Branches/Tags/Submodules</x:String>
545+
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">Visibility in Graph</x:String>
545546
<x:String x:Key="Text.Repository.FilterCommits.Default" xml:space="preserve">Unset</x:String>
546547
<x:String x:Key="Text.Repository.FilterCommits.Exclude" xml:space="preserve">Hide in commit graph</x:String>
547548
<x:String x:Key="Text.Repository.FilterCommits.Include" xml:space="preserve">Filter in commit graph</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@
546546
<x:String x:Key="Text.Repository.EnableReflog" xml:space="preserve">启用 --reflog 选项</x:String>
547547
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在文件浏览器中打开</x:String>
548548
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">快速查找分支/标签/子模块</x:String>
549+
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">设置在列表中的可见性</x:String>
549550
<x:String x:Key="Text.Repository.FilterCommits.Default" xml:space="preserve">不指定</x:String>
550551
<x:String x:Key="Text.Repository.FilterCommits.Exclude" xml:space="preserve">在提交列表中隐藏</x:String>
551552
<x:String x:Key="Text.Repository.FilterCommits.Include" xml:space="preserve">使用其对提交列表过滤</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@
545545
<x:String x:Key="Text.Repository.EnableReflog" xml:space="preserve">啟用 [--reflog] 選項</x:String>
546546
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">在檔案瀏覽器中開啟</x:String>
547547
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">快速搜尋分支/標籤/子模組</x:String>
548+
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">設定在列表中的可視性</x:String>
548549
<x:String x:Key="Text.Repository.FilterCommits.Default" xml:space="preserve">不指定</x:String>
549550
<x:String x:Key="Text.Repository.FilterCommits.Exclude" xml:space="preserve">在提交清單中隱藏</x:String>
550551
<x:String x:Key="Text.Repository.FilterCommits.Include" xml:space="preserve">使用其來篩選提交清單</x:String>

src/ViewModels/Histories.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,12 +703,117 @@ public ContextMenu MakeContextMenu(ListBox list)
703703
return menu;
704704
}
705705

706+
private Models.FilterMode GetFilterMode(string pattern)
707+
{
708+
foreach (var filter in _repo.Settings.HistoriesFilters)
709+
{
710+
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
711+
return filter.Mode;
712+
}
713+
714+
return Models.FilterMode.None;
715+
}
716+
717+
private void FillBranchVisibilityMenu(MenuItem submenu, Models.Branch branch)
718+
{
719+
var visibility = new MenuItem();
720+
visibility.Icon = App.CreateMenuIcon("Icons.Eye");
721+
visibility.Header = App.Text("Repository.FilterCommits");
722+
723+
var exclude = new MenuItem();
724+
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
725+
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
726+
exclude.Click += (_, e) =>
727+
{
728+
_repo.SetBranchFilterMode(branch, Models.FilterMode.Excluded);
729+
e.Handled = true;
730+
};
731+
732+
var filterMode = GetFilterMode(branch.FullName);
733+
if (filterMode == Models.FilterMode.None)
734+
{
735+
var include = new MenuItem();
736+
include.Icon = App.CreateMenuIcon("Icons.Filter");
737+
include.Header = App.Text("Repository.FilterCommits.Include");
738+
include.Click += (_, e) =>
739+
{
740+
_repo.SetBranchFilterMode(branch, Models.FilterMode.Included);
741+
e.Handled = true;
742+
};
743+
visibility.Items.Add(include);
744+
visibility.Items.Add(exclude);
745+
}
746+
else
747+
{
748+
var unset = new MenuItem();
749+
unset.Header = App.Text("Repository.FilterCommits.Default");
750+
unset.Click += (_, e) =>
751+
{
752+
_repo.SetBranchFilterMode(branch, Models.FilterMode.None);
753+
e.Handled = true;
754+
};
755+
visibility.Items.Add(exclude);
756+
visibility.Items.Add(unset);
757+
}
758+
759+
submenu.Items.Add(visibility);
760+
submenu.Items.Add(new MenuItem() { Header = "-" });
761+
}
762+
763+
private void FillTagVisibilityMenu(MenuItem submenu, Models.Tag tag)
764+
{
765+
var visibility = new MenuItem();
766+
visibility.Icon = App.CreateMenuIcon("Icons.Eye");
767+
visibility.Header = App.Text("Repository.FilterCommits");
768+
769+
var exclude = new MenuItem();
770+
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
771+
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
772+
exclude.Click += (_, e) =>
773+
{
774+
_repo.SetTagFilterMode(tag, Models.FilterMode.Excluded);
775+
e.Handled = true;
776+
};
777+
778+
var filterMode = GetFilterMode(tag.Name);
779+
if (filterMode == Models.FilterMode.None)
780+
{
781+
var include = new MenuItem();
782+
include.Icon = App.CreateMenuIcon("Icons.Filter");
783+
include.Header = App.Text("Repository.FilterCommits.Include");
784+
include.Click += (_, e) =>
785+
{
786+
_repo.SetTagFilterMode(tag, Models.FilterMode.Included);
787+
e.Handled = true;
788+
};
789+
visibility.Items.Add(include);
790+
visibility.Items.Add(exclude);
791+
}
792+
else
793+
{
794+
var unset = new MenuItem();
795+
unset.Header = App.Text("Repository.FilterCommits.Default");
796+
unset.Click += (_, e) =>
797+
{
798+
_repo.SetTagFilterMode(tag, Models.FilterMode.None);
799+
e.Handled = true;
800+
};
801+
visibility.Items.Add(exclude);
802+
visibility.Items.Add(unset);
803+
}
804+
805+
submenu.Items.Add(visibility);
806+
submenu.Items.Add(new MenuItem() { Header = "-" });
807+
}
808+
706809
private void FillCurrentBranchMenu(ContextMenu menu, Models.Branch current)
707810
{
708811
var submenu = new MenuItem();
709812
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
710813
submenu.Header = current.Name;
711814

815+
FillBranchVisibilityMenu(submenu, current);
816+
712817
if (!string.IsNullOrEmpty(current.Upstream))
713818
{
714819
var upstream = current.Upstream.Substring(13);
@@ -786,6 +891,8 @@ private void FillOtherLocalBranchMenu(ContextMenu menu, Models.Branch branch, Mo
786891
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
787892
submenu.Header = branch.Name;
788893

894+
FillBranchVisibilityMenu(submenu, branch);
895+
789896
var checkout = new MenuItem();
790897
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", branch.Name);
791898
checkout.Icon = App.CreateMenuIcon("Icons.Check");
@@ -858,6 +965,8 @@ private void FillRemoteBranchMenu(ContextMenu menu, Models.Branch branch, Models
858965
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
859966
submenu.Header = name;
860967

968+
FillBranchVisibilityMenu(submenu, branch);
969+
861970
var checkout = new MenuItem();
862971
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", name);
863972
checkout.Icon = App.CreateMenuIcon("Icons.Check");
@@ -903,6 +1012,8 @@ private void FillTagMenu(ContextMenu menu, Models.Tag tag, Models.Branch current
9031012
submenu.Icon = App.CreateMenuIcon("Icons.Tag");
9041013
submenu.MinWidth = 200;
9051014

1015+
FillTagVisibilityMenu(submenu, tag);
1016+
9061017
var push = new MenuItem();
9071018
push.Header = new Views.NameHighlightedTextBlock("TagCM.Push", tag.Name);
9081019
push.Icon = App.CreateMenuIcon("Icons.Push");

src/ViewModels/Repository.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,13 @@ public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
707707
RefreshHistoriesFilters();
708708
}
709709

710+
public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode)
711+
{
712+
var node = FindBranchNode(branch.IsLocal ? _localBranchTrees : _remoteBranchTrees, branch.FullName);
713+
if (node != null)
714+
SetBranchFilterMode(node, mode);
715+
}
716+
710717
public void SetBranchFilterMode(BranchTreeNode node, Models.FilterMode mode)
711718
{
712719
var isLocal = node.Path.StartsWith("refs/heads/", StringComparison.Ordinal);

0 commit comments

Comments
 (0)