sourcegit/src/SourceGit/ViewModels/Welcome.cs

138 lines
3.8 KiB
C#
Raw Normal View History

using System;
using Avalonia.Collections;
using CommunityToolkit.Mvvm.ComponentModel;
namespace SourceGit.ViewModels
{
public class Welcome : ObservableObject
{
public bool IsClearSearchVisible
{
get => !string.IsNullOrEmpty(_searchFilter);
}
public AvaloniaList<RepositoryNode> RepositoryNodes
{
get => Preference.Instance.RepositoryNodes;
}
public string SearchFilter
{
get => _searchFilter;
set
{
if (SetProperty(ref _searchFilter, value))
{
Referesh();
OnPropertyChanged(nameof(IsClearSearchVisible));
}
}
}
public void InitRepository(string path)
{
if (!Preference.Instance.IsGitConfigured)
{
App.RaiseException(PopupHost.Active.GetId(), App.Text("NotConfigured"));
return;
}
if (PopupHost.CanCreatePopup())
{
PopupHost.ShowPopup(new Init(path));
}
}
public void Clone(object param)
{
var launcher = param as Launcher;
var page = launcher.ActivePage;
if (!Preference.Instance.IsGitConfigured)
{
App.RaiseException(page.GetId(), App.Text("NotConfigured"));
return;
}
if (PopupHost.CanCreatePopup())
{
PopupHost.ShowPopup(new Clone(launcher, page));
}
}
public void OpenTerminal()
{
if (!Preference.Instance.IsGitConfigured)
{
App.RaiseException(PopupHost.Active.GetId(), App.Text("NotConfigured"));
}
else
{
Native.OS.OpenTerminal(null);
}
}
public void ClearSearchFilter()
{
SearchFilter = string.Empty;
}
public void AddFolder()
{
if (PopupHost.CanCreatePopup()) PopupHost.ShowPopup(new CreateGroup(null));
}
public void MoveNode(RepositoryNode from, RepositoryNode to)
{
Preference.MoveNode(from, to);
}
private void Referesh()
{
if (string.IsNullOrWhiteSpace(_searchFilter))
{
foreach (var node in RepositoryNodes) ResetVisibility(node);
}
else
{
foreach (var node in RepositoryNodes) SetVisibilityBySearch(node);
}
}
private void ResetVisibility(RepositoryNode node)
{
node.IsVisible = true;
foreach (var subNode in node.SubNodes) ResetVisibility(subNode);
}
private void SetVisibilityBySearch(RepositoryNode node)
{
if (!node.IsRepository)
{
if (node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
{
node.IsVisible = true;
foreach (var subNode in node.SubNodes) ResetVisibility(subNode);
}
else
{
bool hasVisibleSubNode = false;
foreach (var subNode in node.SubNodes)
{
SetVisibilityBySearch(subNode);
hasVisibleSubNode |= subNode.IsVisible;
}
node.IsVisible = hasVisibleSubNode;
}
}
else
{
node.IsVisible = node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase);
}
}
private string _searchFilter = string.Empty;
}
}