add support for Toggle PTT (click to PTT, click again to unkey), or Regular PTT (click and hold to PTT, release to unkey);

pull/1/head
Bryan Biedenkapp 11 months ago
parent 21e12edac8
commit ad08847e07

@ -43,6 +43,17 @@
<TextBlock Text="{Binding SystemName}" Foreground="Gold" FontSize="10"/> <TextBlock Text="{Binding SystemName}" Foreground="Gold" FontSize="10"/>
</StackPanel> </StackPanel>
<!-- PTT Button -->
<Button x:Name="PttButton" HorizontalAlignment="Left" Width="42" Margin="41,1,0,4" Grid.ColumnSpan="2" BorderThickness="0,0,0,0" BorderBrush="#FFC1C1C1" UseLayoutRounding="False" Grid.RowSpan="2" Background="#FFEEA400"
ToolTip="Push To Talk">
<Button.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="2"/>
</Style>
</Button.Resources>
<Image Source="/dvmconsole;component/Assets/instantptt.png" Width="39" Height="40" Stretch="Fill" Margin="0,0,0,1"/>
</Button>
<!-- Volume Slider --> <!-- Volume Slider -->
<Slider Minimum="0" Maximum="4" Value="{Binding Volume, Mode=TwoWay}" <Slider Minimum="0" Maximum="4" Value="{Binding Volume, Mode=TwoWay}"
Height="21" VerticalAlignment="Top" x:Name="VolumeSlider" Height="21" VerticalAlignment="Top" x:Name="VolumeSlider"
@ -101,15 +112,6 @@
<Image Source="/dvmconsole;component/Assets/channelmarker.png" Width="36" Height="40"/> <Image Source="/dvmconsole;component/Assets/channelmarker.png" Width="36" Height="40"/>
</Button> </Button>
</StackPanel> </StackPanel>
<Button x:Name="PttButton" Click="PTTButton_Click" HorizontalAlignment="Left" Width="42" Margin="41,1,0,4" Grid.ColumnSpan="2" BorderThickness="0,0,0,0" BorderBrush="#FFC1C1C1" UseLayoutRounding="False" Grid.RowSpan="2" Background="#FFEEA400"
ToolTip="Push To Talk">
<Button.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="2"/>
</Style>
</Button.Resources>
<Image Source="/dvmconsole;component/Assets/instantptt.png" Width="39" Height="40" Stretch="Fill" Margin="0,0,0,1"/>
</Button>
</Grid> </Grid>
</Border> </Border>
</UserControl> </UserControl>

