Add About dialog and app metadata

This commit is contained in:
Ray Berezowski
2026-06-02 18:57:04 -04:00
parent d328c38f31
commit 27a67d2136
7 changed files with 197 additions and 9 deletions

101
AboutWindow.xaml Normal file
View File

@@ -0,0 +1,101 @@
<Window x:Class="TaskbarLauncher.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="About Taskbar Launcher"
Height="410"
Width="560"
ResizeMode="NoResize"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource AppWindowBrush}"
Foreground="{DynamicResource AppTextBrush}">
<Grid Margin="22">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="96"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Width="76"
Height="76"
BorderThickness="1"
BorderBrush="{DynamicResource AppAccentBrush}"
Background="{DynamicResource AppSurfaceBrush}"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<Grid>
<TextBlock Text="MGET"
FontSize="22"
FontWeight="Bold"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{DynamicResource AppAccentBrush}"/>
<Border Height="8"
VerticalAlignment="Bottom"
Background="{DynamicResource AppAccentBrush}"/>
</Grid>
</Border>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<TextBlock Text="Taskbar Launcher" FontSize="24" FontWeight="SemiBold"/>
<TextBlock Text="Portable Windows launcher for folders, apps, and organized menus."
Margin="0,6,0,0"
Foreground="{DynamicResource AppMutedTextBrush}"
TextWrapping="Wrap"/>
</StackPanel>
</Grid>
<Border Grid.Row="1"
Margin="0,22,0,18"
Padding="14"
BorderThickness="1"
BorderBrush="{DynamicResource AppBorderBrush}"
Background="{DynamicResource AppSurfaceBrush}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="Author" FontWeight="SemiBold" Margin="0,0,12,10"/>
<TextBlock x:Name="AuthorText" Grid.Column="1" Margin="0,0,0,10"/>
<TextBlock Text="Version" Grid.Row="1" FontWeight="SemiBold" Margin="0,0,12,10"/>
<TextBlock x:Name="VersionText" Grid.Row="1" Grid.Column="1" Margin="0,0,0,10"/>
<TextBlock Text="Build" Grid.Row="2" FontWeight="SemiBold" Margin="0,0,12,10"/>
<TextBlock x:Name="BuildText" Grid.Row="2" Grid.Column="1" Margin="0,0,0,10"/>
<TextBlock Text="Config" Grid.Row="3" FontWeight="SemiBold" Margin="0,0,12,10"/>
<TextBlock x:Name="ConfigPathText"
Grid.Row="3"
Grid.Column="1"
Margin="0,0,0,10"
TextWrapping="Wrap"/>
<TextBlock Text="Project Site" Grid.Row="4" FontWeight="SemiBold" Margin="0,0,12,0"/>
<TextBlock x:Name="ProjectSiteText"
Grid.Row="4"
Grid.Column="1"
TextWrapping="Wrap"/>
</Grid>
</Border>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="Open Config Folder" Click="OpenConfigFolder_Click" Margin="0,0,8,0"/>
<Button Content="Close" Click="Close_Click"/>
</StackPanel>
</Grid>
</Window>

49
AboutWindow.xaml.cs Normal file
View File

@@ -0,0 +1,49 @@
using System.Diagnostics;
using System.Windows;
using System.Windows.Input;
using TaskbarLauncher.Services;
namespace TaskbarLauncher;
public partial class AboutWindow : Window
{
public AboutWindow()
{
InitializeComponent();
AuthorText.Text = AppInfo.Author;
VersionText.Text = AppInfo.Version;
BuildText.Text = AppInfo.Build;
ConfigPathText.Text = ConfigService.ConfigPath;
if (string.IsNullOrWhiteSpace(AppInfo.GiveawaySiteUrl))
{
ProjectSiteText.Text = "Project giveaway site link will be added after review.";
}
else
{
ProjectSiteText.Text = AppInfo.GiveawaySiteUrl;
ProjectSiteText.Cursor = System.Windows.Input.Cursors.Hand;
ProjectSiteText.MouseLeftButtonUp += (_, _) => OpenUrl(AppInfo.GiveawaySiteUrl);
}
}
private static void OpenUrl(string url)
{
Process.Start(new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
});
}
private void OpenConfigFolder_Click(object sender, RoutedEventArgs e)
{
ConfigService.OpenConfigFolder();
}
private void Close_Click(object sender, RoutedEventArgs e)
{
Close();
}
}

View File

@@ -25,6 +25,7 @@
<Button Content="Restore Config" Click="RestoreConfig_Click" Margin="0,0,8,0"/> <Button Content="Restore Config" Click="RestoreConfig_Click" Margin="0,0,8,0"/>
<Button Content="Reload Config" Click="ReloadConfig_Click" Margin="0,0,8,0"/> <Button Content="Reload Config" Click="ReloadConfig_Click" Margin="0,0,8,0"/>
<Button Content="Open Config Folder" Click="OpenConfigFolder_Click" Margin="0,0,8,0"/> <Button Content="Open Config Folder" Click="OpenConfigFolder_Click" Margin="0,0,8,0"/>
<Button Content="About" Click="About_Click" Margin="0,0,8,0"/>
<Button Content="Close" Click="Close_Click"/> <Button Content="Close" Click="Close_Click"/>
</StackPanel> </StackPanel>
</Border> </Border>

View File

