From 4a542880728a51627f4165bd8dd5ef3cf86e386f Mon Sep 17 00:00:00 2001 From: Brett Hewitson Date: Wed, 15 Jul 2020 17:29:43 +1000 Subject: [PATCH] Release 17 updates --- .../source/Plugin.Common/PluginHelper.cs | 12 ++ .../source/Plugin.Discord/Art/Drag.ico | Bin 0 -> 102134 bytes .../Plugin.Discord/Models/ObservableList.cs | 11 ++ .../Plugin.Discord/Plugin.Discord.csproj | 2 + .../Plugin.Discord/Properties/AssemblyInfo.cs | 4 +- .../Plugin.Discord/Utils/WindowUtils.cs | 122 ++++++++++++++++++ .../source/Plugin.Discord/VersionFeed.xml | 5 +- .../source/Plugin.Discord/VersionFeedBeta.xml | 27 +++- .../Windows/ConfigProfileWindow.xaml | 12 +- .../Plugin.Discord/Windows/ConfigWindow.xaml | 24 +++- .../Windows/ConfigWindow.xaml.cs | 106 +++++++++++++++ 11 files changed, 306 insertions(+), 19 deletions(-) create mode 100644 Plugins/Discord/source/Plugin.Discord/Art/Drag.ico create mode 100644 Plugins/Discord/source/Plugin.Discord/Utils/WindowUtils.cs diff --git a/Plugins/Discord/source/Plugin.Common/PluginHelper.cs b/Plugins/Discord/source/Plugin.Common/PluginHelper.cs index 7319b613..20c1ea03 100644 --- a/Plugins/Discord/source/Plugin.Common/PluginHelper.cs +++ b/Plugins/Discord/source/Plugin.Common/PluginHelper.cs @@ -198,6 +198,18 @@ namespace ServerManagerTool.Plugin.Common Plugins.Add(new PluginItem { Plugin = plugin, PluginFile = pluginFile, PluginType = nameof(IAlertPlugin) }); } } + else if (type.GetInterface(typeof(IPlugin).Name) != null) + { + var plugin = assembly.CreateInstance(type.FullName) as IPlugin; + if (plugin != null && plugin.Enabled) + { + if (type.GetInterface(typeof(IBeta).Name) != null) + ((IBeta)plugin).BetaEnabled = BetaEnabled; + plugin.Initialize(); + + Plugins.Add(new PluginItem { Plugin = plugin, PluginFile = pluginFile, PluginType = nameof(IPlugin) }); + } + } } catch (Exception ex) { diff --git a/Plugins/Discord/source/Plugin.Discord/Art/Drag.ico b/Plugins/Discord/source/Plugin.Discord/Art/Drag.ico new file mode 100644 index 0000000000000000000000000000000000000000..34f7816af5a0729ae05ef9fa0dce97674ce592a7 GIT binary patch literal 102134 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 + @@ -53,6 +54,7 @@ + diff --git a/Plugins/Discord/source/Plugin.Discord/Properties/AssemblyInfo.cs b/Plugins/Discord/source/Plugin.Discord/Properties/AssemblyInfo.cs index 6cfb03ee..d7975adb 100644 --- a/Plugins/Discord/source/Plugin.Discord/Properties/AssemblyInfo.cs +++ b/Plugins/Discord/source/Plugin.Discord/Properties/AssemblyInfo.cs @@ -30,5 +30,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.17.1")] -[assembly: AssemblyFileVersion("1.0.17.1")] +[assembly: AssemblyVersion("1.0.17.2")] +[assembly: AssemblyFileVersion("1.0.17.2")] diff --git a/Plugins/Discord/source/Plugin.Discord/Utils/WindowUtils.cs b/Plugins/Discord/source/Plugin.Discord/Utils/WindowUtils.cs new file mode 100644 index 00000000..6c765945 --- /dev/null +++ b/Plugins/Discord/source/Plugin.Discord/Utils/WindowUtils.cs @@ -0,0 +1,122 @@ +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Media; + +namespace ServerManagerTool.Plugin.Discord +{ + public static class WindowUtils + { + public static void RemoveDefaultResourceDictionary(Window window, string defaultDictionary) + { + if (window == null) + return; + + var dictToRemove = window.Resources.MergedDictionaries.FirstOrDefault(d => d.Source.OriginalString.Contains(defaultDictionary)); + if (dictToRemove != null) + { + window.Resources.MergedDictionaries.Remove(dictToRemove); + } + } + + public static void RemoveDefaultResourceDictionary(UserControl control, string defaultDictionary) + { + if (control == null) + return; + + var dictToRemove = control.Resources.MergedDictionaries.FirstOrDefault(d => d.Source.OriginalString.Contains(defaultDictionary)); + if (dictToRemove != null) + { + control.Resources.MergedDictionaries.Remove(dictToRemove); + } + } + + /// + /// Finds a parent of a given item on the visual tree. + /// + /// The type of the queried item. + /// A direct or indirect child of the queried item. + /// The first parent item that matches the submitted type parameter. If not matching item can be found, a null reference is being returned. + public static T TryFindParent(DependencyObject child) + where T : DependencyObject + { + //get parent item + DependencyObject parentObject = GetParentObject(child); + + //we've reached the end of the tree + if (parentObject == null) return null; + + //check if the parent matches the type we're looking for + T parent = parentObject as T; + if (parent != null) + return parent; + + //use recursion to proceed with next level + return TryFindParent(parentObject); + } + + /// + /// This method is an alternative to WPF's method, which also supports content elements. + /// Do note, that for content element, this method falls back to the logical tree of the element. + /// + /// The item to be processed. + /// The submitted item's parent, if available. Otherwise null. + public static DependencyObject GetParentObject(DependencyObject child) + { + if (child == null) return null; + var contentElement = child as ContentElement; + + if (contentElement != null) + { + var parent = ContentOperations.GetParent(contentElement); + if (parent != null) return parent; + + var fce = contentElement as FrameworkContentElement; + return fce?.Parent; + } + + //if it's not a ContentElement, rely on VisualTreeHelper + return VisualTreeHelper.GetParent(child); + } + + /// + /// Recursively processes a given dependency object and all its children, and updates sources of all objects that use a binding expression on a given property. + /// + /// The dependency object that marks a starting point. This could be a dialog window or a panel control that hosts bound controls. + /// The properties to be updated if + /// or one of its childs provide it along with a binding expression. + public static void UpdateBindingSources(DependencyObject obj, params DependencyProperty[] properties) + { + foreach (var depProperty in properties) + { + //check whether the submitted object provides a bound property that matches the property parameters + var be = BindingOperations.GetBindingExpression(obj, depProperty); + be?.UpdateSource(); + } + + int count = VisualTreeHelper.GetChildrenCount(obj); + for (int i = 0; i < count; i++) + { + //process child items recursively + var childObject = VisualTreeHelper.GetChild(obj, i); + UpdateBindingSources(childObject, properties); + } + } + + /// + /// Tries to locate a given item within the visual tree, starting with the dependency object at a given position. + /// + /// The type of the element to be found on the visual tree of the element at the given location. + /// The main element which is used to perform hit testing. + /// The position to be evaluated on the origin. + public static T TryFindFromPoint(UIElement reference, Point point) + where T : DependencyObject + { + var element = reference.InputHitTest(point) as DependencyObject; + if (element == null) return null; + if (element is T) return (T)element; + return TryFindParent(element); + } + } +} diff --git a/Plugins/Discord/source/Plugin.Discord/VersionFeed.xml b/Plugins/Discord/source/Plugin.Discord/VersionFeed.xml index 9b8651ab..82e77d98 100644 --- a/Plugins/Discord/source/Plugin.Discord/VersionFeed.xml +++ b/Plugins/Discord/source/Plugin.Discord/VersionFeed.xml @@ -9,8 +9,8 @@ urn:uuid:D8974ABF-8444-4D40-A594-D4443921B3B8 - 1.0.17 (1.0.17.1) - 1.0.17.1 + 1.0.17 (1.0.17.2) + 1.0.17.2 2020-07-13T00:00:00Z @@ -20,6 +20,7 @@
  • Profile name has been converted to a droplist and is now populated with the Server Manager Profile Names for selection.
  • +
  • Added drag/drop feature to the config window.

diff --git a/Plugins/Discord/source/Plugin.Discord/VersionFeedBeta.xml b/Plugins/Discord/source/Plugin.Discord/VersionFeedBeta.xml index eae3c759..de95f6f5 100644 --- a/Plugins/Discord/source/Plugin.Discord/VersionFeedBeta.xml +++ b/Plugins/Discord/source/Plugin.Discord/VersionFeedBeta.xml @@ -5,14 +5,37 @@ Discord Plugin Version Feed This is the Discord Plugin beta version feed. - 2020-07-13T00:00:00Z + 2020-07-12T02:00:00Z + + + urn:uuid:4750D17C-2C8F-4D8C-AA17-B3512F002170 + 1.0.17 (1.0.17.2) + 1.0.17.2 + + 2020-07-12T02:00:00Z + +
+

+ CHANGE +
+

    +
  • Added drag/drop feature to the config window.
  • +
+

+
+
+ + bletch + bletch1971@hotmail.com + +
urn:uuid:D8974ABF-8444-4D40-A594-D4443921B3B8 1.0.17 (1.0.17.1) 1.0.17.1 - 2020-07-13T00:00:00Z + 2020-07-12T00:00:00Z

diff --git a/Plugins/Discord/source/Plugin.Discord/Windows/ConfigProfileWindow.xaml b/Plugins/Discord/source/Plugin.Discord/Windows/ConfigProfileWindow.xaml index 7b2b4b4d..d1ce9835 100644 --- a/Plugins/Discord/source/Plugin.Discord/Windows/ConfigProfileWindow.xaml +++ b/Plugins/Discord/source/Plugin.Discord/Windows/ConfigProfileWindow.xaml @@ -132,7 +132,7 @@ - + - - + + @@ -64,7 +64,7 @@ - + - +