@ -72,6 +72,8 @@ namespace dvmconsole.Controls
public P25Crypto Crypter = new P25Crypto(); public P25Crypto Crypter = new P25Crypto();
private bool pttToggleMode = false;
/* /*
** Properties ** Properties
*/ */
@ -107,6 +109,14 @@ namespace dvmconsole.Controls
/// </summary> /// </summary>
public event EventHandler<ChannelBox> PTTButtonClicked; public event EventHandler<ChannelBox> PTTButtonClicked;
/// <summary> /// <summary>
/// Event action that handles the PTT button being pressed.
/// </summary>
public event EventHandler<ChannelBox> PTTButtonPressed;
/// <summary>
/// Event action that handles the PTT button being released.
/// </summary>
public event EventHandler<ChannelBox> PTTButtonReleased;
/// <summary>
/// Event action that handles the page button being clicked. /// Event action that handles the page button being clicked.
/// </summary> /// </summary>
public event EventHandler<ChannelBox> PageButtonClicked; public event EventHandler<ChannelBox> PageButtonClicked;
@ -183,6 +193,15 @@ namespace dvmconsole.Controls
} }
} }
/// <summary>
/// Flag indicating the channel is in toggle PTT or regular PTT.
/// </summary>
public bool PTTToggleMode
{
get => pttToggleMode;
set => pttToggleMode = value;
}
/// <summary> /// <summary>
/// Flag indicating the emergency state of this channel. /// Flag indicating the emergency state of this channel.
/// </summary> /// </summary>
@ -222,6 +241,10 @@ namespace dvmconsole.Controls
set set
{ {
isSelected = value; isSelected = value;
if (!isSelected)
DisableControls();
else
EnableControls();
UpdateBackground(); UpdateBackground();
} }
} }
@ -320,7 +343,8 @@ namespace dvmconsole.Controls
/// <param name="channelName"></param> /// <param name="channelName"></param>
/// <param name="systemName"></param> /// <param name="systemName"></param>
/// <param name="dstId"></param> /// <param name="dstId"></param>
public ChannelBox(SelectedChannelsManager selectedChannelsManager, AudioManager audioManager, string channelName, string systemName, string dstId) /// <param name="pttToggleMode"></param>
public ChannelBox(SelectedChannelsManager selectedChannelsManager, AudioManager audioManager, string channelName, string systemName, string dstId, bool pttToggleMode = false)
{ {
InitializeComponent(); InitializeComponent();
@ -340,10 +364,18 @@ namespace dvmconsole.Controls
MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown; MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown;
PttButton.PreviewMouseLeftButtonDown += PttButton_MouseLeftButtonDown;
PttButton.PreviewMouseLeftButtonUp += PttButton_MouseLeftButtonUp;
PttButton.MouseRightButtonDown += PttButton_MouseRightButtonDown;
this.pttToggleMode = pttToggleMode;
PttButton.Background = GRAY_GRADIENT; PttButton.Background = GRAY_GRADIENT;
PageSelectButton.Background = GRAY_GRADIENT; PageSelectButton.Background = GRAY_GRADIENT;
ChannelMarkerBtn.Background = GRAY_GRADIENT; ChannelMarkerBtn.Background = GRAY_GRADIENT;
DisableControls();
if (SystemName == MainWindow.PLAYBACKSYS || ChannelName == MainWindow.PLAYBACKCHNAME || DstId == MainWindow.PLAYBACKTG) if (SystemName == MainWindow.PLAYBACKSYS || ChannelName == MainWindow.PLAYBACKCHNAME || DstId == MainWindow.PLAYBACKTG)
{ {
PttButton.IsEnabled = false; PttButton.IsEnabled = false;
@ -366,6 +398,30 @@ namespace dvmconsole.Controls
} }
} }
/// <summary>
/// Helper to enable controls.
/// </summary>
private void EnableControls()
{
PttButton.IsEnabled = true;
ChannelMarkerBtn.IsEnabled = true;
PageSelectButton.IsEnabled = true;
VolumeSlider.IsEnabled = true;
}
/// <summary>
/// Helper to disable controls.
/// </summary>
private void DisableControls()
{
PttButton.IsEnabled = false;
ChannelMarkerBtn.IsEnabled = false;
PageSelectButton.IsEnabled = false;
VolumeSlider.IsEnabled = false;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -437,7 +493,7 @@ namespace dvmconsole.Controls
/// <param name="e"></param> /// <param name="e"></param>
private void ChannelBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) private void ChannelBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{ {
if (IsEditMode) if (IsEditMode)
return; return;
IsSelected = !IsSelected; IsSelected = !IsSelected;
@ -454,17 +510,70 @@ namespace dvmconsole.Controls
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private async void PTTButton_Click(object sender, RoutedEventArgs e) private void PttButton_Click(object sender, RoutedEventArgs e)
{ {
if (!IsSelected) if (!IsSelected)
return;
PttState = !PttState;
PTTButtonClicked?.Invoke(sender, this);
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private async void PttButton_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (pttToggleMode)
return; return;
if (PttState) if (PttState)
await Task.Delay(500); await Task.Delay(500);
PttState = !PttState; PttButton_Click(sender, e);
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private async void PttButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!IsSelected)
return;
if (PttState)
await Task.Delay(500);
if (pttToggleMode)
PttButton_Click(sender, e);
else
{
PttState = true;
PTTButtonPressed?.Invoke(sender, this);
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void PttButton_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (pttToggleMode)
return;
if (!IsSelected)
return;
PTTButtonClicked.Invoke(sender, this); PTTButtonReleased?.Invoke(sender, this);
PttState = false;
} }
/// <summary> /// <summary>
@ -478,7 +587,7 @@ namespace dvmconsole.Controls
return; return;
PageState = !PageState; PageState = !PageState;
PageButtonClicked.Invoke(sender, this); PageButtonClicked?.Invoke(sender, this);
} }
/// <summary> /// <summary>

