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

Version 3.4.3 Release

This commit is contained in:
Stanley 2022-09-11 09:50:04 -04:00
parent 43caff1ca9
commit 12495a3964
25 changed files with 212 additions and 220 deletions

6
.gitignore vendored
View file

@ -9,9 +9,6 @@
*.sln.docstates
*.backup
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
@ -92,9 +89,6 @@ orleans.codegen.cs
/node_modules
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)

View file

@ -10,9 +10,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.ArduinoAgent</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -33,154 +33,82 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TouchPanelAgent", "TouchPan
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
DebugTouchPanel|Any CPU = DebugTouchPanel|Any CPU
DebugTouchPanel|x64 = DebugTouchPanel|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
ReleaseTouchPanel|Any CPU = ReleaseTouchPanel|Any CPU
ReleaseTouchPanel|x64 = ReleaseTouchPanel|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|Any CPU.ActiveCfg = Debug|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|Any CPU.Build.0 = Debug|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|x64.ActiveCfg = Debug|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|x64.Build.0 = Debug|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|Any CPU.ActiveCfg = Release|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|Any CPU.Build.0 = Release|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|x64.ActiveCfg = Release|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|x64.Build.0 = Release|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{54712A0A-B344-45E4-85C4-0A913305A0E6}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|Any CPU.ActiveCfg = Debug|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|Any CPU.Build.0 = Debug|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|x64.ActiveCfg = Debug|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|x64.Build.0 = Debug|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|Any CPU.ActiveCfg = Release|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|Any CPU.Build.0 = Release|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|x64.ActiveCfg = Release|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|x64.Build.0 = Release|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Debug|Any CPU.ActiveCfg = Debug|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Debug|Any CPU.Build.0 = Debug|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Debug|x64.ActiveCfg = Debug|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Debug|x64.Build.0 = Debug|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Release|Any CPU.ActiveCfg = Release|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Release|Any CPU.Build.0 = Release|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Release|x64.ActiveCfg = Release|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.Release|x64.Build.0 = Release|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{BDD878A3-EF5B-43C7-94B7-CEFA04C67A9E}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Debug|Any CPU.ActiveCfg = Debug|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Debug|Any CPU.Build.0 = Debug|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Debug|x64.ActiveCfg = Debug|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Debug|x64.Build.0 = Debug|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Release|Any CPU.ActiveCfg = Release|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Release|Any CPU.Build.0 = Release|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Release|x64.ActiveCfg = Release|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.Release|x64.Build.0 = Release|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{E72F813F-EE30-4384-B02F-EB5D4BCFEC49}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Debug|Any CPU.ActiveCfg = Debug|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Debug|Any CPU.Build.0 = Debug|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Debug|x64.ActiveCfg = Debug|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Debug|x64.Build.0 = Debug|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Release|Any CPU.ActiveCfg = Release|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Release|Any CPU.Build.0 = Release|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Release|x64.ActiveCfg = Release|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.Release|x64.Build.0 = Release|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{1BBF7803-BA8D-4AEF-8319-061E93AE5F3D}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Debug|Any CPU.ActiveCfg = Debug|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Debug|Any CPU.Build.0 = Debug|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Debug|x64.ActiveCfg = Debug|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Debug|x64.Build.0 = Debug|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Release|Any CPU.ActiveCfg = Release|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Release|Any CPU.Build.0 = Release|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Release|x64.ActiveCfg = Release|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.Release|x64.Build.0 = Release|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{D20EA590-22C2-4F93-AC25-AF6960F97E03}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Debug|Any CPU.ActiveCfg = Debug|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Debug|Any CPU.Build.0 = Debug|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Debug|x64.ActiveCfg = Debug|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Debug|x64.Build.0 = Debug|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Release|Any CPU.ActiveCfg = Release|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Release|Any CPU.Build.0 = Release|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Release|x64.ActiveCfg = Release|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.Release|x64.Build.0 = Release|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{677B6DF0-8E19-4B08-8480-F7C365B6BB89}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Debug|Any CPU.ActiveCfg = Debug|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Debug|Any CPU.Build.0 = Debug|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Debug|x64.ActiveCfg = Debug|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Debug|x64.Build.0 = Debug|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Release|Any CPU.ActiveCfg = Release|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Release|Any CPU.Build.0 = Release|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Release|x64.ActiveCfg = Release|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.Release|x64.Build.0 = Release|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{9CD4014F-B3EA-4E67-9329-9679931E2688}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Debug|Any CPU.ActiveCfg = Debug|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Debug|Any CPU.Build.0 = Debug|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Debug|x64.ActiveCfg = Debug|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Debug|x64.Build.0 = Debug|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.DebugTouchPanel|Any CPU.ActiveCfg = DebugTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.DebugTouchPanel|Any CPU.Build.0 = DebugTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.DebugTouchPanel|x64.ActiveCfg = DebugTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.DebugTouchPanel|x64.Build.0 = DebugTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Release|Any CPU.ActiveCfg = Release|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Release|Any CPU.Build.0 = Release|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Release|x64.ActiveCfg = Release|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.Release|x64.Build.0 = Release|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.ReleaseTouchPanel|Any CPU.ActiveCfg = ReleaseTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.ReleaseTouchPanel|Any CPU.Build.0 = ReleaseTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.ReleaseTouchPanel|x64.ActiveCfg = ReleaseTouchPanel|x64
{2F36A227-C92C-4B42-B1E4-480015492357}.ReleaseTouchPanel|x64.Build.0 = ReleaseTouchPanel|x64
EndGlobalSection

