1
0
Fork 0
mirror of https://github.com/hawkeye-stan/msfs-popout-panel-manager.git synced 2024-11-21 21:30:12 +00:00

Started development v3.4.2

This commit is contained in:
Stanley 2022-08-08 02:07:24 -04:00
parent c16b3fefaf
commit bfb2a72a20
21 changed files with 328 additions and 204 deletions

View file

@ -177,6 +177,9 @@ namespace MSFSPopoutPanelManager.Orchestration
private void HookWinEvent() private void HookWinEvent()
{ {
if (ActiveProfile == null || ActiveProfile.PanelConfigs == null || ActiveProfile.PanelConfigs.Count == 0)
return;
// Setup panel config event hooks // Setup panel config event hooks
_winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT); _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT);
} }
@ -193,19 +196,9 @@ namespace MSFSPopoutPanelManager.Orchestration
{ {
case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE: case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE:
case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND: case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND:
case PInvokeConstant.EVENT_SYSTEM_CAPTURESTART:
case PInvokeConstant.EVENT_SYSTEM_CAPTUREEND:
// check by priority to speed up comparing of escaping constraints // check by priority to speed up comparing of escaping constraints
if (hwnd == IntPtr.Zero if (hwnd == IntPtr.Zero || idObject != 0 || hWinEventHook != _winEventHook || !AllowEdit)
|| idObject != 0
|| hWinEventHook != _winEventHook
|| !AllowEdit
|| ActiveProfile == null
|| ActiveProfile.PanelConfigs == null
|| ActiveProfile.PanelConfigs.Count == 0)
{
return; return;
}
HandleEventCallback(hwnd, iEvent); HandleEventCallback(hwnd, iEvent);
break; break;
@ -234,7 +227,6 @@ namespace MSFSPopoutPanelManager.Orchestration
WindowActionManager.MoveWindow(panelConfig.PanelHandle, panelConfig.PanelType, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height); WindowActionManager.MoveWindow(panelConfig.PanelHandle, panelConfig.PanelType, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height);
break; break;
case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE: case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE:
// Detect if window is maximized, if so, save settings
WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
wp.length = System.Runtime.InteropServices.Marshal.SizeOf(wp); wp.length = System.Runtime.InteropServices.Marshal.SizeOf(wp);
PInvoke.GetWindowPlacement(hwnd, ref wp); PInvoke.GetWindowPlacement(hwnd, ref wp);

View file

@ -33,7 +33,7 @@ namespace MSFSPopoutPanelManager.Orchestration
private AppSetting AppSetting { get { return AppSettingData == null ? null : AppSettingData.AppSetting; } } private AppSetting AppSetting { get { return AppSettingData == null ? null : AppSettingData.AppSetting; } }
public event EventHandler OnPopOutStarted; public event EventHandler OnPopOutStarted;
public event EventHandler OnPopOutCompleted; public event EventHandler<bool> OnPopOutCompleted;
public event EventHandler<TouchPanelOpenEventArg> OnTouchPanelOpened; public event EventHandler<TouchPanelOpenEventArg> OnTouchPanelOpened;
public void ManualPopOut() public void ManualPopOut()
@ -188,7 +188,7 @@ namespace MSFSPopoutPanelManager.Orchestration
if (panelConfigs.Count == 0) if (panelConfigs.Count == 0)
{ {
OnPopOutCompleted?.Invoke(this, null); OnPopOutCompleted?.Invoke(this, false);
StatusMessageWriter.WriteMessage("No panels have been found. Please select at least one in-game panel.", StatusMessageType.Error, false); StatusMessageWriter.WriteMessage("No panels have been found. Please select at least one in-game panel.", StatusMessageType.Error, false);
return; return;
} }
@ -204,19 +204,21 @@ namespace MSFSPopoutPanelManager.Orchestration
} }
} }
if (panelConfigs.Count > 0 || ActiveProfile.PanelConfigs.Count > 0) if (panelConfigs.Count > 0)
{ {
if (ActiveProfile.PanelConfigs.Count > 0)
LoadAndApplyPanelConfigs(panelConfigs); {
ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs); LoadAndApplyPanelConfigs(panelConfigs);
StatusMessageWriter.WriteMessage("Panels have been popped out succesfully and saved panel settings have been applied.", StatusMessageType.Info, true); ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs);
OnPopOutCompleted?.Invoke(this, null); StatusMessageWriter.WriteMessage("Panels have been popped out succesfully and saved panel settings have been applied.", StatusMessageType.Info, true);
} OnPopOutCompleted?.Invoke(this, false);
else }
{ else
ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs); {
StatusMessageWriter.WriteMessage("Panels have been popped out succesfully.", StatusMessageType.Info, true); ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs);
OnPopOutCompleted?.Invoke(this, null); StatusMessageWriter.WriteMessage("Panels have been popped out succesfully.", StatusMessageType.Info, true);
OnPopOutCompleted?.Invoke(this, true);
}
} }
} }

View file

@ -19,7 +19,8 @@
FullScreen, FullScreen,
TouchEnabled, TouchEnabled,
DisableGameRefocus, DisableGameRefocus,
RowHeader,
None,
Invalid, Invalid,
RowHeader
} }
} }

View file