@ -30,7 +30,18 @@
<Separator /> <Separator />
<MenuItem Header="_Exit" Click="Exit_Click" /> <MenuItem Header="_Exit" Click="Exit_Click" />
</MenuItem> </MenuItem>
<MenuItem Header="Edit"> <MenuItem Header="Commands">
<MenuItem Header="_Page Subscriber" Click="PageRID_Click" x:Name="menuPageSubscriber" />
<MenuItem Header="Radio _Check Subscriber" Click="RadioCheckRID_Click" x:Name="menuRadioCheckSubscriber" />
<Separator />
<MenuItem Header="_Inhibit Subscriber" Click="InhibitRID_Click" x:Name="menuInhibitSubscriber" />
<MenuItem Header="_Uninhibit Subscriber" Click="UninhibitRID_Click" x:Name="menuUninhibitSubscriber" />
<Separator />
<MenuItem Header="_QuickCall II" Click="ManualPage_Click" x:Name="menuQuickCall2" />
</MenuItem>
<MenuItem Header="Settings">
<MenuItem Header="_Toggle Push To Talk Mode" IsCheckable="True" Checked="TogglePTTMode_Click" Unchecked="TogglePTTMode_Click" x:Name="menuTogglePTTMode" />
<Separator />
<MenuItem Header="_Audio Settings" Click="AudioSettings_Click" /> <MenuItem Header="_Audio Settings" Click="AudioSettings_Click" />
<MenuItem Header="_Reset Settings" Click="ResetSettings_Click" /> <MenuItem Header="_Reset Settings" Click="ResetSettings_Click" />
<Separator /> <Separator />
@ -42,15 +53,6 @@
<MenuItem Header="Add Alert Tone" Click="AddAlertTone_Click" /> <MenuItem Header="Add Alert Tone" Click="AddAlertTone_Click" />
</MenuItem> </MenuItem>
</MenuItem> </MenuItem>
<MenuItem Header="Commands">
<MenuItem Header="_Page Subscriber" Click="PageRID_Click" x:Name="menuPageSubscriber" />
<MenuItem Header="Radio _Check Subscriber" Click="RadioCheckRID_Click" x:Name="menuRadioCheckSubscriber" />
<Separator />
<MenuItem Header="_Inhibit Subscriber" Click="InhibitRID_Click" x:Name="menuInhibitSubscriber" />
<MenuItem Header="_Uninhibit Subscriber" Click="UninhibitRID_Click" x:Name="menuUninhibitSubscriber" />
<Separator />
<MenuItem Header="_QuickCall II" Click="ManualPage_Click" x:Name="menuQuickCall2" />
</MenuItem>
<MenuItem Header="View"> <MenuItem Header="View">
<MenuItem Header="Select _User Background..." Click="OpenUserBackground_Click" x:Name="menuUserBackground" /> <MenuItem Header="Select _User Background..." Click="OpenUserBackground_Click" x:Name="menuUserBackground" />
<Separator /> <Separator />
@ -97,7 +99,7 @@
</Button> </Button>
<!-- Global PTT --> <!-- Global PTT -->
<Button VerticalContentAlignment="Bottom" HorizontalAlignment="Left" x:Name="btnGlobalPtt" VerticalAlignment="Center" Height="46" Width="82" Click="btnGlobalPtt_Click" BorderBrush="#FFC1C1C1" BorderThickness="1,1,1,1" Grid.Row="1" FontSize="10" FontFamily="Arial" Margin="285,0,0,0" <Button VerticalContentAlignment="Bottom" HorizontalAlignment="Left" x:Name="btnGlobalPtt" VerticalAlignment="Center" Height="46" Width="82" BorderBrush="#FFC1C1C1" BorderThickness="1,1,1,1" Grid.Row="1" FontSize="10" FontFamily="Arial" Margin="285,0,0,0"
ToolTip="Global PTT"> ToolTip="Global PTT">
<Button.Resources> <Button.Resources>
<Style TargetType="{x:Type Border}"> <Style TargetType="{x:Type Border}">

