2
0
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:
Xjph
2021-11-15 10:57:46 -03:30
committed by GitHub
parent 9ad3f77bb8
commit 554948534e
22 changed files with 1144 additions and 61 deletions

View File

@ -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; }

View File

@ -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;
}
}

View File

@ -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);