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

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

View file

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

View file

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

View file

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

View file

@ -53,18 +53,27 @@ namespace MSFSPopoutPanelManager.Orchestration
ProfileData.WriteProfiles(); 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; return;
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelIndex == panelIndex); var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelHandle == panelHandle);
if (panelConfig != null) if (panelConfig != null)
{ {
if (configPropertyName == PanelConfigPropertyName.FullScreen) if (configPropertyName == PanelConfigPropertyName.FullScreen)
{ {
InputEmulationManager.ToggleFullScreenPanel(panelConfig.PanelHandle); 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.HideTitlebar = false;
panelConfig.AlwaysOnTop = 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; return;
var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelIndex == panelIndex); var panelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(p => p.PanelHandle == panelHandle);
if (panelConfig != null) if (panelConfig != null)
{ {

View file

@ -3,7 +3,6 @@ using MSFSPopoutPanelManager.UserDataAgent;
using MSFSPopoutPanelManager.WindowsAgent; using MSFSPopoutPanelManager.WindowsAgent;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
@ -198,14 +197,14 @@ namespace MSFSPopoutPanelManager.Orchestration
// Allow delay to wait for in game built-in pop outs to appear // Allow delay to wait for in game built-in pop outs to appear
Thread.Sleep(_builtInPanelConfigDelay); Thread.Sleep(_builtInPanelConfigDelay);
var panelResults = AddBuiltInPanels(panelConfigs.Count + 200); // add a panelIndex gap var panelResults = AddBuiltInPanels();
if (panelResults != null) if (panelResults != null)
panelConfigs.AddRange(panelResults); panelConfigs.AddRange(panelResults);
} }
if (panelConfigs.Count == 0) 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; return;
} }
@ -225,13 +224,12 @@ namespace MSFSPopoutPanelManager.Orchestration
if (ActiveProfile.PanelConfigs.Count > 0) if (ActiveProfile.PanelConfigs.Count > 0)
{ {
LoadAndApplyPanelConfigs(panelConfigs); 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); StatusMessageWriter.WriteMessage("Panels have been popped out succesfully and saved panel settings have been applied.", StatusMessageType.Info, true);
OnPopOutCompleted?.Invoke(this, false); OnPopOutCompleted?.Invoke(this, false);
} }
else else
{ {
ActiveProfile.PanelConfigs = new ObservableCollection<PanelConfig>(panelConfigs); LoadAndApplyPanelConfigs(panelConfigs);
StatusMessageWriter.WriteMessage("Panels have been popped out succesfully.", StatusMessageType.Info, true); StatusMessageWriter.WriteMessage("Panels have been popped out succesfully.", StatusMessageType.Info, true);
OnPopOutCompleted?.Invoke(this, true); OnPopOutCompleted?.Invoke(this, true);
} }
@ -325,7 +323,7 @@ namespace MSFSPopoutPanelManager.Orchestration
InputEmulationManager.LeftClick(point.X, point.Y); InputEmulationManager.LeftClick(point.X, point.Y);
} }
private List<PanelConfig> AddBuiltInPanels(int panelIndex) private List<PanelConfig> AddBuiltInPanels()
{ {
List<PanelConfig> builtinPanels = new List<PanelConfig>(); List<PanelConfig> builtinPanels = new List<PanelConfig>();
@ -338,7 +336,7 @@ namespace MSFSPopoutPanelManager.Orchestration
builtinPanels.Add(new PanelConfig() builtinPanels.Add(new PanelConfig()
{ {
PanelIndex = panelIndex, PanelIndex = -1,
PanelHandle = panelHandle, PanelHandle = panelHandle,
PanelType = PanelType.BuiltInPopout, PanelType = PanelType.BuiltInPopout,
PanelName = WindowActionManager.GetWindowCaption(panelHandle), PanelName = WindowActionManager.GetWindowCaption(panelHandle),
@ -347,8 +345,6 @@ namespace MSFSPopoutPanelManager.Orchestration
Width = clientRectangle.Width, Width = clientRectangle.Width,
Height = clientRectangle.Height Height = clientRectangle.Height
}); });
panelIndex++;
} }
return builtinPanels.Count == 0 ? null : builtinPanels; return builtinPanels.Count == 0 ? null : builtinPanels;
@ -423,6 +419,8 @@ namespace MSFSPopoutPanelManager.Orchestration
private void LoadAndApplyPanelConfigs(List<PanelConfig> panelResults) private void LoadAndApplyPanelConfigs(List<PanelConfig> panelResults)
{ {
ActiveProfile.PanelConfigs.ToList().ForEach(p => p.PanelHandle = IntPtr.Zero);
Parallel.ForEach(panelResults, panel => Parallel.ForEach(panelResults, panel =>
{ {
// Something is wrong here where panel has no window handle // Something is wrong here where panel has no window handle
@ -436,82 +434,94 @@ namespace MSFSPopoutPanelManager.Orchestration
else if (panel.PanelType == PanelType.BuiltInPopout) else if (panel.PanelType == PanelType.BuiltInPopout)
savedPanelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(s => s.PanelName == panel.PanelName); savedPanelConfig = ActiveProfile.PanelConfigs.FirstOrDefault(s => s.PanelName == panel.PanelName);
if (savedPanelConfig == null) if (savedPanelConfig == null) return;
{
panel.PanelHandle = IntPtr.Zero;
return;
}
// Assign previous saved values // Assign window handle to panel config
if (savedPanelConfig != null) savedPanelConfig.PanelHandle = panel.PanelHandle;
{
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;
}
// Apply panel name // Apply panel name
if (panel.PanelType == PanelType.CustomPopout) if (savedPanelConfig.PanelType == PanelType.CustomPopout)
{ {
var caption = panel.PanelName + " (Custom)"; var caption = savedPanelConfig.PanelName + " (Custom)";
PInvoke.SetWindowText(panel.PanelHandle, caption); PInvoke.SetWindowText(savedPanelConfig.PanelHandle, caption);
Thread.Sleep(500); Thread.Sleep(500);
} }
// Apply locations // 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); 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); 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 // 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 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); Thread.Sleep(1000);
} }
if (!panel.FullScreen) if (!savedPanelConfig.FullScreen)
{ {
// Apply always on top // 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); Thread.Sleep(1000);
} }
// Apply hide title bar // Apply hide title bar
if (panel.HideTitlebar) if (savedPanelConfig.HideTitlebar)
WindowActionManager.ApplyHidePanelTitleBar(panel.PanelHandle, true); 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) // Apply full screen (cannot combine with always on top or hide title bar)
// Cannot run in parallel process // Cannot run in parallel process
panelResults.ForEach(panel => ActiveProfile.PanelConfigs.ToList().ForEach(panel =>
{ {
if (panel.FullScreen && (!panel.AlwaysOnTop && !panel.HideTitlebar)) if (panel.FullScreen && (!panel.AlwaysOnTop && !panel.HideTitlebar))
{ {
InputEmulationManager.ToggleFullScreenPanel(panel.PanelHandle); InputEmulationManager.ToggleFullScreenPanel(panel.PanelHandle);
Thread.Sleep(250); 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() private void ReturnToAfterPopOutCameraView()

View file

@ -14,8 +14,9 @@ Please follow [FlightSimulator.com](https://forums.flightsimulator.com/t/msfs-po
<hr> <hr>
## Touch Panel Feature ## 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. 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 class PanelConfigItem
{ {
public int PanelIndex { get; set; } public PanelConfigItem()
{
PanelHandle = IntPtr.Zero;
}
public IntPtr PanelHandle { get; set; }
public PanelConfigPropertyName PanelConfigProperty { get; set; } public PanelConfigPropertyName PanelConfigProperty { get; set; }
} }

View file

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

View file

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

View file

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

View file

@ -109,6 +109,9 @@ namespace MSFSPopoutPanelManager.UserDataAgent
public bool DisableGameRefocus { get; set; } public bool DisableGameRefocus { get; set; }
[JsonIgnore]
public bool IsFound { get { return PanelHandle != IntPtr.Zero; } }
[JsonIgnore] [JsonIgnore]
public bool IsCustomPopOut { get { return PanelType == PanelType.CustomPopout; } } 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 public class TouchPanelBinding : ObservableObject

View file

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

View file

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

View file

@ -2,9 +2,13 @@
<hr/> <hr/>
## Version 3.4.3 ## 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 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 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 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 ## 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. * 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> <PackageProjectUrl>https://github.com/hawkeye-stan/msfs-popout-panel-manager</PackageProjectUrl>
<RootNamespace>MSFSPopoutPanelManager.WebServer</RootNamespace> <RootNamespace>MSFSPopoutPanelManager.WebServer</RootNamespace>
<Platforms>x64</Platforms> <Platforms>x64</Platforms>
<Version>3.4.3.0</Version> <Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion> <AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion> <FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>Embedded</DebugType> <DebugType>Embedded</DebugType>
<Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations> <Configurations>Debug;Release;DebugTouchPanel;ReleaseTouchPanel</Configurations>

View file

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

View file

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

View file

@ -27,6 +27,7 @@
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Foreground" Value="#FF4D4D4D" />
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </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" <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" 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" 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> <DataGrid.RowStyle>
<Style TargetType="DataGridRow"> <Style TargetType="DataGridRow">
<Setter Property="Background" Value="{x:Null}" /> <Setter Property="Background" Value="{x:Null}" />
@ -98,7 +100,7 @@
<TextBox Name="PanelName" Width="30" Height="28" BorderThickness="0" TextAlignment="Left" <TextBox Name="PanelName" Width="30" Height="28" BorderThickness="0" TextAlignment="Left"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
IsReadOnly="True" IsReadOnly="True"
IsHitTestVisible="{c:Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path='!DataContext.ProfileData.ActiveProfile.IsLocked'}" IsHitTestVisible="{Binding IsFound}"
Text="&#x25B6;" Text="&#x25B6;"
VerticalAlignment="Center" VerticalAlignment="Center"
Padding="5, 3, 0, 0"> Padding="5, 3, 0, 0">
@ -127,8 +129,9 @@
Text="{Binding PanelName, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}" Text="{Binding PanelName, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}" Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}" IsHitTestVisible="{Binding IsCustomPopOut}"
IsEnabled="{Binding IsCustomPopOut}"> IsReadOnly="{c:Binding Path='!IsCustomPopOut'}"
IsEnabled="{Binding IsFound}">
</TextBox> </TextBox>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
@ -140,8 +143,8 @@
Text="{Binding Left, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}" Text="{Binding Left, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}" Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}" IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus" GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus" LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/> FontSize="14"/>
@ -155,8 +158,8 @@
Text="{Binding Top, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}" Text="{Binding Top, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}" Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}" IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus" GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus" LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/> FontSize="14"/>
@ -170,8 +173,8 @@
Text="{Binding Width, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}" Text="{Binding Width, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}" Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=DataContext.ProfileData.ActiveProfile.IsLocked}"
IsHitTestVisible="{c:Binding Path='!FullScreen'}" IsHitTestVisible="{c:Binding Path='!FullScreen'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus" GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus" LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/> FontSize="14"/>
@ -185,11 +188,12 @@
Text="{Binding Height, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}" Text="{Binding Height, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus}"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
Style="{StaticResource TextBoxColumnFocus}" Style="{StaticResource TextBoxColumnFocus}"
IsReadOnly="{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'}"
IsEnabled="{Binding IsFound}"
GotFocus="NumericDataPoint_GotFocus" GotFocus="NumericDataPoint_GotFocus"
LostFocus="NumericDataPoint_LostFocus" LostFocus="NumericDataPoint_LostFocus"
FontSize="14"/> FontSize="14">
</TextBox>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
@ -199,8 +203,7 @@
<CheckBox Name="AlwaysOnTop" Width="75" Margin="30 0 0 0" <CheckBox Name="AlwaysOnTop" Width="75" Margin="30 0 0 0"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding AlwaysOnTop, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 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 and IsFound'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen'}"/>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
@ -210,8 +213,7 @@
<CheckBox Name="HideTitlebar" Width="75" Margin="30 0 0 0" <CheckBox Name="HideTitlebar" Width="75" Margin="30 0 0 0"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding HideTitlebar, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 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) and IsFound'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut)'}"/>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
@ -221,19 +223,17 @@
<CheckBox Name="FullScreen" Width="80" Margin="32 0 0 0" <CheckBox Name="FullScreen" Width="80" Margin="32 0 0 0"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding FullScreen, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 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) and IsFound'}"/>
IsHitTestVisible="{c:Binding Path='IsCustomPopOut or IsBuiltInPopOut'}"/>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
<DataGridTemplateColumn Header="Touch Enabled" Width="70"> <DataGridTemplateColumn Header="Touch Enabled" Width="70">
<DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellTemplate>
<DataTemplate> <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" SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding TouchEnabled, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 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='(IsCustomPopOut or IsBuiltInPopOut) and IsFound'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut)'}"/>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
@ -243,8 +243,7 @@
<CheckBox Name="DisableGameRefocus" Width="70" Margin="25 0 0 0" <CheckBox Name="DisableGameRefocus" Width="70" Margin="25 0 0 0"
SourceUpdated="GridData_SourceUpdated" SourceUpdated="GridData_SourceUpdated"
IsChecked="{Binding DisableGameRefocus, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 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='(IsCustomPopOut or IsBuiltInPopOut) and TouchEnabled and IsFound'}"/>
IsHitTestVisible="{c:Binding Path='!FullScreen and (IsCustomPopOut or IsBuiltInPopOut) and TouchEnabled'}"/>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>

View file

@ -30,7 +30,7 @@ namespace MSFSPopoutPanelManager.WpfApp
var panelConfig = container.Content as PanelConfig; var panelConfig = container.Content as PanelConfig;
var propertyName = (PanelConfigPropertyName)Enum.Parse(typeof(PanelConfigPropertyName), ((Control)sender).Name); 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); _panelConfigurationViewModel.PanelConfigUpdatedCommand.Execute(panelConfigItem);
} }
@ -80,7 +80,7 @@ namespace MSFSPopoutPanelManager.WpfApp
break; 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; _panelConfigurationViewModel.NumericDataPointTextBox = textBox;
var panelConfig = textBox.DataContext as PanelConfig; 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; return;
} }