@ -20,6 +20,7 @@ namespace MSFSPopoutPanelManager.SimConnectAgent.TouchPanel
private bool _isUsedArduino; private bool _isUsedArduino;
private CommandAction _lastCommandAction; private CommandAction _lastCommandAction;
private int _repeatCommandActionCount; private int _repeatCommandActionCount;
private bool _isExecutingCommand;
private SimConnectEncoderAction _currentSimConnectEncoderAction; private SimConnectEncoderAction _currentSimConnectEncoderAction;
private System.Timers.Timer _actionExecutionTimer; private System.Timers.Timer _actionExecutionTimer;
@ -63,6 +64,8 @@ namespace MSFSPopoutPanelManager.SimConnectAgent.TouchPanel
if (_isSimConnected && actionData.Action != null) if (_isSimConnected && actionData.Action != null)
{ {
_isExecutingCommand = true;
try try
{ {
if (actionData.Action == "NO_ACTION") return; if (actionData.Action == "NO_ACTION") return;
@ -106,13 +109,17 @@ namespace MSFSPopoutPanelManager.SimConnectAgent.TouchPanel
Task.Run(() => Task.Run(() =>
{ {
Thread.Sleep(500); Thread.Sleep(500);
InputEmulationManager.LeftClickGameWindow(); if (!_isExecutingCommand)
{
InputEmulationManager.RefocusGameWindow();
}
}); });
} }
break; break;
} }
ExecuteCommand(commandAction); ExecuteCommand(commandAction);
_isExecutingCommand = false;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -203,11 +210,5 @@ namespace MSFSPopoutPanelManager.SimConnectAgent.TouchPanel
break; break;
} }
} }
private void RefocusMsfs()
{
Thread.Sleep(250);
InputEmulationManager.LeftClickGameWindow();
}
} }
} }

View file

@ -14,6 +14,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
MinimizeToTray = false; MinimizeToTray = false;
AlwaysOnTop = true; AlwaysOnTop = true;
UseAutoPanning = true; UseAutoPanning = true;
MinimizeAfterPopOut = false;
AutoPanningKeyBinding = "0"; AutoPanningKeyBinding = "0";
StartMinimized = false; StartMinimized = false;
AutoDisableTrackIR = true; AutoDisableTrackIR = true;
@ -22,6 +23,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
UseLeftRightControlToPopOut = false; UseLeftRightControlToPopOut = false;
IsEnabledTouchPanelServer = false; IsEnabledTouchPanelServer = false;
AfterPopOutCameraView = new AfterPopOutCameraView(); AfterPopOutCameraView = new AfterPopOutCameraView();
AfterPopOutCameraView.PropertyChanged += (source, e) => AfterPopOutCameraView.PropertyChanged += (source, e) =>
{ {
@ -54,6 +56,8 @@ namespace MSFSPopoutPanelManager.UserDataAgent
public bool UseAutoPanning { get; set; } public bool UseAutoPanning { get; set; }
public bool MinimizeAfterPopOut { get; set; }
public string AutoPanningKeyBinding { get; set; } public string AutoPanningKeyBinding { get; set; }
public bool StartMinimized { get; set; } public bool StartMinimized { get; set; }

View file

@ -8,7 +8,9 @@
* Implemented work around for SU10+ issue where after panel separation, the panel's size is huge which blocked most of the game window for lower resolution screen and prevented Pop Out Panel Manager from popping out the next panel. * Implemented work around for SU10+ issue where after panel separation, the panel's size is huge which blocked most of the game window for lower resolution screen and prevented Pop Out Panel Manager from popping out the next panel.
* Implement key binding to move and resize pop out * Implement key binding to move and resize pop outs.
* Added setting to minimize pop out manager after panels have been popped out.
Known issue: Known issue:

View file

@ -191,5 +191,18 @@ namespace MSFSPopoutPanelManager.WindowsAgent
PInvoke.keybd_event(Convert.ToByte(VK_ENT), 0, KEYEVENTF_KEYUP, 0); PInvoke.keybd_event(Convert.ToByte(VK_ENT), 0, KEYEVENTF_KEYUP, 0);
PInvoke.keybd_event(Convert.ToByte(VK_RMENU), 0, KEYEVENTF_KEYUP, 0); PInvoke.keybd_event(Convert.ToByte(VK_RMENU), 0, KEYEVENTF_KEYUP, 0);
} }
public static void RefocusGameWindow()
{
var simualatorProcess = WindowProcessManager.GetSimulatorProcess();
if (simualatorProcess == null)
return;
var rectangle = WindowActionManager.GetWindowRect(simualatorProcess.Handle);
var clientRectangle = WindowActionManager.GetClientRect(simualatorProcess.Handle);
PInvoke.SetCursorPos(rectangle.X + clientRectangle.Width / 2, rectangle.Y + clientRectangle.Height / 2);
}
} }
} }

View file

@ -16,9 +16,6 @@ namespace MSFSPopoutPanelManager.WindowsAgent
public const int SW_MINIMIZE = 6; public const int SW_MINIMIZE = 6;
public const int SW_RESTORE = 9; public const int SW_RESTORE = 9;
public const uint EVENT_SYSTEM_CAPTURESTART = 0x0008;
public const uint EVENT_SYSTEM_CAPTUREEND = 0x0009;
public const uint EVENT_SYSTEM_MOVESIZESTART = 0x000A;
public const uint EVENT_SYSTEM_MOVESIZEEND = 0x000B; public const uint EVENT_SYSTEM_MOVESIZEEND = 0x000B;
public const uint EVENT_OBJECT_LOCATIONCHANGE = 0x800B; public const uint EVENT_OBJECT_LOCATIONCHANGE = 0x800B;

View file

@ -45,8 +45,7 @@ namespace MSFSPopoutPanelManager.WindowsAgent
{ {
ProcessId = process.Id, ProcessId = process.Id,
ProcessName = process.ProcessName, ProcessName = process.ProcessName,
Handle = process.MainWindowHandle, Handle = process.MainWindowHandle
MainModule = process.MainModule
}; };
} }
} }
@ -62,7 +61,5 @@ namespace MSFSPopoutPanelManager.WindowsAgent
public string ProcessName { get; set; } public string ProcessName { get; set; }
public IntPtr Handle { get; set; } public IntPtr Handle { get; set; }
public ProcessModule MainModule { get; set; }
} }
} }

View file