View file

@ -10,9 +10,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.Orchestration</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -53,18 +53,27 @@ namespace MSFSPopoutPanelManager.Orchestration
ProfileData.WriteProfiles();
}
public void PanelConfigPropertyUpdated(int panelIndex, PanelConfigPropertyName configPropertyName)
public void PanelConfigPropertyUpdated(IntPtr panelHandle, PanelConfigPropertyName configPropertyName)
{
if (panelIndex == -1 || !AllowEdit || ActiveProfile.IsLocked)
if (panelHandle == IntPtr.Zero || !AllowEdit || ActiveProfile.IsLocked)
return;
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelIndex == panelIndex);
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelHandle == panelHandle);
if (panelConfig != null)
{
if (configPropertyName == PanelConfigPropertyName.FullScreen)
{
InputEmulationManager.ToggleFullScreenPanel(panelConfig.PanelHandle);
// Set full screen mode panel coordinate
var windowRectangle = WindowActionManager.GetWindowRect(panelConfig.PanelHandle);
var clientRectangle = WindowActionManager.GetClientRect(panelConfig.PanelHandle);
panelConfig.FullScreenLeft = panelConfig.FullScreen ? windowRectangle.Left : 0;
panelConfig.FullScreenTop = panelConfig.FullScreen ? windowRectangle.Top : 0;
panelConfig.FullScreenWidth = panelConfig.FullScreen ? clientRectangle.Width : 0;
panelConfig.FullScreenHeight = panelConfig.FullScreen ? clientRectangle.Height : 0;
panelConfig.HideTitlebar = false;
panelConfig.AlwaysOnTop = false;
}
@ -123,12 +132,12 @@ namespace MSFSPopoutPanelManager.Orchestration
}
}
public void PanelConfigIncreaseDecrease(int panelIndex, PanelConfigPropertyName configPropertyName, int changeAmount)
public void PanelConfigIncreaseDecrease(IntPtr panelHandle, PanelConfigPropertyName configPropertyName, int changeAmount)
{
if (panelIndex == -1 || !AllowEdit || ActiveProfile.IsLocked || ActiveProfile.PanelConfigs == null || ActiveProfile.PanelConfigs.Count == 0)
if (panelHandle == IntPtr.Zero || !AllowEdit || ActiveProfile.IsLocked || ActiveProfile.PanelConfigs == null || ActiveProfile.PanelConfigs.Count == 0)
return;
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelIndex == panelIndex);
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelHandle == panelHandle);
if (panelConfig != null)
{

View file

@ -3,7 +3,6 @@ using MSFSPopoutPanelManager.UserDataAgent;
using MSFSPopoutPanelManager.WindowsAgent;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Linq;
using System.Threading;
@ -198,14 +197,14 @@ namespace MSFSPopoutPanelManager.Orchestration
// Allow delay to wait for in game built-in pop outs to appear
Thread.Sleep(_builtInPanelConfigDelay);
var panelResults = AddBuiltInPanels(panelConfigs.Count + 200); // add a panelIndex gap
var panelResults = AddBuiltInPanels();
if (panelResults != null)
panelConfigs.AddRange(panelResults);
}
if (panelConfigs.Count == 0)
{
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, true);
return;
}
@ -225,13 +224,12 @@ namespace MSFSPopoutPanelManager.Orchestration
if (ActiveProfile.PanelConfigs.Count > 0)
{
LoadAndApplyPanelConfigs(panelConfigs);
ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs);
StatusMessageWriter.WriteMessage("Panels have been popped out succesfully and saved panel settings have been applied.", StatusMessageType.Info, true);
OnPopOutCompleted?.Invoke(this, false);
}
else
{
ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs);
LoadAndApplyPanelConfigs(panelConfigs);
StatusMessageWriter.WriteMessage("Panels have been popped out succesfully.", StatusMessageType.Info, true);
OnPopOutCompleted?.Invoke(this, true);
}
@ -325,7 +323,7 @@ namespace MSFSPopoutPanelManager.Orchestration
InputEmulationManager.LeftClick(point.X, point.Y);
}
private List<PanelConfig> AddBuiltInPanels(int panelIndex)
private List<PanelConfig> AddBuiltInPanels()
{
List<PanelConfig> builtinPanels = new List<PanelConfig>();
@ -338,7 +336,7 @@ namespace MSFSPopoutPanelManager.Orchestration
builtinPanels.Add(new PanelConfig()
{
PanelIndex = panelIndex,
PanelIndex = -1,
PanelHandle = panelHandle,
PanelType = PanelType.BuiltInPopout,
PanelName = WindowActionManager.GetWindowCaption(panelHandle),
@ -347,8 +345,6 @@ namespace MSFSPopoutPanelManager.Orchestration
Width = clientRectangle.Width,
Height = clientRectangle.Height
});
panelIndex++;
}
return builtinPanels.Count == 0 ? null : builtinPanels;
@ -423,6 +419,8 @@ namespace MSFSPopoutPanelManager.Orchestration
private void LoadAndApplyPanelConfigs(List<PanelConfig> panelResults)
{
ActiveProfile.PanelConfigs.ToList().ForEach(p => p.PanelHandle = IntPtr.Zero);
Parallel.ForEach(panelResults, panel =>
{
// Something is wrong here where panel has no window handle
@ -436,82 +434,94 @@ namespace MSFSPopoutPanelManager.Orchestration
else if (panel.PanelType == PanelType.BuiltInPopout)
savedPanelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(s => s.PanelName == panel.PanelName);
if (savedPanelConfig == null)
{
panel.PanelHandle = IntPtr.Zero;
return;
}
if (savedPanelConfig == null) return;
// Assign previous saved values
if (savedPanelConfig != null)
{
panel.PanelName = savedPanelConfig.PanelName;
panel.Top = savedPanelConfig.Top;
panel.Left = savedPanelConfig.Left;
panel.Width = savedPanelConfig.Width;
panel.Height = savedPanelConfig.Height;
panel.FullScreen = savedPanelConfig.FullScreen;
panel.AlwaysOnTop = savedPanelConfig.AlwaysOnTop;
panel.HideTitlebar = savedPanelConfig.HideTitlebar;
panel.TouchEnabled = savedPanelConfig.TouchEnabled;
}
// Assign window handle to panel config
savedPanelConfig.PanelHandle = panel.PanelHandle;
// Apply panel name
if (panel.PanelType == PanelType.CustomPopout)
if (savedPanelConfig.PanelType == PanelType.CustomPopout)
{
var caption = panel.PanelName + " (Custom)";
PInvoke.SetWindowText(panel.PanelHandle, caption);
var caption = savedPanelConfig.PanelName + " (Custom)";
PInvoke.SetWindowText(savedPanelConfig.PanelHandle, caption);
Thread.Sleep(500);
}
// Apply locations
if (panel.Width != 0 && panel.Height != 0)
if (savedPanelConfig.Width != 0 && savedPanelConfig.Height != 0)
{
PInvoke.ShowWindow(panel.PanelHandle, PInvokeConstant.SW_RESTORE);
PInvoke.ShowWindow(savedPanelConfig.PanelHandle, PInvokeConstant.SW_RESTORE);
Thread.Sleep(250);
WindowActionManager.MoveWindow(panel.PanelHandle, panel.Left, panel.Top, panel.Width, panel.Height);
WindowActionManager.MoveWindow(savedPanelConfig.PanelHandle, savedPanelConfig.Left, savedPanelConfig.Top, savedPanelConfig.Width, savedPanelConfig.Height);
Thread.Sleep(1000);
}
// Apply window size again to overcome a bug in MSFS that when moving panel between monitors, panel automatic resize for no reason
if (panel.PanelType == PanelType.BuiltInPopout)
if (savedPanelConfig.PanelType == PanelType.BuiltInPopout)
{
Thread.Sleep(2000); // Overcome GTN750 bug
WindowActionManager.MoveWindow(panel.PanelHandle, panel.Left, panel.Top, panel.Width, panel.Height);
WindowActionManager.MoveWindow(savedPanelConfig.PanelHandle, savedPanelConfig.Left, savedPanelConfig.Top, savedPanelConfig.Width, savedPanelConfig.Height);
Thread.Sleep(1000);
}
if (!panel.FullScreen)
if (!savedPanelConfig.FullScreen)
{
// Apply always on top
if (panel.AlwaysOnTop)
if (savedPanelConfig.AlwaysOnTop)
{
WindowActionManager.ApplyAlwaysOnTop(panel.PanelHandle, panel.PanelType, true, new Rectangle(panel.Left, panel.Top, panel.Width, panel.Height));
WindowActionManager.ApplyAlwaysOnTop(savedPanelConfig.PanelHandle, savedPanelConfig.PanelType, true, new Rectangle(savedPanelConfig.Left, savedPanelConfig.Top, savedPanelConfig.Width, savedPanelConfig.Height));
Thread.Sleep(1000);
}
// Apply hide title bar
if (panel.HideTitlebar)
WindowActionManager.ApplyHidePanelTitleBar(panel.PanelHandle, true);
if (savedPanelConfig.HideTitlebar)
WindowActionManager.ApplyHidePanelTitleBar(savedPanelConfig.PanelHandle, true);
}
PInvoke.ShowWindow(panel.PanelHandle, PInvokeConstant.SW_RESTORE);
PInvoke.ShowWindow(savedPanelConfig.PanelHandle, PInvokeConstant.SW_RESTORE);
});
// If profile is unlocked, add any new panel into profile
if (!ActiveProfile.IsLocked)
{
var isAdded = false;
panelResults.ForEach(panel =>
{
if (panel.PanelType == PanelType.BuiltInPopout && !ActiveProfile.PanelConfigs.Any(s => s.PanelName == panel.PanelName))
{
ActiveProfile.PanelConfigs.Add(panel);
isAdded = true;
}
else if (panel.PanelType == PanelType.CustomPopout && !ActiveProfile.PanelConfigs.Any(s => s.PanelIndex == panel.PanelIndex))
{
ActiveProfile.PanelConfigs.Add(panel);
isAdded = true;
}
});
if (isAdded)
ProfileData.WriteProfiles();
}
// Apply full screen (cannot combine with always on top or hide title bar)
// Cannot run in parallel process
panelResults.ForEach(panel =>
ActiveProfile.PanelConfigs.ToList().ForEach(panel =>
{
if (panel.FullScreen && (!panel.AlwaysOnTop && !panel.HideTitlebar))
{
InputEmulationManager.ToggleFullScreenPanel(panel.PanelHandle);
Thread.Sleep(250);
// Set full screen mode panel coordinate
var windowRectangle = WindowActionManager.GetWindowRect(panel.PanelHandle);
var clientRectangle = WindowActionManager.GetClientRect(panel.PanelHandle);
panel.FullScreenLeft = windowRectangle.Left;
panel.FullScreenTop = windowRectangle.Top;
panel.FullScreenWidth = clientRectangle.Width;
panel.FullScreenHeight = clientRectangle.Height;
}
});
// If profile is locked, remove all panels without handle
if (ActiveProfile.IsLocked)
panelResults.RemoveAll(p => p.PanelHandle == IntPtr.Zero);
}
private void ReturnToAfterPopOutCameraView()

View file

@ -14,8 +14,9 @@ Please follow [FlightSimulator.com](https://forums.flightsimulator.com/t/msfs-po
<hr>
## Touch Panel Feature
With SU10 Beta v1.27.11, Asobo seems to have fix a major [bug](#touch-enable-pop-out-feature) (in SU9 and before) that stops Pop Out Panel Manager's touch panel feature from working reliably. I'm happy to announce touch enabled feature works pretty well out of the box on either direct connected touch monitor or on pop out window that is displayed on tablet using software tool such as SpaceDesk. Until Asobo actually allow touch passthrough for panels, this tool can serve as a stopgap solution.
With SU10 Beta v1.27.11+, Asobo seems to have fix a major [bug](#touch-enable-pop-out-feature) (in SU9 and before) that stops Pop Out Panel Manager's touch panel feature from working reliably. I'm happy to announce touch enabled feature works pretty well out of the box on either direct connected touch monitor or on pop out window that is displayed on tablet using software tool such as SpaceDesk. Until Asobo actually allow touch passthrough for panels, this tool can serve as a stopgap solution.
I've tested touch operation on GTN750, GTN530, KingAir PFD/MFD, TMB 930 FMS, Flybywire A32NX EFB and they are operational. Please report any issues that you encounter when using touch enable feature. There is still lots of room for improvement and I'll continue my effort to make touch work better and better.

View file

@ -1,8 +1,15 @@
namespace MSFSPopoutPanelManager.Shared
using System;
namespace MSFSPopoutPanelManager.Shared
{
public class PanelConfigItem
{
public int PanelIndex { get; set; }
public PanelConfigItem()
{
PanelHandle = IntPtr.Zero;
}
public IntPtr PanelHandle { get; set; }
public PanelConfigPropertyName PanelConfigProperty { get; set; }
}

View file

@ -11,9 +11,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.Shared</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -11,9 +11,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.SimConnectAgent</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -11,9 +11,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.TouchPanelAgent</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -109,6 +109,9 @@ namespace MSFSPopoutPanelManager.UserDataAgent
public bool DisableGameRefocus { get; set; }
[JsonIgnore]
public bool IsFound { get { return PanelHandle != IntPtr.Zero; } }
[JsonIgnore]
public bool IsCustomPopOut { get { return PanelType == PanelType.CustomPopout; } }
@ -150,6 +153,18 @@ namespace MSFSPopoutPanelManager.UserDataAgent
}
}
}
[JsonIgnore]
public int FullScreenTop { get; set; }
[JsonIgnore]
public int FullScreenLeft { get; set; }
[JsonIgnore]
public int FullScreenWidth { get; set; }
[JsonIgnore]
public int FullScreenHeight { get; set; }
}
public class TouchPanelBinding : ObservableObject

View file

@ -29,6 +29,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
var copiedProfile = matchedProfile.Copy<Profile>(); // Using Shared/ObjectExtensions.cs extension method
copiedProfile.BindingAircrafts = new ObservableCollection<string>();
copiedProfile.IsLocked = false;
return AddProfile(copiedProfile, newProfileName, profiles);
}