@@ -4,7 +4,6 @@ using System.Windows.Forms;
using System.Windows.Media; using System.Windows.Media;
using System.IO; using System.IO;
using System.Windows.Input; using System.Windows.Input;
using System.Reflection;
using TaskbarLauncher.Models; using TaskbarLauncher.Models;
using TaskbarLauncher.Services; using TaskbarLauncher.Services;
using MessageBox = System.Windows.MessageBox; using MessageBox = System.Windows.MessageBox;
@@ -35,7 +34,7 @@ public partial class MainWindow : Window
DisplayModeBox.ItemsSource = Enum.GetValues<LauncherDisplayMode>(); DisplayModeBox.ItemsSource = Enum.GetValues<LauncherDisplayMode>();
ItemDisplayModeBox.ItemsSource = Enum.GetValues<LauncherDisplayMode>(); ItemDisplayModeBox.ItemsSource = Enum.GetValues<LauncherDisplayMode>();
TypeBox.ItemsSource = Enum.GetValues<LauncherItemType>(); TypeBox.ItemsSource = Enum.GetValues<LauncherItemType>();
VersionText.Text = $"Version {GetAppVersion()}"; VersionText.Text = $"Version {AppInfo.Version} Build {AppInfo.Build}";
RefreshView(); RefreshView();
} }
@@ -68,13 +67,6 @@ public partial class MainWindow : Window
} }
} }
private static string GetAppVersion()
{
return Assembly.GetExecutingAssembly()
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
.InformationalVersion ?? "development";
}
private static TreeViewItem CreateTreeItem(LauncherItem item) private static TreeViewItem CreateTreeItem(LauncherItem item)
{ {
var treeItem = new TreeViewItem { Header = $"{item.Title} ({item.Type})", Tag = item }; var treeItem = new TreeViewItem { Header = $"{item.Title} ({item.Type})", Tag = item };
@@ -701,6 +693,16 @@ public partial class MainWindow : Window
ConfigService.OpenConfigFolder(); ConfigService.OpenConfigFolder();
} }
private void About_Click(object sender, RoutedEventArgs e)
{
AboutWindow aboutWindow = new()
{
Owner = this
};
aboutWindow.ShowDialog();
}
private void Close_Click(object sender, RoutedEventArgs e) private void Close_Click(object sender, RoutedEventArgs e)
{ {
Hide(); Hide();

18
Services/AppInfo.cs Normal file
View File

@@ -0,0 +1,18 @@
using System.Reflection;
namespace TaskbarLauncher.Services;
public static class AppInfo
{
public const string ProductName = "Taskbar Launcher";
public const string Author = "Ray Berezowski";
public const string GiveawaySiteUrl = "";
public static string Version =>
Assembly.GetExecutingAssembly()
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
.InformationalVersion ?? "development";
public static string Build =>
Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "development";
}

View File

@@ -13,6 +13,7 @@ public sealed class LauncherController : IDisposable
private NotifyIcon? notifyIcon; private NotifyIcon? notifyIcon;
private LauncherPopup? popup; private LauncherPopup? popup;
private MainWindow? settingsWindow; private MainWindow? settingsWindow;
private AboutWindow? aboutWindow;
public LauncherConfig Config { get; private set; } = new(); public LauncherConfig Config { get; private set; } = new();
@@ -38,6 +39,20 @@ public sealed class LauncherController : IDisposable
settingsWindow.Activate(); settingsWindow.Activate();
} }
public void ShowAbout()
{
if (aboutWindow?.IsVisible == true)
{
aboutWindow.Activate();
return;
}
aboutWindow = new AboutWindow();
aboutWindow.Closed += (_, _) => aboutWindow = null;
aboutWindow.Show();
aboutWindow.Activate();
}
public void TogglePopup() public void TogglePopup()
{ {
if (popup?.IsVisible == true) if (popup?.IsVisible == true)
@@ -83,6 +98,7 @@ public sealed class LauncherController : IDisposable
notifyIcon.DoubleClick += (_, _) => TogglePopup(); notifyIcon.DoubleClick += (_, _) => TogglePopup();
notifyIcon.ContextMenuStrip.Items.Add("Open Launcher", null, (_, _) => TogglePopup()); notifyIcon.ContextMenuStrip.Items.Add("Open Launcher", null, (_, _) => TogglePopup());
notifyIcon.ContextMenuStrip.Items.Add("Settings", null, (_, _) => ShowSettings()); notifyIcon.ContextMenuStrip.Items.Add("Settings", null, (_, _) => ShowSettings());
notifyIcon.ContextMenuStrip.Items.Add("About", null, (_, _) => ShowAbout());
notifyIcon.ContextMenuStrip.Items.Add("Reload Config", null, (_, _) => ReloadConfig()); notifyIcon.ContextMenuStrip.Items.Add("Reload Config", null, (_, _) => ReloadConfig());
notifyIcon.ContextMenuStrip.Items.Add("Open Config Folder", null, (_, _) => ConfigService.OpenConfigFolder()); notifyIcon.ContextMenuStrip.Items.Add("Open Config Folder", null, (_, _) => ConfigService.OpenConfigFolder());
notifyIcon.ContextMenuStrip.Items.Add("Exit", null, (_, _) => System.Windows.Application.Current.Shutdown()); notifyIcon.ContextMenuStrip.Items.Add("Exit", null, (_, _) => System.Windows.Application.Current.Shutdown());

View File

@@ -8,6 +8,7 @@
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<DefaultItemExcludes>$(DefaultItemExcludes);bin\**;obj\**;builds\**;_*\**;..\TaskbarLauncher-build\**</DefaultItemExcludes> <DefaultItemExcludes>$(DefaultItemExcludes);bin\**;obj\**;builds\**;_*\**;..\TaskbarLauncher-build\**</DefaultItemExcludes>
<Authors>Ray Berezowski</Authors>
<Version>1.0.0</Version> <Version>1.0.0</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion> <AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion> <FileVersion>1.0.0.0</FileVersion>