@ -0,0 +1,46 @@
<mah:MetroWindow x:Class="MSFSPopoutPanelManager.WpfApp.PanelConfigurationInstructionDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
mc:Ignorable="d"
Title="Keyboard Shortcuts"
Height="700"
Width="900"
ResizeMode="NoResize"
Background="Transparent">
<Grid Margin="20,10,20,0">
<WrapPanel>
<TextBlock Margin="0,10,0,10">To configure a panel, first click on the arrow to the left of the panel name. When panel is selected, the arrow will turn red.</TextBlock>
<TextBlock>
<Run Foreground="LightSkyBlue">Up Arrow</Run> - Move panel up by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Down Arrow</Run> - Move panel down by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Left Arrow</Run> - Move panel left by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Right Arrow</Run> - Move panel right by 10 pixels<LineBreak/><LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Up Arrow</Run> - Move panel up by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Down Arrow</Run> - Move panel down by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Left Arrow</Run> - Move panel left by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Right Arrow</Run> - Move panel right by 1 pixel<LineBreak/><LineBreak/>
<Run Foreground="LightSkyBlue">Ctrl + Up Arrow</Run> - Decrease height by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Ctrl + Down Arrow</Run> - Increase height by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Ctrl + Left Arrow</Run> - Decrease width by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Ctrl + Right Arrow</Run> - Increase width by 10 pixels<LineBreak/><LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Ctrl + Up Arrow</Run> - Decrease height by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Ctrl + Down Arrow</Run> - Increase height by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Ctrl + Left Arrow</Run> - Decrease width by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Ctrl + Right Arrow</Run> - Increase width by 1 pixel<LineBreak/>
</TextBlock>
<TextBlock Margin="0,10,0,10">To change value for X-Pos, Y-Pos, width, or height individually, first click on grid cell of the property you want to change.</TextBlock>
<TextBlock>
<Run Foreground="LightSkyBlue">Up Arrow</Run> - Increase value by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Down Arrow</Run> - Decrease value by 10 pixels<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Up Arrow</Run> - Increase value by 1 pixel<LineBreak/>
<Run Foreground="LightSkyBlue">Shift + Down Arrow</Run> - Decrease value by 1 pixel<LineBreak/>
</TextBlock>
</WrapPanel>
</Grid>
</mah:MetroWindow>

View file

@ -0,0 +1,12 @@
using MahApps.Metro.Controls;
namespace MSFSPopoutPanelManager.WpfApp
{
public partial class PanelConfigurationInstructionDialog : MetroWindow
{
public PanelConfigurationInstructionDialog()
{
InitializeComponent();
}
}
}

View file

