VRDash/VDash/UI/CreateNewOverlay.xaml.cs

116 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
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;
namespace VDash.UI
{
/// <summary>
/// Interaction logic for CreateNewOverlay.xaml
/// </summary>
public partial class CreateNewOverlay : UserControl
{
public delegate void CreatedEventHandler(UserControl sender, IOverlay created);
public event CreatedEventHandler Created;
public OverlayTypeWrapper[] EligibleOverlays { get; private set; } = {
new OverlayTypeWrapper("Window Overlay", typeof(WindowOverlay), new OverlayEditor(new WindowOverlayEditor())),
new OverlayTypeWrapper("Monitor Overlay", typeof(MonitorOverlay), new OverlayEditor(new MonitorOverlayEditor()))
};
public CreateNewOverlay()
{
InitializeComponent();
DataContext = this;
}
private void cbOverlayType_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
bdrContent.Child = ((OverlayTypeWrapper)cbOverlayType.SelectedItem).Control;
}
private void btnCreate_Click(object sender, RoutedEventArgs e)
{
var editorControl = ((OverlayTypeWrapper)cbOverlayType.SelectedItem).Control;
var intConrol = (IOverlayEditor)editorControl;
string[] issues = intConrol.ValidateInput();
if (issues.Count() != 0)
{
StringBuilder error = new StringBuilder();
error.AppendLine("Please rectify the following issues:");
foreach(var issue in issues)
{
error.AppendLine(issue);
}
MessageBox.Show(error.ToString(), "Input Error", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var wrapper = ((OverlayTypeWrapper)cbOverlayType.SelectedItem);
var config = wrapper.Editor.Config;
if (String.IsNullOrWhiteSpace(config.Key))
{
config.Key = RandomString(8, true);
}
IOverlay overlay = (IOverlay)Activator.CreateInstance(wrapper.OverlayType, new object[] { config });
overlay.Create();
MainWindow.OverlayManager.Overlays.Add(overlay);
Created?.Invoke(this, overlay);
}
// Generate a random string with a given size
public string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
}
public class OverlayTypeWrapper
{
public Type OverlayType { get; private set; }
public string FriendlyName { get; private set; }
public UserControl Control { get; private set; }
//this is a bit messy...
public IOverlayEditor Editor { get { return (IOverlayEditor)Control; } }
public OverlayTypeWrapper(string friendlyName, Type overlayType, UserControl control)
{
if (!typeof(IOverlay).IsAssignableFrom(overlayType))
{
throw new Exception("The type must be based on IOverlay.");
}
OverlayType = overlayType;
FriendlyName = friendlyName;
Control = control;
}
public override string ToString()
{
return FriendlyName;
}
}
}