using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Input; using ClassicAssist.Annotations; using ClassicAssist.UO.Data; using ReactiveUI; namespace ClassicAssist.UI.Views { /// /// Interaction logic for HuePickerWindow.xaml /// public partial class HuePickerWindow : Window, INotifyPropertyChanged { private ObservableCollection _filteredItems = new ObservableCollection(); private string _filterText; private ObservableCollection _items = new ObservableCollection(); private ICommand _okCommand; private int _selectedHue = -1; private HuePickerEntry _selectedItem; public HuePickerWindow() { InitializeComponent(); for ( int i = 0; i < 3000; i++ ) { Items.Add( new HuePickerEntry { Index = i + 1, Entry = Hues._lazyHueEntries.Value[i] } ); } ApplyFilter( _filterText ); } public ObservableCollection FilteredItems { get => _filteredItems; set => SetProperty( ref _filteredItems, value ); } public string FilterText { get => _filterText; set { SetProperty( ref _filterText, value ); ApplyFilter( value ); } } public ObservableCollection Items { get => _items; set => SetProperty( ref _items, value ); } public ICommand OKCommand => _okCommand ?? ( _okCommand = ReactiveCommand.Create( OK, this.WhenAnyValue( e => e.SelectedItem, selector: e => e != null ) ) ); public int SelectedHue { get => _selectedHue; set => SetProperty( ref _selectedHue, value ); } public HuePickerEntry SelectedItem { get => _selectedItem; set => SetProperty( ref _selectedItem, value ); } public event PropertyChangedEventHandler PropertyChanged; private void ApplyFilter( string value ) { FilteredItems = new ObservableCollection( Items.Where( i => string.IsNullOrEmpty( value ) || i.Index.ToString().StartsWith( value ) ) ); } public static bool GetHue( out int hue ) { HuePickerWindow window = new HuePickerWindow(); window.ShowDialog(); hue = window.SelectedHue; return hue != -1; } private void OK( object obj ) { if ( !( obj is HuePickerEntry entry ) ) { return; } SelectedHue = entry.Index; } [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged( [CallerMemberName] string propertyName = null ) { PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) ); } // ReSharper disable once RedundantAssignment public virtual void SetProperty( ref T obj, T value, [CallerMemberName] string propertyName = "" ) { obj = value; OnPropertyChanged( propertyName ); CommandManager.InvalidateRequerySuggested(); } public class HuePickerEntry { public HueEntry Entry { get; set; } public string EntryName => Entry.Name ?? "Unknown"; public int Index { get; set; } } } }