@ -6,7 +6,7 @@
xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
mc:Ignorable="d" mc:Ignorable="d"
Title="Preferences" Title="Preferences"
Height="670" Height="700"
Width="900" Width="900"
ResizeMode="NoResize" ResizeMode="NoResize"
Background="Transparent"> Background="Transparent">
@ -65,171 +65,186 @@
<TreeViewItem Header="Touch Settings" Selected="TreeViewItem_Selected" Margin="0,0,0,10"></TreeViewItem> <TreeViewItem Header="Touch Settings" Selected="TreeViewItem_Selected" Margin="0,0,0,10"></TreeViewItem>
<TreeViewItem Header="MSFS Touch Panel Settings" Selected="TreeViewItem_Selected" Margin="0,0,0,10" Visibility="{Binding Path=AppSettingData.AppSetting.IsEnabledTouchPanelServer, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"></TreeViewItem> <TreeViewItem Header="MSFS Touch Panel Settings" Selected="TreeViewItem_Selected" Margin="0,0,0,10" Visibility="{Binding Path=AppSettingData.AppSetting.IsEnabledTouchPanelServer, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"></TreeViewItem>
</TreeView> </TreeView>
<WrapPanel DockPanel.Dock="Right" Margin="20,10,20,0"> <WrapPanel DockPanel.Dock="Right" Margin="20,10,0,0">
<WrapPanel Orientation="Vertical" Visibility="{Binding ApplicationSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<WrapPanel Orientation="Vertical" Width="Auto" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Visibility="{Binding ApplicationSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<TextBlock Style="{StaticResource TextBlockHeading}">Always on Top</TextBlock> <WrapPanel Orientation="Vertical" Width="Auto" Margin="0,0,20,20">
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <TextBlock Style="{StaticResource TextBlockHeading}">Always on Top</TextBlock>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AlwaysOnTop, Mode=TwoWay}">
<AccessText>Pin the application on top of all open windows.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Auto Start</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoStart, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Enable auto start application when MSFS starts. This adds a XML config entry in EXE.xml file.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Minimize to Tray</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.MinimizeToTray, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Minimize the application to system tray.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Start Minimized</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.StartMinimized, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Start the application in minimized mode in system tray.</AccessText>
</CheckBox>
</WrapPanel>
</WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding PopOutSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<WrapPanel Orientation="Vertical">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Auto Panning</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.UseAutoPanning, Mode=TwoWay}"> <CheckBox IsChecked="{Binding AppSettingData.AppSetting.AlwaysOnTop, Mode=TwoWay}">
<AccessText>Enable automatic panning of cockpit view when popping out panels. Auto Panning remembers the custom cockpit camera angle you used when defining the locations of pop out panel.</AccessText> <AccessText>Pin the application on top of all open windows.</AccessText>
</CheckBox> </CheckBox>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.UseAutoPanning, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<WrapPanel Orientation="Horizontal" Margin="24,15,0,0" VerticalAlignment="Top"> <TextBlock Style="{StaticResource TextBlockHeading}">Auto Start</TextBlock>
<Label Content="Ctrl-Alt-" FontSize="14"></Label> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<ComboBox HorizontalAlignment="Left" <CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoStart, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Enable auto start application when MSFS starts. This adds a XML config entry in EXE.xml file.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Minimize to Tray</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.MinimizeToTray, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Minimize the application to system tray.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Start Minimized</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.StartMinimized, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Start the application in minimized mode in system tray.</AccessText>
</CheckBox>
</WrapPanel>
</WrapPanel>
</ScrollViewer>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<WrapPanel Orientation="Vertical" Visibility="{Binding PopOutSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<WrapPanel Orientation="Vertical">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Auto Panning</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.UseAutoPanning, Mode=TwoWay}">
<AccessText>Enable automatic panning of cockpit view when popping out panels. Auto Panning remembers the custom cockpit camera angle you used when defining the locations of pop out panel.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.UseAutoPanning, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Horizontal" Margin="24,15,0,0" VerticalAlignment="Top">
<Label Content="Ctrl-Alt-" FontSize="14"></Label>
<ComboBox HorizontalAlignment="Left"
VerticalAlignment="top" VerticalAlignment="top"
Width="60" Width="60"
SelectedValuePath="Tag" SelectedValuePath="Tag"
SelectedValue="{Binding AppSettingData.AppSetting.AutoPanningKeyBinding, Mode=TwoWay}" > SelectedValue="{Binding AppSettingData.AppSetting.AutoPanningKeyBinding, Mode=TwoWay}" >
<ComboBoxItem Content="0" Tag="0"></ComboBoxItem> <ComboBoxItem Content="0" Tag="0"></ComboBoxItem>
<ComboBoxItem Content="1" Tag="1"></ComboBoxItem> <ComboBoxItem Content="1" Tag="1"></ComboBoxItem>
<ComboBoxItem Content="2" Tag="2"></ComboBoxItem> <ComboBoxItem Content="2" Tag="2"></ComboBoxItem>
<ComboBoxItem Content="3" Tag="3"></ComboBoxItem> <ComboBoxItem Content="3" Tag="3"></ComboBoxItem>
<ComboBoxItem Content="4" Tag="4"></ComboBoxItem> <ComboBoxItem Content="4" Tag="4"></ComboBoxItem>
<ComboBoxItem Content="5" Tag="5"></ComboBoxItem> <ComboBoxItem Content="5" Tag="5"></ComboBoxItem>
<ComboBoxItem Content="6" Tag="6"></ComboBoxItem> <ComboBoxItem Content="6" Tag="6"></ComboBoxItem>
<ComboBoxItem Content="7" Tag="7"></ComboBoxItem> <ComboBoxItem Content="7" Tag="7"></ComboBoxItem>
<ComboBoxItem Content="8" Tag="8"></ComboBoxItem> <ComboBoxItem Content="8" Tag="8"></ComboBoxItem>
<ComboBoxItem Content="9" Tag="9"></ComboBoxItem> <ComboBoxItem Content="9" Tag="9"></ComboBoxItem>
</ComboBox> </ComboBox>
<AccessText Margin="10,0,0,0" Width="420"> <AccessText Margin="10,0,0,0" Width="420">
Configure key binding for saving and recalling of custom MSFS cockpit camera view when defining the locations of pop out panel. Requires binding keystroke to custom camera in MSFS control setting. (Default: Ctrl-Alt-0 to save and Alt-0 to load). Configure key binding for saving and recalling of custom MSFS cockpit camera view when defining the locations of pop out panel. Requires binding keystroke to custom camera in MSFS control setting. (Default: Ctrl-Alt-0 to save and Alt-0 to load).
</AccessText> </AccessText>
</WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Minimize Pop Out Panel Manager After Pop Out</TextBlock>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<WrapPanel Orientation="Vertical">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Return to Predefined Camera View After Pop Out</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.EnableReturnToCameraView, Mode=TwoWay}"> <WrapPanel>
<AccessText>Enable return to a camera view after pop out. Default is return to cockpit center view by emulating Ctrl-Space keystroke.</AccessText> <CheckBox IsChecked="{Binding AppSettingData.AppSetting.MinimizeAfterPopOut, Mode=TwoWay}">
</CheckBox> <AccessText Margin="10,0,0,0" Width="510">Minimize Pop Out Panel Manager after pop out. When creating a new profile and during initial pop out, this setting has no effect.</AccessText>
</CheckBox>
</WrapPanel>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.EnableReturnToCameraView, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<WrapPanel Orientation="Horizontal" Margin="28,10,0,15"> <WrapPanel Orientation="Vertical">
<ComboBox HorizontalAlignment="Left" <TextBlock Style="{StaticResource TextBlockHeading}">Enable Return to Predefined Camera View After Pop Out</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.EnableReturnToCameraView, Mode=TwoWay}">
<AccessText>Enable return to a camera view after pop out. Default is return to cockpit center view by emulating Ctrl-Space keystroke.</AccessText>
</CheckBox>
</WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.EnableReturnToCameraView, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Horizontal" Margin="28,10,0,15">
<ComboBox HorizontalAlignment="Left"
VerticalAlignment="Center" VerticalAlignment="Center"
Width="200" Width="200"
SelectedValuePath="Tag" SelectedValuePath="Tag"
SelectedValue="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.CameraView, Mode=TwoWay}" > SelectedValue="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.CameraView, Mode=TwoWay}" >
<ComboBoxItem Content="Cockpit Center View" Tag="CockpitCenterView"></ComboBoxItem> <ComboBoxItem Content="Cockpit Center View" Tag="CockpitCenterView"></ComboBoxItem>
<ComboBoxItem Content="Custom Camera View" Tag="CustomCameraView"></ComboBoxItem> <ComboBoxItem Content="Custom Camera View" Tag="CustomCameraView"></ComboBoxItem>
</ComboBox> </ComboBox>
</WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> <WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.IsEnabledCustomCameraKeyBinding, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Visibility="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.IsEnabledCustomCameraKeyBinding, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <WrapPanel Orientation="Horizontal" Margin="20,10,0,0">
<WrapPanel Orientation="Horizontal" Margin="20,10,0,0"> <Label Content="Alt-" FontSize="14"></Label>
<Label Content="Alt-" FontSize="14"></Label> <ComboBox HorizontalAlignment="Left"
<ComboBox HorizontalAlignment="Left"
VerticalAlignment="Top" VerticalAlignment="Top"
Width="60" Width="60"
SelectedValuePath="Tag" SelectedValuePath="Tag"
SelectedValue="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.CustomCameraKeyBinding, Mode=TwoWay}" > SelectedValue="{Binding AppSettingData.AppSetting.AfterPopOutCameraView.CustomCameraKeyBinding, Mode=TwoWay}" >
<ComboBoxItem Content="0" Tag="0"></ComboBoxItem> <ComboBoxItem Content="0" Tag="0"></ComboBoxItem>
<ComboBoxItem Content="1" Tag="1"></ComboBoxItem> <ComboBoxItem Content="1" Tag="1"></ComboBoxItem>
<ComboBoxItem Content="2" Tag="2"></ComboBoxItem> <ComboBoxItem Content="2" Tag="2"></ComboBoxItem>
<ComboBoxItem Content="3" Tag="3"></ComboBoxItem> <ComboBoxItem Content="3" Tag="3"></ComboBoxItem>
<ComboBoxItem Content="4" Tag="4"></ComboBoxItem> <ComboBoxItem Content="4" Tag="4"></ComboBoxItem>
<ComboBoxItem Content="5" Tag="5"></ComboBoxItem> <ComboBoxItem Content="5" Tag="5"></ComboBoxItem>
<ComboBoxItem Content="6" Tag="6"></ComboBoxItem> <ComboBoxItem Content="6" Tag="6"></ComboBoxItem>
<ComboBoxItem Content="7" Tag="7"></ComboBoxItem> <ComboBoxItem Content="7" Tag="7"></ComboBoxItem>
<ComboBoxItem Content="8" Tag="8"></ComboBoxItem> <ComboBoxItem Content="8" Tag="8"></ComboBoxItem>
<ComboBoxItem Content="9" Tag="9"></ComboBoxItem> <ComboBoxItem Content="9" Tag="9"></ComboBoxItem>
</ComboBox> </ComboBox>
<AccessText Margin="10,0,0,0" Width="480"> <AccessText Margin="10,0,0,0" Width="480">
Configure key binding for custom camera view to load. Requires binding keystroke to custom camera in MSFS control setting. (Default: Alt-1 to load). Configure key binding for custom camera view to load. Requires binding keystroke to custom camera in MSFS control setting. (Default: Alt-1 to load).
</AccessText> </AccessText>
</WrapPanel>
</WrapPanel>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">On Screen Message Dialog Duration</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<WrapPanel>
<mah:NumericUpDown Width="80" Minimum="0" Maximum="10" FontSize="16" Height="32" Value="{Binding AppSettingData.AppSetting.OnScreenMessageDuration, Mode=TwoWay}"></mah:NumericUpDown>
<AccessText Margin="10,0,0,0" Width="510">Amount of time to show on screen message dialog before it disappears from view. Set it to zero to hide on screen message. (Default: 1 second)</AccessText>
</WrapPanel>
</WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Use Left Control + Right Control to Pop Out Panel (SU 10+ option)</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<WrapPanel>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.UseLeftRightControlToPopOut, Mode=TwoWay}">
<AccessText Margin="10,0,0,0" Width="510">If your keyboard does not have a Right-Alt key in order to perform left click to pop out panel, you can map Left Ctrl + Right Ctrl in MSFS control setting to pop out
panel instead. For this feature to work, please map (CTRL + RIGHT CTRL) in Control Options => Miscellaneous => New UI Window Mode in the game</AccessText>
</CheckBox>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</ScrollViewer>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<TextBlock Style="{StaticResource TextBlockHeading}">On Screen Message Dialog Duration</TextBlock> <WrapPanel Orientation="Vertical" Visibility="{Binding AutoPopOutSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<WrapPanel> <TextBlock Style="{StaticResource TextBlockHeading}">Enable Auto Pop Out Panels</TextBlock>
<mah:NumericUpDown Width="80" Minimum="0" Maximum="10" FontSize="16" Height="32" Value="{Binding AppSettingData.AppSetting.OnScreenMessageDuration, Mode=TwoWay}"></mah:NumericUpDown> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<AccessText Margin="10,0,0,0" Width="510">Amount of time to show on screen message dialog before it disappears from view. Set it to zero to hide on screen message. (Default: 1 second)</AccessText> <CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoPopOutPanels, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Automatic pop out panels when an aircraft livery is bound to a profile. The following steps will be performed.</AccessText>
</CheckBox>
<AccessText Margin="24,10,0,0">
1. Detect flight start signal using SimConnect.
</AccessText>
<AccessText Margin="24,10,0,0">
2. Wait for cockpit view to appear before executing pop out panel sequence.
</AccessText>
<AccessText Margin="24,10,0,0">
3. If configured for profile on cold start, execute and detect instrumentation power on before executing pop out panel sequence.
</AccessText>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</ScrollViewer>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<TextBlock Style="{StaticResource TextBlockHeading}">Use Left Control + Right Control to Pop Out Panel (SU 10+ option)</TextBlock> <WrapPanel Orientation="Vertical" Visibility="{Binding TrackIRSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<WrapPanel> <TextBlock Style="{StaticResource TextBlockHeading}">Auto Disable Track IR</TextBlock>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.UseLeftRightControlToPopOut, Mode=TwoWay}"> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<AccessText Margin="10,0,0,0" Width="510">If your keyboard does not have a Right-Alt key in order to perform left click to pop out panel, you can map Left Ctrl + Right Ctrl in MSFS control setting to pop out <CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoDisableTrackIR, Mode=TwoWay}" >
panel instead. For this feature to work, please map (CTRL + RIGHT CTRL) in Control Options => Miscellaneous => New UI Window Mode in the game</AccessText> <AccessText TextWrapping="Wrap">Automactically disable Track IR during panel selections and pop out process. Track IR will be re-enabled once these processes are completed.</AccessText>
</CheckBox> </CheckBox>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> </ScrollViewer>
<WrapPanel Orientation="Vertical" Visibility="{Binding AutoPopOutSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Visibility="{Binding TouchSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Auto Pop Out Panels</TextBlock> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoPopOutPanels, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Automatic pop out panels when an aircraft livery is bound to a profile. The following steps will be performed.</AccessText>
</CheckBox>
<AccessText Margin="24,10,0,0">
1. Detect flight start signal using SimConnect.
</AccessText>
<AccessText Margin="24,10,0,0">
2. Wait for cockpit view to appear before executing pop out panel sequence.
</AccessText>
<AccessText Margin="24,10,0,0">
3. If configured for profile on cold start, execute and detect instrumentation power on before executing pop out panel sequence.
</AccessText>
</WrapPanel>
</WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding TrackIRSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Auto Disable Track IR</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.AutoDisableTrackIR, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Automactically disable Track IR during panel selections and pop out process. Track IR will be re-enabled once these processes are completed.</AccessText>
</CheckBox>
</WrapPanel>
</WrapPanel>
<WrapPanel Orientation="Vertical" Visibility="{Binding TouchSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Margin="0,0,0,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Refocus Game Window</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Refocus Game Window</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindow, Mode=TwoWay}" > <CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindow, Mode=TwoWay}" >
@ -240,7 +255,7 @@
<AccessText Margin="10,0,0,0" Width="490">Amount of time in milliseconds to wait for touch inactivity before input focus goes back to game window.</AccessText> <AccessText Margin="10,0,0,0" Width="490">Amount of time in milliseconds to wait for touch inactivity before input focus goes back to game window.</AccessText>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Touch Down Touch Up Delay</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Touch Down Touch Up Delay</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<WrapPanel> <WrapPanel>
@ -254,9 +269,10 @@
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</ScrollViewer>
<WrapPanel Orientation="Vertical" Visibility="{Binding MSFSTouchPanelSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Visibility="{Binding MSFSTouchPanelSettingsVisible, Converter={StaticResource VisibleIfTrueConverter}, Mode=OneWay}">
<WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Touch Panel Integration (Experimental Feature - Unsupported)</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Enable Touch Panel Integration (Experimental Feature - Unsupported)</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration, Mode=TwoWay}" > <CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration, Mode=TwoWay}" >
@ -268,21 +284,21 @@
<TextBlock FontStyle="Italic"> <TextBlock FontStyle="Italic">
Restart is require for all changes below to take effect. Restart is require for all changes below to take effect.
</TextBlock> </TextBlock>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Use of Arduino</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Enable Use of Arduino</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.UseArduino, Mode=TwoWay}" > <CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.UseArduino, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Use of Arduino encoders to control touch panel.</AccessText> <AccessText TextWrapping="Wrap">Use of Arduino encoders to control touch panel.</AccessText>
</CheckBox> </CheckBox>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Enable Sound</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Enable Sound</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.EnableSound, Mode=TwoWay}" > <CheckBox IsChecked="{Binding AppSettingData.AppSetting.TouchPanelSettings.EnableSound, Mode=TwoWay}" >
<AccessText TextWrapping="Wrap">Enable playing of button click sound when using touch panel.</AccessText> <AccessText TextWrapping="Wrap">Enable playing of button click sound when using touch panel.</AccessText>
</CheckBox> </CheckBox>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Data Refresh Interval</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Data Refresh Interval</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<WrapPanel> <WrapPanel>
@ -290,7 +306,7 @@
<AccessText Margin="10,0,0,0" Width="490">Time interval for touch panel to refresh SimConnect data. (Default: 200 miliseconds)</AccessText> <AccessText Margin="10,0,0,0" Width="490">Time interval for touch panel to refresh SimConnect data. (Default: 200 miliseconds)</AccessText>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
<WrapPanel Orientation="Vertical" Margin="0,0,0,20"> <WrapPanel Orientation="Vertical" Margin="0,0,20,20">
<TextBlock Style="{StaticResource TextBlockHeading}">Map Refresh Interval</TextBlock> <TextBlock Style="{StaticResource TextBlockHeading}">Map Refresh Interval</TextBlock>
<Line Stretch="Fill" Stroke="Gray" X2="1"/> <Line Stretch="Fill" Stroke="Gray" X2="1"/>
<WrapPanel> <WrapPanel>
@ -300,7 +316,7 @@
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>
</ScrollViewer>
<WrapPanel Orientation="Vertical" Visibility="Visible"> <WrapPanel Orientation="Vertical" Visibility="Visible">
</WrapPanel> </WrapPanel>
</WrapPanel> </WrapPanel>

