From 0c045ebf6e0f72719e4b5f7ba0b40df2c57901c8 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 21 Mar 2025 16:39:31 -0400 Subject: [PATCH] abolish "Edit Mode" in favor of allowing channel, system and alert widgets to be moved with the right mouse button so long as "Lock Widgets" isn't enabled; --- dvmconsole/Controls/AlertTone.xaml | 3 - dvmconsole/Controls/AlertTone.xaml.cs | 65 --------------- dvmconsole/Controls/ChannelBox.xaml.cs | 17 ---- dvmconsole/MainWindow.xaml | 3 +- dvmconsole/MainWindow.xaml.cs | 105 ++++++++++++++----------- dvmconsole/SettingsManager.cs | 6 ++ 6 files changed, 68 insertions(+), 131 deletions(-) diff --git a/dvmconsole/Controls/AlertTone.xaml b/dvmconsole/Controls/AlertTone.xaml index f5f34ed..aaf802a 100644 --- a/dvmconsole/Controls/AlertTone.xaml +++ b/dvmconsole/Controls/AlertTone.xaml @@ -2,9 +2,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="55" Width="105" - MouseLeftButtonDown="AlertTone_MouseLeftButtonDown" - MouseMove="AlertTone_MouseMove" - MouseRightButtonDown="AlertTone_MouseRightButtonDown" DataContext="{Binding RelativeSource={RelativeSource Self}}" Background="#FF848484"> diff --git a/dvmconsole/Controls/AlertTone.xaml.cs b/dvmconsole/Controls/AlertTone.xaml.cs index 9dd8071..7a8717b 100644 --- a/dvmconsole/Controls/AlertTone.xaml.cs +++ b/dvmconsole/Controls/AlertTone.xaml.cs @@ -47,11 +47,6 @@ namespace dvmconsole.Controls /// public string AlertFilePath { get; set; } - /// - /// - /// - public bool IsEditMode { get; set; } - /* ** Events */ @@ -71,10 +66,6 @@ namespace dvmconsole.Controls InitializeComponent(); AlertFilePath = alertFilePath; AlertFileName = System.IO.Path.GetFileNameWithoutExtension(alertFilePath); - - this.MouseLeftButtonDown += AlertTone_MouseLeftButtonDown; - this.MouseMove += AlertTone_MouseMove; - this.MouseRightButtonDown += AlertTone_MouseRightButtonDown; } /// @@ -86,61 +77,5 @@ namespace dvmconsole.Controls { OnAlertTone.Invoke(this); } - - /// - /// - /// - /// - /// - private void AlertTone_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - if (!IsEditMode) return; - - startPoint = e.GetPosition(this); - isDragging = true; - } - - /// - /// - /// - /// - /// - private void AlertTone_MouseMove(object sender, MouseEventArgs e) - { - if (isDragging && IsEditMode) - { - var parentCanvas = VisualTreeHelper.GetParent(this) as Canvas; - if (parentCanvas != null) - { - Point mousePos = e.GetPosition(parentCanvas); - double newLeft = mousePos.X - startPoint.X; - double newTop = mousePos.Y - startPoint.Y; - - Canvas.SetLeft(this, Math.Max(0, newLeft)); - Canvas.SetTop(this, Math.Max(0, newTop)); - } - } - } - - /// - /// - /// - /// - /// - private void AlertTone_MouseRightButtonDown(object sender, MouseButtonEventArgs e) - { - if (!IsEditMode || !isDragging) return; - - isDragging = false; - - var parentCanvas = VisualTreeHelper.GetParent(this) as Canvas; - if (parentCanvas != null) - { - double x = Canvas.GetLeft(this); - double y = Canvas.GetTop(this); - } - - ReleaseMouseCapture(); - } } // public partial class AlertTone : UserControl } // namespace dvmconsole.Controls diff --git a/dvmconsole/Controls/ChannelBox.xaml.cs b/dvmconsole/Controls/ChannelBox.xaml.cs index 151c45f..1fc3d6c 100644 --- a/dvmconsole/Controls/ChannelBox.xaml.cs +++ b/dvmconsole/Controls/ChannelBox.xaml.cs @@ -227,11 +227,6 @@ namespace dvmconsole.Controls /// public string VoiceChannel { get; set; } - /// - /// Flag indicating whether or not edit mode is enabled. - /// - public bool IsEditMode { get; set; } - /// /// Flag indicating whether or not this channel is selected. /// @@ -442,9 +437,6 @@ namespace dvmconsole.Controls /// private void UpdatePTTColor() { - if (IsEditMode) - return; - if (PttState) PttButton.Background = RED_GRADIENT; else @@ -456,9 +448,6 @@ namespace dvmconsole.Controls /// private void UpdatePageColor() { - if (IsEditMode) - return; - if (PageState) PageSelectButton.Background = ORANGE_GRADIENT; else @@ -467,9 +456,6 @@ namespace dvmconsole.Controls private void UpdateHoldColor() { - if (IsEditMode) - return; - if (HoldState) ChannelMarkerBtn.Background = ORANGE_GRADIENT; else @@ -508,9 +494,6 @@ namespace dvmconsole.Controls /// private void ChannelBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { - if (IsEditMode) - return; - IsSelected = !IsSelected; ControlBorder.Background = IsSelected ? BLUE_GRADIENT : DARK_GRAY_GRADIENT; diff --git a/dvmconsole/MainWindow.xaml b/dvmconsole/MainWindow.xaml index 9c22e78..873042f 100644 --- a/dvmconsole/MainWindow.xaml +++ b/dvmconsole/MainWindow.xaml @@ -46,6 +46,7 @@ + @@ -55,7 +56,7 @@ - + diff --git a/dvmconsole/MainWindow.xaml.cs b/dvmconsole/MainWindow.xaml.cs index d2277ae..c3f4646 100644 --- a/dvmconsole/MainWindow.xaml.cs +++ b/dvmconsole/MainWindow.xaml.cs @@ -37,6 +37,7 @@ using fnecore.P25; using fnecore.P25.LC.TSBK; using fnecore.P25.KMM; using System; +using System.Windows.Media; namespace dvmconsole { @@ -69,8 +70,6 @@ namespace dvmconsole private const string URI_RESOURCE_PATH = "pack://application:,,,/dvmconsole;component"; - private bool isEditMode = false; - private bool globalPttState = false; private const int GridSize = 5; @@ -275,8 +274,9 @@ namespace dvmconsole Canvas.SetTop(systemStatusBox, offsetY); } - systemStatusBox.MouseLeftButtonDown += SystemStatusBox_MouseLeftButtonDown; - systemStatusBox.MouseLeftButtonUp += SystemStatusBox_MouseLeftButtonUp; + // widget placement + systemStatusBox.MouseRightButtonDown += SystemStatusBox_MouseRightButtonDown; + systemStatusBox.MouseRightButtonUp += SystemStatusBox_MouseRightButtonUp; systemStatusBox.MouseMove += SystemStatusBox_MouseMove; channelsCanvas.Children.Add(systemStatusBox); @@ -365,9 +365,11 @@ namespace dvmconsole channelBox.PageButtonClicked += ChannelBox_PageButtonClicked; channelBox.HoldChannelButtonClicked += ChannelBox_HoldChannelButtonClicked; - channelBox.MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown; - channelBox.MouseLeftButtonUp += ChannelBox_MouseLeftButtonUp; + // widget placement + channelBox.MouseRightButtonDown += ChannelBox_MouseRightButtonDown; + channelBox.MouseRightButtonUp += ChannelBox_MouseRightButtonUp; channelBox.MouseMove += ChannelBox_MouseMove; + channelsCanvas.Children.Add(channelBox); offsetX += 225; @@ -387,9 +389,15 @@ namespace dvmconsole // iterate through the alert tones and begin building alert tone widges foreach (var alertPath in settingsManager.AlertToneFilePaths) { - AlertTone alertTone = new AlertTone(alertPath) { IsEditMode = isEditMode }; + AlertTone alertTone = new AlertTone(alertPath); + alertTone.OnAlertTone += SendAlertTone; + // widget placement + alertTone.MouseRightButtonDown += AlertTone_MouseRightButtonDown; + alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp; + alertTone.MouseMove += AlertTone_MouseMove; + if (settingsManager.AlertTonePositions.TryGetValue(alertPath, out var position)) { Canvas.SetLeft(alertTone, position.X); @@ -401,8 +409,6 @@ namespace dvmconsole Canvas.SetTop(alertTone, 20); } - alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp; - channelsCanvas.Children.Add(alertTone); } } @@ -425,9 +431,11 @@ namespace dvmconsole playbackChannelBox.PageButtonClicked += ChannelBox_PageButtonClicked; playbackChannelBox.HoldChannelButtonClicked += ChannelBox_HoldChannelButtonClicked; - playbackChannelBox.MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown; - playbackChannelBox.MouseLeftButtonUp += ChannelBox_MouseLeftButtonUp; + // widget placement + playbackChannelBox.MouseRightButtonDown += ChannelBox_MouseRightButtonDown; + playbackChannelBox.MouseRightButtonUp += ChannelBox_MouseRightButtonUp; playbackChannelBox.MouseMove += ChannelBox_MouseMove; + channelsCanvas.Children.Add(playbackChannelBox); Cursor = Cursors.Arrow; @@ -608,21 +616,6 @@ namespace dvmconsole } } - /// - /// - /// - private void UpdateEditModeForWidgets() - { - foreach (var child in channelsCanvas.Children) - { - if (child is AlertTone alertTone) - alertTone.IsEditMode = isEditMode; - - if (child is ChannelBox channelBox) - channelBox.IsEditMode = isEditMode; - } - } - /// /// /// @@ -811,6 +804,7 @@ namespace dvmconsole const double heightOffset = 115; // set PTT toggle mode (this must be done before channel widgets are defined) + menuToggleLockWidgets.IsChecked = settingsManager.LockWidgets; menuTogglePTTMode.IsChecked = settingsManager.TogglePTTMode; if (!string.IsNullOrEmpty(settingsManager.LastCodeplugPath) && File.Exists(settingsManager.LastCodeplugPath)) @@ -1161,10 +1155,15 @@ namespace dvmconsole if (openFileDialog.ShowDialog() == true) { string alertFilePath = openFileDialog.FileName; - var alertTone = new AlertTone(alertFilePath) { IsEditMode = isEditMode }; + var alertTone = new AlertTone(alertFilePath); alertTone.OnAlertTone += SendAlertTone; + // widget placement + alertTone.MouseRightButtonDown += AlertTone_MouseRightButtonDown; + alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp; + alertTone.MouseMove += AlertTone_MouseMove; + if (settingsManager.AlertTonePositions.TryGetValue(alertFilePath, out var position)) { Canvas.SetLeft(alertTone, position.X); @@ -1176,8 +1175,6 @@ namespace dvmconsole Canvas.SetTop(alertTone, 20); } - alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp; - channelsCanvas.Children.Add(alertTone); settingsManager.UpdateAlertTonePaths(alertFilePath); } @@ -1226,12 +1223,12 @@ namespace dvmconsole /// /// /// - private void ToggleEditMode_Click(object sender, RoutedEventArgs e) + private void ToggleLockWidgets_Click(object sender, RoutedEventArgs e) { - isEditMode = !isEditMode; - var menuItem = (MenuItem)sender; - menuItem.Header = isEditMode ? "Disable Edit Mode" : "Enable Edit Mode"; - UpdateEditModeForWidgets(); + if (!windowLoaded) + return; + + settingsManager.LockWidgets = !settingsManager.LockWidgets; } /// @@ -1398,9 +1395,10 @@ namespace dvmconsole /// /// /// - private void ChannelBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + private void ChannelBox_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { - if (!isEditMode || !(sender is UIElement element)) return; + if (settingsManager.LockWidgets || !(sender is UIElement element)) + return; draggedElement = element; startPoint = e.GetPosition(channelsCanvas); @@ -1418,9 +1416,9 @@ namespace dvmconsole /// /// /// - private void ChannelBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + private void ChannelBox_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { - if (!isEditMode || !isDragging || draggedElement == null) + if (settingsManager.LockWidgets || !isDragging || draggedElement == null) return; Cursor = Cursors.Arrow; @@ -1437,7 +1435,7 @@ namespace dvmconsole /// private void ChannelBox_MouseMove(object sender, MouseEventArgs e) { - if (!isEditMode || !isDragging || draggedElement == null) + if (settingsManager.LockWidgets || !isDragging || draggedElement == null) return; Point currentPosition = e.GetPosition(channelsCanvas); @@ -1464,16 +1462,16 @@ namespace dvmconsole /// /// /// - private void SystemStatusBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => ChannelBox_MouseLeftButtonDown(sender, e); + private void SystemStatusBox_MouseRightButtonDown(object sender, MouseButtonEventArgs e) => ChannelBox_MouseRightButtonDown(sender, e); /// /// /// /// /// - private void SystemStatusBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + private void SystemStatusBox_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { - if (!isEditMode) + if (settingsManager.LockWidgets) return; if (sender is SystemStatusBox systemStatusBox) @@ -1482,7 +1480,7 @@ namespace dvmconsole double y = Canvas.GetTop(systemStatusBox); settingsManager.SystemStatusPositions[systemStatusBox.SystemName] = new ChannelPosition { X = x, Y = y }; - ChannelBox_MouseLeftButtonUp(sender, e); + ChannelBox_MouseRightButtonUp(sender, e); } } @@ -1493,6 +1491,13 @@ namespace dvmconsole /// private void SystemStatusBox_MouseMove(object sender, MouseEventArgs e) => ChannelBox_MouseMove(sender, e); + /// + /// + /// + /// + /// + private void AlertTone_MouseRightButtonDown(object sender, MouseButtonEventArgs e) => ChannelBox_MouseRightButtonDown(sender, e); + /// /// /// @@ -1500,16 +1505,26 @@ namespace dvmconsole /// private void AlertTone_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { - if (!isEditMode) return; + if (settingsManager.LockWidgets) + return; if (sender is AlertTone alertTone) { double x = Canvas.GetLeft(alertTone); double y = Canvas.GetTop(alertTone); - settingsManager.UpdateAlertTonePosition(alertTone.AlertFilePath, x, y); + settingsManager.UpdateAlertTonePosition(alertTone.AlertFileName, x, y); + + ChannelBox_MouseRightButtonUp(sender, e); } } + /// + /// + /// + /// + /// + private void AlertTone_MouseMove(object sender, MouseEventArgs e) => ChannelBox_MouseMove(sender, e); + /** WPF Ribbon Controls */ /// diff --git a/dvmconsole/SettingsManager.cs b/dvmconsole/SettingsManager.cs index e2eae09..c26febd 100644 --- a/dvmconsole/SettingsManager.cs +++ b/dvmconsole/SettingsManager.cs @@ -83,6 +83,11 @@ namespace dvmconsole /// public bool TogglePTTMode { get; set; } = true; + /// + /// Flag indicating channel and other widgets are locked in place. + /// + public bool LockWidgets { get; set; } = true; + /// /// Flag indicating window maximized state. /// @@ -145,6 +150,7 @@ namespace dvmconsole AlertTonePositions = loadedSettings.AlertTonePositions ?? new Dictionary(); ChannelOutputDevices = loadedSettings.ChannelOutputDevices ?? new Dictionary(); TogglePTTMode = loadedSettings.TogglePTTMode; + LockWidgets = loadedSettings.LockWidgets; Maximized = loadedSettings.Maximized; DarkMode = loadedSettings.DarkMode; WindowWidth = loadedSettings.WindowWidth;