mirror of
https://github.com/hawkeye-stan/msfs-popout-panel-manager.git
synced 2024-11-28 00:30:09 +00:00
Release v3.4.0
This commit is contained in:
parent
e49fe68227
commit
7fcb567884
16 changed files with 242 additions and 156 deletions
|
@ -8,17 +8,17 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
{
|
{
|
||||||
public static void MigrateUserDataFiles()
|
public static void MigrateUserDataFiles()
|
||||||
{
|
{
|
||||||
var packageFile = new FileInfo("MSFSPopoutPanelManager.exe");
|
|
||||||
|
|
||||||
var newDataPath = Path.Combine(FileIo.GetUserDataFilePath());
|
|
||||||
var oldDataPath = Path.Combine(packageFile.DirectoryName, "userdata");
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var newDataPath = FileIo.GetUserDataFilePath();
|
||||||
|
|
||||||
// Check if migration is necessary
|
// Check if migration is necessary
|
||||||
if (new DirectoryInfo(newDataPath).Exists)
|
if (new DirectoryInfo(newDataPath).Exists)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var packageFile = new FileInfo("MSFSPopoutPanelManager.exe");
|
||||||
|
var oldDataPath = Path.Combine(packageFile.DirectoryName, "userdata");
|
||||||
|
|
||||||
// Check if upgrading from older version of app
|
// Check if upgrading from older version of app
|
||||||
if (!new DirectoryInfo(oldDataPath).Exists)
|
if (!new DirectoryInfo(oldDataPath).Exists)
|
||||||
return;
|
return;
|
||||||
|
@ -56,6 +56,7 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
if (!new FileInfo(newAppSettingDataJsonPath).Exists)
|
if (!new FileInfo(newAppSettingDataJsonPath).Exists)
|
||||||
{
|
{
|
||||||
StatusMessageWriter.WriteMessage("An error has occured when moving 'appsettingdata.json' to new folder location. Please try manually move this file and restart the app again.", StatusMessageType.Error, true, 5, true);
|
StatusMessageWriter.WriteMessage("An error has occured when moving 'appsettingdata.json' to new folder location. Please try manually move this file and restart the app again.", StatusMessageType.Error, true, 5, true);
|
||||||
|
RemoveDocumentsFolder();
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +72,7 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
if (!new FileInfo(newUserProfileDataJsonPath).Exists)
|
if (!new FileInfo(newUserProfileDataJsonPath).Exists)
|
||||||
{
|
{
|
||||||
StatusMessageWriter.WriteMessage("An error has occured when moving 'userprofiledata.json' to new folder location. Please try manually move this file and restart the app again.", StatusMessageType.Error, true, 5, true);
|
StatusMessageWriter.WriteMessage("An error has occured when moving 'userprofiledata.json' to new folder location. Please try manually move this file and restart the app again.", StatusMessageType.Error, true, 5, true);
|
||||||
|
RemoveDocumentsFolder();
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,9 +85,9 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
// Force an update of AppSetting file
|
// Force an update of AppSetting file
|
||||||
var appSettingData = new AppSettingData();
|
var appSettingData = new AppSettingData();
|
||||||
appSettingData.ReadSettings();
|
appSettingData.ReadSettings();
|
||||||
appSettingData.AppSetting.AlwaysOnTop = false;
|
appSettingData.AppSetting.AlwaysOnTop = !appSettingData.AppSetting.AlwaysOnTop;
|
||||||
System.Threading.Thread.Sleep(500);
|
System.Threading.Thread.Sleep(500);
|
||||||
appSettingData.AppSetting.AlwaysOnTop = true;
|
appSettingData.AppSetting.AlwaysOnTop = !appSettingData.AppSetting.AlwaysOnTop;
|
||||||
|
|
||||||
StatusMessageWriter.WriteMessage(String.Empty, StatusMessageType.Info, false);
|
StatusMessageWriter.WriteMessage(String.Empty, StatusMessageType.Info, false);
|
||||||
}
|
}
|
||||||
|
@ -129,5 +131,15 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void RemoveDocumentsFolder()
|
||||||
|
{
|
||||||
|
var dataPath = FileIo.GetUserDataFilePath();
|
||||||
|
|
||||||
|
if (Directory.Exists(dataPath))
|
||||||
|
{
|
||||||
|
Directory.Delete(dataPath, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,8 +241,8 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
|
if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTUREEND)
|
//if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTUREEND)
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
HandleTouchUpEvent(panelConfig);
|
HandleTouchUpEvent(panelConfig);
|
||||||
break;
|
break;
|
||||||
|
@ -300,8 +300,8 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
|
if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTUREEND)
|
//if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTUREEND)
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
HandleTouchUpEvent(panelConfig);
|
HandleTouchUpEvent(panelConfig);
|
||||||
break;
|
break;
|
||||||
|
@ -312,19 +312,21 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleTouchDownEvent(PanelConfig panelConfig)
|
private void HandleTouchDownEvent(PanelConfig panelConfig)
|
||||||
|
{
|
||||||
|
if (!_isHookMouseDown)
|
||||||
|
{
|
||||||
|
lock (_hookLock)
|
||||||
{
|
{
|
||||||
Point point;
|
Point point;
|
||||||
PInvoke.GetCursorPos(out point);
|
PInvoke.GetCursorPos(out point);
|
||||||
|
|
||||||
// Disable left clicking if user is touching the title bar area
|
// Disable left clicking if user is touching the title bar area
|
||||||
if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
|
if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
|
||||||
{
|
|
||||||
if (!_isHookMouseDown)
|
|
||||||
{
|
|
||||||
lock (_hookLock)
|
|
||||||
{
|
{
|
||||||
_isHookMouseDown = true;
|
_isHookMouseDown = true;
|
||||||
InputEmulationManager.LeftClickMouseDown(point.X, point.Y);
|
InputEmulationManager.LeftClickMouseDown(point.X, point.Y);
|
||||||
|
|
||||||
|
//Debug.WriteLine($"Mouse Down {_pair}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,14 +335,6 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
|
|
||||||
private void HandleTouchUpEvent(PanelConfig panelConfig)
|
private void HandleTouchUpEvent(PanelConfig panelConfig)
|
||||||
{
|
{
|
||||||
Point point;
|
|
||||||
PInvoke.GetCursorPos(out point);
|
|
||||||
|
|
||||||
// Disable left clicking if user is touching the title bar area
|
|
||||||
if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
|
|
||||||
{
|
|
||||||
var prevWinEventClickLock = ++_winEventClickLock;
|
|
||||||
|
|
||||||
if (_isHookMouseDown)
|
if (_isHookMouseDown)
|
||||||
{
|
{
|
||||||
Thread.Sleep(AppSettingData.AppSetting.TouchScreenSettings.MouseUpDownDelay);
|
Thread.Sleep(AppSettingData.AppSetting.TouchScreenSettings.MouseUpDownDelay);
|
||||||
|
@ -349,10 +343,18 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
{
|
{
|
||||||
_isHookMouseDown = false;
|
_isHookMouseDown = false;
|
||||||
UnhookWinEvent();
|
UnhookWinEvent();
|
||||||
|
|
||||||
|
Point point;
|
||||||
|
PInvoke.GetCursorPos(out point);
|
||||||
|
// Disable left clicking if user is touching the title bar area
|
||||||
|
if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
|
||||||
|
{
|
||||||
InputEmulationManager.LeftClickMouseUp(0, 0);
|
InputEmulationManager.LeftClickMouseUp(0, 0);
|
||||||
HookWinEvent();
|
HookWinEvent();
|
||||||
}
|
// Debug.WriteLine($"Mouse Up {_pair}");
|
||||||
}
|
//_pair++;
|
||||||
|
|
||||||
|
var prevWinEventClickLock = ++_winEventClickLock;
|
||||||
|
|
||||||
if (prevWinEventClickLock == _winEventClickLock && AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindow)
|
if (prevWinEventClickLock == _winEventClickLock && AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindow)
|
||||||
{
|
{
|
||||||
|
@ -360,6 +362,8 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void RefocusMsfs(int prevWinEventClickLock)
|
private void RefocusMsfs(int prevWinEventClickLock)
|
||||||
{
|
{
|
||||||
|
@ -367,14 +371,13 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
|
|
||||||
if (prevWinEventClickLock == _winEventClickLock)
|
if (prevWinEventClickLock == _winEventClickLock)
|
||||||
{
|
{
|
||||||
var simulatorProcess = WindowProcessManager.GetSimulatorProcess();
|
|
||||||
|
|
||||||
Rectangle rectangle;
|
|
||||||
PInvoke.GetWindowRect(simulatorProcess.Handle, out rectangle);
|
|
||||||
|
|
||||||
if (!_isHookMouseDown)
|
if (!_isHookMouseDown)
|
||||||
{
|
{
|
||||||
PInvoke.SetCursorPos(rectangle.X + 18, rectangle.Y + 80);
|
var simulatorProcess = WindowProcessManager.GetSimulatorProcess();
|
||||||
|
var rectangle = WindowActionManager.GetWindowRect(simulatorProcess.Handle);
|
||||||
|
var clientRectangle = WindowActionManager.GetClientRect(simulatorProcess.Handle);
|
||||||
|
|
||||||
|
PInvoke.SetCursorPos(rectangle.X + clientRectangle.Width / 2, rectangle.Y + clientRectangle.Height / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,8 +73,8 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
{
|
{
|
||||||
StatusMessageWriter.WriteMessage($"Automatic pop out is starting for profile:\n{profile.ProfileName}", StatusMessageType.Info, true);
|
StatusMessageWriter.WriteMessage($"Automatic pop out is starting for profile:\n{profile.ProfileName}", StatusMessageType.Info, true);
|
||||||
|
|
||||||
// Extra wait for cockpit view to align
|
// Extra wait for cockpit view to appear and align
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(2000);
|
||||||
|
|
||||||
CorePopOutSteps();
|
CorePopOutSteps();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,9 @@ namespace MSFSPopoutPanelManager.Orchestration
|
||||||
if (ActiveProfile == null)
|
if (ActiveProfile == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return ProfileManager.DeleteProfile(profileId, Profiles);
|
var success = ProfileManager.DeleteProfile(profileId, Profiles);
|
||||||
|
UpdateActiveProfile(-1);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddProfileBinding(string planeTitle, int activeProfileId)
|
public void AddProfileBinding(string planeTitle, int activeProfileId)
|
||||||
|
|
80
README.md
80
README.md
|
@ -14,19 +14,55 @@ Please follow [FlightSimulator.com](https://forums.flightsimulator.com/t/msfs-po
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
## ** Updated 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 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, KingAir PFD/MFD, TMB 930 FMS and they are operational with couple of caveats listed below. 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.
|
||||||
|
|
||||||
|
Things that work:
|
||||||
|
|
||||||
|
* General button click
|
||||||
|
* Touch and drag such as when panning maps or using scrollbars
|
||||||
|
* Works on touch monitor or tablet with SpaceDesk
|
||||||
|
|
||||||
|
Know issues and workarounds:
|
||||||
|
* When setting a panel to be touch enabled, please refrain form using a mouse to operate the panel since it is going to drive you insane. In the application, when no touch (click) action occurs within 1 second after the last touch action, the mouse cursor is going to jump back into the game window in order to give flight control back to the user. If you're using a mouse to interact with a panel that is designated as touch enabled, your mouse cursor is going to jump around. You can turn off game refocus setting but then you'll lose control of the plane as soon as you interact with a pop out panel. I believe the lost of flight control is on Asobo bug list waiting to be fixed.
|
||||||
|
|
||||||
|
* Panels are designed in the game for mouse interaction which means it has a built-in assumption for slow-er mouse click response. But using finger to touch is definitely much faster than using a mouse and some panel UI will not be able to keep up with the speed of touch entry if you send touch input too fast. When you encounter UI lag in response or button click not responding to your touch input, please slow down your touch input speed a bit and let the panel catch up. (On my to-do list for improvement.)
|
||||||
|
|
||||||
|
* With the point above and because panels are coded by different developers, they will have vary software performance when using them. Touch event may register consistently for one panel and not another. There is a new touch setting in preferences menu to adjust the time delay to allow a panel to register a touch (mouse down then up). If your panel has trouble receiving your touch input, increase this value one step at a time to compensate for the delay.
|
||||||
|
|
||||||
|
* Unlike using a mouse, to pan a map, you've to touch the map first to set the map in focus before touching and dragging to pan the map. This is a limitation of touch vs direct mouse click when using drag action in pop out panel. (On my to-do list for improvement.)
|
||||||
|
|
||||||
|
* Touch dragging a scrollbar. Since the current scrollbar implementation in MSFS has a very small target zone when using a finger compares to using a mouse, you may have to try couple times to hit the required scrollbar area to scroll. A easier approach to activate the scrollbar is by touching the scrollbar with your finger, hold for about 1 second, then move your finger to scroll. This gives time for MSFS side to register the start scroll event.
|
||||||
|
|
||||||
|
* In SU 10 beta (1.27.11.0) or before, when using Touch Enabled and Full Screen Mode simultaneously for a panel, touch event will not register since Full Screen mode does not get treated as a pop out window by Asobo. Please run the panel in regular pop out window and use "Hide toolbar" option instead of full screen mode to simulator full screen. (On my to-do list for improvement.)
|
||||||
|
|
||||||
## Application Features
|
## Application Features
|
||||||
* Display resolution independent. Supports 1080p/1440p/4k display and ultrawide displays.
|
* Display resolution independent. Supports 1080p/1440p/4k display and ultrawide displays.
|
||||||
|
|
||||||
* Support multiple user defined aircraft profiles to save panel locations to be recalled later.
|
* Support multiple user defined aircraft profiles to save panel locations to be recalled later.
|
||||||
|
|
||||||
* Intuitive user interface to defined location of panels to be popped out.
|
* Intuitive user interface to defined location of panels to be popped out.
|
||||||
|
|
||||||
* [Auto Pop Out](#auto-pop-out-feature) feature. The application will detect active aircraft by livery and activate the corresponding profile on start of new flight session.
|
* [Auto Pop Out](#auto-pop-out-feature) feature. The application will detect active aircraft by livery and activate the corresponding profile on start of new flight session.
|
||||||
|
|
||||||
* [Cold Start feature](#auto-pop-out-feature). Instrumentation panels can be popped out even when they're not powered on (for G1000 / / G1000 NXi planes only).
|
* [Cold Start feature](#auto-pop-out-feature). Instrumentation panels can be popped out even when they're not powered on (for G1000 / / G1000 NXi planes only).
|
||||||
|
|
||||||
* Auto Panning feature remembers the cockpit camera angle when you first define the pop out panels. You can now pan, zoom in, and zoom out to identify offscreen panels and the camera angle will be saved and reused. This feature requires the use of Ctrl-Alt-0 keyboard binding to save custom camera view per plane configuration. (Can be configured to use 0 through 9). If the keyboard binding is currently being used. The auto-panning feature will overwrite the saved camera view if enabled.
|
* Auto Panning feature remembers the cockpit camera angle when you first define the pop out panels. You can now pan, zoom in, and zoom out to identify offscreen panels and the camera angle will be saved and reused. This feature requires the use of Ctrl-Alt-0 keyboard binding to save custom camera view per plane configuration. (Can be configured to use 0 through 9). If the keyboard binding is currently being used. The auto-panning feature will overwrite the saved camera view if enabled.
|
||||||
|
|
||||||
* Fine-grain control in positioning of panels down to pixel level.
|
* Fine-grain control in positioning of panels down to pixel level.
|
||||||
|
|
||||||
* Panels can be configured to appear always on top, with title bar hidden, or stretch to full screen mode.
|
* Panels can be configured to appear always on top, with title bar hidden, or stretch to full screen mode.
|
||||||
|
|
||||||
* Auto disable Track IR when pop out starts.
|
* Auto disable Track IR when pop out starts.
|
||||||
|
|
||||||
* User-friendly features such as application always on top, auto start, minimized to tray with keyboard shortcuts.
|
* User-friendly features such as application always on top, auto start, minimized to tray with keyboard shortcuts.
|
||||||
|
|
||||||
* Auto save feature. All profile and panel changes are saved automatically.
|
* Auto save feature. All profile and panel changes are saved automatically.
|
||||||
|
|
||||||
* Auto update feature. Application can auto-update itself when new version becomes available.
|
* Auto update feature. Application can auto-update itself when new version becomes available.
|
||||||
|
|
||||||
* **Experimental Feature**: Enable touch support for pop outs on touch capable display. Please see [Touch Enable Pop Out Feature](#touch-enable-pop-out-feature) for more information.
|
* **Experimental Feature**: Enable touch support for pop outs on touch capable display. Please see [Touch Enable Pop Out Feature](#touch-enable-pop-out-feature) for more information.
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -40,17 +76,15 @@ What if you can do the setup once by defining on screen where the pop out panels
|
||||||
|
|
||||||
## How to Install
|
## How to Install
|
||||||
|
|
||||||
1. After downloading the latest zip package from github repository or from Flightsim.to website, extract the zip package to a folder of your choice on your computer. You must have write access to this folder since your preference settings and profiles will be save in the folder **userdata** within the installation folder. Please do not install in **C:\Program Files** or **C:\Program Files (x86)** since most users do not have write access to these folders.
|
1. After downloading the latest zip package from github repository or from Flightsim.to website, extract the zip package to a folder of your choice on your computer.
|
||||||
|
|
||||||
2. Start the application **MSFSPopoutPanelManager.exe** and it will automatically connect when MSFS/SimConnect starts. You maybe prompt to download .NET framework 5.0 x64 desktop runtime. Please see the screenshot below to download and install x64 desktop version of the framework.
|
2. If you're using Auto Pop Out Panel feature, a plugin is required to be installed in MSFS community folder. Please copy the folder "zzz-ready-to-fly-button-skipper" into your MSFS community folder. This plugin is used to automatically skip the "Ready to Fly" button press when a flight starts so Auto Pop Out Panel can start its process.
|
||||||
|
|
||||||
<p align="center">
|
3. Start the application **MSFSPopoutPanelManager.exe** and it will automatically connect when MSFS/SimConnect starts.
|
||||||
<img src="assets/readme/images/framework_download.png" width="1000" hspace="10"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## How to Update
|
## How to Update
|
||||||
|
|
||||||
1. To update the application, you can download the latest zip package and directly extract the package into your Pop Out Manager installation folder and overwrite all files within. Your **userdata** folder will be safe.
|
1. To update the application, you can download the latest zip package and directly extract the package into your Pop Out Manager installation folder and overwrite all files within. Your application setting and profile data will be safe.
|
||||||
|
|
||||||
2. You can also use the built-in auto update feature and let the application handles the update. If the update is optional, you can skip the update if you so choose. When you start the application and if an update is available, a dialog will appear and it will show the latest version's release notes and an option to update the application.
|
2. You can also use the built-in auto update feature and let the application handles the update. If the update is optional, you can skip the update if you so choose. When you start the application and if an update is available, a dialog will appear and it will show the latest version's release notes and an option to update the application.
|
||||||
|
|
||||||
|
@ -58,7 +92,7 @@ What if you can do the setup once by defining on screen where the pop out panels
|
||||||
|
|
||||||
- Restart you computer and most of the time this will do the trick.
|
- Restart you computer and most of the time this will do the trick.
|
||||||
- Clear your default web browser cache on your computer since auto update will try to download latest version of update configuration file from github repository and the file may have been cached on your machine.
|
- Clear your default web browser cache on your computer since auto update will try to download latest version of update configuration file from github repository and the file may have been cached on your machine.
|
||||||
- Clear Internet Browser History. First search for "Internet Properties" in Windows control panel. In "General" tab, select "Delete" in Browsing History section.
|
- Clear Internet Browser History. First search for "Internet Options" in Windows control panel. In "General" tab, select "Delete" in Browsing History section.
|
||||||
|
|
||||||
## How to Use
|
## How to Use
|
||||||
|
|
||||||
|
@ -133,7 +167,6 @@ This feature will make pop out panel touch enabled on touch screen monitor or ta
|
||||||
- King Air 350
|
- King Air 350
|
||||||
- PMS GTN750
|
- PMS GTN750
|
||||||
- Lower touch panel in TBM 930
|
- Lower touch panel in TBM 930
|
||||||
- Built-in panels such as Checklist, ATC, etc.
|
|
||||||
|
|
||||||
In MSFS, when operating the above panels with pop outs, there are currently 2 limitations and one major bug that Asobo has to solve to make touch panels viable. This touch enable pop out experimental feature will try to solve the 2 limitations but is currently not able to overcome the bug.
|
In MSFS, when operating the above panels with pop outs, there are currently 2 limitations and one major bug that Asobo has to solve to make touch panels viable. This touch enable pop out experimental feature will try to solve the 2 limitations but is currently not able to overcome the bug.
|
||||||
|
|
||||||
|
@ -145,7 +178,9 @@ In MSFS, when operating the above panels with pop outs, there are currently 2 li
|
||||||
|
|
||||||
**Limitation solved by**: detect when the user has stopped any touch events (after 1 second) and refocus main screen to allow flight control to work again.
|
**Limitation solved by**: detect when the user has stopped any touch events (after 1 second) and refocus main screen to allow flight control to work again.
|
||||||
|
|
||||||
- Bug - If the pop out panel is also display on the main screen, a click through at incorrect coordinate will occur at the relative position where the pop out panel is located. If you click at this particular location in the pop out panel, the click event will register at the wrong coordinate. I haven’t been able to figure out how to work around this issue yet since the bug is deep in the closed source CoherentGT code in how MSFS implements the internal browser control to display to pop out panel. So touch will not work in the relative position of the pop out panel where panel appears on the main screen. This only affects instrumentation pop outs. The built-in ones such as ATC and checklist are fine since once they’re popped out, they no longer appear on the main screen. Below is the screenshot where click through at incorrect coordinate occurs. See the relative position (red box) in the pop out where the same instrumentation appears on the main screen.
|
|
||||||
|
**EDITED** - Asobo have fixed the below bug in SU10 Beta v1.27.11. And hopefuly it won't be broken again.
|
||||||
|
- ~~Bug~~ - If the pop out panel is also display on the main screen, a click through at incorrect coordinate will occur at the relative position where the pop out panel is located. If you click at this particular location in the pop out panel, the click event will register at the wrong coordinate. I haven’t been able to figure out how to work around this issue yet since the bug is deep in the closed source CoherentGT code in how MSFS implements the internal browser control to display to pop out panel. So touch will not work in the relative position of the pop out panel where panel appears on the main screen. This only affects instrumentation pop outs. The built-in ones such as ATC and checklist are fine since once they’re popped out, they no longer appear on the main screen. Below is the screenshot where click through at incorrect coordinate occurs. See the relative position (red box) in the pop out where the same instrumentation appears on the main screen.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="assets/readme/images/touch_support_bug.png" width="900" hspace="10"/>
|
<img src="assets/readme/images/touch_support_bug.png" width="900" hspace="10"/>
|
||||||
|
@ -159,37 +194,39 @@ In MSFS, when operating the above panels with pop outs, there are currently 2 li
|
||||||
|
|
||||||
#### How to enable touch support
|
#### How to enable touch support
|
||||||
|
|
||||||
Perform your regular panel selection and once your touch capable panel has been popped out, in the configuration screen grid, just check "Touch Enabled" to enable touch support for the selected panel. Once you enable touch support for a panel, using a mouse to operate the panel will no longer work correctly because double submit of Left-Click to MSFS will occur.
|
Perform your regular panel selection and once your touch capable panel has been popped out, in the configuration screen grid, just check "Touch Enabled" to enable touch support for the selected panel.
|
||||||
|
|
||||||
#### Know Issues
|
#### Known Issues
|
||||||
|
|
||||||
- If you enable touch support for a pop out panel, please do not you use a mouse to click the panel. It will register extra click since the app's code simulate a left mouse click when touch.
|
- If you enable touch support for a pop out panel, please do not you use a mouse to click the panel. It will register extra click since the app's code simulate a left mouse click when touch.
|
||||||
|
|
||||||
- A MSFS click through bug where pop out panel also appears on the main game screen. Touch will not register correctly in the section of the pop out panel where the relative position of the panel corresponds to where the panel is located on the main game screen.
|
~~- A MSFS click through bug where pop out panel also appears on the main game screen. Touch will not register correctly in the section of the pop out panel where the relative position of the panel corresponds to where the panel is located on the main game screen.~~ **Asobo fixed in SU10 Beta 1.27.11.**
|
||||||
|
|
||||||
- When a click through occurs on non-instrumentation panel items such as throttle or switches, even though the switches will not accidentally get clicked, touch response in pop out panel may not work. Just touching a little bit to the left/right in the pop out panel may register your touch event correctly and trigger your intend target.
|
~~- When a click through occurs on non-instrumentation panel items such as throttle or switches, even though the switches will not accidentally get clicked, touch response in pop out panel may not work. Just touching a little bit to the left/right in the pop out panel may register your touch event correctly and trigger your intend target.~~ **Asobo fixed in SU10 Beta 1.27.11.**
|
||||||
|
|
||||||
- To do a drag such a scrollbar, hold down your finger a little longer then usual and drag your finger. Some scrollbars also has a very narrow touch target and they will be hard to drag. The bigger your touch display and pop out panel size, the easier for touch the register the correct target.
|
- To do a drag such a scrollbar, hold down your finger a little longer then usual and drag your finger. Some scrollbars also has a very narrow touch target and they will be hard to drag. The bigger your touch display and pop out panel size, the easier for touch the register the correct target.
|
||||||
|
|
||||||
- If touch suddenly becomes unresponsive, please try to change the main view of the game such as looking left/right using keyboard shortcut. This will sometime reset the mouse coordinate where you touch the pop out panel.
|
- If touch suddenly becomes unresponsive, please try to change the main view of the game such as looking left/right using keyboard shortcut. This will sometime reset the mouse coordinate where you touch the pop out panel.
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
## User Profile Data Files
|
## User Profile Data Files
|
||||||
|
|
||||||
The user plane profile data and application settings data are stored as JSON files under the following folder path.
|
The user plane profile data and application settings data are stored as JSON files under your "Documents" folder. (%userprofile%\Documents\MSFS Pop Out Manager)
|
||||||
|
|
||||||
* userdata/userprofiledata.json
|
* userprofiledata.json
|
||||||
|
|
||||||
Stored your various plane profiles.
|
Stored your various plane profiles.
|
||||||
|
|
||||||
* userdata/appsettingdata.json
|
* appsettingdata.json
|
||||||
|
|
||||||
Stored your application preference settings.
|
Stored your application preference settings.
|
||||||
|
|
||||||
* userdata/autoupdate.json
|
* autoupdate.json
|
||||||
|
|
||||||
Stored the application auto update information. This file can be deleted if you want to reset your update status.
|
Stored the application auto update information. This file can be deleted if you want to reset your update status.
|
||||||
|
|
||||||
You can backup this folder and restore this folder if you want to uninstall and reinstall MSFS Pop Out Manager or to download prelease version of application to try out.
|
You can backup this folder and restore this folder if you want to uninstall and reinstall MSFS Pop Out Manager.
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
|
@ -197,8 +234,6 @@ You can backup this folder and restore this folder if you want to uninstall and
|
||||||
|
|
||||||
* Automatic power on for Auto Pop Out Panels feature will not work if you're using any flight control hardware (such as Honeycomb Alpha or Bravo) that permanently binds the master battery switch or master avionics switch. If the hardware control switch is in the off position, pop out manager won't be able to temporary turn on the instrumentation panels to pop them out. This seems to be a bug on Asobo side and only affects the G1000 instrumentation at the moment.
|
* Automatic power on for Auto Pop Out Panels feature will not work if you're using any flight control hardware (such as Honeycomb Alpha or Bravo) that permanently binds the master battery switch or master avionics switch. If the hardware control switch is in the off position, pop out manager won't be able to temporary turn on the instrumentation panels to pop them out. This seems to be a bug on Asobo side and only affects the G1000 instrumentation at the moment.
|
||||||
|
|
||||||
* Current application package size is bigger than previous version of the application because it is not a single EXE file package. With added feature of exception logging and stack trace to support user feedback and troubleshooting, a Single EXE package in .NET 5.0 as well as .NET 6.0 has a bug that stack trace information is not complete. Hopefully, Microsoft will be fixing this problem.
|
|
||||||
|
|
||||||
* Please see [Version](VERSION.md) file for latest known application issues.
|
* Please see [Version](VERSION.md) file for latest known application issues.
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
@ -211,7 +246,7 @@ You can backup this folder and restore this folder if you want to uninstall and
|
||||||
|
|
||||||
* Unable to pop out ALL panels. This may indicate a potential miscount of panels (circles) and the number of actual panels that got popped out. You may have duplicate panels in your selection or panels that cannot be popped out.
|
* Unable to pop out ALL panels. This may indicate a potential miscount of panels (circles) and the number of actual panels that got popped out. You may have duplicate panels in your selection or panels that cannot be popped out.
|
||||||
|
|
||||||
* If you encounter application crashes or unknown error, please help my continuing development effort by attaching the file **error.log** in the application folder and open an issue ticket in github repo for this project. This is going to help me troubleshoot the issue and provide hotfixes.
|
* If you encounter application crashes or unknown error, please help my continuing development effort by attaching the file **error.log** in the application Logs folder and open an issue ticket in github repo for this project. This is going to help me troubleshoot the issue and provide hotfixes.
|
||||||
|
|
||||||
* If you encounter an issue with panels that are not restored back to your saved profile locations, please check if you have other apps such as Sizer or Windows PowerToys that may have conflict with Pop Out Manager.
|
* If you encounter an issue with panels that are not restored back to your saved profile locations, please check if you have other apps such as Sizer or Windows PowerToys that may have conflict with Pop Out Manager.
|
||||||
|
|
||||||
|
@ -221,7 +256,6 @@ You can backup this folder and restore this folder if you want to uninstall and
|
||||||
|
|
||||||
This usually happens on clean Windows installation. Pop Out Panel Manager uses x64 version of SimConnect.dll to perform its function and a Visaul C++ redistributable is required for SimConnect to run correctly. Please download and install the following [VC++ redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe) on your PC to resolve this issue. Further information can be obtained in this [support ticket](https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/21).
|
This usually happens on clean Windows installation. Pop Out Panel Manager uses x64 version of SimConnect.dll to perform its function and a Visaul C++ redistributable is required for SimConnect to run correctly. Please download and install the following [VC++ redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe) on your PC to resolve this issue. Further information can be obtained in this [support ticket](https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/21).
|
||||||
|
|
||||||
|
|
||||||
## Author
|
## Author
|
||||||
Stanley Kwok
|
Stanley Kwok
|
||||||
[hawkeyesk@outlook.com](mailto:hawkeyesk@outlook.com)
|
[hawkeyesk@outlook.com](mailto:hawkeyesk@outlook.com)
|
||||||
|
@ -237,7 +271,7 @@ I welcome feedback to help improve the usefulness of this application. You are w
|
||||||
Thank you for your super kind support of this app!
|
Thank you for your super kind support of this app!
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
[MouseKeyHook](https://github.com/gmamaladze/globalmousekeyhook) by George Mamaladze
|
[WindowsHook](https://github.com/topstarai/WindowsHook) by Mark Kang
|
||||||
|
|
||||||
[Fody](https://github.com/Fody/Fody) .NET assemblies weaver by Fody
|
[Fody](https://github.com/Fody/Fody) .NET assemblies weaver by Fody
|
||||||
|
|
||||||
|
|
|
@ -232,8 +232,7 @@ namespace MSFSPopoutPanelManager.SimConnectAgent
|
||||||
private const int CAMERA_STATE_COCKPIT = 2;
|
private const int CAMERA_STATE_COCKPIT = 2;
|
||||||
private const int CAMERA_STATE_LOAD_SCREEN = 11;
|
private const int CAMERA_STATE_LOAD_SCREEN = 11;
|
||||||
private const int CAMERA_STATE_HOME_SCREEN = 15;
|
private const int CAMERA_STATE_HOME_SCREEN = 15;
|
||||||
private int _currentCameraState;
|
private int _currentCameraState = -1;
|
||||||
private bool _isFlightStarted;
|
|
||||||
|
|
||||||
private void DetectFlightStartedOrStopped()
|
private void DetectFlightStartedOrStopped()
|
||||||
{
|
{
|
||||||
|
@ -243,20 +242,29 @@ namespace MSFSPopoutPanelManager.SimConnectAgent
|
||||||
if (_currentCameraState == cameraState)
|
if (_currentCameraState == cameraState)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
switch (_currentCameraState)
|
||||||
|
{
|
||||||
|
case CAMERA_STATE_HOME_SCREEN:
|
||||||
|
case CAMERA_STATE_LOAD_SCREEN:
|
||||||
|
if (cameraState == CAMERA_STATE_COCKPIT)
|
||||||
|
{
|
||||||
_currentCameraState = cameraState;
|
_currentCameraState = cameraState;
|
||||||
FileLogger.WriteLog($"Debug Info - Camera State: {cameraState}", StatusMessageType.Debug);
|
|
||||||
|
|
||||||
if (!_isFlightStarted && cameraState == CAMERA_STATE_COCKPIT)
|
|
||||||
{
|
|
||||||
_isFlightStarted = true;
|
|
||||||
OnFlightStarted?.Invoke(this, null);
|
OnFlightStarted?.Invoke(this, null);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (_isFlightStarted && (cameraState == CAMERA_STATE_LOAD_SCREEN || cameraState == CAMERA_STATE_HOME_SCREEN))
|
|
||||||
|
break;
|
||||||
|
case CAMERA_STATE_COCKPIT:
|
||||||
|
if ((cameraState == CAMERA_STATE_LOAD_SCREEN || cameraState == CAMERA_STATE_HOME_SCREEN))
|
||||||
{
|
{
|
||||||
_isFlightStarted = false;
|
_currentCameraState = cameraState;
|
||||||
OnFlightStopped?.Invoke(this, null);
|
OnFlightStopped?.Invoke(this, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cameraState == CAMERA_STATE_COCKPIT || cameraState == CAMERA_STATE_HOME_SCREEN || cameraState == CAMERA_STATE_LOAD_SCREEN)
|
||||||
|
_currentCameraState = cameraState;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleReceiveSystemEvent(object sender, SimConnectSystemEvent e)
|
private void HandleReceiveSystemEvent(object sender, SimConnectSystemEvent e)
|
||||||
|
|
|
@ -129,7 +129,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
|
||||||
{
|
{
|
||||||
public TouchScreenSettings()
|
public TouchScreenSettings()
|
||||||
{
|
{
|
||||||
MouseUpDownDelay = 50;
|
MouseUpDownDelay = 25;
|
||||||
RefocusGameWindow = true;
|
RefocusGameWindow = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
VERSION.md
14
VERSION.md
|
@ -3,11 +3,13 @@
|
||||||
|
|
||||||
## Version 3.4
|
## Version 3.4
|
||||||
|
|
||||||
* Changed where user data files are stored. Previously, the files are saved in subfolder "userdata" in your installation directory. Now they're moved to your Windows "Documents" folder under "MSFS Pop Out Panel Manager" for easy access. When you first start the application, a data migration step will occur and your user data files will be moved to this new folder location. This change will allow you to install Pop Out Manager to any folder of your choice in your machine since the application no longer requires write access to your installation folder.
|
* Changed where user data files are stored. Previously, the files are saved in subfolder "userdata" in your installation directory. Now they're moved to your Windows "Documents" folder under "MSFS Pop Out Panel Manager" for easy access. When you first start the application, a data migration step will occur and your user data files will be upgraded and moved to this new folder location. This change will allow you to install Pop Out Manager to folder of your choice on your machine since the application no longer requires write access to your installation folder.
|
||||||
|
|
||||||
* Upgraded the application to use latest .NET 6.0 framework. You'll notice after user data migration, your installation folder will have only one executable file left. Please don't be alarmed. This file is much bigger (67MB) since all .NET dependencies and application files are now packaged into a single file. You no longer need to manually install .NET framework to run this application.
|
* Upgraded the application to use latest .NET 6.0 framework. You'll notice after user data migration, your installation folder will have only one executable file left. Please don't be alarmed. This file is much bigger (67MB) since all .NET dependencies and application files are now packaged into a single file. You no longer need to manually install .NET framework to run this application.
|
||||||
|
|
||||||
* Revamped how Auto Pop Out Panel works. The app no longer tries to hunt and click "Ready to Fly" button by using "Ready to Fly Button Skipper" plugin I created. This community plugin is included in the installation folder and is required for Auto Pop Out Panel to work. Please copy the folder "zzz-ready-to-fly-button-skipper" in subfolder "community" in your installation location into your MSFS community folder. [(Issue #29)](https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/29).
|
* Major improvement in how Auto Pop Out Panel works. The app no longer tries to hunt and click "Ready to Fly" button by using "Ready to Fly Button Skipper" plugin I created. This plugin is included in the installation folder and is required for Auto Pop Out Panel to work. Please copy the folder "zzz-ready-to-fly-button-skipper" in subfolder "community" in your installation location into your MSFS community folder. [(Issue #29)](https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/29).
|
||||||
|
|
||||||
|
* Major improvement in support for touch enabled panel. Using SU10 Beta v1.27.11, touch panel capability has greatly improved including new support for touch down and touch up events. This update enables smooth touch operations (click and drag) for panel running on connected touch monitor or on tablet using software tool such as SpaceDesk. There is a new preference settings section for touch operation adjustments. Please see README.md for current known issue and workaround for touch operations.
|
||||||
|
|
||||||
* Updated how the application detects Sim Start and Sim Stop to perform Auto Pop Out. It now uses the much more reliable camera state SimConnect variable for detection.
|
* Updated how the application detects Sim Start and Sim Stop to perform Auto Pop Out. It now uses the much more reliable camera state SimConnect variable for detection.
|
||||||
|
|
||||||
|
@ -17,17 +19,15 @@
|
||||||
|
|
||||||
* Added feature to change message dialog on screen duration. You can disable on screen message by setting the duration value to zero.
|
* Added feature to change message dialog on screen duration. You can disable on screen message by setting the duration value to zero.
|
||||||
|
|
||||||
* (New for SU10+) Added additional keystroke option to pop out panel Ctrl + Right Ctrl + Left click instead of just Right-Alt Left click. This is designed for users that have a keyboard without the Right-Alt key. To use this feature, please map (CTRL + RIGHT CTRL) in Control Options => Miscellaneous => New UI Window Mode in the game.
|
* (New for SU10+) Added additional keystroke option to pop out panel Ctrl + Right Ctrl + Left click instead of just Right-Alt +Left click. This is designed for users that have a keyboard without the Right-Alt key. To use this feature, please map (CTRL + RIGHT CTRL) in Control Options => Miscellaneous => New UI Window Mode in the game.
|
||||||
|
|
||||||
* Changed how auto pop out with bound livery works. When you start or restart Pop Out Manager and if you're already in a flight with a bound profile, Pop Out Manager will automatic re-pop out all panels for you to sync up all settings based on your cold start or hot start configuration.
|
* Cleaned up UI and improved UI guidance for user by enabling/disabling buttons and actions throughout the pop out process.
|
||||||
|
|
||||||
* Cleaned up UI and improved UI guidance for user by enable/disabling buttons and actions as needed.
|
|
||||||
|
|
||||||
* Lots of the code is rewritten from the ground up for better performance and stability. It also prepares the code architecture for v4.0 new features. Please be patient as I continue to implement v4.0. As always, please report issue and comment and I welcome all feedbacks and will do my best to fix or implement requested features.
|
* Lots of the code is rewritten from the ground up for better performance and stability. It also prepares the code architecture for v4.0 new features. Please be patient as I continue to implement v4.0. As always, please report issue and comment and I welcome all feedbacks and will do my best to fix or implement requested features.
|
||||||
|
|
||||||
Known Issues:
|
Known Issues:
|
||||||
|
|
||||||
* In SU 10 beta (1.27.11.0), when using Touch Enabled and Full Screen Mode simultaneously, touch event may not register correctly. So if you want to use touch feature, please run the panel in regular pop out window mode instead of full screen.
|
* In SU 10 beta (1.27.11.0), when using Touch Enabled and Full Screen Mode simultaneously, touch event will not register correctly. Please run the panel in regular pop out window with "Hide toolbar" option instead of full screen mode.
|
||||||
|
|
||||||
## Version 3.3.7
|
## Version 3.3.7
|
||||||
* Fixed an issue where panel number circles are displayed at incorrect location instead of at the location where you clicked your mouse. This issue will most likely occur if your monitor display scale is set to greater than 100% in Windows display setting.
|
* Fixed an issue where panel number circles are displayed at incorrect location instead of at the location where you clicked your mouse. This issue will most likely occur if your monitor display scale is set to greater than 100% in Windows display setting.
|
||||||
|
|
|
@ -19,6 +19,7 @@ namespace MSFSPopoutPanelManager.WindowsAgent
|
||||||
const uint VK_ENT = 0x0D;
|
const uint VK_ENT = 0x0D;
|
||||||
const uint KEY_0 = 0x30;
|
const uint KEY_0 = 0x30;
|
||||||
|
|
||||||
|
private static InputSimulator InputSimulator = new InputSimulator();
|
||||||
|
|
||||||
public static void LeftClickGameWindow()
|
public static void LeftClickGameWindow()
|
||||||
{
|
{
|
||||||
|
@ -58,15 +59,12 @@ namespace MSFSPopoutPanelManager.WindowsAgent
|
||||||
|
|
||||||
public static void LeftClickMouseDown(int x, int y)
|
public static void LeftClickMouseDown(int x, int y)
|
||||||
{
|
{
|
||||||
//Thread.Sleep(50);
|
|
||||||
PInvoke.mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
|
PInvoke.mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LeftClickMouseUp(int x, int y)
|
public static void LeftClickMouseUp(int x, int y)
|
||||||
{
|
{
|
||||||
|
InputSimulator.Mouse.LeftButtonUp();
|
||||||
PInvoke.mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void PopOutPanel(int x, int y, bool useCtrlShift)
|
public static void PopOutPanel(int x, int y, bool useCtrlShift)
|
||||||
|
@ -80,14 +78,13 @@ namespace MSFSPopoutPanelManager.WindowsAgent
|
||||||
|
|
||||||
if (useCtrlShift)
|
if (useCtrlShift)
|
||||||
{
|
{
|
||||||
InputSimulator inputSimulator = new InputSimulator();
|
InputSimulator.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.LCONTROL);
|
||||||
inputSimulator.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.LCONTROL);
|
InputSimulator.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.RCONTROL);
|
||||||
inputSimulator.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.RCONTROL);
|
|
||||||
PInvoke.mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
|
PInvoke.mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
|
||||||
Thread.Sleep(200);
|
Thread.Sleep(200);
|
||||||
PInvoke.mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
|
PInvoke.mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
|
||||||
inputSimulator.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.RCONTROL);
|
InputSimulator.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.RCONTROL);
|
||||||
inputSimulator.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.LCONTROL);
|
InputSimulator.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.LCONTROL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
SizeToContent="WidthAndHeight"
|
SizeToContent="WidthAndHeight"
|
||||||
Background="#01F0F0FF"
|
Background="#01F0F0FF"
|
||||||
AllowsTransparency="True"
|
AllowsTransparency="True"
|
||||||
Topmost="True"
|
MouseMove="Window_MouseMove"
|
||||||
MouseMove="Window_MouseMove">
|
Loaded="Window_Loaded">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Label Name="lblPanelIndex" Content="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
<Label Name="lblPanelIndex" Content="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
<Image Height="46" Width="55" HorizontalAlignment="Left" VerticalAlignment="Top" Opacity="1" Source="resources/transparent.png"/>
|
<Image Height="46" Width="55" HorizontalAlignment="Left" VerticalAlignment="Top" Opacity="1" Source="resources/transparent.png"/>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
using System;
|
using MSFSPopoutPanelManager.Shared;
|
||||||
|
using MSFSPopoutPanelManager.WindowsAgent;
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Interop;
|
||||||
|
|
||||||
namespace MSFSPopoutPanelManager.WpfApp
|
namespace MSFSPopoutPanelManager.WpfApp
|
||||||
{
|
{
|
||||||
|
@ -7,6 +10,8 @@ namespace MSFSPopoutPanelManager.WpfApp
|
||||||
{
|
{
|
||||||
private const int TOP_ADJUSTMENT = 23; // half of window height
|
private const int TOP_ADJUSTMENT = 23; // half of window height
|
||||||
private const int LEFT_ADJUSTMENT = 27; // half of window width
|
private const int LEFT_ADJUSTMENT = 27; // half of window width
|
||||||
|
private int _xCoor;
|
||||||
|
private int _yCoor;
|
||||||
|
|
||||||
public bool IsEditingPanelLocation { get; set; }
|
public bool IsEditingPanelLocation { get; set; }
|
||||||
|
|
||||||
|
@ -19,14 +24,15 @@ namespace MSFSPopoutPanelManager.WpfApp
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.lblPanelIndex.Content = panelIndex;
|
this.lblPanelIndex.Content = panelIndex;
|
||||||
IsEditingPanelLocation = false;
|
IsEditingPanelLocation = false;
|
||||||
|
this.Topmost = true;
|
||||||
|
|
||||||
this.LocationChanged += PanelCoorOverlay_LocationChanged;
|
this.LocationChanged += PanelCoorOverlay_LocationChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MoveWindow(int x, int y)
|
public void MoveWindow(int x, int y)
|
||||||
{
|
{
|
||||||
this.Left = x - LEFT_ADJUSTMENT;
|
_xCoor = x - LEFT_ADJUSTMENT;
|
||||||
this.Top = y - TOP_ADJUSTMENT;
|
_yCoor = y - TOP_ADJUSTMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PanelCoorOverlay_LocationChanged(object sender, EventArgs e)
|
private void PanelCoorOverlay_LocationChanged(object sender, EventArgs e)
|
||||||
|
@ -34,10 +40,10 @@ namespace MSFSPopoutPanelManager.WpfApp
|
||||||
if (this.Top is double.NaN || this.Left is double.NaN)
|
if (this.Top is double.NaN || this.Left is double.NaN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var top = Convert.ToInt32(this.Top);
|
// Fixed broken window left/top coordinate for DPI Awareness Per Monitor
|
||||||
var left = Convert.ToInt32(this.Left);
|
var handle = new WindowInteropHelper(this).Handle;
|
||||||
|
var rect = WindowActionManager.GetWindowRect(handle);
|
||||||
WindowLocationChanged?.Invoke(this, new System.Drawing.Point(left + LEFT_ADJUSTMENT, top + TOP_ADJUSTMENT));
|
WindowLocationChanged?.Invoke(this, new System.Drawing.Point(rect.X + LEFT_ADJUSTMENT, rect.Y + TOP_ADJUSTMENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
|
private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
|
||||||
|
@ -45,5 +51,14 @@ namespace MSFSPopoutPanelManager.WpfApp
|
||||||
if (IsEditingPanelLocation && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
|
if (IsEditingPanelLocation && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
|
||||||
this.DragMove();
|
this.DragMove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
// Fixed broken window left/top coordinate for DPI Awareness Per Monitor
|
||||||
|
var handle = new WindowInteropHelper(this).Handle;
|
||||||
|
WindowActionManager.MoveWindow(handle, PanelType.WPFWindow, _xCoor, _yCoor, Convert.ToInt32(this.Width), Convert.ToInt32(this.Height));
|
||||||
|
|
||||||
|
WindowActionManager.ApplyAlwaysOnTop(handle, PanelType.WPFWindow, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,10 +240,11 @@
|
||||||
<TextBlock Style="{StaticResource TextBlockHeading}">Touch Down Touch Up Delay</TextBlock>
|
<TextBlock Style="{StaticResource TextBlockHeading}">Touch Down Touch Up Delay</TextBlock>
|
||||||
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
|
<Line Stretch="Fill" Stroke="Gray" X2="1"/>
|
||||||
<WrapPanel>
|
<WrapPanel>
|
||||||
<mah:NumericUpDown Width="100" Minimum="0" Maximum="300" Interval="50" FontSize="16" Height="32" Value="{Binding AppSettingData.AppSetting.TouchScreenSettings.MouseUpDownDelay, Mode=TwoWay}"></mah:NumericUpDown>
|
<mah:NumericUpDown Width="100" Minimum="0" Maximum="200" Interval="25" FontSize="16" Height="32" Value="{Binding AppSettingData.AppSetting.TouchScreenSettings.MouseUpDownDelay, Mode=TwoWay}"></mah:NumericUpDown>
|
||||||
<AccessText Margin="10,0,0,0" Width="490">Amount of time to delay the touch down and then touch up event when operating touch enabled panel. If your touch is not registering consistently, increasing this value will help.
|
<AccessText Margin="10,0,0,0" Width="490">Amount of time to delay the touch down and then touch up event when operating touch enabled panel. If your touch is not registering consistently, increasing this value will help.
|
||||||
For example on a directly connected touch monitor, zero or 50 milliseconds works really well. But when operating a panel on a tablet using software such as Spacedesk, since there is delay for touch signal sending back to Windows OS
|
For example on a direct connected touch monitor, 25 milliseconds work really well. But when operating a panel on a tablet using software such as Spacedesk, since there is delay for touch signal sending back to Windows OS
|
||||||
by the software, increasing this value to 50 or 100 will compensate for the delay. Please increase or decrease this value one step at time until you get a consistent touch response. (Default: 0 milliseconds)</AccessText>
|
by the software, increasing this value to 50 or higher may compensate for the delay. The speed of your PC or the type of panel on each plane could also be a factor for touch consistency.
|
||||||
|
You can experiment by increasing or decreasing this value one step at time until you get a consistent touch response. (Default: 25 milliseconds)</AccessText>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
|
|
|
@ -14,6 +14,13 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
|
||||||
{
|
{
|
||||||
_orchestrator = orchestrator;
|
_orchestrator = orchestrator;
|
||||||
|
|
||||||
|
AddProfileCommand = new DelegateCommand(OnAddProfile);
|
||||||
|
|
||||||
|
DeleteProfileCommand = new DelegateCommand(OnDeleteProfile, () => ProfileData.HasActiveProfile)
|
||||||
|
.ObservesProperty(() => ProfileData.ActiveProfile);
|
||||||
|
|
||||||
|
ChangeProfileCommand = new DelegateCommand<object>(OnChangeProfile);
|
||||||
|
|
||||||
AddProfileBindingCommand = new DelegateCommand(OnAddProfileBinding, () => ProfileData.HasActiveProfile && FlightSimData.HasCurrentMsfsPlaneTitle && ProfileData.IsAllowedAddAircraftBinding && FlightSimData.IsSimulatorStarted)
|
AddProfileBindingCommand = new DelegateCommand(OnAddProfileBinding, () => ProfileData.HasActiveProfile && FlightSimData.HasCurrentMsfsPlaneTitle && ProfileData.IsAllowedAddAircraftBinding && FlightSimData.IsSimulatorStarted)
|
||||||
.ObservesProperty(() => FlightSimData.HasCurrentMsfsPlaneTitle)
|
.ObservesProperty(() => FlightSimData.HasCurrentMsfsPlaneTitle)
|
||||||
.ObservesProperty(() => ProfileData.HasActiveProfile)
|
.ObservesProperty(() => ProfileData.HasActiveProfile)
|
||||||
|
@ -57,6 +64,12 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
|
||||||
TouchPanelBindingViewModel = new TouchPanelBindingViewModel(_orchestrator);
|
TouchPanelBindingViewModel = new TouchPanelBindingViewModel(_orchestrator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DelegateCommand AddProfileCommand { get; private set; }
|
||||||
|
|
||||||
|
public DelegateCommand DeleteProfileCommand { get; private set; }
|
||||||
|
|
||||||
|
public DelegateCommand<object> ChangeProfileCommand { get; private set; }
|
||||||
|
|
||||||
public DelegateCommand AddProfileBindingCommand { get; private set; }
|
public DelegateCommand AddProfileBindingCommand { get; private set; }
|
||||||
|
|
||||||
public DelegateCommand DeleteProfileBindingCommand { get; private set; }
|
public DelegateCommand DeleteProfileBindingCommand { get; private set; }
|
||||||
|
@ -81,12 +94,6 @@ namespace MSFSPopoutPanelManager.WpfApp.ViewModel
|
||||||
|
|
||||||
public PanelSourceOrchestrator PanelSource { get { return _orchestrator.PanelSource; } }
|
public PanelSourceOrchestrator PanelSource { get { return _orchestrator.PanelSource; } }
|
||||||
|
|
||||||
public DelegateCommand AddProfileCommand => new DelegateCommand(OnAddProfile);
|
|
||||||
|
|
||||||
public DelegateCommand DeleteProfileCommand => new DelegateCommand(OnDeleteProfile, () => ProfileData.HasActiveProfile).ObservesProperty(() => ProfileData.ActiveProfile);
|
|
||||||
|
|
||||||
public DelegateCommand<object> ChangeProfileCommand => new DelegateCommand<object>(OnChangeProfile);
|
|
||||||
|
|
||||||
public TouchPanelBindingViewModel TouchPanelBindingViewModel { get; private set; }
|
public TouchPanelBindingViewModel TouchPanelBindingViewModel { get; private set; }
|
||||||
|
|
||||||
public event EventHandler OpenTouchPanelBindingDialog;
|
public event EventHandler OpenTouchPanelBindingDialog;
|
||||||
|
|
|
@ -90,6 +90,9 @@
|
||||||
<ProjectReference Include="..\Shared\Shared.csproj">
|
<ProjectReference Include="..\Shared\Shared.csproj">
|
||||||
<SetTargetFramework>TargetFramework=net6.0</SetTargetFramework>
|
<SetTargetFramework>TargetFramework=net6.0</SetTargetFramework>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\WindowsAgent\WindowsAgent.csproj">
|
||||||
|
<SetTargetFramework>TargetFramework=net6.0</SetTargetFramework>
|
||||||
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="CopyItems" AfterTargets="ComputeFilesToPublish">
|
<Target Name="CopyItems" AfterTargets="ComputeFilesToPublish">
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<maximumFileSize value="25MB" />
|
<maximumFileSize value="25MB" />
|
||||||
<staticLogFileName value="true" />
|
<staticLogFileName value="true" />
|
||||||
<layout type="log4net.Layout.PatternLayout">
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
|
<conversionPattern value="%date - %message%newline" />
|
||||||
</layout>
|
</layout>
|
||||||
<filter type="log4net.Filter.LevelRangeFilter">
|
<filter type="log4net.Filter.LevelRangeFilter">
|
||||||
<levelMin value="ERROR" />
|
<levelMin value="ERROR" />
|
||||||
|
|
|
@ -1,52 +1,61 @@
|
||||||
Version 3.4.0.0
|
Version 3.4.0.0
|
||||||
|
|
||||||
This release is optional and it fixes some of the urgent application issues and made improvement
|
This release is optional. It added major new features and made performance improvements to the
|
||||||
to performance when using Auto Pop Out Panel. Since this update has major application
|
core of the application. I encouraged you to update to this latest version. You're still welcome
|
||||||
architecture changes and performance improvement, you're encouraged to update to this latest
|
to skip this update and continue to use older version of the applicaiton but they will no longer
|
||||||
version. You're still welcome to skip this update and continue to use older version of the
|
be supported going forward.
|
||||||
applicaiton but they will not be supported going forward.
|
|
||||||
|
|
||||||
************************************************************************************************
|
************************************************************************************************
|
||||||
IMPORTANT CHANGES
|
IMPORTANT
|
||||||
|
|
||||||
1. A major change to application architecture resulted in an update download of 60MB. The
|
1. In this update, your user data files including your application settings and profiles will
|
||||||
application now includes the updated .NET framework as part of the package and you will no
|
be upgraded and moved to new a folder location in user "Documents" foder. You can backup all
|
||||||
longer need to install the framework with a separate download.
|
files within subfolder "userdata" (appsettingdata.json, userprofiledata.json) before this
|
||||||
|
update occurs. To do so, plese close this update dialog using the X button in the upper
|
||||||
|
right corner (do not click update button) and exit the application. Then backup the folder
|
||||||
|
and relaunch the application. This update dialog will reappear and you can perform the update
|
||||||
|
at that time. After the data migration, all orphan files in the installation folder will be
|
||||||
|
deleted.
|
||||||
|
|
||||||
2. User data files for the application are being moved to new folder location. You can backup
|
2. A major change to application architecture resulted in an update download size of 60MB. The
|
||||||
the two user data files "appsettingdata.json" and "userprofiledata.json" in "userdata"
|
update now includes .NET framework 6.0 as part of the package and you will no longer need
|
||||||
folder in your installation directory before performing this update. To do that, you can
|
to install .NET framework with a separate download.
|
||||||
close this update dialog (do not click update) and exit the application. Backup the two files
|
|
||||||
and relaunch the application. This update dialog will reappear and you can select update a
|
3. New additional community plugin installation is required to use Auto Pop Out Panel feature.
|
||||||
gain.
|
Please see information below regarding Auto Pop Out Panel improvement for installation
|
||||||
|
instruciton.
|
||||||
|
|
||||||
3. New additional community plugin installation is required to to use Auto Pop Out Panel feature.
|
|
||||||
Please see information below for installation instruciton.
|
|
||||||
************************************************************************************************
|
************************************************************************************************
|
||||||
|
|
||||||
Change Log:
|
Change Log:
|
||||||
|
|
||||||
* Revamped how Auto Pop Out Panel works. The application no longer tries to hunt and click
|
|
||||||
"Ready to Fly" button by using "Ready to Fly Button Skipper" plugin I created. This community
|
|
||||||
plugin is included in the installation folder and is required for Auto Pop Out Panel to work.
|
|
||||||
Please copy the folder "zzz-ready-to-fly-button-skipper" in subfolder "community" in your
|
|
||||||
installation location into your MSFS community folder. (Issue #29)
|
|
||||||
https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/29.
|
|
||||||
|
|
||||||
* Changed where user data files are stored. Previously, the files are saved in subfolder
|
* Changed where user data files are stored. Previously, the files are saved in subfolder
|
||||||
"userdata" in your installation directory. Now they're moved to your Windows "Documents"
|
"userdata" in your installation folder. Now they're moved to your Windows "Documents"
|
||||||
folder under "MSFS Pop Out Panel Manager" for easy access. When you first start the
|
folder under "MSFS Pop Out Panel Manager" for easy access. When you first start the
|
||||||
application, a data migration step will occur and your user data files will be moved to this
|
application, a data migration step will occur and your user data files will be upgraded and
|
||||||
new folder location. This change will allow you to install Pop Out Manager to any folder of
|
moved to this new folder location. This change will allow you to install Pop Out Manager to
|
||||||
your choice in your machine since the application no longer requires write access to your
|
folder of your choice on your machine since the application no longer requires write access
|
||||||
installation folder.
|
to your installation folder.
|
||||||
|
|
||||||
* Upgraded the application to use latest .NET 6.0 framework. You'll notice after user data
|
* Upgraded the application to use latest .NET 6.0 framework. You'll notice after user data
|
||||||
migration, your installation folder will have only one executable file left. Please don't
|
migration, your installation folder will have only one executable file left. Please don't
|
||||||
be alarmed when this file is 67MB since all .NET dependencies and application files
|
be alarmed when this file is 60MB since all .NET dependencies and application files
|
||||||
are now packaged into a single file. You no longer need to manually install .NET framework
|
are now packaged into a single file. You no longer need to manually install .NET framework
|
||||||
to run this application.
|
to run this application.
|
||||||
|
|
||||||
|
* Major improvement in how Auto Pop Out Panel works. The application no longer tries to hunt
|
||||||
|
and click "Ready to Fly" button to continue pop out process by using "Ready to Fly Button
|
||||||
|
Skipper" plugin I created. This plugin is included in the installation folder and is
|
||||||
|
required for Auto Pop Out Panel to work. Please copy the folder
|
||||||
|
"zzz-ready-to-fly-button-skipper" into your MSFS community folder.
|
||||||
|
|
||||||
|
* Major improvement in support for touch enabled panel. Using SU10 Beta v1.27.11, touch panel
|
||||||
|
capabilities has greatly improved including new support for touch down and touch up events.
|
||||||
|
This update enables smooth touch operations (click and drag) for panel running on connected
|
||||||
|
touch monitor or on tablet using software tool such as SpaceDesk. There is a new preference
|
||||||
|
settings section for touch operation adjustments. Please see README.md for current known
|
||||||
|
issue and workaround for touch operations.
|
||||||
|
|
||||||
* Updated how the application detects Sim Start and Sim Stop to perform Auto Pop Out. It now
|
* Updated how the application detects Sim Start and Sim Stop to perform Auto Pop Out. It now
|
||||||
uses the much more reliable camera state SimConnect variable for detection.
|
uses the much more reliable camera state SimConnect variable for detection.
|
||||||
|
|
||||||
|
@ -64,18 +73,13 @@ Change Log:
|
||||||
* Added feature to change message dialog on screen duration. You can disable on screen message
|
* Added feature to change message dialog on screen duration. You can disable on screen message
|
||||||
by setting the duration value to zero.
|
by setting the duration value to zero.
|
||||||
|
|
||||||
* (New for SU10+) Added additional keystroke option to pop out panel Ctrl + Right Ctrl + Left
|
* (New for SU10) Added additional keystroke option to pop out panel Ctrl + Right Ctrl + Left
|
||||||
click instead of just Right-Alt Left click. This is designed for users that have a keyboard
|
click instead of just Right-Alt + Left click. This is designed for users that have a keyboard
|
||||||
without the Right-Alt key. To use this feature, please map (CTRL + RIGHT CTRL) in
|
without the Right-Alt key. To use this feature, please map (CTRL + RIGHT CTRL) in
|
||||||
Control Options => Miscellaneous => New UI Window Mode in the game.
|
Control Options => Miscellaneous => New UI Window Mode in the game.
|
||||||
|
|
||||||
* Changed how auto pop out with bound livery works. When you start or restart Pop Out Manager
|
* Cleaned up UI and improved UI guidance for user by enabling/disabling buttons and actions
|
||||||
and if you're already in a flight with a bound profile, Pop Out Manager will automatic re-pop
|
throughout the pop out process.
|
||||||
out all panels for you to sync up all settings based on your cold start or hot start
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
* Cleaned up UI and improved UI guidance for user by enable/disabling buttons and actions as
|
|
||||||
needed.
|
|
||||||
|
|
||||||
* Lots of the code is rewritten from the ground up for better performance and stability. It
|
* Lots of the code is rewritten from the ground up for better performance and stability. It
|
||||||
also prepares the code architecture for v4.0 new features. Please be patient as I continue
|
also prepares the code architecture for v4.0 new features. Please be patient as I continue
|
||||||
|
@ -85,5 +89,5 @@ Change Log:
|
||||||
Known Issues:
|
Known Issues:
|
||||||
|
|
||||||
* In SU 10 beta (1.27.11.0), when using Touch Enabled and Full Screen Mode simultaneously for
|
* In SU 10 beta (1.27.11.0), when using Touch Enabled and Full Screen Mode simultaneously for
|
||||||
a panel, touch event may not register correctly. So if you want to use touch feature, please
|
a panel, touch event may not register correctly. Please run the panel in regular pop out
|
||||||
run the panel in regular pop out window mode instead of full screen.
|
window with "Hide toolbar" option instead of full screen mode.
|
Loading…
Reference in a new issue