View file

@ -10,9 +10,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.UserDataAgent</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -2,9 +2,13 @@
<hr/>
## Version 3.4.3
* Added ability to remember MSFS game window size and location for aircraft profile when running the game in windows display mode. This new setting is used to resize game window to match original size and location of MSFS game window when panel profile was defined initially. For existing aircraft profile, when running the game in windows display mode, the profile will automatically save MSFS game window position after the first successful pop out.
* Added ability to include in-game menu bar panels such as VFR Map, ATC, Checklist, etc to aircraft profile. During the pop out process, if any in-game menu bar panels are in popped out state, they will be included in panel configurations. This feature will only work if in-game menu bar panels are popped out initially and it also rely on MSFS re-opens these panels when flight starts (SU 10+).
* Added UI cue to show number circles momentarily when popping out panel to facilitate troubleshooting.
* Added ability to remember MSFS game window size and location for aircraft profile when running the game in windows display mode. This new preference setting is used to resize game window to match original size and location of MSFS game window when panel profile was defined initially. For existing aircraft profile, when running the game in windows display mode, the profile will automatically save MSFS game window position after the first successful pop out.
* Added ability to include in-game menu bar panels such as VFR Map, ATC, Checklist, etc to aircraft profile. During the pop out process, if any in-game menu bar panels are in popped out state, they will be included in panel configurations. This feature will only work if in-game menu bar panels are popped out if using in conjunction with auto pop out, it relies on MSFS re-opens these panels when flight starts (SU 10+). This also allows in-game menu bar panels to be touch enabled. Toggling the include in-game menu bar panels checkbox for a profile will reset these panels' inclusion and configurations. When using this feature with Auto Pop Out, there will be a delay in the pop out process to allow in-game menu bar panels to appear on screen before they're being configured to previously defined settings.
* Added UI cue to show number circle momentarily when popping out panel.
* Fixed an issue where touch does not work for panel when using full screen mode.
## Version 3.4.2
* Major change in how profile is bound to an aircraft. Previously, a profile is bound to an aircraft livery which requires you to activate binding when switching livery for the same aircraft. With this update, a profile is now bound to an aircraft so you no longer need to perform the binding step when switching livery. As you change active aircraft to fly, all existing livery binding will be automatically converted to aircraft binding if one exists. Also, a profile can still be bound to multiple aircrafts if you so choose such as when flying multiple variations of Cessna 172. This change has been a long awaited request to simplify your profile bindings.

