mirror of
https://github.com/9ParsonsB/Pulsar.git
synced 2025-07-01 08:23:42 -04:00
observatory herald (#30)
* WIP: initial commit for observatory herald * Plugin error handling refactor * make error window non-modal * tidy up plugin error handling * first pass for basic herald functionality * corrections for linux env * Use FNV hash directly instead of managing through dictionary/index file * resolve audio queuing issue, switch to personal NetCoreAudio fork * merge cleanup * add enable setting, populate defaults * framework xml doc update * Adjust settings, add style selection, replace locale with demonym in dropdown list. * Test is position is on screen before saving/loading. * use a default that's actually in the list
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
|
||||
namespace Observatory.UI.ViewModels
|
||||
{
|
||||
@ -9,6 +9,9 @@ namespace Observatory.UI.ViewModels
|
||||
public MainWindowViewModel(PluginManagement.PluginManager pluginManager)
|
||||
{
|
||||
core = new CoreViewModel(pluginManager.workerPlugins, pluginManager.notifyPlugins);
|
||||
|
||||
if (pluginManager.errorList.Any())
|
||||
ErrorReporter.ShowErrorPopup("Plugin Load Error", string.Join(Environment.NewLine, pluginManager.errorList));
|
||||
}
|
||||
|
||||
public CoreViewModel core { get; }
|
||||
|
@ -535,7 +535,7 @@ namespace Observatory.UI.Views
|
||||
NotificationArgs args = new()
|
||||
{
|
||||
Title = "Speech Synthesis Test",
|
||||
TitleSsml = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\">Speech Synthesis Test</speak>",
|
||||
TitleSsml = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"\">Speech Synthesis Test</voice></speak>",
|
||||
Detail = harvardSentences.OrderBy(s => new Random().NextDouble()).First()
|
||||
};
|
||||
|
||||
@ -943,6 +943,46 @@ namespace Observatory.UI.Views
|
||||
|
||||
settingsGrid.AddControl(actionButton, settingsGrid.RowDefinitions.Count - 1, 0);
|
||||
|
||||
break;
|
||||
case Dictionary<string, object> dictSetting:
|
||||
|
||||
var backingValueName = (SettingBackingValue)Attribute.GetCustomAttribute(setting.Key, typeof(SettingBackingValue));
|
||||
|
||||
var backingValue = from s in displayedSettings
|
||||
where s.Value == backingValueName.BackingProperty
|
||||
select s.Key;
|
||||
|
||||
if (backingValue.Count() != 1)
|
||||
throw new($"{plugin.ShortName}: Dictionary settings must have exactly one backing value.");
|
||||
|
||||
label.Text += ": ";
|
||||
|
||||
ComboBox selectionDropDown = new()
|
||||
{
|
||||
MinWidth = 200
|
||||
};
|
||||
|
||||
selectionDropDown.Items = from s in dictSetting
|
||||
orderby s.Key
|
||||
select s.Key;
|
||||
|
||||
string currentSelection = backingValue.First().GetValue(plugin.Settings)?.ToString();
|
||||
|
||||
if (currentSelection?.Length > 0)
|
||||
{
|
||||
selectionDropDown.SelectedItem = currentSelection;
|
||||
}
|
||||
|
||||
selectionDropDown.SelectionChanged += (object sender, SelectionChangedEventArgs e) =>
|
||||
{
|
||||
var comboBox = (ComboBox)sender;
|
||||
backingValue.First().SetValue(plugin.Settings, comboBox.SelectedItem.ToString());
|
||||
PluginManagement.PluginManager.GetInstance.SaveSettings(plugin, plugin.Settings);
|
||||
};
|
||||
|
||||
settingsGrid.AddControl(label, settingsGrid.RowDefinitions.Count - 1, 0);
|
||||
settingsGrid.AddControl(selectionDropDown, settingsGrid.RowDefinitions.Count - 1, 1);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -15,17 +15,43 @@ namespace Observatory.UI.Views
|
||||
#endif
|
||||
Height = Properties.Core.Default.MainWindowSize.Height;
|
||||
Width = Properties.Core.Default.MainWindowSize.Width;
|
||||
Position = new PixelPoint(Properties.Core.Default.MainWindowPosition.X, Properties.Core.Default.MainWindowPosition.Y);
|
||||
|
||||
var savedPosition = new System.Drawing.Point(Properties.Core.Default.MainWindowPosition.X, Properties.Core.Default.MainWindowPosition.Y);
|
||||
if (PointWithinDesktopWorkingArea(savedPosition))
|
||||
Position = new PixelPoint(Properties.Core.Default.MainWindowPosition.X, Properties.Core.Default.MainWindowPosition.Y);
|
||||
|
||||
Closing += (object sender, System.ComponentModel.CancelEventArgs e) =>
|
||||
{
|
||||
var size = new System.Drawing.Size((int)System.Math.Round(Width), (int)System.Math.Round(Height));
|
||||
var position = new System.Drawing.Point(Position.X, Position.Y);
|
||||
Properties.Core.Default.MainWindowSize = size;
|
||||
Properties.Core.Default.MainWindowPosition = position;
|
||||
|
||||
var position = new System.Drawing.Point(Position.X, Position.Y);
|
||||
if (PointWithinDesktopWorkingArea(position))
|
||||
Properties.Core.Default.MainWindowPosition = position;
|
||||
|
||||
Properties.Core.Default.Save();
|
||||
};
|
||||
}
|
||||
|
||||
private bool PointWithinDesktopWorkingArea(System.Drawing.Point position)
|
||||
{
|
||||
bool inBounds = false;
|
||||
|
||||
foreach (var screen in Screens.All)
|
||||
{
|
||||
if (screen.WorkingArea.TopLeft.X <= position.X
|
||||
&& screen.WorkingArea.TopLeft.Y <= position.Y
|
||||
&& screen.WorkingArea.BottomRight.X > position.X
|
||||
&& screen.WorkingArea.BottomRight.Y > position.Y)
|
||||
{
|
||||
inBounds = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return inBounds;
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
|
Reference in New Issue
Block a user