# 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