View file

@ -11,9 +11,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.WebServer</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -18,6 +18,7 @@ namespace MSFSPopoutPanelManager.WindowsAgent
private static bool _isMouseMoveBlock = false;
private static object _mouseTouchLock = new object();
private static bool _isDragged = false;
private static bool _refocused = true;
private const int PANEL_MENUBAR_HEIGHT = 31;
private const uint TOUCH_FLAG = 0xFF515700;
@ -77,13 +78,19 @@ namespace MSFSPopoutPanelManager.WindowsAgent
return PInvoke.CallNextHookEx(_hHook, code, wParam, lParam);
}
// Touch
// If touch point is within pop out panel boundaries and have touch enabled
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.TouchEnabled
&& info.pt.X > p.Left
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.TouchEnabled &&
((!p.FullScreen &&
info.pt.X > p.Left
&& info.pt.X < p.Left + p.Width
&& info.pt.Y > p.Top + (p.HideTitlebar || p.FullScreen ? 5 : PANEL_MENUBAR_HEIGHT)
&& info.pt.Y < p.Top + p.Height);
&& info.pt.Y > p.Top + (p.HideTitlebar ? 5 : PANEL_MENUBAR_HEIGHT)
&& info.pt.Y < p.Top + p.Height) ||
(p.FullScreen &&
info.pt.X > p.FullScreenLeft
&& info.pt.X < p.FullScreenLeft + p.FullScreenWidth
&& info.pt.Y > p.FullScreenTop + 5
&& info.pt.Y < p.FullScreenTop + p.FullScreenHeight
)));
if (panelConfig == null)
return PInvoke.CallNextHookEx(_hHook, code, wParam, lParam);
@ -97,6 +104,7 @@ namespace MSFSPopoutPanelManager.WindowsAgent
case WM_LBUTTONDOWN:
if (!_isTouchDown)
{
_refocused = false;
_isTouchDown = true;
_isMouseMoveBlock = true;
@ -153,8 +161,9 @@ namespace MSFSPopoutPanelManager.WindowsAgent
{
Thread.Sleep(AppSetting.TouchScreenSettings.RefocusGameWindowDelay);
if (!_isTouchDown && AppSetting.TouchScreenSettings.RefocusGameWindow && !panelConfig.DisableGameRefocus)
if (!_refocused && !_isTouchDown && AppSetting.TouchScreenSettings.RefocusGameWindow && !panelConfig.DisableGameRefocus)
{
_refocused = true;
var rectangle = WindowActionManager.GetWindowRect(_simulatorProcess.Handle);
var clientRectangle = WindowActionManager.GetClientRect(_simulatorProcess.Handle);

View file

@ -9,8 +9,8 @@ namespace MSFSPopoutPanelManager.WindowsAgent
{
var systemAssemblyVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version;
var appVersion = $"{systemAssemblyVersion.Major}.{systemAssemblyVersion.Minor}.{systemAssemblyVersion.Build}";
if (systemAssemblyVersion.Revision > 0)
appVersion += "." + systemAssemblyVersion.Revision.ToString("D4"); ;
//if (systemAssemblyVersion.Revision > 0)
// appVersion += "." + systemAssemblyVersion.Revision.ToString("D4");
return appVersion;
}

View file

@ -11,9 +11,9 @@
<PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.WindowsAgent</RootNamespace>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

@ -27,6 +27,7 @@
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="#FF4D4D4D" />
</Trigger>
</Style.Triggers>
</Style>
@ -48,7 +49,8 @@
<DataGrid Name="PanelConfigGrid" HorizontalAlignment="Center" Width="882" Height="460" Margin="0 10 0 0" AutoGenerateColumns="False" CanUserResizeColumns="False" HorizontalScrollBarVisibility="Disabled"
CanUserReorderColumns="False" CanUserResizeRows="False" HorizontalGridLinesBrush="#B9B9B9" VerticalGridLinesBrush="#B9B9B9" GridLinesVisibility="Horizontal" SelectionUnit="Cell"
BorderThickness="1" CanUserAddRows="False" CanUserSortColumns="False" KeyboardNavigation.TabNavigation="None" KeyboardNavigation.IsTabStop="False"
ItemsSource="{Binding ProfileData.ActiveProfile.PanelConfigs}" HeadersVisibility="Column" KeyboardNavigation.DirectionalNavigation="Local" MouseDown="PanelConfigGrid_MouseDown">
ItemsSource="{Binding ProfileData.ActiveProfile.PanelConfigs}" HeadersVisibility="Column" KeyboardNavigation.DirectionalNavigation="Local" MouseDown="PanelConfigGrid_MouseDown"
IsHitTestVisible="{c:Binding Path='!ProfileData.ActiveProfile.IsLocked'}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{x:Null}" />
@ -98,7 +100,7 @@
<TextBox Name="PanelName" Width="30" Height="28" BorderThickness="0" TextAlignment="Left"
SourceUpdated="GridData_SourceUpdated"
IsReadOnly="True"
IsHitTestVisible="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{Binding IsFound}"
Text="&#x25B6;"
VerticalAlignment="Center"
Padding="5, 3, 0, 0">
@ -127,8 +129,9 @@
Text="{Binding PanelName, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsEnabled="{Binding IsCustomPopOut}">
IsHitTestVisible="{Binding IsCustomPopOut}"
IsReadOnly="{c:Binding Path='!IsCustomPopOut'}"
IsEnabled="{Binding IsFound}">
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
@ -140,8 +143,8 @@
Text="{Binding Left, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/>
@ -155,8 +158,8 @@
Text="{Binding Top, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/>
@ -170,8 +173,8 @@
Text="{Binding Width, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/>
@ -185,11 +188,12 @@
Text="{Binding Height, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/>
FontSize="14">
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -199,8 +203,7 @@
<CheckBox Name="AlwaysOnTop" Width="75" Margin="30 0 0 0"
SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding AlwaysOnTop, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen and IsFound'}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -210,8 +213,7 @@
<CheckBox Name="HideTitlebar" Width="75" Margin="30 0 0 0"
SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding HideTitlebar, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked '}"
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut)'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut) and IsFound'}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -221,19 +223,17 @@
<CheckBox Name="FullScreen" Width="80" Margin="32 0 0 0"
SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding FullScreen, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{c:Binding Path='IsCustomPopOut or IsBuiltInPopOut'}"/>
IsHitTestVisible="{c:Binding Path='(IsCustomPopOut or IsBuiltInPopOut) and IsFound'}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Touch Enabled" Width="70">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="TouchEnabled" Width="70" Margin="25 0 0 0"
<CheckBox Name="TouchEnabled" Width="70" Margin="25 0 0 0" Foreground="#FFFFFFFF"
SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding TouchEnabled, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut)'}"/>
IsHitTestVisible="{c:Binding Path='(IsCustomPopOut or IsBuiltInPopOut) and IsFound'}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -243,8 +243,7 @@
<CheckBox Name="DisableGameRefocus" Width="70" Margin="25 0 0 0"
SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding DisableGameRefocus, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}"
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut) and TouchEnabled'}"/>
IsHitTestVisible="{c:Binding Path='(IsCustomPopOut or IsBuiltInPopOut) and TouchEnabled and IsFound'}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

