Files
FileTime/src/GuiApp/FileTime.Avalonia/Application/AppState.cs

104 lines
3.3 KiB
C#

using MvvmGen;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using FileTime.App.Core.Tab;
using System.Threading.Tasks;
using FileTime.Core.Models;
using System.Threading;
namespace FileTime.Avalonia.Application
{
[ViewModel]
public partial class AppState
{
[Property]
private ObservableCollection<TabContainer> _tabs = new();
[Property]
[PropertyCallMethod(nameof(SelectedTabChanged))]
private TabContainer _selectedTab;
[Property]
private ViewMode _viewMode;
[Property]
private string _rapidTravelText = "";
partial void OnInitialize()
{
_tabs.CollectionChanged += TabsChanged;
}
private void TabsChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
SelectedTab ??= Tabs.Count > 0 ? Tabs[0] : null;
List<TabContainer> itemsAdded = new();
List<TabContainer> itemsRemoved = new();
if (e.NewItems != null && e.OldItems != null)
{
itemsAdded.AddRange(e.NewItems.Cast<TabContainer>().Except(e.OldItems.Cast<TabContainer>()));
itemsRemoved.AddRange(e.OldItems.Cast<TabContainer>().Except(e.NewItems.Cast<TabContainer>()));
}
else if (e.NewItems != null)
{
itemsAdded.AddRange(e.NewItems.Cast<TabContainer>());
}
else if (e.OldItems != null)
{
itemsRemoved.AddRange(e.OldItems.Cast<TabContainer>());
}
foreach (var item in itemsAdded)
{
item.TabState.ItemMarked.Add(TabItemMarked);
item.TabState.ItemUnmarked.Add(TabItemUnmarked);
}
foreach (var item in itemsRemoved)
{
item.TabState.ItemMarked.Remove(TabItemMarked);
item.TabState.ItemUnmarked.Remove(TabItemUnmarked);
}
}
private void SelectedTabChanged()
{
foreach(var tab in Tabs)
{
tab.IsSelected = tab == SelectedTab;
}
}
private async Task TabItemMarked(TabState tabState, AbsolutePath item, CancellationToken token = default)
{
var tabContainer = Tabs.FirstOrDefault(t => t.TabState == tabState);
if (tabContainer != null)
{
var item2 = (await tabContainer.CurrentLocation.GetItems(token)).FirstOrDefault(i => i.Item.FullName == item.Path);
if (token.IsCancellationRequested) return;
if (item2 != null)
{
item2.IsMarked = true;
}
}
}
private async Task TabItemUnmarked(TabState tabState, AbsolutePath item, CancellationToken token = default)
{
var tabContainer = Tabs.FirstOrDefault(t => t.TabState == tabState);
if (tabContainer != null)
{
var item2 = (await tabContainer.CurrentLocation.GetItems(token)).FirstOrDefault(i => i.Item.FullName == item.Path);
if (token.IsCancellationRequested) return;
if (item2 != null)
{
item2.IsMarked = false;
}
}
}
}
}