Implemented option to disable the busy indicator (animation).

This commit is contained in:
LoRd_MuldeR 2021-11-11 21:36:13 +01:00
parent 9e29561707
commit 153aca4517
Signed by: mulder
GPG Key ID: 2B5913365F57E03F
3 changed files with 47 additions and 30 deletions

View File

@ -45,7 +45,7 @@
<StackPanel Style="{StaticResource WaitCursorWhileBusy}" Background="Transparent"> <StackPanel Style="{StaticResource WaitCursorWhileBusy}" Background="Transparent">
<Grid> <Grid>
<Image Source="{StaticResource ImageSource_Banner}" Stretch="None" MouseLeftButtonDown="Image_MouseLeftButtonDown" Name="Banner"/> <Image Source="{StaticResource ImageSource_Banner}" Stretch="None" MouseLeftButtonDown="Image_MouseLeftButtonDown" Name="Banner"/>
<Canvas x:Name="Canvas" IsHitTestVisible="False" Visibility="{Binding IsBusy, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Converter={StaticResource VisibilityConverter}}" Opacity="0.8"/> <Canvas x:Name="Canvas" IsHitTestVisible="False" Visibility="{Binding IsBusyIndicatorVisible, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Converter={StaticResource VisibilityConverter}}" Opacity="0.8"/>
</Grid> </Grid>
<Separator Margin="0"/> <Separator Margin="0"/>
<StackPanel> <StackPanel>

View File

@ -45,8 +45,9 @@ namespace com.muldersoft.slunkcrypt.gui
private readonly ReadOnlyObservableCollection<string> m_logFileReadOnly; private readonly ReadOnlyObservableCollection<string> m_logFileReadOnly;
private volatile ModeOfOperation m_modeOfOperation = (ModeOfOperation)(-1); private volatile ModeOfOperation m_modeOfOperation = (ModeOfOperation)(-1);
private volatile bool m_busyFlag = false, m_checksumError = false, m_processReceived = false, m_checked = false; private volatile bool m_busyFlag = false, m_checksumError = false, m_processReceived = false, m_disableAnimation = false;
private volatile SlunkCryptRunner m_processRunner = null; private volatile SlunkCryptRunner m_processRunner = null;
private uint? m_menuId_disableAnimation = null, m_menuId_enableExpertMode = null;
private const string ASCII_CHARS = "!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"; private const string ASCII_CHARS = "!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~";
@ -58,9 +59,9 @@ namespace com.muldersoft.slunkcrypt.gui
{ {
InitializeComponent(); InitializeComponent();
m_defaultStatusText = Label_Status.Text; m_defaultStatusText = Label_Status.Text;
m_dispatcherTimer = new DispatcherTimer(DispatcherPriority.SystemIdle, Dispatcher); m_dispatcherTimer = new DispatcherTimer(DispatcherPriority.ApplicationIdle, Dispatcher);
m_dispatcherTimer.Tick += DispatcherTimer_Tick; m_dispatcherTimer.Tick += DispatcherTimer_Tick;
m_dispatcherTimer.Interval = TimeSpan.FromMilliseconds(125); m_dispatcherTimer.Interval = TimeSpan.FromMilliseconds(200);
m_logFileReadOnly = new ReadOnlyObservableCollection<string>(m_logFile); m_logFileReadOnly = new ReadOnlyObservableCollection<string>(m_logFile);
} }
@ -76,8 +77,20 @@ namespace com.muldersoft.slunkcrypt.gui
} }
set set
{ {
m_dispatcherTimer.IsEnabled = m_busyFlag = value; if (m_busyFlag != value)
{
m_dispatcherTimer.IsEnabled = (m_busyFlag = value) && (!m_disableAnimation);
NotifyPropertyChanged("IsBusy"); NotifyPropertyChanged("IsBusy");
NotifyPropertyChanged("IsBusyIndicatorVisible");
}
}
}
public bool IsBusyIndicatorVisible
{
get
{
return m_busyFlag && (!m_disableAnimation);
} }
} }
@ -357,7 +370,9 @@ namespace com.muldersoft.slunkcrypt.gui
private async void Window_Loaded(object sender, RoutedEventArgs e) private async void Window_Loaded(object sender, RoutedEventArgs e)
{ {
await Task.Yield(); await Task.Yield();
new SystemMenu(this).AppendMenu("Enable Expert Mode", SystemMenu_Activated); SystemMenu systemMenu = new SystemMenu(this, SystemMenu_Activated);
m_menuId_disableAnimation = systemMenu.AppendMenu("Disable Busy Indicator");
m_menuId_enableExpertMode = systemMenu.AppendMenu("Expert Settings");
CreateIndicatorElements(); CreateIndicatorElements();
} }
@ -377,19 +392,23 @@ namespace com.muldersoft.slunkcrypt.gui
private void SystemMenu_Activated(SystemMenu sender, uint menuId) private void SystemMenu_Activated(SystemMenu sender, uint menuId)
{ {
if (m_checked = (!m_checked)) if (m_menuId_disableAnimation.HasValue && (menuId == m_menuId_disableAnimation.Value))
{
sender.ModifyMenu(menuId, m_disableAnimation = !m_disableAnimation);
if (m_busyFlag)
{
m_dispatcherTimer.IsEnabled = !m_disableAnimation;
NotifyPropertyChanged("IsBusyIndicatorVisible");
}
}
else if (m_menuId_enableExpertMode.HasValue && (menuId == m_menuId_enableExpertMode.Value))
{ {
sender.ModifyMenu(menuId, true);
try try
{ {
Process.Start("https://youtu.be/Is_8bjYVmnA").Dispose(); Process.Start("https://youtu.be/Is_8bjYVmnA").Dispose();
} }
catch { } catch { }
} }
else
{
sender.ModifyMenu(menuId, false);
}
} }
// ============================================================================= // =============================================================================