@ -149,6 +149,10 @@ namespace dvmconsole
audioManager = new AudioManager(settingsManager); audioManager = new AudioManager(settingsManager);
btnGlobalPtt.PreviewMouseLeftButtonDown += btnGlobalPtt_MouseLeftButtonDown;
btnGlobalPtt.PreviewMouseLeftButtonUp += btnGlobalPtt_MouseLeftButtonUp;
btnGlobalPtt.MouseRightButtonDown += btnGlobalPtt_MouseRightButtonDown;
selectedChannelsManager.SelectedChannelsChanged += SelectedChannelsChanged; selectedChannelsManager.SelectedChannelsChanged += SelectedChannelsChanged;
SizeChanged += MainWindow_SizeChanged; SizeChanged += MainWindow_SizeChanged;
Loaded += MainWindow_Loaded; Loaded += MainWindow_Loaded;
@ -335,10 +339,10 @@ namespace dvmconsole
// iterate through the coeplug zones and begin building channel widgets // iterate through the coeplug zones and begin building channel widgets
foreach (var zone in Codeplug.Zones) foreach (var zone in Codeplug.Zones)
{ {
// iterate through zone channels. // iterate through zone channels
foreach (var channel in zone.Channels) foreach (var channel in zone.Channels)
{ {
ChannelBox channelBox = new ChannelBox(selectedChannelsManager, audioManager, channel.Name, channel.System, channel.Tgid); ChannelBox channelBox = new ChannelBox(selectedChannelsManager, audioManager, channel.Name, channel.System, channel.Tgid, true);
systemStatuses.Add(channel.Name, new SlotStatus()); systemStatuses.Add(channel.Name, new SlotStatus());
if (settingsManager.ChannelPositions.TryGetValue(channel.Name, out var position)) if (settingsManager.ChannelPositions.TryGetValue(channel.Name, out var position))
@ -353,6 +357,8 @@ namespace dvmconsole
} }
channelBox.PTTButtonClicked += ChannelBox_PTTButtonClicked; channelBox.PTTButtonClicked += ChannelBox_PTTButtonClicked;
channelBox.PTTButtonPressed += ChannelBox_PTTButtonPressed;
channelBox.PTTButtonReleased += ChannelBox_PTTButtonReleased;
channelBox.PageButtonClicked += ChannelBox_PageButtonClicked; channelBox.PageButtonClicked += ChannelBox_PageButtonClicked;
channelBox.HoldChannelButtonClicked += ChannelBox_HoldChannelButtonClicked; channelBox.HoldChannelButtonClicked += ChannelBox_HoldChannelButtonClicked;
@ -801,14 +807,19 @@ namespace dvmconsole
const double widthOffset = 16; const double widthOffset = 16;
const double heightOffset = 115; const double heightOffset = 115;
// set PTT toggle mode (this must be done before channel widgets are defined)
menuTogglePTTMode.IsChecked = settingsManager.TogglePTTMode;
if (!string.IsNullOrEmpty(settingsManager.LastCodeplugPath) && File.Exists(settingsManager.LastCodeplugPath)) if (!string.IsNullOrEmpty(settingsManager.LastCodeplugPath) && File.Exists(settingsManager.LastCodeplugPath))
LoadCodeplug(settingsManager.LastCodeplugPath); LoadCodeplug(settingsManager.LastCodeplugPath);
else else
GenerateChannelWidgets(); GenerateChannelWidgets();
// set background configuration
menuDarkMode.IsChecked = settingsManager.DarkMode; menuDarkMode.IsChecked = settingsManager.DarkMode;
UpdateBackground(); UpdateBackground();
// set window configuration
if (settingsManager.Maximized) if (settingsManager.Maximized)
{ {
windowLoaded = true; windowLoaded = true;
@ -868,139 +879,6 @@ namespace dvmconsole
Application.Current.Shutdown(); Application.Current.Shutdown();
} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AudioSettings_Click(object sender, RoutedEventArgs e)
{
List<Codeplug.Channel> channels = Codeplug?.Zones.SelectMany(z => z.Channels).ToList() ?? new List<Codeplug.Channel>();
AudioSettingsWindow audioSettingsWindow = new AudioSettingsWindow(settingsManager, audioManager, channels);
audioSettingsWindow.ShowDialog();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ResetSettings_Click(object sender, RoutedEventArgs e)
{
var confirmResult = MessageBox.Show("Are you sure to wish to reset console settings?", "Reset Settings", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (confirmResult == MessageBoxResult.Yes)
{
MessageBox.Show("Settings will be reset after console restart.", "Reset Settings", MessageBoxButton.OK, MessageBoxImage.Information);
noSaveSettingsOnClose = true;
settingsManager.Reset();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ToggleEditMode_Click(object sender, RoutedEventArgs e)
{
isEditMode = !isEditMode;
var menuItem = (MenuItem)sender;
menuItem.Header = isEditMode ? "Disable Edit Mode" : "Enable Edit Mode";
UpdateEditModeForWidgets();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ResizeCanvasToWindow_Click(object sender, RoutedEventArgs e)
{
const double widthOffset = 16;
const double heightOffset = 115;
foreach (UIElement child in channelsCanvas.Children)
{
double childLeft = Canvas.GetLeft(child) + child.RenderSize.Width;
if (childLeft > ActualWidth)
Canvas.SetLeft(child, ActualWidth - (child.RenderSize.Width + widthOffset));
double childBottom = Canvas.GetTop(child) + child.RenderSize.Height;
if (childBottom > ActualHeight)
Canvas.SetTop(child, ActualHeight - (child.RenderSize.Height + heightOffset));
}
channelsCanvas.Width = ActualWidth;
canvasScrollViewer.Width = ActualWidth;
channelsCanvas.Height = ActualHeight;
canvasScrollViewer.Height = ActualHeight;
settingsManager.CanvasWidth = ActualWidth;
settingsManager.CanvasHeight = ActualHeight;
settingsManager.WindowWidth = ActualWidth;
settingsManager.WindowHeight = ActualHeight;
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SelectWidgets_Click(object sender, RoutedEventArgs e)
{
WidgetSelectionWindow widgetSelectionWindow = new WidgetSelectionWindow();
widgetSelectionWindow.Owner = this;
if (widgetSelectionWindow.ShowDialog() == true)
{
settingsManager.ShowSystemStatus = widgetSelectionWindow.ShowSystemStatus;
settingsManager.ShowChannels = widgetSelectionWindow.ShowChannels;
settingsManager.ShowAlertTones = widgetSelectionWindow.ShowAlertTones;
GenerateChannelWidgets();
if (!noSaveSettingsOnClose)
settingsManager.SaveSettings();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddAlertTone_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "WAV Files (*.wav)|*.wav|All Files (*.*)|*.*",
Title = "Select Alert Tone"
};
if (openFileDialog.ShowDialog() == true)
{
string alertFilePath = openFileDialog.FileName;
var alertTone = new AlertTone(alertFilePath) { IsEditMode = isEditMode };
alertTone.OnAlertTone += SendAlertTone;
if (settingsManager.AlertTonePositions.TryGetValue(alertFilePath, out var position))
{
Canvas.SetLeft(alertTone, position.X);
Canvas.SetTop(alertTone, position.Y);
}
else
{
Canvas.SetLeft(alertTone, 20);
Canvas.SetTop(alertTone, 20);
}
alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp;
channelsCanvas.Children.Add(alertTone);
settingsManager.UpdateAlertTonePaths(alertFilePath);
}
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -1197,6 +1075,156 @@ namespace dvmconsole
} }
} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TogglePTTMode_Click(object sender, RoutedEventArgs e)
{
settingsManager.TogglePTTMode = menuTogglePTTMode.IsChecked;
// update elements
foreach (UIElement child in channelsCanvas.Children)
{
if (child is ChannelBox)
((ChannelBox)child).PTTToggleMode = settingsManager.TogglePTTMode;
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AudioSettings_Click(object sender, RoutedEventArgs e)
{
List<Codeplug.Channel> channels = Codeplug?.Zones.SelectMany(z => z.Channels).ToList() ?? new List<Codeplug.Channel>();
AudioSettingsWindow audioSettingsWindow = new AudioSettingsWindow(settingsManager, audioManager, channels);
audioSettingsWindow.ShowDialog();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ResetSettings_Click(object sender, RoutedEventArgs e)
{
var confirmResult = MessageBox.Show("Are you sure to wish to reset console settings?", "Reset Settings", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (confirmResult == MessageBoxResult.Yes)
{
MessageBox.Show("Settings will be reset after console restart.", "Reset Settings", MessageBoxButton.OK, MessageBoxImage.Information);
noSaveSettingsOnClose = true;
settingsManager.Reset();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ToggleEditMode_Click(object sender, RoutedEventArgs e)
{
isEditMode = !isEditMode;
var menuItem = (MenuItem)sender;
menuItem.Header = isEditMode ? "Disable Edit Mode" : "Enable Edit Mode";
UpdateEditModeForWidgets();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ResizeCanvasToWindow_Click(object sender, RoutedEventArgs e)
{
const double widthOffset = 16;
const double heightOffset = 115;
foreach (UIElement child in channelsCanvas.Children)
{
double childLeft = Canvas.GetLeft(child) + child.RenderSize.Width;
if (childLeft > ActualWidth)
Canvas.SetLeft(child, ActualWidth - (child.RenderSize.Width + widthOffset));
double childBottom = Canvas.GetTop(child) + child.RenderSize.Height;
if (childBottom > ActualHeight)
Canvas.SetTop(child, ActualHeight - (child.RenderSize.Height + heightOffset));
}
channelsCanvas.Width = ActualWidth;
canvasScrollViewer.Width = ActualWidth;
channelsCanvas.Height = ActualHeight;
canvasScrollViewer.Height = ActualHeight;
settingsManager.CanvasWidth = ActualWidth;
settingsManager.CanvasHeight = ActualHeight;
settingsManager.WindowWidth = ActualWidth;
settingsManager.WindowHeight = ActualHeight;
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SelectWidgets_Click(object sender, RoutedEventArgs e)
{
WidgetSelectionWindow widgetSelectionWindow = new WidgetSelectionWindow();
widgetSelectionWindow.Owner = this;
if (widgetSelectionWindow.ShowDialog() == true)
{
settingsManager.ShowSystemStatus = widgetSelectionWindow.ShowSystemStatus;
settingsManager.ShowChannels = widgetSelectionWindow.ShowChannels;
settingsManager.ShowAlertTones = widgetSelectionWindow.ShowAlertTones;
GenerateChannelWidgets();
if (!noSaveSettingsOnClose)
settingsManager.SaveSettings();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddAlertTone_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "WAV Files (*.wav)|*.wav|All Files (*.*)|*.*",
Title = "Select Alert Tone"
};
if (openFileDialog.ShowDialog() == true)
{
string alertFilePath = openFileDialog.FileName;
var alertTone = new AlertTone(alertFilePath) { IsEditMode = isEditMode };
alertTone.OnAlertTone += SendAlertTone;
if (settingsManager.AlertTonePositions.TryGetValue(alertFilePath, out var position))
{
Canvas.SetLeft(alertTone, position.X);
Canvas.SetTop(alertTone, position.Y);
}
else
{
Canvas.SetLeft(alertTone, 20);
Canvas.SetTop(alertTone, 20);
}
alertTone.MouseRightButtonUp += AlertTone_MouseRightButtonUp;
channelsCanvas.Children.Add(alertTone);
settingsManager.UpdateAlertTonePaths(alertFilePath);
}
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -1299,6 +1327,63 @@ namespace dvmconsole
handler.SendP25TDU(srcId, dstId, false); handler.SendP25TDU(srcId, dstId, false);
} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void ChannelBox_PTTButtonPressed(object sender, ChannelBox e)
{
if (e.SystemName == PLAYBACKSYS || e.ChannelName == PLAYBACKCHNAME || e.DstId == PLAYBACKTG)
return;
if (!e.PttState)
{
Codeplug.System system = Codeplug.GetSystemForChannel(e.ChannelName);
Codeplug.Channel cpgChannel = Codeplug.GetChannelByName(e.ChannelName);
PeerSystem handler = fneSystemManager.GetFneSystem(system.Name);
if (!e.IsSelected)
return;
FneUtils.Memset(e.mi, 0x00, P25Defines.P25_MI_LENGTH);
uint srcId = uint.Parse(system.Rid);
uint dstId = uint.Parse(cpgChannel.Tgid);
e.TxStreamId = handler.NewStreamId();
handler.SendP25TDU(srcId, dstId, true);
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void ChannelBox_PTTButtonReleased(object sender, ChannelBox e)
{
if (e.SystemName == PLAYBACKSYS || e.ChannelName == PLAYBACKCHNAME || e.DstId == PLAYBACKTG)
return;
if (e.PttState)
{
Codeplug.System system = Codeplug.GetSystemForChannel(e.ChannelName);
Codeplug.Channel cpgChannel = Codeplug.GetChannelByName(e.ChannelName);
PeerSystem handler = fneSystemManager.GetFneSystem(system.Name);
if (!e.IsSelected)
return;
uint srcId = uint.Parse(system.Rid);
uint dstId = uint.Parse(cpgChannel.Tgid);
handler.SendP25TDU(srcId, dstId, false);
}
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -1442,8 +1527,6 @@ namespace dvmconsole
if (globalPttState) if (globalPttState)
await Task.Delay(500); await Task.Delay(500);
globalPttState = !globalPttState;
foreach (ChannelBox channel in selectedChannelsManager.GetSelectedChannels()) foreach (ChannelBox channel in selectedChannelsManager.GetSelectedChannels())
{ {
if (channel.SystemName == PLAYBACKSYS || channel.ChannelName == PLAYBACKCHNAME || channel.DstId == PLAYBACKTG) if (channel.SystemName == PLAYBACKSYS || channel.ChannelName == PLAYBACKCHNAME || channel.DstId == PLAYBACKTG)
@ -1478,6 +1561,57 @@ namespace dvmconsole
} }
} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void btnGlobalPtt_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (settingsManager.TogglePTTMode)
return;
globalPttState = !globalPttState;
btnGlobalPtt_Click(sender, e);
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void btnGlobalPtt_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (settingsManager.TogglePTTMode)
{
globalPttState = !globalPttState;
btnGlobalPtt_Click(sender, e);
}
else
{
globalPttState = true;
btnGlobalPtt_Click(sender, e);
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void btnGlobalPtt_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (settingsManager.TogglePTTMode)
return;
globalPttState = false;
btnGlobalPtt_Click(sender, e);
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

@ -37,20 +37,20 @@ namespace dvmconsole
*/ */
/// <summary> /// <summary>
/// /// Flag indicating whether or not system status widgets will be displayed.
/// </summary> /// </summary>
public bool ShowSystemStatus { get; set; } = true; public bool ShowSystemStatus { get; set; } = true;
/// <summary> /// <summary>
/// /// Flag indicating whether or not channel widgets will be displayed.
/// </summary> /// </summary>
public bool ShowChannels { get; set; } = true; public bool ShowChannels { get; set; } = true;
/// <summary> /// <summary>
/// /// Flag indicating whether or not alert tone widgets will be displayed.
/// </summary> /// </summary>
public bool ShowAlertTones { get; set; } = true; public bool ShowAlertTones { get; set; } = true;
/// <summary> /// <summary>
/// /// Full path to last loaded console codeplug.
/// </summary> /// </summary>
public string LastCodeplugPath { get; set; } = null; public string LastCodeplugPath { get; set; } = null;
@ -62,46 +62,54 @@ namespace dvmconsole
/// ///
/// </summary> /// </summary>
public Dictionary<string, ChannelPosition> SystemStatusPositions { get; set; } = new Dictionary<string, ChannelPosition>(); public Dictionary<string, ChannelPosition> SystemStatusPositions { get; set; } = new Dictionary<string, ChannelPosition>();
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public List<string> AlertToneFilePaths { get; set; } = new List<string>(); public List<string> AlertToneFilePaths { get; set; } = new List<string>();
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public Dictionary<string, ChannelPosition> AlertTonePositions { get; set; } = new Dictionary<string, ChannelPosition>(); public Dictionary<string, ChannelPosition> AlertTonePositions { get; set; } = new Dictionary<string, ChannelPosition>();
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public Dictionary<string, int> ChannelOutputDevices { get; set; } = new Dictionary<string, int>(); public Dictionary<string, int> ChannelOutputDevices { get; set; } = new Dictionary<string, int>();
/// <summary> /// <summary>
/// /// Flag indicating the PTT mode, Toggle PTT or Regular PTT.
/// </summary>
public bool TogglePTTMode { get; set; } = true;
/// <summary>
/// Flag indicating window maximized state.
/// </summary> /// </summary>
public bool Maximized { get; set; } = false; public bool Maximized { get; set; } = false;
/// <summary> /// <summary>
/// /// Flag indicating whether or not the window operates in dark mode.
/// </summary> /// </summary>
public bool DarkMode { get; set; } = false; public bool DarkMode { get; set; } = false;
/// <summary> /// <summary>
/// /// Last width of the console window.
/// </summary> /// </summary>
public double WindowWidth { get; set; } = MainWindow.MIN_WIDTH; public double WindowWidth { get; set; } = MainWindow.MIN_WIDTH;
/// <summary> /// <summary>
/// /// Last height of the console window.
/// </summary> /// </summary>
public double WindowHeight { get; set; } = MainWindow.MIN_HEIGHT; public double WindowHeight { get; set; } = MainWindow.MIN_HEIGHT;
/// <summary> /// <summary>
/// /// Last width of the console canvas display area.
/// </summary> /// </summary>
public double CanvasWidth { get; set; } = MainWindow.MIN_WIDTH; public double CanvasWidth { get; set; } = MainWindow.MIN_WIDTH;
/// <summary> /// <summary>
/// /// Last height of the console canvas display area.
/// </summary> /// </summary>
public double CanvasHeight { get; set; } = MainWindow.MIN_HEIGHT; public double CanvasHeight { get; set; } = MainWindow.MIN_HEIGHT;
/// <summary> /// <summary>
/// /// Full path to a user defined background image.
/// </summary> /// </summary>
public string UserBackgroundImage { get; set; } = null; public string UserBackgroundImage { get; set; } = null;
@ -122,8 +130,8 @@ namespace dvmconsole
try try
{ {
var json = File.ReadAllText(SettingsFilePath); string json = File.ReadAllText(SettingsFilePath);
var loadedSettings = JsonConvert.DeserializeObject<SettingsManager>(json); SettingsManager loadedSettings = JsonConvert.DeserializeObject<SettingsManager>(json);
if (loadedSettings != null) if (loadedSettings != null)
{ {
@ -136,6 +144,7 @@ namespace dvmconsole
AlertToneFilePaths = loadedSettings.AlertToneFilePaths ?? new List<string>(); AlertToneFilePaths = loadedSettings.AlertToneFilePaths ?? new List<string>();
AlertTonePositions = loadedSettings.AlertTonePositions ?? new Dictionary<string, ChannelPosition>(); AlertTonePositions = loadedSettings.AlertTonePositions ?? new Dictionary<string, ChannelPosition>();
ChannelOutputDevices = loadedSettings.ChannelOutputDevices ?? new Dictionary<string, int>(); ChannelOutputDevices = loadedSettings.ChannelOutputDevices ?? new Dictionary<string, int>();
TogglePTTMode = loadedSettings.TogglePTTMode;
Maximized = loadedSettings.Maximized; Maximized = loadedSettings.Maximized;
DarkMode = loadedSettings.DarkMode; DarkMode = loadedSettings.DarkMode;
WindowWidth = loadedSettings.WindowWidth; WindowWidth = loadedSettings.WindowWidth;
@ -180,7 +189,7 @@ namespace dvmconsole
try try
{ {
var json = JsonConvert.SerializeObject(this, Formatting.Indented); string json = JsonConvert.SerializeObject(this, Formatting.Indented);
File.WriteAllText(SettingsFilePath, json); File.WriteAllText(SettingsFilePath, json);
} }
catch (Exception ex) catch (Exception ex)

Loading…
Cancel
Save

Powered by TurnKey Linux.