VRDash/VDash/UI/WindowOverlayEditor.xaml.cs

194 lines
6.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using VDash.Overlay.Actions;
using VDash.Overlay.Config;
using VDash.UI.ActionEditors;
using VDash.WindowSelectors;
namespace VDash.UI
{
/// <summary>
/// Interaction logic for CreateWindowOverlay.xaml
/// </summary>
public partial class WindowOverlayEditor : UserControl,IOverlayEditor
{
public WindowOverlayConfig OverlayConfig { get; set; }
public SelectorWrapper[] Selectors { get; private set; } =
{
new SelectorWrapper("By Process Name", typeof(FromProcessName), typeof(ProcessSelectorEditor)),
new SelectorWrapper("By Window Title", typeof(FromWindowTitle), typeof(WindowSelectorEditor))
};
public IOverlayConfig Config { get { return OverlayConfig; } }
//public WindowOverlayEditor()
//{
// InitializeComponent();
// OverlayConfig = new WindowOverlayConfig();
// OverlayConfig.OverlayShownActions.Add(new BringWindowToFrontAction(true));
// DataContext = OverlayConfig;
// cbSelector.ItemsSource = Selectors;
// SetupDropDown();
//}
public WindowOverlayEditor(ref WindowOverlayConfig config)
{
InitializeComponent();
OverlayConfig = config;
DataContext = OverlayConfig;
cbSelector.ItemsSource = Selectors;
SetupDropDown();
}
private void SetupDropDown()
{
if (OverlayConfig.Selector != null)
{
SelectorWrapper wrapper = Selectors.Single(x => x.SelectorType == OverlayConfig.Selector.GetType());
IWindowSelector selector = OverlayConfig.Selector;
UserControl editor = (UserControl)Activator.CreateInstance(wrapper.EditorType, new object[] { selector });
wrapper.Editor = editor;
wrapper.Selector = selector;
cbSelector.SelectedItem = wrapper;
}
}
public class SelectorWrapper
{
public string FriendlyName { get; set; }
//public IWindowSelector Selector{ get; private set; }
public Type SelectorType { get; set; }
//public UserControl Control { get; set; }
public Type EditorType { get; set; }
public IWindowSelector Selector { get; set; }
public UserControl Editor { get; set; } = null;
public SelectorWrapper(string friendlyName, Type selectorType, Type editorType)
{
FriendlyName = friendlyName;
SelectorType = selectorType;
EditorType = editorType;
Selector = (IWindowSelector)Activator.CreateInstance(selectorType);
Editor = (UserControl)Activator.CreateInstance(EditorType, new object[] { Selector });
}
public override string ToString()
{
return FriendlyName;
}
}
private void cbSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var wrapper = (SelectorWrapper)cbSelector.SelectedItem;
OverlayConfig.Selector = wrapper.Selector;
bdrSelector.Child = wrapper.Editor;
}
public string[] ValidateInput()
{
List<string> issues = new List<string>();
if (String.IsNullOrWhiteSpace(Config.Name))
{
issues.Add("Please enter a name.");
}
if((SelectorWrapper)cbSelector.SelectedItem == null)
{
issues.Add("Please select a window selector.");
}
else
{
//Type selectorType = ((SelectorWrapper)cbSelector.SelectedItem).Editor;
var selectorEditor = (ISelectorEditor)((SelectorWrapper)cbSelector.SelectedItem).Editor;
issues.AddRange(selectorEditor.ValidateInput());
}
return issues.ToArray();
}
private void ContextMenuBuilder(Collection<IWindowAction> col)
{
List<MenuItem> items = new List<MenuItem>();
ContextMenu menu = new ContextMenu();
menu.ItemsSource = items;
menu.Placement = System.Windows.Controls.Primitives.PlacementMode.MousePoint;
foreach(var actionType in OverlayActionInfo.GetTypesWithAttribute())
{
OverlayActionInfo attribute = (OverlayActionInfo)actionType.GetCustomAttributes(typeof(OverlayActionInfo), false).Single();
if(attribute.EditorType == null)
{
var item = new MenuItem() { Header = attribute.Description };
item.Click += (s, e) => {
IWindowAction action = (IWindowAction)Activator.CreateInstance(actionType);
col.Add(action);
};
items.Add(item);
}
else
{
var item = new MenuItem() { Header = attribute.Description };
IWindowAction action = (IWindowAction)Activator.CreateInstance(actionType);
IActionEditor editor = (IActionEditor)Activator.CreateInstance(attribute.EditorType, new object[] { action });
item.ItemsSource = new object[] { new MenuItem() { Header = editor } };
editor.Submitted += (s, e) =>
{
col.Add(action);
menu.IsOpen = false;
};
items.Add(item);
}
}
menu.IsOpen = true;
}
private void btnOnShowAdd_Click(object sender, RoutedEventArgs e)
{
ContextMenuBuilder(OverlayConfig.OverlayShownActions);
}
private void btnOnShowRemove_Click(object sender, RoutedEventArgs e)
{
if(lvOnOpenActions.SelectedItem == null)
{
return;
}
OverlayConfig.OverlayShownActions.Remove((IWindowAction)lvOnOpenActions.SelectedItem);
}
private void btnOnHideAdd_Click(object sender, RoutedEventArgs e)
{
ContextMenuBuilder(OverlayConfig.OverlayHiddenActions);
}
private void btnOnHideRemove_Click(object sender, RoutedEventArgs e)
{
if (lvOnCloseActions.SelectedItem == null)
{
return;
}
OverlayConfig.OverlayHiddenActions.Remove((IWindowAction)lvOnCloseActions.SelectedItem);
}
}
}