View file

@ -30,7 +30,7 @@ namespace MSFSPopoutPanelManager.WpfApp
var panelConfig = container.Content as PanelConfig;
var propertyName = (PanelConfigPropertyName)Enum.Parse(typeof(PanelConfigPropertyName), ((Control)sender).Name);
var panelConfigItem = new PanelConfigItem() { PanelIndex = panelConfig.PanelIndex, PanelConfigProperty = propertyName };
var panelConfigItem = new PanelConfigItem() { PanelHandle = panelConfig.PanelHandle, PanelConfigProperty = propertyName };
_panelConfigurationViewModel.PanelConfigUpdatedCommand.Execute(panelConfigItem);
}
@ -80,7 +80,7 @@ namespace MSFSPopoutPanelManager.WpfApp
break;
}
_panelConfigurationViewModel.SelectedPanelConfigItem = new PanelConfigItem() { PanelIndex = panelConfig.PanelIndex, PanelConfigProperty = selectedProperty };
_panelConfigurationViewModel.SelectedPanelConfigItem = new PanelConfigItem() { PanelHandle = panelConfig.PanelHandle, PanelConfigProperty = selectedProperty };
}
}
@ -96,7 +96,7 @@ namespace MSFSPopoutPanelManager.WpfApp
_panelConfigurationViewModel.NumericDataPointTextBox = textBox;
var panelConfig = textBox.DataContext as PanelConfig;
_panelConfigurationViewModel.SelectedPanelConfigItem = new PanelConfigItem() { PanelIndex = panelConfig.PanelIndex, PanelConfigProperty = (PanelConfigPropertyName)Enum.Parse(typeof(PanelConfigPropertyName), textBox.Name) };
_panelConfigurationViewModel.SelectedPanelConfigItem = new PanelConfigItem() { PanelHandle = panelConfig.PanelHandle, PanelConfigProperty = (PanelConfigPropertyName)Enum.Parse(typeof(PanelConfigPropertyName), textBox.Name) };
return;
}

