10 Commits

Author SHA1 Message Date
4751ae476d Cleanup
- Refactoring
- Resource strings
2024-09-30 20:10:42 -04:00
6d4d33c82f Tweak async and deploy debug for now so debugger can be attached 2024-09-30 18:18:59 -04:00
fe0b0895b4 Fix async 2024-09-30 18:12:00 -04:00
978873a58a Add hourglass cursor when checking for updates 2024-09-30 17:47:49 -04:00
733a3de573 Add update settings panel 2024-09-30 17:41:54 -04:00
5631bc87be Start working on settings UI 2024-09-29 21:00:13 -04:00
3a87285e58 Update icons 2024-09-26 21:42:44 -04:00
14ac34f27f Set an application icon 2024-09-26 21:35:17 -04:00
72644ef84f Tweaks to install 2024-09-26 21:22:35 -04:00
e732fe9d91 Small updates
- Add manual GH action trigger
- Update release name
2024-09-26 21:00:33 -04:00
17 changed files with 541 additions and 77 deletions

View File

@@ -5,6 +5,8 @@ on:
branches:
- main
workflow_dispatch:
jobs:
deploy-to-github-releases:
runs-on: windows-latest
@@ -24,11 +26,11 @@ jobs:
dotnet-version: 8.0.x
- name: Publish Application
run: dotnet publish WorldClockStatusWindow.csproj -c Release -o publish -r win-x64 --self-contained true
run: dotnet publish WorldClockStatusWindow.csproj -c Debug -o publish
- name: Create Velopack Release
run: |
dotnet tool install -g vpk
vpk download github --repoUrl https://github.com/ckaczor/WorldClockStatusWindow
vpk pack -u WorldClockStatusWindow -v ${{ steps.version.outputs.version }} -p publish
vpk upload github --repoUrl https://github.com/ckaczor/WorldClockStatusWindow --publish --releaseName "WorldClockStatusWindow ${{ steps.version.outputs.version }}" --tag v${{ steps.version.outputs.version }} --token ${{ secrets.GITHUB_TOKEN }}
vpk pack -u WorldClockStatusWindow -v ${{ steps.version.outputs.version }} -p publish --packTitle "World Clock Status Window" --shortcuts StartMenuRoot --framework net8.0-x64-desktop
vpk upload github --repoUrl https://github.com/ckaczor/WorldClockStatusWindow --publish --releaseName "${{ steps.version.outputs.version }}" --tag v${{ steps.version.outputs.version }} --token ${{ secrets.GITHUB_TOKEN }}

View File