View file

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

View file

@ -45,7 +45,7 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
.ObservesProperty(() => ProfileData.ActiveProfile) .ObservesProperty(() => ProfileData.ActiveProfile)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted); .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(() => FlightSimData.HasCurrentMsfsAircraft)
.ObservesProperty(() => ProfileData.ActiveProfile) .ObservesProperty(() => ProfileData.ActiveProfile)
.ObservesProperty(() => FlightSimData.IsSimulatorStarted); .ObservesProperty(() => FlightSimData.IsSimulatorStarted);
@ -193,5 +193,14 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
{ {
OpenTouchPanelBindingDialog?.Invoke(this, null); 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> <RootNamespace>MSFSPopoutPanelManager.WpfApp</RootNamespace>
<ApplicationIcon>logo.ico</ApplicationIcon> <ApplicationIcon>logo.ico</ApplicationIcon>
<Platforms>x64</Platforms> <Platforms>x64</Platforms>
<Version>3.4.3.0</Version> <Version>3.4.3.0911</Version>
<AssemblyVersion>3.4.3.0</AssemblyVersion> <AssemblyVersion>3.4.3.0911</AssemblyVersion>
<FileVersion>3.4.3.0</FileVersion> <FileVersion>3.4.3.0911</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages> <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. This release is optional and please feel to skip this update.
Change Log: Change Log:
* Added ability to remember MSFS game window size and location for aircraft profile when * 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 running the game in windows display mode. This new preference setting is used to resize
match original size and location of MSFS game window when panel profile was defined game window to match original size and location of MSFS game window when panel profile was
initially. For existing aircraft profile, when running the game in windows display mode, defined initially. For existing aircraft profile, when running the game in windows display
the profile will automatically save MSFS game window position after the first successful mode, the profile will automatically save MSFS game window position after the first
pop out. successful pop out.
* Added ability to include in-game menu bar panels such as VFR Map, ATC, Checklist, etc to * 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 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 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 in-game menu bar panels are popped out and if using in conjunction with auto pop out, it
panels when flight starts (SU 10+). 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 * Added UI cue to show number circles momentarily when popping out panel.
troubleshooting.
* Fixed an issue where touch does not work for panel when using full screen mode.