View File

@ -11,15 +11,14 @@ using System.Windows.Interop;
namespace com.muldersoft.slunkcrypt.gui.utils namespace com.muldersoft.slunkcrypt.gui.utils
{ {
using ItemInfo = Tuple<string, SystemMenu.SystemMenuActionHandler>;
class SystemMenu : IDisposable class SystemMenu : IDisposable
{ {
private const int WM_SYSCOMMAND = 0x112; private const int WM_SYSCOMMAND = 0x112;
public delegate void SystemMenuActionHandler(SystemMenu sender, uint menuId); public delegate void SystemMenuActionHandler(SystemMenu sender, uint menuId);
private readonly SystemMenuActionHandler m_handler;
private readonly HwndSource m_hwndSource; private readonly HwndSource m_hwndSource;
private readonly Dictionary<uint, ItemInfo> m_menuItems = new Dictionary<uint, ItemInfo>(); private readonly Dictionary<uint, string> m_menuItems = new Dictionary<uint, string>();
private bool m_firstItem = true; private bool m_firstItem = true;
private uint m_nextMenuId = 100; private uint m_nextMenuId = 100;
@ -30,12 +29,16 @@ namespace com.muldersoft.slunkcrypt.gui.utils
// Constructor // Constructor
// ============================================================================= // =============================================================================
public SystemMenu(Window window) public SystemMenu(Window window, SystemMenuActionHandler handler)
{ {
if (ReferenceEquals(window, null)) if (ReferenceEquals(window, null))
{ {
throw new ArgumentNullException("Window must not be null!"); throw new ArgumentNullException("Window must not be null!");
} }
if (ReferenceEquals(m_handler = handler, null))
{
throw new ArgumentNullException("SystemMenuActionHandler must not be null!");
}
window.Dispatcher.VerifyAccess(); window.Dispatcher.VerifyAccess();
m_hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(window).Handle); m_hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(window).Handle);
m_hwndSource.AddHook(WndProcHook); m_hwndSource.AddHook(WndProcHook);
@ -45,16 +48,12 @@ namespace com.muldersoft.slunkcrypt.gui.utils
// Public methods // Public methods
// ============================================================================= // =============================================================================
public uint AppendMenu(string captionStr, SystemMenuActionHandler handler) public uint AppendMenu(string captionStr)
{ {
if (m_disposed) if (m_disposed)
{ {
throw new ObjectDisposedException("Already disposed!"); throw new ObjectDisposedException("Already disposed!");
} }
if (ReferenceEquals(handler, null))
{
throw new ArgumentNullException("SystemMenuActionHandler must not be null!");
}
m_hwndSource.Dispatcher.VerifyAccess(); m_hwndSource.Dispatcher.VerifyAccess();
IntPtr hSysMenu = GetSystemMenu(m_hwndSource.Handle, false); IntPtr hSysMenu = GetSystemMenu(m_hwndSource.Handle, false);
if (hSysMenu != IntPtr.Zero) if (hSysMenu != IntPtr.Zero)
@ -69,7 +68,7 @@ namespace com.muldersoft.slunkcrypt.gui.utils
if (AppendMenu(hSysMenu, Native.MenuFlags.MF_STRING, m_nextMenuId, captionStr)) if (AppendMenu(hSysMenu, Native.MenuFlags.MF_STRING, m_nextMenuId, captionStr))
{ {
uint menuItemId = m_nextMenuId++; uint menuItemId = m_nextMenuId++;
m_menuItems.Add(menuItemId, Tuple.Create(captionStr, handler)); m_menuItems.Add(menuItemId, captionStr);
return menuItemId; return menuItemId;
} }
} }
@ -83,13 +82,13 @@ namespace com.muldersoft.slunkcrypt.gui.utils
throw new ObjectDisposedException("Already disposed!"); throw new ObjectDisposedException("Already disposed!");
} }
m_hwndSource.Dispatcher.VerifyAccess(); m_hwndSource.Dispatcher.VerifyAccess();
ItemInfo itemInfo; string captionStr;
if (m_menuItems.TryGetValue(menuId, out itemInfo)) if (m_menuItems.TryGetValue(menuId, out captionStr))
{ {
IntPtr hSysMenu = GetSystemMenu(m_hwndSource.Handle, false); IntPtr hSysMenu = GetSystemMenu(m_hwndSource.Handle, false);
if (hSysMenu != IntPtr.Zero) if (hSysMenu != IntPtr.Zero)
{ {
return ModifyMenu(hSysMenu, menuId, Native.MenuFlags.MF_BYCOMMAND | (isChecked ? Native.MenuFlags.MF_CHECKED : Native.MenuFlags.MF_UNCHECKED), menuId, itemInfo.Item1); return ModifyMenu(hSysMenu, menuId, Native.MenuFlags.MF_BYCOMMAND | (isChecked ? Native.MenuFlags.MF_CHECKED : Native.MenuFlags.MF_UNCHECKED), menuId, captionStr);
} }
return false; return false;
} }
@ -107,11 +106,10 @@ namespace com.muldersoft.slunkcrypt.gui.utils
{ {
if (msg == WM_SYSCOMMAND) if (msg == WM_SYSCOMMAND)
{ {
uint menuId = (uint)wParam.ToInt32(); uint menuId;
ItemInfo itemInfo; if (m_menuItems.ContainsKey(menuId = (uint) wParam.ToInt32()))
if (m_menuItems.TryGetValue(menuId, out itemInfo))
{ {
itemInfo.Item2(this, menuId); m_handler(this, menuId);
handled = true; handled = true;
} }
} }