@@ -22,6 +22,9 @@
<setting name="TimeZones" serializeAs="String">
<value>[]</value>
</setting>
<setting name="CheckVersionAtStartup" serializeAs="String">
<value>True</value>
</setting>
</WorldClockStatusWindow.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34014
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -19,10 +19,10 @@ namespace WorldClockStatusWindow.Properties {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
public class Resources {
private static global::System.Resources.ResourceManager resourceMan;
@@ -36,7 +36,7 @@ namespace WorldClockStatusWindow.Properties {
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WorldClockStatusWindow.Properties.Resources", typeof(Resources).Assembly);
@@ -51,7 +51,7 @@ namespace WorldClockStatusWindow.Properties {
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
@@ -63,11 +63,177 @@ namespace WorldClockStatusWindow.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon ApplicationIcon {
public static System.Drawing.Icon ApplicationIcon {
get {
object obj = ResourceManager.GetObject("ApplicationIcon", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized string similar to World Clock Status Window.
/// </summary>
public static string ApplicationName {
get {
return ResourceManager.GetString("ApplicationName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Checking for update....
/// </summary>
public static string CheckingForUpdate {
get {
return ResourceManager.GetString("CheckingForUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Check for Update.
/// </summary>
public static string CheckUpdate {
get {
return ResourceManager.GetString("CheckUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Check _Now.
/// </summary>
public static string checkVersionNowButton {
get {
return ResourceManager.GetString("checkVersionNowButton", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Check for a new version on startup.
/// </summary>
public static string checkVersionOnStartupCheckBox {
get {
return ResourceManager.GetString("checkVersionOnStartupCheckBox", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Close.
/// </summary>
public static string CloseButtonText {
get {
return ResourceManager.GetString("CloseButtonText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Downloading update....
/// </summary>
public static string DownloadingUpdate {
get {
return ResourceManager.GetString("DownloadingUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Installing update....
/// </summary>
public static string InstallingUpdate {
get {
return ResourceManager.GetString("InstallingUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Loading....
/// </summary>
public static string Loading {
get {
return ResourceManager.GetString("Loading", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to About.
/// </summary>
public static string optionCategoryAbout {
get {
return ResourceManager.GetString("optionCategoryAbout", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to General.
/// </summary>
public static string optionCategoryGeneral {
get {
return ResourceManager.GetString("optionCategoryGeneral", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update.
/// </summary>
public static string optionCategoryUpdate {
get {
return ResourceManager.GetString("optionCategoryUpdate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
public static string SettingsTitle {
get {
return ResourceManager.GetString("SettingsTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Start when Windows starts.
/// </summary>
public static string startWithWindowsCheckBox {
get {
return ResourceManager.GetString("startWithWindowsCheckBox", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You are already running the most recent version.
///
///No updates are available at this time..
/// </summary>
public static string UpdateCheckCurrent {
get {
return ResourceManager.GetString("UpdateCheckCurrent", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Version {1} of {0} is now available.
///
///Would you like to download and install it now?.
/// </summary>
public static string UpdateCheckNewVersion {
get {
return ResourceManager.GetString("UpdateCheckNewVersion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} Update.
/// </summary>
public static string UpdateCheckTitle {
get {
return ResourceManager.GetString("UpdateCheckTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Version {0}.
/// </summary>
public static string Version {
get {
return ResourceManager.GetString("Version", resourceCulture);
}
}
}
}

View File

@@ -121,4 +121,62 @@
<data name="ApplicationIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Application.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ApplicationName" xml:space="preserve">
<value>World Clock Status Window</value>
</data>
<data name="optionCategoryAbout" xml:space="preserve">
<value>About</value>
</data>
<data name="CheckUpdate" xml:space="preserve">
<value>_Check for Update</value>
</data>
<data name="startWithWindowsCheckBox" xml:space="preserve">
<value>_Start when Windows starts</value>
</data>
<data name="optionCategoryGeneral" xml:space="preserve">
<value>General</value>
</data>
<data name="SettingsTitle" xml:space="preserve">
<value>Settings</value>
</data>
<data name="CloseButtonText" xml:space="preserve">
<value>Close</value>
</data>
<data name="Version" xml:space="preserve">
<value>Version {0}</value>
</data>
<data name="optionCategoryUpdate" xml:space="preserve">
<value>Update</value>
</data>
<data name="checkVersionOnStartupCheckBox" xml:space="preserve">
<value>_Check for a new version on startup</value>
</data>
<data name="checkVersionNowButton" xml:space="preserve">
<value>Check _Now</value>
</data>
<data name="UpdateCheckTitle" xml:space="preserve">
<value>{0} Update</value>
</data>
<data name="UpdateCheckCurrent" xml:space="preserve">
<value>You are already running the most recent version.
No updates are available at this time.</value>
</data>
<data name="UpdateCheckNewVersion" xml:space="preserve">
<value>Version {0} is now available.
Would you like to download and install it now?</value>
</data>
<data name="Loading" xml:space="preserve">
<value>Loading...</value>
</data>
<data name="CheckingForUpdate" xml:space="preserve">
<value>Checking for update...</value>
</data>
<data name="DownloadingUpdate" xml:space="preserve">
<value>Downloading update...</value>
</data>
<data name="InstallingUpdate" xml:space="preserve">
<value>Installing update...</value>
</data>
</root>

View File

@@ -70,5 +70,17 @@ namespace WorldClockStatusWindow.Properties {
this["TimeZones"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool CheckVersionAtStartup {
get {
return ((bool)(this["CheckVersionAtStartup"]));
}
set {
this["CheckVersionAtStartup"] = value;
}
}
}
}

View File

@@ -14,5 +14,8 @@
<Setting Name="TimeZones" Type="System.String" Scope="User">
<Value Profile="(Default)">[]</Value>
</Setting>
<Setting Name="CheckVersionAtStartup" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -0,0 +1,21 @@
<windows:CategoryPanelBase x:Class="WorldClockStatusWindow.SettingsWindow.AboutSettingsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:properties="clr-namespace:WorldClockStatusWindow.Properties"
xmlns:worldClockStatusWindow="clr-namespace:WorldClockStatusWindow"
xmlns:windows="clr-namespace:ChrisKaczor.Wpf.Windows;assembly=ChrisKaczor.Wpf.Windows.CategoryWindow"
mc:Ignorable="d"
d:DesignHeight="150"
d:DesignWidth="300">
<Grid>
<StackPanel windows:Spacing.Vertical="10">
<TextBlock Text="{x:Static properties:Resources.ApplicationName}"
FontWeight="Bold" />
<TextBlock Text="{Binding Source={x:Static worldClockStatusWindow:UpdateCheck.LocalVersion}, StringFormat={x:Static properties:Resources.Version}}"
Name="VersionLabel" />
<TextBlock Text="Chris Kaczor" />
</StackPanel>
</Grid>
</windows:CategoryPanelBase>

View File

@@ -0,0 +1,12 @@
namespace WorldClockStatusWindow.SettingsWindow
{
public partial class AboutSettingsPanel
{
public AboutSettingsPanel()
{
InitializeComponent();
}
public override string CategoryName => Properties.Resources.optionCategoryAbout;
}
}

View File

@@ -0,0 +1,16 @@
<windows:CategoryPanelBase x:Class="WorldClockStatusWindow.SettingsWindow.GeneralSettingsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:properties="clr-namespace:WorldClockStatusWindow.Properties"
xmlns:windows="clr-namespace:ChrisKaczor.Wpf.Windows;assembly=ChrisKaczor.Wpf.Windows.CategoryWindow"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300">
<StackPanel windows:Spacing.Vertical="10">
<CheckBox Content="{x:Static properties:Resources.startWithWindowsCheckBox}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=AutoStart}"
Click="OnSaveSettings" />
</StackPanel>
</windows:CategoryPanelBase>

View File

@@ -0,0 +1,36 @@
using ChrisKaczor.Wpf.Application;
using System.Windows;
using WorldClockStatusWindow.Properties;
namespace WorldClockStatusWindow.SettingsWindow;
public partial class GeneralSettingsPanel
{
public GeneralSettingsPanel()
{
InitializeComponent();
}
public override string CategoryName => Properties.Resources.optionCategoryGeneral;
public override void LoadPanel(Window parentWindow)
{
base.LoadPanel(parentWindow);
MarkLoaded();
}
private void OnSaveSettings(object sender, RoutedEventArgs e)
{
SaveSettings();
}
private void SaveSettings()
{
if (!HasLoaded) return;
Settings.Default.Save();
Application.Current.SetStartWithWindows(Settings.Default.AutoStart);
}
}

View File

@@ -0,0 +1,22 @@
<windows:CategoryPanelBase x:Class="WorldClockStatusWindow.SettingsWindow.UpdateSettingsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:properties="clr-namespace:WorldClockStatusWindow.Properties"
xmlns:windows="clr-namespace:ChrisKaczor.Wpf.Windows;assembly=ChrisKaczor.Wpf.Windows.CategoryWindow"
xmlns:worldClockStatusWindow="clr-namespace:WorldClockStatusWindow"
mc:Ignorable="d"
d:DesignHeight="150"
d:DesignWidth="250">
<StackPanel windows:Spacing.Vertical="10">
<CheckBox Content="{x:Static properties:Resources.checkVersionOnStartupCheckBox}"
Name="CheckVersionOnStartupCheckBox"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=CheckVersionAtStartup}"
Click="OnSaveSettings" />
<Button Content="{x:Static properties:Resources.checkVersionNowButton}"
IsEnabled="{Binding Source={x:Static worldClockStatusWindow:UpdateCheck.IsInstalled}}"
HorizontalAlignment="Left"
Click="HandleCheckVersionNowButtonClick" />
</StackPanel>
</windows:CategoryPanelBase>

View File

@@ -0,0 +1,38 @@
using System.Windows;
using System.Windows.Input;
using WorldClockStatusWindow.Properties;
namespace WorldClockStatusWindow.SettingsWindow;
public partial class UpdateSettingsPanel
{
public UpdateSettingsPanel()
{
InitializeComponent();
}
public override string CategoryName => Properties.Resources.optionCategoryUpdate;
private async void HandleCheckVersionNowButtonClick(object sender, RoutedEventArgs e)
{
var cursor = Cursor;
Cursor = Cursors.Wait;
await UpdateCheck.DisplayUpdateInformation(true);
Cursor = cursor;
}
private void OnSaveSettings(object sender, RoutedEventArgs e)
{
SaveSettings();
}
private void SaveSettings()
{
if (!HasLoaded) return;
Settings.Default.Save();
}
}

50
UpdateCheck.cs Normal file
View File

@@ -0,0 +1,50 @@
using NuGet.Versioning;
using Serilog;
using System.Threading.Tasks;
using System.Windows;
using Velopack;
using Velopack.Sources;
namespace WorldClockStatusWindow;
internal static class UpdateCheck
{
private static UpdateManager _updateManager;
public static UpdateManager UpdateManager => _updateManager ??= new UpdateManager(new GithubSource("https://github.com/ckaczor/WorldClockStatusWindow", null, false));
public static string LocalVersion => (UpdateManager.CurrentVersion ?? new SemanticVersion(0, 0, 0)).ToString();
public static bool IsInstalled => UpdateManager.IsInstalled;
public static async Task DisplayUpdateInformation(bool showIfCurrent)
{
var newVersion = IsInstalled ? await UpdateManager.CheckForUpdatesAsync() : null;
if (newVersion != null)
{
var updateCheckTitle = string.Format(Properties.Resources.UpdateCheckTitle, Properties.Resources.ApplicationName);
var updateCheckMessage = string.Format(Properties.Resources.UpdateCheckNewVersion, newVersion.TargetFullRelease.Version);
if (MessageBox.Show(updateCheckMessage, updateCheckTitle, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
return;
Log.Logger.Information("Downloading update");
await UpdateManager.DownloadUpdatesAsync(newVersion);
Log.Logger.Information("Installing update");
UpdateManager.ApplyUpdatesAndRestart(newVersion);
}
else if (showIfCurrent)
{
var updateCheckTitle = string.Format(Properties.Resources.UpdateCheckTitle, Properties.Resources.ApplicationName);
var updateCheckMessage = string.Format(Properties.Resources.UpdateCheckCurrent, Properties.Resources.ApplicationName);
MessageBox.Show(updateCheckMessage, updateCheckTitle, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}

View File

@@ -1,16 +1,16 @@
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
using ChrisKaczor.Wpf.Windows;
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Threading;
using Velopack;
using Velopack.Sources;
using WorldClockStatusWindow.Properties;
using WorldClockStatusWindow.SettingsWindow;
namespace WorldClockStatusWindow;
@@ -20,19 +20,15 @@ internal class WindowSource : IWindowSource, IDisposable
private readonly Timer _timer;
private readonly Dispatcher _dispatcher;
private readonly UpdateManager _updateManager;
private List<TimeZoneEntry> _timeZoneEntries;
internal WindowSource()
{
_floatingStatusWindow = new FloatingStatusWindow(this);
_floatingStatusWindow.SetText("Loading...");
_floatingStatusWindow.SetText(Resources.Loading);
_dispatcher = Dispatcher.CurrentDispatcher;
_updateManager = new UpdateManager(new GithubSource("https://github.com/ckaczor/WorldClockStatusWindow", null, false));
_timer = new Timer(1000);
Task.Factory.StartNew(UpdateApp).ContinueWith(task => Start(task.Result.Result));
@@ -42,29 +38,32 @@ internal class WindowSource : IWindowSource, IDisposable
{
try
{
if (!_updateManager.IsInstalled)
if (!UpdateCheck.IsInstalled)
return false;
if (!Settings.Default.CheckVersionAtStartup)
return false;
Log.Logger.Information("Checking for update");
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Checking for update..."));
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.CheckingForUpdate));
var newVersion = await _updateManager.CheckForUpdatesAsync();
var newVersion = await UpdateCheck.UpdateManager.CheckForUpdatesAsync();
if (newVersion == null)
return false;
Log.Logger.Information("Downloading update");
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Downloading update..."));
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.DownloadingUpdate));
await _updateManager.DownloadUpdatesAsync(newVersion);
await UpdateCheck.UpdateManager.DownloadUpdatesAsync(newVersion);
Log.Logger.Information("Installing update");
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Installing update..."));
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.InstallingUpdate));
_updateManager.ApplyUpdatesAndRestart(newVersion);
UpdateCheck.UpdateManager.ApplyUpdatesAndRestart(newVersion);
}
catch (Exception e)
{
@@ -93,7 +92,7 @@ internal class WindowSource : IWindowSource, IDisposable
private void Load()
{
_timeZoneEntries = JsonSerializer.Deserialize<List<TimeZoneEntry>>(Properties.Settings.Default.TimeZones);
_timeZoneEntries = JsonSerializer.Deserialize<List<TimeZoneEntry>>(Settings.Default.TimeZones);
if (_timeZoneEntries.Any())
return;
@@ -108,8 +107,8 @@ internal class WindowSource : IWindowSource, IDisposable
private void Save()
{
Properties.Settings.Default.TimeZones = JsonSerializer.Serialize(_timeZoneEntries);
Properties.Settings.Default.Save();
Settings.Default.TimeZones = JsonSerializer.Serialize(_timeZoneEntries);
Settings.Default.Save();
}
private void HandleTimerElapsed(object sender, ElapsedEventArgs e)
@@ -127,13 +126,9 @@ internal class WindowSource : IWindowSource, IDisposable
if (text.Length > 0)
text.AppendLine();
text.Append($"{timeZoneEntry.Label.PadLeft(labelLength)}: {TimeZoneInfo.ConvertTime(now, timeZone).ToString(Properties.Settings.Default.TimeFormat)}");
text.Append($"{timeZoneEntry.Label.PadLeft(labelLength)}: {TimeZoneInfo.ConvertTime(now, timeZone).ToString(Settings.Default.TimeFormat)}");
}
text.AppendLine();
text.AppendLine();
text.Append(_updateManager.CurrentVersion);
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(text.ToString()));
}
@@ -148,9 +143,9 @@ internal class WindowSource : IWindowSource, IDisposable
public Guid Id => Guid.Parse("29DF6CFD-6783-406F-AE12-4723EB7741EA");
public string Name => "World Clock";
public string Name => Resources.ApplicationName;
public System.Drawing.Icon Icon => Properties.Resources.ApplicationIcon;
public System.Drawing.Icon Icon => Resources.ApplicationIcon;
public bool HasSettingsMenu => true;
@@ -158,11 +153,23 @@ internal class WindowSource : IWindowSource, IDisposable
public void ShowAbout()
{
_floatingStatusWindow.SetText(Assembly.GetEntryAssembly()!.GetName().Version!.ToString());
}
public void ShowSettings()
{
var categoryPanels = new List<CategoryPanelBase>
{
new GeneralSettingsPanel(),
new UpdateSettingsPanel(),
new AboutSettingsPanel()
};
var settingsWindow = new CategoryWindow(categoryPanels, Resources.SettingsTitle, Resources.CloseButtonText);
var dialogResult = settingsWindow.ShowDialog();
if (!dialogResult.GetValueOrDefault(false))
return;
Save();
}
@@ -175,11 +182,11 @@ internal class WindowSource : IWindowSource, IDisposable
public string WindowSettings
{
get => Properties.Settings.Default.WindowSettings;
get => Settings.Default.WindowSettings;
set
{
Properties.Settings.Default.WindowSettings = value;
Properties.Settings.Default.Save();
Settings.Default.WindowSettings = value;
Settings.Default.Save();
}
}
}

View File

@@ -1,40 +1,56 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows7.0</TargetFramework>
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<StartupObject>WorldClockStatusWindow.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ChrisKaczor.Wpf.Application.StartWithWindows" Version="1.0.5" />
<PackageReference Include="ChrisKaczor.Wpf.Windows.FloatingStatusWindow" Version="2.0.0.5" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Serilog" Version="4.0.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Velopack" Version="0.0.626" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include=".github\workflows\main.yml" />
</ItemGroup>
<PropertyGroup>
<TargetFramework>net8.0-windows7.0</TargetFramework>
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<StartupObject>WorldClockStatusWindow.Program</StartupObject>
<ApplicationIcon>Resources\Application.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<Content Include="Resources\Application.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ChrisKaczor.Wpf.Application.StartWithWindows" Version="1.0.5" />
<PackageReference Include="ChrisKaczor.Wpf.Windows.CategoryWindow" Version="1.0.2" />
<PackageReference Include="ChrisKaczor.Wpf.Windows.FloatingStatusWindow" Version="2.0.0.5" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Serilog" Version="4.0.2" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Velopack" Version="0.0.626" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include=".github\workflows\main.yml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kaczor/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>