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 _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 itemsAdded = new(); List itemsRemoved = new(); if (e.NewItems != null && e.OldItems != null) { itemsAdded.AddRange(e.NewItems.Cast().Except(e.OldItems.Cast())); itemsRemoved.AddRange(e.OldItems.Cast().Except(e.NewItems.Cast())); } else if (e.NewItems != null) { itemsAdded.AddRange(e.NewItems.Cast()); } else if (e.OldItems != null) { itemsRemoved.AddRange(e.OldItems.Cast()); } 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; } } } } }