View file

@ -57,12 +57,12 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
{
var panelConfigItem = commandParameter as PanelConfigItem;
if (panelConfigItem != null)
_orchestrator.PanelConfiguration.PanelConfigPropertyUpdated(panelConfigItem.PanelIndex, panelConfigItem.PanelConfigProperty);
_orchestrator.PanelConfiguration.PanelConfigPropertyUpdated(panelConfigItem.PanelHandle, panelConfigItem.PanelConfigProperty);
}
private void OnDataItemIncDec(object commandParameter)
{
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, SelectedPanelConfigItem.PanelConfigProperty, Convert.ToInt32(commandParameter));
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, SelectedPanelConfigItem.PanelConfigProperty, Convert.ToInt32(commandParameter));
Application.Current.Dispatcher.Invoke(() =>
{
@ -73,7 +73,7 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
private void OnConfigurePanel(object commandParameter)
{
if (SelectedPanelConfigItem.PanelIndex == -1)
if (SelectedPanelConfigItem.PanelHandle == IntPtr.Zero)
return;
var keyAction = commandParameter as KeyAction;
@ -81,28 +81,28 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
switch (keyAction.Action)
{
case "Up":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Top, -1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Top, -1 * keyAction.Multiplier);
break;
case "Down":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Top, 1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Top, 1 * keyAction.Multiplier);
break;
case "Left":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Left, -1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Left, -1 * keyAction.Multiplier);
break;
case "Right":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Left, 1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Left, 1 * keyAction.Multiplier);
break;
case "Control-Up":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Height, -1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Height, -1 * keyAction.Multiplier);
break;
case "Control-Down":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Height, 1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Height, 1 * keyAction.Multiplier);
break;
case "Control-Left":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Width, -1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Width, -1 * keyAction.Multiplier);
break;
case "Control-Right":
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelIndex, PanelConfigPropertyName.Width, 1 * keyAction.Multiplier);
_orchestrator.PanelConfiguration.PanelConfigIncreaseDecrease(SelectedPanelConfigItem.PanelHandle, PanelConfigPropertyName.Width, 1 * keyAction.Multiplier);
break;
}
}

