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; }
}
}
}