SXXXXXXX_PyMsc/pymsc/gui/docking/README.md

366 lines
9.7 KiB
Markdown

# ARTOS Docking System
## Tkinter-based Modular GUI Framework
**Status:** ✅ First iteration complete
**Created:** 2026-01-09
**Version:** 0.1.0
---
## Overview
Custom docking system for ARTOS built with Tkinter, providing a modular GUI where each subsystem (MCS, Navigation, IRST, etc.) lives in its own dockable panel.
### Key Features
- ✅ Dockable panels with title bars
- ✅ Minimize/maximize/close controls
- ✅ Resizable splits (PanedWindow)
- ✅ Save/load workspace layouts (JSON)
- ✅ Zero external dependencies (stdlib only)
- ✅ Dark theme using ttk 'clam' style
---
## Architecture
```
pymsc/gui/docking/
├── __init__.py # Package exports
├── dock_frame.py # Base class for dockable panels
├── workspace_manager.py # Layout and lifecycle management
├── mcs_dock.py # MCS module dock (full implementation)
├── placeholder_dock.py # Generic placeholder for future modules
└── main_docking_window.py # Main application window
```
### Class Hierarchy
```
DockFrame (base)
├── title_bar (Frame)
│ ├── title_label
│ └── buttons (minimize, close)
└── content_frame (to be populated by subclasses)
MCSDock (DockFrame)
└── content_frame
└── Notebook (tabs)
├── Page01 (Command)
├── Page02 (Radar Settings)
├── ...
└── Page07 (Advanced)
PlaceholderDock (DockFrame)
└── content_frame
└── Label ("Not yet implemented")
```
---
## Usage
### Quick Start
```powershell
# Activate venv
.venv\Scripts\Activate.ps1
# Launch docking GUI
python scripts\launch_docking_gui.py
```
### Layout Structure
```
┌─────────────┬──────────────────────────┐
│ │ Right Top │
│ │ ┌────────────────────┐ │
│ MCS │ │ Navigation │ │
│ Dock │ │ (Placeholder) │ │
│ │ └────────────────────┘ │
│ │ ┌────────────────────┐ │
│ │ │ IRST Module │ │
│ │ │ (Placeholder) │ │
│ │ └────────────────────┘ │
│ ├──────────────────────────┤
│ │ Right Bottom │
│ │ ┌────────────────────┐ │
│ │ │ Logger & Status │ │
│ │ │ (Placeholder) │ │
│ │ └────────────────────┘ │
└─────────────┴──────────────────────────┘
```
---
## Creating a New Dock
### Step 1: Subclass DockFrame
```python
from pymsc.gui.docking import DockFrame
import tkinter as tk
from tkinter import ttk
class MyModuleDock(DockFrame):
def __init__(self, parent, my_data, **kwargs):
self.my_data = my_data
super().__init__(parent, title="My Module", **kwargs)
def populate_content(self):
"""Called after __init__ to populate content_frame."""
label = ttk.Label(self.content_frame, text="My module content")
label.pack()
```
### Step 2: Register in MainDockingWindow
```python
# In main_docking_window.py -> _create_docks()
my_dock = MyModuleDock(
self.workspace.left_container,
my_data=some_data
)
self.workspace.add_dock('my_module', my_dock, position='left')
```
### Step 3: Add View menu entry
```python
# In _create_menu()
view_menu.add_command(
label="Toggle My Module",
command=lambda: self.workspace.toggle_dock_visibility('my_module')
)
```
---
## Configuration
### Workspace Layouts
Layouts are saved in `layouts/` directory as JSON files:
```json
{
"main_sash_position": [400, 0],
"right_sash_position": [0, 600],
"docks": {
"mcs": {
"visible": true,
"minimized": false
},
"nav": {
"visible": true,
"minimized": true
}
}
}
```
### Saving/Loading
- **Save:** File → Save Layout
- **Load:** File → Load Layout
- **Default:** `layouts/user_layout.json`
---
## API Reference
### DockFrame
Base class for all dockable panels.
**Constructor:**
```python
DockFrame(parent, title, on_close=None, closable=True, **kwargs)
```
**Methods:**
- `populate_content()` - Override to add widgets to `content_frame`
- `minimize()` - Hide content, keep title bar
- `restore()` - Restore from minimized state
- `close()` - Hide entire dock
- `show()` - Show dock if hidden
- `set_title(new_title)` - Update dock title
**Attributes:**
- `content_frame` - ttk.Frame for dock content
- `is_minimized` - bool
- `is_visible` - bool
---
### WorkspaceManager
Manages dock lifecycle and layout.
**Constructor:**
```python
WorkspaceManager(root, layouts_dir="layouts")
```
**Methods:**
- `add_dock(dock_id, dock, position)` - Register and place dock
- Positions: `'left'`, `'right_top'`, `'right_bottom'`
- `get_dock(dock_id)` - Retrieve dock by ID
- `remove_dock(dock_id)` - Unregister dock
- `toggle_dock_visibility(dock_id)` - Show/hide dock
- `save_layout(name)` - Save layout to JSON
- `load_layout(name)` - Load layout from JSON
**Attributes:**
- `docks` - Dict[str, DockFrame]
- `main_pane` - tk.PanedWindow (horizontal split)
- `right_pane` - tk.PanedWindow (vertical split)
---
## Current Modules
| Dock ID | Title | Status | Position |
|---------|-------|--------|----------|
| `mcs` | Mission Control System | ✅ Full implementation | Left |
| `nav` | Navigation System | 🔲 Placeholder | Right Top |
| `irst` | IRST Module | 🔲 Placeholder | Right Top |
| `logger` | System Logger & Status | 🔲 Placeholder | Right Bottom |
---
## Planned Modules (Future Phases)
### Phase 3: Navigation & Algorithms
- **Navigation Dock:** Real-time navigation algorithms and data processing
- **Trajectory Dock:** Track prediction and analysis
### Phase 4: Video & IRST
- **Video Dock:** Camera feeds with PIL/Pillow rendering
- **IRST Dock:** Infrared search and track visualization
### Phase 5: Test Execution
- **Test Control Dock:** Script selection and execution
- **Report Viewer Dock:** Real-time test results and logs
---
## Theming
### Current Theme
The GUI uses Tkinter's native 'clam' theme with custom dark color scheme:
- Background: Dark blue-grey (#2b3e50)
- Text: Light grey (#ecf0f1)
- Accent: Blue (#3498db)
### Changing Colors
Edit [main_docking_window.py](main_docking_window.py) in `__init__()`:
```python
# Dark theme configuration
bg_dark = '#2b3e50' # Main background
bg_darker = '#1a252f' # Darker backgrounds
fg_light = '#ecf0f1' # Text color
accent = '#3498db' # Accent color (buttons)
```
### Alternative Themes
You can use other ttk themes by changing:
```python
style.theme_use('clam') # Options: clam, alt, default, classic
```
---
## Known Issues & Limitations
### Current Limitations
- ⚠️ Docks cannot be dragged between positions (fixed slots)
- ⚠️ No floating/undocked panels
- ⚠️ Sash positions are absolute pixels (not percentages)
### Future Improvements
- [ ] Drag-and-drop dock repositioning
- [ ] Floating window support
- [ ] Tabbed docking (multiple docks in same slot)
- [ ] Dock state persistence per user
- [ ] Keyboard shortcuts for dock operations
---
## Testing
### Manual Testing
1. Launch GUI: `python scripts\launch_docking_gui.py`
2. Verify MCS tabs load (Page 01-07)
3. Test minimize buttons on each dock
4. Test close/restore via View menu
5. Resize splitters (drag sash)
6. Save layout (File → Save Layout)
7. Close and relaunch
8. Load layout (File → Load Layout)
### Unit Tests (TODO)
```powershell
pytest tests/test_docking_system.py
```
---
## Migration Guide
### From old main_window.py to docking system
**Old approach:**
```python
# All tabs in one Notebook
notebook = ttk.Notebook(root)
page01 = Page01(notebook, bus_module)
notebook.add(page01, text="Command")
```
**New approach:**
```python
# MCS dock with tabs
mcs_dock = MCSDock(parent, bus_module)
workspace.add_dock('mcs', mcs_dock, position='left')
```
**Benefits:**
- Independent refresh loops per dock
- Each module can be hidden/minimized independently
- Easier parallel development (one developer per dock)
- Better separation of concerns
---
## Contributing
### Adding a New Dock Module
1. Create `pymsc/gui/docking/my_module_dock.py`
2. Subclass `DockFrame`
3. Implement `populate_content()`
4. Register in `MainDockingWindow._create_docks()`
5. Add View menu toggle
6. Update this README with dock info
### Code Style
- Follow PEP 8
- Type hints for public methods
- Docstrings for classes and public methods
- Comments for complex logic
Tkinter ttk Styling](https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.Style
---
## References
- [Tkinter PanedWindow](https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.PanedWindow)
- [ttkbootstrap Themes](https://ttkbootstrap.readthedocs.io/en/latest/themes/)
- [ARTOS Architecture Decisions](../doc/ARTOS_Architecture_Decisions.md)
---
## Changelog
### v0.1.0 - 2026-01-09
- ✅ Initial docking system implementation
- ✅ DockFrame base class with minimize/close
- ✅ WorkspaceManager with PanedWindow layouts
- ✅ MCSDock with Control and Mission pages
- ✅ PlaceholderDock for future modules
- ✅ MainDockingWindow with menu system
- ✅ Save/load layout functionality
- ✅ Dark theme using ttk 'clam' style (zero external dependencies)
---
## License
© 2025 - Internal project