View file

@ -45,7 +45,7 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
.ObservesProperty(() => ProfileData.ActiveProfile)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
SetIncludeInGamePanelsCommand = new DelegateCommand(() => ProfileData.WriteProfiles(), () => FlightSimData.HasCurrentMsfsAircraft && ProfileData.HasActiveProfile && FlightSimData.IsSimulatorStarted)
SetIncludeInGamePanelsCommand = new DelegateCommand(OnSetIncludeInGamePanels, () => FlightSimData.HasCurrentMsfsAircraft && ProfileData.HasActiveProfile && FlightSimData.IsSimulatorStarted)
.ObservesProperty(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => ProfileData.ActiveProfile)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted);
@ -193,5 +193,14 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
{
OpenTouchPanelBindingDialog?.Invoke(this, null);
}
private void OnSetIncludeInGamePanels()
{
// Reset all in-game panels configuration
if (!ProfileData.ActiveProfile.IncludeInGamePanels)
ProfileData.ActiveProfile.PanelConfigs.RemoveAll(c => c.PanelType == PanelType.BuiltInPopout);
ProfileData.WriteProfiles();
}
}
}

View file

@ -14,9 +14,9 @@
<RootNamespace>MSFSPopoutPanelManager.WpfApp</RootNamespace>
<ApplicationIcon>logo.ico</ApplicationIcon>
<Platforms>x64</Platforms>
<Version>3.4.3.0</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion>
<Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>embedded</DebugType>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>

