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; using VDash.Overlay.Config; namespace VDash.UI { /// /// Interaction logic for CreateNewOverlay.xaml /// public partial class CreateNewOverlay : UserControl { public delegate void CreatedEventHandler(UserControl sender, IOverlay created); public event CreatedEventHandler Created; public List EligibleOverlays { get; private set; } = new List(); public CreateNewOverlay() { InitializeComponent(); DataContext = this; foreach (var info in OverlayInfo.GetOverlayInfos()) { var newWrapper = new OverlayTypeWrapper(info); //Add "Bring to front" for window overlays. Conveneience, my dude. if(info.OverlayType == typeof(WindowOverlay)) { ((WindowOverlayConfig)newWrapper.Config).OverlayShownActions.Add(new Overlay.Actions.BringWindowToFrontAction()); } EligibleOverlays.Add(newWrapper); } } 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.Config; if (String.IsNullOrWhiteSpace(config.Key)) { config.Key = RandomString(8, true); } IOverlay overlay = (IOverlay)Activator.CreateInstance(wrapper.OverlayInfo.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 OverlayTypeWrapper(OverlayInfo.OverlayAttributeInfo overlayInfo) { OverlayInfo = overlayInfo; Config = (IOverlayConfig)Activator.CreateInstance(OverlayInfo.Info.ConfigType); Control = (UserControl)Activator.CreateInstance(OverlayInfo.Info.EditorType, new object[] { Config }); } public OverlayInfo.OverlayAttributeInfo OverlayInfo { get; private set; } public UserControl Control { get; private set; } //this is a bit messy... public IOverlayEditor Editor { get { return (IOverlayEditor)Control; } } public IOverlayConfig Config { get; private set; } public override string ToString() { return OverlayInfo.Info.Description; } } }