mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Refine PanelBinder implementation and add documentation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
This commit is contained in:
67
PANEL_BINDING_FEATURE.md
Normal file
67
PANEL_BINDING_FEATURE.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# Panel Binding Feature
|
||||
|
||||
## Overview
|
||||
This feature allows users to bind the Connections and Config panels together when they are in auto-hide state (collapsed). When one panel is clicked to expand, the other panel will automatically expand as well.
|
||||
|
||||
## How It Works
|
||||
|
||||
### User Workflow
|
||||
1. The user collapses both the Connections and Config panels by clicking the auto-hide pin icon (they become auto-hidden tabs on the left side)
|
||||
2. The user enables the "Bind Connections and Config panels together when auto-hidden" option in Tools > Options > Tabs & Panels
|
||||
3. When the user clicks on the Connections tab to expand it, the Config panel will automatically expand as well
|
||||
4. Similarly, when clicking on the Config tab, the Connections panel will expand
|
||||
5. Both panels stay expanded together, allowing the user to view connection settings easily
|
||||
6. When the user clicks away from the panels, both collapse back to auto-hide
|
||||
|
||||
### Benefits
|
||||
- Reduces the number of clicks needed to view and edit connection settings
|
||||
- Panels work together seamlessly when in auto-hide mode
|
||||
- User can still use panels independently when they are pinned (docked)
|
||||
- Configurable option allows users to enable/disable as needed
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### Files Modified
|
||||
1. **Properties/OptionsTabsPanelsPage.settings** - Added `BindConnectionsAndConfigPanels` setting (default: false)
|
||||
2. **Properties/OptionsTabsPanelsPage.Designer.cs** - Added property accessor for the new setting
|
||||
3. **UI/Panels/PanelBinder.cs** - NEW - Core logic for binding panel visibility
|
||||
4. **UI/Forms/OptionsPages/TabsPanelsPage.cs** - Added checkbox and load/save logic
|
||||
5. **UI/Forms/OptionsPages/TabsPanelsPage.Designer.cs** - Added UI checkbox control
|
||||
6. **UI/Forms/frmMain.cs** - Initialize PanelBinder after panels are loaded
|
||||
7. **Config/Settings/Registry/OptRegistryTabsPanelsPage.cs** - Added registry support for enterprise deployment
|
||||
|
||||
### Key Classes
|
||||
|
||||
#### PanelBinder
|
||||
- Singleton class that manages the binding between panels
|
||||
- Subscribes to VisibleChanged events on both TreeForm (Connections) and ConfigForm (Config)
|
||||
- Only acts when:
|
||||
- The binding setting is enabled
|
||||
- Both panels are in auto-hide state
|
||||
- One panel becomes visible (user clicked its tab)
|
||||
- Uses a `_isProcessing` flag to prevent recursive event triggers
|
||||
- Calls `Activate()` on the other panel to show it
|
||||
|
||||
### How to Test
|
||||
|
||||
1. Build and run mRemoteNG
|
||||
2. Go to Tools > Options > Tabs & Panels
|
||||
3. Verify the new checkbox "Bind Connections and Config panels together when auto-hidden" is present
|
||||
4. Create a test connection in the Connections panel
|
||||
5. Auto-hide both the Connections and Config panels (click the pin icon on each)
|
||||
6. Both panels should now appear as collapsed tabs on the left side
|
||||
7. Enable the binding option in Options
|
||||
8. Click on the Connections tab - both Connections and Config should expand
|
||||
9. Click away from the panels - both should collapse
|
||||
10. Click on the Config tab - both panels should expand again
|
||||
11. Disable the binding option
|
||||
12. Verify panels now work independently when clicking their tabs
|
||||
13. Pin one or both panels (dock them)
|
||||
14. Verify the binding only works when BOTH panels are in auto-hide state
|
||||
|
||||
## Registry Support
|
||||
|
||||
Administrators can configure this setting via registry for enterprise deployment:
|
||||
- Key: `HKEY_LOCAL_MACHINE\SOFTWARE\mRemoteNG\TabsAndPanels` or `HKEY_CURRENT_USER\SOFTWARE\mRemoteNG\TabsAndPanels`
|
||||
- Value: `BindConnectionsAndConfigPanels` (DWORD)
|
||||
- 0 = Disabled, 1 = Enabled
|
||||
@@ -29,22 +29,21 @@ namespace mRemoteNG.UI.Panels
|
||||
if (Windows.TreeForm != null)
|
||||
{
|
||||
Windows.TreeForm.VisibleChanged += OnTreeFormVisibleChanged;
|
||||
Windows.TreeForm.DockStateChanged += OnTreeFormDockStateChanged;
|
||||
}
|
||||
|
||||
if (Windows.ConfigForm != null)
|
||||
{
|
||||
Windows.ConfigForm.VisibleChanged += OnConfigFormVisibleChanged;
|
||||
Windows.ConfigForm.DockStateChanged += OnConfigFormDockStateChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTreeFormVisibleChanged(object sender, EventArgs e)
|
||||
{
|
||||
// Only act when binding is enabled and not already processing
|
||||
if (!OptionsTabsPanelsPage.Default.BindConnectionsAndConfigPanels || _isProcessing)
|
||||
return;
|
||||
|
||||
// Only act when the panel becomes visible
|
||||
// Only act when the panel becomes visible (expanded from auto-hide)
|
||||
if (!Windows.TreeForm.Visible)
|
||||
return;
|
||||
|
||||
@@ -55,6 +54,7 @@ namespace mRemoteNG.UI.Panels
|
||||
_isProcessing = true;
|
||||
try
|
||||
{
|
||||
// Show the Config panel by activating it
|
||||
ShowPanel(Windows.ConfigForm);
|
||||
}
|
||||
finally
|
||||
@@ -65,10 +65,11 @@ namespace mRemoteNG.UI.Panels
|
||||
|
||||
private void OnConfigFormVisibleChanged(object sender, EventArgs e)
|
||||
{
|
||||
// Only act when binding is enabled and not already processing
|
||||
if (!OptionsTabsPanelsPage.Default.BindConnectionsAndConfigPanels || _isProcessing)
|
||||
return;
|
||||
|
||||
// Only act when the panel becomes visible
|
||||
// Only act when the panel becomes visible (expanded from auto-hide)
|
||||
if (!Windows.ConfigForm.Visible)
|
||||
return;
|
||||
|
||||
@@ -79,6 +80,7 @@ namespace mRemoteNG.UI.Panels
|
||||
_isProcessing = true;
|
||||
try
|
||||
{
|
||||
// Show the Connections panel by activating it
|
||||
ShowPanel(Windows.TreeForm);
|
||||
}
|
||||
finally
|
||||
@@ -87,18 +89,6 @@ namespace mRemoteNG.UI.Panels
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTreeFormDockStateChanged(object sender, EventArgs e)
|
||||
{
|
||||
// This event helps us track when panels transition to/from auto-hide
|
||||
// We don't need to take action here, just be aware of state changes
|
||||
}
|
||||
|
||||
private void OnConfigFormDockStateChanged(object sender, EventArgs e)
|
||||
{
|
||||
// This event helps us track when panels transition to/from auto-hide
|
||||
// We don't need to take action here, just be aware of state changes
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a panel is in auto-hide state
|
||||
/// </summary>
|
||||
@@ -120,6 +110,7 @@ namespace mRemoteNG.UI.Panels
|
||||
{
|
||||
if (panel != null && IsPanelAutoHidden(panel))
|
||||
{
|
||||
// Activate the panel to show it from auto-hide
|
||||
panel.Activate();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user