View file

@ -10,7 +10,8 @@
Height="450" Height="450"
Width="800" Width="800"
WindowStyle="None" WindowStyle="None"
AllowsTransparency="True"> AllowsTransparency="True"
Closing="Window_Closing">
<Window.Background> <Window.Background>
<SolidColorBrush Color="#FFF0F0F0" Opacity="0.01" /> <SolidColorBrush Color="#FFF0F0F0" Opacity="0.01" />
</Window.Background> </Window.Background>

View file

@ -38,6 +38,11 @@ namespace MSFSPopoutPanelManager.WpfApp
{ {
webView.Source = new Uri($"{Constants.WEB_HOST_URI}/{_planeId.ToLower()}/{_panelId.ToLower()}"); webView.Source = new Uri($"{Constants.WEB_HOST_URI}/{_planeId.ToLower()}/{_panelId.ToLower()}");
} }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
webView.Dispose();
}
} }
internal static class WindowExtensions internal static class WindowExtensions

View file

@ -1,6 +1,7 @@
<UserControl x:Class="MSFSPopoutPanelManager.WpfApp.UserControlPanelConfiguration" <UserControl x:Class="MSFSPopoutPanelManager.WpfApp.UserControlPanelConfiguration"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@ -36,10 +37,14 @@
<WrapPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="19,10,0,0" HorizontalAlignment="Left"> <WrapPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="19,10,0,0" HorizontalAlignment="Left">
<Label Content="Panel Locations and Settings -" Margin="0,0,0,0" HorizontalAlignment="Left"/> <Label Content="Panel Locations and Settings -" Margin="0,0,0,0" HorizontalAlignment="Left"/>
<Label Content="{Binding ProfileData.ActiveProfile.ProfileName}" Margin="0,0,0,0" HorizontalAlignment="Left"/> <Label Content="{Binding ProfileData.ActiveProfile.ProfileName}" Margin="0,0,0,0" HorizontalAlignment="Left"/>
<controls:Tile Foreground="LightSkyBlue" Background="Transparent" HorizontalAlignment="Right" VerticalAlignment="Center" Width="30" Height="30"
controls:ControlsHelper.MouseOverBorderBrush="{DynamicResource MahApps.Brushes.Button.Border}" Margin="565,0,0,0" Click="Instruction_Click" >
<iconPacks:PackIconMaterial Width="22" Height="22" Kind="Information" VerticalAlignment="Center"></iconPacks:PackIconMaterial>
</controls:Tile>
<DataGrid Name="PanelConfigGrid" HorizontalAlignment="Center" Width="882" Height="430" Margin="0 10 0 0" AutoGenerateColumns="False" CanUserResizeColumns="False" HorizontalScrollBarVisibility="Disabled" <DataGrid Name="PanelConfigGrid" HorizontalAlignment="Center" Width="882" Height="430" Margin="0 10 0 0" AutoGenerateColumns="False" CanUserResizeColumns="False" HorizontalScrollBarVisibility="Disabled"
CanUserReorderColumns="False" CanUserResizeRows="False" HorizontalGridLinesBrush="#B9B9B9" VerticalGridLinesBrush="#B9B9B9" GridLinesVisibility="Horizontal" SelectionUnit="Cell" CanUserReorderColumns="False" CanUserResizeRows="False" HorizontalGridLinesBrush="#B9B9B9" VerticalGridLinesBrush="#B9B9B9" GridLinesVisibility="Horizontal" SelectionUnit="Cell"
BorderThickness="1" CanUserAddRows="False" CanUserSortColumns="False" KeyboardNavigation.TabNavigation="None" KeyboardNavigation.IsTabStop="False" BorderThickness="1" CanUserAddRows="False" CanUserSortColumns="False" KeyboardNavigation.TabNavigation="None" KeyboardNavigation.IsTabStop="False"
ItemsSource="{Binding ProfileData.ActiveProfile.PanelConfigs}" HeadersVisibility="Column" KeyboardNavigation.DirectionalNavigation="Local"> ItemsSource="{Binding ProfileData.ActiveProfile.PanelConfigs}" HeadersVisibility="Column" KeyboardNavigation.DirectionalNavigation="Local" MouseDown="PanelConfigGrid_MouseDown">
<DataGrid.RowStyle> <DataGrid.RowStyle>
<Style TargetType="DataGridRow"> <Style TargetType="DataGridRow">
<Setter Property="Background" Value="{x:Null}" /> <Setter Property="Background" Value="{x:Null}" />