View file

@ -1,21 +1,27 @@
Version 3.4.3.0
Version 3.4.3
This release is optional and please feel to skip this update.
Change Log:
* Added ability to remember MSFS game window size and location for aircraft profile when
running the game in windows display mode. This new setting is used to resize game window to
match original size and location of MSFS game window when panel profile was defined
initially. For existing aircraft profile, when running the game in windows display mode,
the profile will automatically save MSFS game window position after the first successful
pop out.
running the game in windows display mode. This new preference setting is used to resize
game window to match original size and location of MSFS game window when panel profile was
defined initially. For existing aircraft profile, when running the game in windows display
mode, the profile will automatically save MSFS game window position after the first
successful pop out.
* Added ability to include in-game menu bar panels such as VFR Map, ATC, Checklist, etc to
aircraft profile. During the pop out process, if any in-game menu bar panels are in popped
out state, they will be included in panel configurations. This feature will only work if
in-game menu bar panels are popped out initially and it also rely on MSFS re-opens these
panels when flight starts (SU 10+).
in-game menu bar panels are popped out and if using in conjunction with auto pop out, it
relies on MSFS re-opens these panels when flight starts (SU 10+). This also allows in-game
menu bar panels to be touch enabled. Toggling the include in-game menu bar panels checkbox
for a profile will reset these panels' inclusion and configurations. When using this
feature with Auto Pop Out, there will be a delay in the pop out process to allow in-game
menu bar panels to appear on screen before they're being configured to previously defined
settings.
* Added UI cue to show number circles momentarily when popping out panel to facilitate
troubleshooting.
* Added UI cue to show number circles momentarily when popping out panel.
* Fixed an issue where touch does not work for panel when using full screen mode.