1
0
mirror of https://github.com/DarthAffe/RGBSyncPlus synced 2025-12-13 09:28:31 +00:00
RGBSyncPlus/RGBSync+/UI/ConfigurationViewModel.cs

184 lines
6.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Data;
using GongSolutions.Wpf.DragDrop;
using RGB.NET.Core;
using RGBSyncPlus.Helper;
using RGBSyncPlus.Model;
namespace RGBSyncPlus.UI
{
public sealed class ConfigurationViewModel : AbstractBindable, IDropTarget
{
#region Properties & Fields
public Version Version => Assembly.GetEntryAssembly().GetName().Version;
public double UpdateRate
{
get => 1.0 / ApplicationManager.Instance.UpdateTrigger.UpdateFrequency;
set
{
double val = MathHelper.Clamp(value, 1, 100);
ApplicationManager.Instance.Settings.UpdateRate = val;
ApplicationManager.Instance.UpdateTrigger.UpdateFrequency = 1.0 / val;
OnPropertyChanged();
}
}
private ObservableCollection<SyncGroup> _syncGroups;
public ObservableCollection<SyncGroup> SyncGroups
{
get => _syncGroups;
set => SetProperty(ref _syncGroups, value);
}
private SyncGroup _selectedSyncGroup;
public SyncGroup SelectedSyncGroup
{
get => _selectedSyncGroup;
set
{
if (SetProperty(ref _selectedSyncGroup, value))
UpdateLedLists();
}
}
private ListCollectionView _availableSyncLeds;
public ListCollectionView AvailableSyncLeds
{
get => _availableSyncLeds;
set => SetProperty(ref _availableSyncLeds, value);
}
private ListCollectionView _availableLeds;
public ListCollectionView AvailableLeds
{
get => _availableLeds;
set => SetProperty(ref _availableLeds, value);
}
private ListCollectionView _synchronizedLeds;
public ListCollectionView SynchronizedLeds
{
get => _synchronizedLeds;
set => SetProperty(ref _synchronizedLeds, value);
}
#endregion
#region Commands
private ActionCommand _openHomepageCommand;
public ActionCommand OpenHomepageCommand => _openHomepageCommand ?? (_openHomepageCommand = new ActionCommand(OpenHomepage));
private ActionCommand _addSyncGroupCommand;
public ActionCommand AddSyncGroupCommand => _addSyncGroupCommand ?? (_addSyncGroupCommand = new ActionCommand(AddSyncGroup));
private ActionCommand<SyncGroup> _removeSyncGroupCommand;
public ActionCommand<SyncGroup> RemoveSyncGroupCommand => _removeSyncGroupCommand ?? (_removeSyncGroupCommand = new ActionCommand<SyncGroup>(RemoveSyncGroup));
#endregion
#region Constructors
public ConfigurationViewModel()
{
SyncGroups = new ObservableCollection<SyncGroup>(ApplicationManager.Instance.Settings.SyncGroups);
AvailableSyncLeds = GetGroupedLedList(RGBSurface.Instance.Leds.Where(x => x.Device.DeviceInfo.SupportsSyncBack));
OnPropertyChanged(nameof(AvailableSyncLeds));
}
#endregion
#region Methods
private ListCollectionView GetGroupedLedList(IEnumerable<Led> leds) => GetGroupedLedList(leds.Select(led => new SyncLed(led)).ToList());
private ListCollectionView GetGroupedLedList(IList syncLeds)
{
ListCollectionView collectionView = new ListCollectionView(syncLeds);
collectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(SyncLed.Device)));
collectionView.SortDescriptions.Add(new SortDescription(nameof(SyncLed.Device), ListSortDirection.Ascending));
collectionView.SortDescriptions.Add(new SortDescription(nameof(SyncLed.LedId), ListSortDirection.Ascending));
collectionView.Refresh();
return collectionView;
}
private void UpdateLedLists()
{
SynchronizedLeds = GetGroupedLedList(SelectedSyncGroup.Leds);
OnPropertyChanged(nameof(SynchronizedLeds));
AvailableLeds = GetGroupedLedList(RGBSurface.Instance.Leds.Where(led => !SelectedSyncGroup.Leds.Any(sc => (sc.LedId == led.Id) && (sc.Device == led.Device.GetDeviceName()))));
OnPropertyChanged(nameof(AvailableLeds));
}
private void OpenHomepage() => Process.Start("https://github.com/DarthAffe/RGBSyncPlus");
private void AddSyncGroup()
{
SyncGroup syncGroup = new SyncGroup();
SyncGroups.Add(syncGroup);
ApplicationManager.Instance.AddSyncGroup(syncGroup);
}
private void RemoveSyncGroup(SyncGroup syncGroup)
{
if (syncGroup == null) return;
if (MessageBox.Show($"Are you sure that you want to delete the group '{syncGroup.DisplayName}'", "Remove Sync-Group", MessageBoxButton.YesNo) == MessageBoxResult.No)
return;
SyncGroups.Remove(syncGroup);
ApplicationManager.Instance.RemoveSyncGroup(syncGroup);
}
void IDropTarget.DragOver(IDropInfo dropInfo)
{
if ((dropInfo.Data is SyncLed || dropInfo.Data is IEnumerable<SyncLed>) && (dropInfo.TargetCollection is ListCollectionView))
{
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Copy;
}
}
void IDropTarget.Drop(IDropInfo dropInfo)
{
if (!(dropInfo.TargetCollection is ListCollectionView targetList)) return;
//HACK DarthAffe 04.06.2018: Super ugly hack - I've no idea how to do this correctly ...
ListCollectionView sourceList = targetList == AvailableLeds ? SynchronizedLeds : AvailableLeds;
if (dropInfo.Data is SyncLed syncLed)
{
targetList.AddNewItem(syncLed);
sourceList.Remove(syncLed);
targetList.CommitNew();
sourceList.CommitEdit();
}
else if (dropInfo.Data is IEnumerable<SyncLed> syncLeds)
{
foreach (SyncLed led in syncLeds)
{
targetList.AddNewItem(led);
sourceList.Remove(led);
}
targetList.CommitNew();
sourceList.CommitEdit();
}
}
#endregion
}
}