View file

@ -173,7 +173,17 @@ namespace MSFSPopoutPanelManager.WpfApp
break; break;
} }
}
private void Instruction_Click(object sender, RoutedEventArgs e)
{
DialogHelper.PanelConfigurationInstructionDialog();
}
private void PanelConfigGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
_panelConfigurationViewModel.SelectedPanelConfigItem = null;
this.PanelConfigGrid.Focus();
} }
} }
} }

View file

@ -32,7 +32,8 @@
ItemsSource="{Binding Source={StaticResource UserProfilesViewSource}}" ItemsSource="{Binding Source={StaticResource UserProfilesViewSource}}"
SelectedItem="{Binding Path=ProfileData.ActiveProfile, Mode=OneWay}" SelectedItem="{Binding Path=ProfileData.ActiveProfile, Mode=OneWay}"
DisplayMemberPath="ProfileName" DisplayMemberPath="ProfileName"
SelectedValuePath="ProfileId"> SelectedValuePath="ProfileId"
IsEnabled="{c:Binding 'FlightSimData.IsSimulatorStarted and FlightSimData.HasCurrentMsfsAircraft'}">
<i:Interaction.Triggers> <i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged"> <i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ChangeProfileCommand}" CommandParameter="{Binding ElementName=cmbProfile, Path=SelectedValue}" /> <i:InvokeCommandAction Command="{Binding ChangeProfileCommand}" CommandParameter="{Binding ElementName=cmbProfile, Path=SelectedValue}" />

