# Модуль редактирования диаграмм - Детальная спецификация

## Назначение

**DiagramEditorWindow** - окно для работы с диаграммами из книг Go:
- Просмотр диаграмм (позиций из книги)
- Редактирование вариантов
- Решение задач
- Экспорт в SGF
- Импорт из DGR

**Не является** полноценным редактором задач - это инструмент **читателя** для работы с диаграммами книги.

---

## Возможности редактирования

### 1. Базовые операции с вариантами

#### Создание нового варианта
```python
def create_new_variant(self):
    """
    Создать новый вариант.
    
    Диалог:
    - Выбор цвета первого хода (Black/White)
    - Номер первого хода (1-999)
    - Название варианта (опционально)
    """
```

**UI**: Кнопка "New Variant" или Ctrl+N

#### Навигация по вариантам
- Стрелки ←→ : переход между ходами
- Стрелки ↑↓ : переход между вариантами
- Home/End : первый/последний ход
- PageUp/PageDown : предыдущий/следующий вариант

---

### 2. Ходы с номерами

#### Автонумерация
```python
def auto_number_moves(self, enabled: bool = True):
    """
    Включить/выключить автонумерацию ходов.
    
    Если enabled=True:
    - Каждый новый ход автоматически получает номер
    - Номер = предыдущий_номер + 1
    - Чередование цветов (B→W→B...)
    
    Если enabled=False:
    - Ходы без номеров
    - Только камни (позиция)
    """
```

**UI**: Checkbox "Auto-number moves" или Ctrl+#

#### Ручная установка номера
```python
def set_move_number(self, move_index: int, number: int):
    """
    Установить номер хода вручную.
    
    Args:
        move_index: Индекс хода в варианте
        number: Номер для отображения
    """
```

**UI**: Правый клик на ходе → "Set number..."

---

### 3. Автобуквы (автоматические метки)

#### Автоматическая расстановка букв
```python
def auto_label_stones(self, enabled: bool = True):
    """
    Включить/выключить автоматические буквы.
    
    Если enabled=True:
    - Первый камень = 'A'
    - Второй камень = 'B'
    - И так далее (A-Z, затем a-z)
    
    Используется для:
    - Обозначения последовательности в позиции
    - Маркировки важных точек
    """
```

**UI**: Checkbox "Auto-labels" или Ctrl+L

#### Правила автобукв
```python
LABEL_SEQUENCE = [
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
]
```

---

### 4. Виды отображения

#### Режим "1 вид"
```python
def show_single_variant(self):
    """
    Показать только текущий вариант.
    
    - Доска показывает только ходы текущего варианта
    - Другие варианты скрыты
    - Удобно для концентрации на одной линии
    """
```

**UI**: Radio button "Single variant" или F5

#### Режим "Все варианты"
```python
def show_all_variants(self):
    """
    Показать все варианты одновременно.
    
    - Доска показывает все ходы всех вариантов
    - Текущий вариант выделен (более яркий)
    - Остальные варианты затемнены (прозрачность 50%)
    - Удобно для сравнения вариантов
    """
```

**UI**: Radio button "All variants" или F6

#### Режим "Дерево вариантов"
```python
def show_variant_tree(self):
    """
    Показать дерево вариантов (опционально).
    
    - Боковая панель с деревом вариантов
    - Клик на узле → переход к этому ходу
    - Визуализация структуры вариантов
    """
```

**UI**: Toggle panel "Variant tree" или F7

---

## Экспорт и импорт

### Экспорт в SGF

```python
def export_to_sgf(self, filepath: str):
    """
    Экспорт диаграммы в SGF файл.
    
    Формат SGF:
    (;GM[1]FF[4]SZ[19]...
      ;B[pd]
      ;W[dd]
      (;B[pq]  # variant 1
       ;W[dp])
      (;B[qp]  # variant 2
       ;W[dq])
    )
    
    Args:
        filepath: Путь для сохранения .sgf файла
    """
```

**Что экспортируется**:
- ✅ Размер доски (W x H)
- ✅ Все варианты (древовидная структура)
- ✅ Номера ходов
- ✅ Метки (буквы, символы)
- ✅ Комментарии к ходам
- ✅ Название диаграммы (в корневом узле)

**Что НЕ экспортируется**:
- ❌ Информация о странице книги
- ❌ Связь с БД (Dia_ID, Book_ID)
- ❌ Координаты на странице PDF

**UI**: File → Export SGF... или Ctrl+S

---

### Импорт из DGR

```python
def import_from_dgr(self, filepath: str):
    """
    Импорт диаграммы из формата DGR.
    
    Формат DGR (Delphi Go Record):
    - Бинарный формат
    - Структура: заголовок + позиция + варианты
    - Используется в старых программах Go
    
    Args:
        filepath: Путь к .dgr файлу
    """
```

**Что импортируется**:
- ✅ Позиция (камни на доске)
- ✅ Варианты (если есть)
- ✅ Размер доски
- ✅ Метки

**Особенности**:
- DGR не содержит номеров ходов → **автонумерация**
- DGR может содержать только позицию → **создать вариант**

**UI**: File → Import DGR... или Ctrl+O

---

## Взаимодействие с БД

### Загрузка диаграммы из БД

```python
def load_diagram_from_db(self, book_id: int, dia_id: int):
    """
    Загрузить диаграмму из базы данных.
    
    Читает из таблицы Book_Dias:
    - SGF (основная позиция и варианты)
    - Dia_Name (название)
    - W, H (размер доски)
    - Symmetry (симметрия, если есть)
    
    Парсит SGF и строит дерево вариантов.
    """
```

### Сохранение в БД (отложено)

```python
def save_diagram_to_db(self, book_id: int, dia_id: int):
    """
    Сохранить изменения в БД.
    
    **ПОКА НЕ РЕАЛИЗОВАНО**
    
    Будущая функциональность:
    - Обновление SGF в Book_Dias
    - Версионирование изменений
    - История редактирования
    """
```

**Причины отложить**:
- Нужно продумать права доступа (кто может редактировать?)
- Версионирование (как хранить историю изменений?)
- Конфликты (что если несколько пользователей редактируют?)

---

## Режимы работы

### 1. Режим просмотра (View Mode)

**Цель**: Изучение диаграммы без изменений

**Возможности**:
- ✅ Навигация по вариантам
- ✅ Просмотр всех ходов
- ✅ Переключение видов (1 вид / все)
- ❌ Добавление новых ходов
- ❌ Удаление ходов
- ❌ Изменение меток

**UI**: По умолчанию при открытии диаграммы

---

### 2. Режим редактирования (Edit Mode)

**Цель**: Создание вариантов и изменение диаграммы

**Возможности**:
- ✅ Все из View Mode
- ✅ Добавление новых ходов (клик на доске)
- ✅ Создание новых вариантов
- ✅ Удаление ходов (Del)
- ✅ Изменение меток и номеров
- ✅ Автонумерация и автобуквы

**UI**: Кнопка "Edit" или Ctrl+E для переключения

---

### 3. Режим решения (Solve Mode)

**Цель**: Решение задачи (если диаграмма - задача)

**Особенности**:
- ✅ Доска с начальной позицией
- ✅ Пользователь делает ходы
- ✅ Сравнение с правильным решением
- ✅ Подсказки (опционально)
- ✅ Статистика попыток

**UI**: Кнопка "Solve" (если диаграмма помечена как задача)

**Будущая функция**: Сохранение попыток в БД (User_Attempts)

---

## UI компоненты

### Главное окно DiagramEditorWindow

```
┌────────────────────────────────────────────────────────────┐
│ File  Edit  View  Tools  Help                             │
├────────────────────────────────────────────────────────────┤
│ ⬅️ ➡️ 🏠 🔚 │ New Variant │ [x] Auto-number  [x] Auto-labels│
├─────────────────────┬──────────────────────────────────────┤
│                     │  Diagram: "Dia 45 - Tesuji"         │
│                     │  Size: 19x19                         │
│   Go Board          │  Current variant: Main line          │
│   (19x19)           │  Move: 5 of 12                       │
│                     │                                      │
│                     │  ○ Single variant                    │
│                     │  ○ All variants                      │
│                     │                                      │
│                     │  Variants:                           │
│                     │  ├─ Main line (12 moves)            │
│                     │  ├─ Variation A (8 moves)           │
│                     │  └─ Variation B (5 moves)           │
├─────────────────────┴──────────────────────────────────────┤
│ Status: Edit mode │ File: diagram_45.sgf │ Modified: No  │
└────────────────────────────────────────────────────────────┘
```

### Панель инструментов

```python
toolbar = [
    ('←', 'Previous move', self.previous_move),
    ('→', 'Next move', self.next_move),
    ('⏮', 'First move', self.first_move),
    ('⏭', 'Last move', self.last_move),
    '|',
    ('New Variant', 'Create new variant', self.new_variant),
    ('Delete', 'Delete current move', self.delete_move),
    '|',
    ('Auto #', 'Toggle auto-numbering', self.toggle_auto_number),
    ('Auto ABC', 'Toggle auto-labels', self.toggle_auto_labels),
    '|',
    ('Export SGF', 'Export to SGF', self.export_sgf),
    ('Import DGR', 'Import from DGR', self.import_dgr),
]
```

---

## Горячие клавиши

### Навигация
- `←` / `→` : Предыдущий / следующий ход
- `↑` / `↓` : Предыдущий / следующий вариант
- `Home` / `End` : Первый / последний ход
- `PgUp` / `PgDn` : На уровень выше / ниже в дереве

### Редактирование
- `Ctrl+N` : Новый вариант
- `Del` : Удалить текущий ход
- `Ctrl+Z` : Отменить
- `Ctrl+Y` : Повторить
- `Ctrl+#` : Переключить автонумерацию
- `Ctrl+L` : Переключить автобуквы

### Виды
- `F5` : Режим "1 вид"
- `F6` : Режим "Все варианты"
- `F7` : Показать/скрыть дерево вариантов

### Файлы
- `Ctrl+S` : Экспорт SGF
- `Ctrl+O` : Импорт DGR
- `Ctrl+E` : Переключить режим редактирования
- `Esc` : Закрыть окно

---

## Отличия от InputProblemsWindow

### Что оставляем из InputProblemsWindow

✅ **Базовая структура**:
- GoBoard widget
- Variant tree structure
- Move navigation
- SGF parsing (для чтения из БД)

✅ **Редактирование**:
- Создание вариантов
- Добавление ходов
- Автонумерация
- Автобуквы

✅ **Экспорт**:
- SGF экспорт (полная функция)

✅ **Импорт**:
- DGR импорт (через DGR_converter)

---

### Что убираем из InputProblemsWindow

❌ **Чтение SGF файлов**:
- Нет кнопки "Load SGF"
- Нет импорта SGF через меню
- Только чтение из БД

❌ **Сохранение в БД** (пока):
- Нет кнопки "Save to DB"
- Нет автосохранения
- Только локальное редактирование

❌ **Batch операции**:
- Нет массовой обработки
- Нет пакетного экспорта/импорта

❌ **Сложные настройки**:
- Упрощенное меню настроек
- Только основные опции

---

## Пример использования

### Scenario 1: Просмотр диаграммы

```python
# Пользователь читает текст книги
main_window = MainReaderWindow()
main_window.show_page(book_id=1, page=45)

# Кликает на @DIAGRAM(12):Tesuji@
diagram_editor = DiagramEditorWindow(master=main_window)
diagram_editor.load_diagram_from_db(book_id=1, dia_id=12)

# Режим просмотра (по умолчанию)
diagram_editor.show_single_variant()  # Показать только главную линию
diagram_editor.next_move()  # Перейти к следующему ходу
```

### Scenario 2: Создание варианта

```python
# Пользователь хочет добавить свой вариант
diagram_editor.enter_edit_mode()  # Ctrl+E

# Создать новый вариант
diagram_editor.create_new_variant()
# Диалог: Black, move 5, name "My attempt"

# Включить автонумерацию
diagram_editor.toggle_auto_number(True)

# Сделать ходы (клики на доске)
diagram_editor.place_stone(15, 3)  # Ход 5
diagram_editor.place_stone(16, 4)  # Ход 6
```

### Scenario 3: Экспорт в SGF

```python
# Сохранить диаграмму с вариантами
diagram_editor.export_to_sgf("my_analysis.sgf")

# SGF файл содержит:
# - Исходную позицию
# - Главную линию
# - Пользовательский вариант "My attempt"
```

---

## Следующие шаги

1. Создать базовую структуру `DiagramEditorWindow`
2. Портировать GoBoard и variant management
3. Реализовать автонумерацию и автобуквы
4. Добавить экспорт SGF
5. Добавить импорт DGR
6. Создать UI с панелями и кнопками
7. Тестирование с реальными диаграммами

**Начать с какого пункта?**
