Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Models/HistoryFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public enum FilterType
RemoteBranch,
RemoteBranchFolder,
Tag,
TagFolder,
}

public enum FilterMode
Expand Down
24 changes: 23 additions & 1 deletion src/Models/RepositoryUIStates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,25 @@ public void RemoveBranchFiltersByPrefix(string pattern)

foreach (var filter in HistoryFilters)
{
if (filter.Type == FilterType.Tag)
if (filter.Type is FilterType.Tag or FilterType.TagFolder)
continue;

if (filter.Pattern.StartsWith(prefix, StringComparison.Ordinal))
dirty.Add(filter);
}

foreach (var filter in dirty)
HistoryFilters.Remove(filter);
}

public void RemoveTagFiltersByPrefix(string pattern)
{
var dirty = new List<HistoryFilter>();
var prefix = $"{pattern}/";

foreach (var filter in HistoryFilters)
{
if (filter.Type is not (FilterType.Tag or FilterType.TagFolder))
continue;

if (filter.Pattern.StartsWith(prefix, StringComparison.Ordinal))
Expand Down Expand Up @@ -483,6 +501,8 @@ private void BuildHistoryParamsForIncluded(StringBuilder builder)
builder.Append($"--remotes={filter.Pattern.AsSpan(13)}/* ");
else if (filter.Type == FilterType.Tag)
builder.Append($"refs/tags/{filter.Pattern} ");
else if (filter.Type == FilterType.TagFolder)
builder.Append($"--tags={filter.Pattern}/* ");
}
}

Expand All @@ -503,6 +523,8 @@ private void BuildHistoryParamsForExcluded(StringBuilder builder, string gitDir)
excludedRemotes.Add($"--exclude=\"{filter.Pattern.AsSpan(13)}/*\" --decorate-refs-exclude=\"{filter.Pattern}/*\" ");
else if (filter.Type == FilterType.Tag)
excludedTags.Add($"--exclude=\"{filter.Pattern}\" --decorate-refs-exclude=\"refs/tags/{filter.Pattern}\" ");
else if (filter.Type == FilterType.TagFolder)
excludedTags.Add($"--exclude=\"{filter.Pattern}/*\" --decorate-refs-exclude=\"refs/tags/{filter.Pattern}/*\" ");
}

foreach (var b in excludedBranches)
Expand Down
25 changes: 22 additions & 3 deletions src/ViewModels/Repository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,11 @@ public void UpdateBranchNodeIsExpanded(BranchTreeNode node)
}

public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
{
SetTagFilterMode(tag.Name, false, mode);
}

public void SetTagFilterMode(string path, bool isFolder, Models.FilterMode mode)
{
// Auto turn off `FocusOnCurrentBranch` when user set a tag filter manually.
if (_uiStates.FocusOnCurrentBranch)
Expand All @@ -1015,9 +1020,23 @@ public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
OnPropertyChanged(nameof(FocusOnCurrentBranch));
}

var changed = _uiStates.UpdateHistoryFilters(tag.Name, Models.FilterType.Tag, mode);
if (changed)
RefreshHistoryFilters(true);
var type = isFolder ? Models.FilterType.TagFolder : Models.FilterType.Tag;
var changed = _uiStates.UpdateHistoryFilters(path, type, mode);
if (!changed)
return;

if (isFolder)
_uiStates.RemoveTagFiltersByPrefix(path);

var lastSepIdx = path.LastIndexOf('/');
while (lastSepIdx > 0)
{
path = path.Substring(0, lastSepIdx);
_uiStates.UpdateHistoryFilters(path, Models.FilterType.TagFolder, Models.FilterMode.None);
lastSepIdx = path.LastIndexOf('/');
}

RefreshHistoryFilters(true);
}

public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode, bool clearExists, bool refresh)
Expand Down
6 changes: 2 additions & 4 deletions src/ViewModels/TagCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,13 @@ public TagTreeNode(string path, bool isExpanded, int depth)

public void UpdateFilterMode(Dictionary<string, Models.FilterMode> filters)
{
FilterMode = filters.GetValueOrDefault(FullPath, Models.FilterMode.None);

if (Tag == null)
{
foreach (var child in Children)
child.UpdateFilterMode(filters);
}
else
{
FilterMode = filters.GetValueOrDefault(FullPath, Models.FilterMode.None);
}
}

public static List<TagTreeNode> Build(List<Models.Tag> tags, HashSet<string> expanded)
Expand Down
12 changes: 6 additions & 6 deletions src/Views/FilterModeSwitchButton.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ private void OnChangeFilterModeButtonClicked(object sender, RoutedEventArgs e)

var menu = new ContextMenu();
if (DataContext is ViewModels.TagListItem tagItem)
FillContextMenuForTag(menu, repo, tagItem.Tag, tagItem.FilterMode);
FillContextMenuForTag(menu, repo, tagItem.Tag.Name, false, tagItem.FilterMode);
else if (DataContext is ViewModels.TagTreeNode tagNode)
FillContextMenuForTag(menu, repo, tagNode.Tag, tagNode.FilterMode);
FillContextMenuForTag(menu, repo, tagNode.FullPath, tagNode.IsFolder, tagNode.FilterMode);
else if (DataContext is ViewModels.BranchTreeNode branchNode)
FillContextMenuForBranch(menu, repo, branchNode, branchNode.FilterMode);

Expand All @@ -83,15 +83,15 @@ private void OnChangeFilterModeButtonClicked(object sender, RoutedEventArgs e)
e.Handled = true;
}

private void FillContextMenuForTag(ContextMenu menu, ViewModels.Repository repo, Models.Tag tag, Models.FilterMode current)
private void FillContextMenuForTag(ContextMenu menu, ViewModels.Repository repo, string path, bool isFolder, Models.FilterMode current)
{
if (current != Models.FilterMode.None)
{
var unset = new MenuItem();
unset.Header = App.Text("Repository.FilterCommits.Default");
unset.Click += (_, ev) =>
{
repo.SetTagFilterMode(tag, Models.FilterMode.None);
repo.SetTagFilterMode(path, isFolder, Models.FilterMode.None);
ev.Handled = true;
};

Expand All @@ -105,7 +105,7 @@ private void FillContextMenuForTag(ContextMenu menu, ViewModels.Repository repo,
include.IsEnabled = current != Models.FilterMode.Included;
include.Click += (_, ev) =>
{
repo.SetTagFilterMode(tag, Models.FilterMode.Included);
repo.SetTagFilterMode(path, isFolder, Models.FilterMode.Included);
ev.Handled = true;
};

Expand All @@ -115,7 +115,7 @@ private void FillContextMenuForTag(ContextMenu menu, ViewModels.Repository repo,
exclude.IsEnabled = current != Models.FilterMode.Excluded;
exclude.Click += (_, ev) =>
{
repo.SetTagFilterMode(tag, Models.FilterMode.Excluded);
repo.SetTagFilterMode(path, isFolder, Models.FilterMode.Excluded);
ev.Handled = true;
};

Expand Down
4 changes: 1 addition & 3 deletions src/Views/TagsView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,7 @@
<Run Text="{Binding TagsCount}" Foreground="{DynamicResource Brush.FG2}"/>
</TextBlock>

<Border Grid.Column="3" Margin="4,0,8,0" IsVisible="{Binding !IsFolder}">
<v:FilterModeSwitchButton Mode="{Binding FilterMode}"/>
</Border>
<v:FilterModeSwitchButton Grid.Column="3" Margin="4,0,8,0" Mode="{Binding FilterMode}"/>
</Grid>
</Border>
</DataTemplate>
Expand Down
Loading