View file

@ -8,7 +8,7 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
{ {
public static bool ConfirmDialog(string title, string message) public static bool ConfirmDialog(string title, string message)
{ {
ConfirmationDialog dialog = new ConfirmationDialog(title, message); var dialog = new ConfirmationDialog(title, message);
dialog.Owner = Application.Current.MainWindow; dialog.Owner = Application.Current.MainWindow;
dialog.Topmost = true; dialog.Topmost = true;
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner; dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
@ -18,7 +18,7 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
public static AddProfileDialogResult AddProfileDialog(List<Profile> profiles) public static AddProfileDialogResult AddProfileDialog(List<Profile> profiles)
{ {
AddProfileDialog dialog = new AddProfileDialog(profiles); var dialog = new AddProfileDialog(profiles);
dialog.Owner = Application.Current.MainWindow; dialog.Owner = Application.Current.MainWindow;
dialog.Topmost = true; dialog.Topmost = true;
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner; dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
@ -33,7 +33,16 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
public static void PreferencesDialog(PreferencesViewModel preferencesViewModel) public static void PreferencesDialog(PreferencesViewModel preferencesViewModel)
{ {
PreferencesDialog dialog = new PreferencesDialog(preferencesViewModel); var dialog = new PreferencesDialog(preferencesViewModel);
dialog.Owner = Application.Current.MainWindow;
dialog.Topmost = true;
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialog.ShowDialog();
}
public static void PanelConfigurationInstructionDialog()
{
var dialog = new PanelConfigurationInstructionDialog();
dialog.Owner = Application.Current.MainWindow; dialog.Owner = Application.Current.MainWindow;
dialog.Topmost = true; dialog.Topmost = true;
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner; dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;

View file

@ -131,12 +131,12 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
}); });
} }
private void HandleOnPopOutCompleted(object sender, EventArgs e) private void HandleOnPopOutCompleted(object sender, bool isFirstTime)
{ {
Application.Current.Dispatcher.Invoke(() => Application.Current.Dispatcher.Invoke(() =>
{ {
// Restore window state // Restore window state
if (_minimizeForPopOut) if (_minimizeForPopOut && (isFirstTime || !_orchestrator.AppSettingData.AppSetting.MinimizeAfterPopOut))
{ {
WindowActionManager.BringWindowToForeground(_orchestrator.ApplicationHandle); WindowActionManager.BringWindowToForeground(_orchestrator.ApplicationHandle);
ApplicationWindow.Show(); ApplicationWindow.Show();

View file

@ -14,12 +14,18 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
{ {
_orchestrator = orchestrator; _orchestrator = orchestrator;
AddProfileCommand = new DelegateCommand(OnAddProfile); AddProfileCommand = new DelegateCommand(OnAddProfile, () => FlightSimData.HasCurrentMsfsAircraft && FlightSimData.IsSimulatorStarted)
.ObservesProperty(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
DeleteProfileCommand = new DelegateCommand(OnDeleteProfile, () => ProfileData.HasActiveProfile) DeleteProfileCommand = new DelegateCommand(OnDeleteProfile, () => ProfileData.HasActiveProfile && FlightSimData.HasCurrentMsfsAircraft && FlightSimData.IsSimulatorStarted)
.ObservesProperty(() => ProfileData.ActiveProfile); .ObservesProperty(() => ProfileData.HasActiveProfile)
.ObservesProperty(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
ChangeProfileCommand = new DelegateCommand<object>(OnChangeProfile); ChangeProfileCommand = new DelegateCommand<object>(OnChangeProfile, (obj) => FlightSimData.HasCurrentMsfsAircraft && FlightSimData.IsSimulatorStarted)
.ObservesProperty(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
AddProfileBindingCommand = new DelegateCommand(OnAddProfileBinding, () => ProfileData.HasActiveProfile && FlightSimData.HasCurrentMsfsAircraft && ProfileData.IsAllowedAddAircraftBinding && FlightSimData.IsSimulatorStarted) AddProfileBindingCommand = new DelegateCommand(OnAddProfileBinding, () => ProfileData.HasActiveProfile && FlightSimData.HasCurrentMsfsAircraft && ProfileData.IsAllowedAddAircraftBinding && FlightSimData.IsSimulatorStarted)
.ObservesProperty(() => ProfileData.ActiveProfile) .ObservesProperty(() => ProfileData.ActiveProfile)
@ -58,9 +64,12 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
.ObservesProperty(() => ProfileData.ActiveProfile.PanelSourceCoordinates.Count) .ObservesProperty(() => ProfileData.ActiveProfile.PanelSourceCoordinates.Count)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted); .ObservesProperty(() => FlightSimData.IsSimulatorStarted);
OpenTouchPanelBindingCommand = new DelegateCommand(OnOpenTouchPanelBinding, () => ProfileData.HasActiveProfile && AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration) OpenTouchPanelBindingCommand = new DelegateCommand(OnOpenTouchPanelBinding, () => FlightSimData.HasCurrentMsfsAircraft && FlightSimData.IsSimulatorStarted && ProfileData.HasActiveProfile && AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration)
.ObservesProperty(() => ProfileData.HasActiveProfile) .ObservesProperty(() => ProfileData.HasActiveProfile)
.ObservesProperty(() => AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration); .ObservesProperty(() => AppSettingData.AppSetting.TouchPanelSettings.EnableTouchPanelIntegration)
.ObservesProperty(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
;
TouchPanelBindingViewModel = new TouchPanelBindingViewModel(_orchestrator); TouchPanelBindingViewModel = new TouchPanelBindingViewModel(_orchestrator);
} }

View file

@ -70,6 +70,7 @@
<PackageReference Include="InputSimulatorCore" Version="1.0.5" /> <PackageReference Include="InputSimulatorCore" Version="1.0.5" />
<PackageReference Include="log4net" Version="2.0.14" /> <PackageReference Include="log4net" Version="2.0.14" />
<PackageReference Include="MahApps.Metro" Version="2.4.9" /> <PackageReference Include="MahApps.Metro" Version="2.4.9" />
<PackageReference Include="MahApps.Metro.IconPacks" Version="4.11.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" /> <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Prism.Core" Version="8.1.97" /> <PackageReference Include="Prism.Core" Version="8.1.97" />