mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-15 15:44:59 +00:00
ux: new style for ref's Visibility in Graph
context menu item
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
parent
cd009bda6b
commit
bf43dd828a
5 changed files with 142 additions and 107 deletions
|
@ -843,6 +843,10 @@
|
|||
<DataTemplate DataType="x:String">
|
||||
<v:NameHighlightedTextBlock Text="{Binding}" VerticalAlignment="Center"/>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate DataType="vm:FilterModeInGraph">
|
||||
<v:FilterModeInGraph/>
|
||||
</DataTemplate>
|
||||
</ContentPresenter.DataTemplates>
|
||||
</ContentPresenter>
|
||||
|
||||
|
@ -949,6 +953,19 @@
|
|||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="MenuItem.filter_mode_switcher">
|
||||
<Setter Property="Height" Value="48"/>
|
||||
|
||||
<Style Selector="^:selected">
|
||||
<Style Selector="^ /template/ Border#PART_LayoutRoot">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ ContentPresenter#PART_HeaderPresenter">
|
||||
<Setter Property="Foreground" Value="Transparent" />
|
||||
</Style>
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="ComboBox">
|
||||
<Style.Resources>
|
||||
<Thickness x:Key="ComboBoxDropdownBorderPadding">4,0</Thickness>
|
||||
|
|
62
src/ViewModels/FilterModeInGraph.cs
Normal file
62
src/ViewModels/FilterModeInGraph.cs
Normal file
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
public class FilterModeInGraph : ObservableObject
|
||||
{
|
||||
public bool IsFiltered
|
||||
{
|
||||
get => _mode == Models.FilterMode.Included;
|
||||
set => SetFilterMode(value ? Models.FilterMode.Included : Models.FilterMode.None);
|
||||
}
|
||||
|
||||
public bool IsExcluded
|
||||
{
|
||||
get => _mode == Models.FilterMode.Excluded;
|
||||
set => SetFilterMode(value ? Models.FilterMode.Excluded : Models.FilterMode.None);
|
||||
}
|
||||
|
||||
public FilterModeInGraph(Repository repo, object target)
|
||||
{
|
||||
_repo = repo;
|
||||
_target = target;
|
||||
|
||||
if (_target is Models.Branch b)
|
||||
_mode = GetFilterMode(b.FullName);
|
||||
else if (_target is Models.Tag t)
|
||||
_mode = GetFilterMode(t.Name);
|
||||
}
|
||||
|
||||
private Models.FilterMode GetFilterMode(string pattern)
|
||||
{
|
||||
foreach (var filter in _repo.Settings.HistoriesFilters)
|
||||
{
|
||||
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
|
||||
return filter.Mode;
|
||||
}
|
||||
|
||||
return Models.FilterMode.None;
|
||||
}
|
||||
|
||||
private void SetFilterMode(Models.FilterMode mode)
|
||||
{
|
||||
if (_mode != mode)
|
||||
{
|
||||
_mode = mode;
|
||||
|
||||
if (_target is Models.Branch branch)
|
||||
_repo.SetBranchFilterMode(branch, _mode, false, true);
|
||||
else if (_target is Models.Tag tag)
|
||||
_repo.SetTagFilterMode(tag, _mode);
|
||||
|
||||
OnPropertyChanged(nameof(IsFiltered));
|
||||
OnPropertyChanged(nameof(IsExcluded));
|
||||
}
|
||||
}
|
||||
|
||||
private Repository _repo = null;
|
||||
private object _target = null;
|
||||
private Models.FilterMode _mode = Models.FilterMode.None;
|
||||
}
|
||||
}
|
|
@ -809,116 +809,17 @@ namespace SourceGit.ViewModels
|
|||
return menu;
|
||||
}
|
||||
|
||||
private Models.FilterMode GetFilterMode(string pattern)
|
||||
{
|
||||
foreach (var filter in _repo.Settings.HistoriesFilters)
|
||||
{
|
||||
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
|
||||
return filter.Mode;
|
||||
}
|
||||
|
||||
return Models.FilterMode.None;
|
||||
}
|
||||
|
||||
private void FillBranchVisibilityMenu(MenuItem submenu, Models.Branch branch)
|
||||
{
|
||||
var visibility = new MenuItem();
|
||||
visibility.Icon = App.CreateMenuIcon("Icons.Eye");
|
||||
visibility.Header = App.Text("Repository.FilterCommits");
|
||||
|
||||
var exclude = new MenuItem();
|
||||
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
|
||||
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
|
||||
exclude.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetBranchFilterMode(branch, Models.FilterMode.Excluded, false, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
var filterMode = GetFilterMode(branch.FullName);
|
||||
if (filterMode == Models.FilterMode.None)
|
||||
{
|
||||
var include = new MenuItem();
|
||||
include.Icon = App.CreateMenuIcon("Icons.Filter");
|
||||
include.Header = App.Text("Repository.FilterCommits.Include");
|
||||
include.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetBranchFilterMode(branch, Models.FilterMode.Included, false, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
visibility.Items.Add(include);
|
||||
visibility.Items.Add(exclude);
|
||||
}
|
||||
else
|
||||
{
|
||||
var unset = new MenuItem();
|
||||
unset.Header = App.Text("Repository.FilterCommits.Default");
|
||||
unset.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetBranchFilterMode(branch, Models.FilterMode.None, false, true);
|
||||
e.Handled = true;
|
||||
};
|
||||
visibility.Items.Add(exclude);
|
||||
visibility.Items.Add(unset);
|
||||
}
|
||||
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
}
|
||||
|
||||
private void FillTagVisibilityMenu(MenuItem submenu, Models.Tag tag)
|
||||
{
|
||||
var visibility = new MenuItem();
|
||||
visibility.Icon = App.CreateMenuIcon("Icons.Eye");
|
||||
visibility.Header = App.Text("Repository.FilterCommits");
|
||||
|
||||
var exclude = new MenuItem();
|
||||
exclude.Icon = App.CreateMenuIcon("Icons.EyeClose");
|
||||
exclude.Header = App.Text("Repository.FilterCommits.Exclude");
|
||||
exclude.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetTagFilterMode(tag, Models.FilterMode.Excluded);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
var filterMode = GetFilterMode(tag.Name);
|
||||
if (filterMode == Models.FilterMode.None)
|
||||
{
|
||||
var include = new MenuItem();
|
||||
include.Icon = App.CreateMenuIcon("Icons.Filter");
|
||||
include.Header = App.Text("Repository.FilterCommits.Include");
|
||||
include.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetTagFilterMode(tag, Models.FilterMode.Included);
|
||||
e.Handled = true;
|
||||
};
|
||||
visibility.Items.Add(include);
|
||||
visibility.Items.Add(exclude);
|
||||
}
|
||||
else
|
||||
{
|
||||
var unset = new MenuItem();
|
||||
unset.Header = App.Text("Repository.FilterCommits.Default");
|
||||
unset.Click += (_, e) =>
|
||||
{
|
||||
_repo.SetTagFilterMode(tag, Models.FilterMode.None);
|
||||
e.Handled = true;
|
||||
};
|
||||
visibility.Items.Add(exclude);
|
||||
visibility.Items.Add(unset);
|
||||
}
|
||||
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
}
|
||||
|
||||
private void FillCurrentBranchMenu(ContextMenu menu, Models.Branch current)
|
||||
{
|
||||
var submenu = new MenuItem();
|
||||
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
|
||||
submenu.Header = current.Name;
|
||||
|
||||
FillBranchVisibilityMenu(submenu, current);
|
||||
var visibility = new MenuItem();
|
||||
visibility.Classes.Add("filter_mode_switcher");
|
||||
visibility.Header = new FilterModeInGraph(_repo, current);
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
if (!string.IsNullOrEmpty(current.Upstream))
|
||||
{
|
||||
|
@ -1015,7 +916,11 @@ namespace SourceGit.ViewModels
|
|||
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
|
||||
submenu.Header = branch.Name;
|
||||
|
||||
FillBranchVisibilityMenu(submenu, branch);
|
||||
var visibility = new MenuItem();
|
||||
visibility.Classes.Add("filter_mode_switcher");
|
||||
visibility.Header = new FilterModeInGraph(_repo, branch);
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
if (!_repo.IsBare)
|
||||
{
|
||||
|
@ -1105,7 +1010,11 @@ namespace SourceGit.ViewModels
|
|||
submenu.Icon = App.CreateMenuIcon("Icons.Branch");
|
||||
submenu.Header = name;
|
||||
|
||||
FillBranchVisibilityMenu(submenu, branch);
|
||||
var visibility = new MenuItem();
|
||||
visibility.Classes.Add("filter_mode_switcher");
|
||||
visibility.Header = new FilterModeInGraph(_repo, branch);
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
var checkout = new MenuItem();
|
||||
checkout.Header = App.Text("BranchCM.Checkout", name);
|
||||
|
@ -1162,7 +1071,11 @@ namespace SourceGit.ViewModels
|
|||
submenu.Icon = App.CreateMenuIcon("Icons.Tag");
|
||||
submenu.MinWidth = 200;
|
||||
|
||||
FillTagVisibilityMenu(submenu, tag);
|
||||
var visibility = new MenuItem();
|
||||
visibility.Classes.Add("filter_mode_switcher");
|
||||
visibility.Header = new FilterModeInGraph(_repo, tag);
|
||||
submenu.Items.Add(visibility);
|
||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
var push = new MenuItem();
|
||||
push.Header = App.Text("TagCM.Push", tag.Name);
|
||||
|
|
31
src/Views/FilterModeInGraph.axaml
Normal file
31
src/Views/FilterModeInGraph.axaml
Normal file
|
@ -0,0 +1,31 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:vm="using:SourceGit.ViewModels"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="SourceGit.Views.FilterModeInGraph"
|
||||
x:DataType="vm:FilterModeInGraph">
|
||||
<Grid RowDefinitions="22,26">
|
||||
<TextBlock Grid.Row="0"
|
||||
Text="{DynamicResource Text.Repository.FilterCommits}"
|
||||
Foreground="{DynamicResource Brush.FG2}"/>
|
||||
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal">
|
||||
<ToggleButton Classes="line_path"
|
||||
Width="13" Height="26"
|
||||
Background="Transparent"
|
||||
IsChecked="{Binding IsFiltered, Mode=TwoWay}">
|
||||
<Path Width="13" Height="13" Data="{StaticResource Icons.Filter}"/>
|
||||
</ToggleButton>
|
||||
|
||||
<ToggleButton Classes="line_path"
|
||||
Width="13" Height="26"
|
||||
Margin="10,0,0,0"
|
||||
Background="Transparent"
|
||||
IsChecked="{Binding IsExcluded, Mode=TwoWay}">
|
||||
<Path Width="13" Height="13" Data="{StaticResource Icons.EyeClose}"/>
|
||||
</ToggleButton>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</UserControl>
|
12
src/Views/FilterModeInGraph.axaml.cs
Normal file
12
src/Views/FilterModeInGraph.axaml.cs
Normal file
|
@ -0,0 +1,12 @@
|
|||
using Avalonia.Controls;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
public partial class FilterModeInGraph : UserControl
|
||||
{
|
||||
public FilterModeInGraph()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue