## Render

- [x] сделать офигенно быстрый рендер
- [x] parseSVGToCommands
  - [x] возвращать массив комманд, а в Cell парсить их в Path2D, это пригодится при сохранении сцены и ячейки, а так же для создания своих элементов
  - [ ] обработать все SVG элементы
  - [ ] обработать radialGradient
  - [ ] gradientTransform
  - [ ] gradient stop-opacity
  - [ ] linear gradient кажется вверх ногами
  - [ ] getTransform: парсить все transform, возвращать DOMMatrix. Функцию можно взять из джойнта

- [x] обработать devicePixelRatio

## Техдолг

- [x] выдернуть из джойнта функции которые тут используются (V и g например)

- [x] заменить EventEmitter на свой

- [x] Типы для ивентов! Привести к единообразию

- [x] везде разобраться какие поля приватные (см #). Если надо - написать сеттеры и геттеры

## Работа с текстом

- [x] раскрасить фон текста

## Виртуализация

- [ ] учитывать реальные размеры элементов
- [x] сделать проверку на пересечение коннектора с вьюпортом
- [x] учесть bbox текста

## CASHING

- [x] на зум сделать отдельный рендер с debounce, показывать старый кэш, в конце - новый. <strong>(Тесты показали что работает медленно. Решил отказаться)</strong> Сделано отображение упрощенного превью ячейки
- [ ] при сильном увеличении рисовать только часть картинки которая попадает во вьюпорт иначе тормозит нещадно
- [x] определять реальные размеры рисунка.
- [ ] определять INIT_CASH_THRESHOLD для включения кэширования ячейки
  - [ ] учесть bbox текста

---

## Общее

- [x] сделать поддержку многофайловости - несколько AppState. PeojectsManager
- [x] переделать создание Cell. назначить только нужные параметры из Params
  - [x] разделить Cell на BaseCell, Cell и Link
  - [x] сделать отдельно Line

- [ ] реализовать контейнеры

- [x] создание предустановленных фигур: квадрат, круг, треугольник

- [x] удаление элементов на кнопку Del

## Коннекторы

- [x] Реализовать основной функционал коннекторов
  - [x] выделение
  - [x] перемещение точек
  - [x] перемещение коннектора
  - [x] перемещение начала и конца
  - [x] привязка при наведении на фигуру/точку
  - [x] создание от фигуры (от стрелки)
  - [ ] создание от фигуры (от точки )
  - [x] разные типы коннекторов
    - [x] Линия
    - [x] орто
    - [x] Безье
    - [x] переключение
  - [x] роутинг
    - [x] Ortho-роутинг для ortho-коннекторов
    - [x] для Безье-коннекторов
    - [x] учитывать поворот фигур
  - [x] поворот маркеров
  - [x] уменьшение линии на величину отступа маркера
  - [x] привязывание к ячейкам и следование за ними
  - [x] отслеживание положения на фигуре при драге и трансформе
  - [x] сделать дефолтные паарметры коннектора
  - [x] разные типы привязки (bbox, граница, центр)
  - [x] изменение привязки при перемещении фигуры в зависимости от типа коннектора
  - [x] сделать переключаемым при изменении настроек роутинга в файле dragCell пересчет графа сцены, сейчас он нужен только для Ortho коннекторов и в Scene2D.calcSceneRect()
  - [x] разные типы маркеров
  - [ ] размер маркеров
  - [ ] Тип маркера по умолчанию для данной сцены (настройка во вкладке схема)
  - [ ] Разрывать коннектор если на него кинули фигуру, при этом курсор должен быть над коннектором

## Работа с фигурами

- [x] Cell controls: translate
- [x] Cell controls: scale
  - [x] BUG: смещение при достижении левого верхнего контрола минимальных значений
  - [x] BUG неверно скейл на повернутых элементах
  - [ ] BUG скейла толщины линий быть не должно ???
  - [x] BUG не скейлится если маленький размер ячейки
- [x] Cell controls: rotate
- [x] Cell controls: rotate cursor

- [x] Foreigns
  - [x] диаграммы
    - [ ] Сделать все типы
  - [ ] Таблицы

- [x] булевые операции
  - [ ] учитывать взаимное смещение фигур
  - [ ] у измененной ячейки пересчитывать все параметры начиная с размеров (или просто создать новую?)
  - [ ] обрабатывать за раз более чем 2 фигуры

## Работа с группами:

- [x] рендер
- [x] выделение
- [x] трансформации
- [x] Трансформировать содержимое вместе с группой
- [x] UI: группировать
- [x] UI: разгруппировать
- [x] удаление из группы в UI
- [ ] редактирование в отдельном окне (UI)
- [x] Группа в группе: добавление
- [ ] Запретить изменение элементов в группе, разрешить только через отдельное окно (блокировка)
- [x] Сделать опциональным пунктиры для отслеживания элементов в группе

## Выделение

- [x] выделение рамкой
- [ ] выделение по типу
- [x] добавление к выделенному с CTRL
- [x] трансформация выделения по принципу группы

## Редактирование стилей

- [x] редактирование стиля ячейки - заливка, линия. Записывать в customAttrs. При рендере сначала берется это значение если оно есть, затем из темы если она есть, затем собственный. Это позволит делать сброс установленного стиля и упростит копирование стиля.

- [x] копирования/вставка стиля ячеек/коннекторов

## Features

- [x] Механизм включения/отключения плагинов/сервисов

### Internal

- [x] UndoRedo [CommandManager](./src/engine/internal/CommandManager.ts)
  - [x] после возарата удаления вернуть вложенность групп и привязки коннекторов

- [x] Линейка [Ruler](./src/engine/internal/Ruler.ts)

- [x] Сделать class [SystemSettings](./src/engine/internal/SystemSettings.ts). Должен сохранять настройки между сессиями и подгружать при запуске. должны управляться пользователем.
  - [ ] отрисовка кастомных контролов
  - [ ] включение кэширования ???
  - [x] точность выделения
  - [ ] отображение координат около курсора
  - [x] отображение длины и высоты на CellControls
  - [x] отображение линий позиции и поворота
  - [x] Включение привязок

- [x] настройки сцены
  - [x] Включение выключение линейки
  - [x] Включение выключение сетки
  - [x] Изменение шага сетки
  - [x] Включение выключение тени страницы

- [x] Привязки
  - [x] К сетке
  - [x] К фигурам

- [x] Сделать разбивку на листы и добавление листа, если фигура за пределами листа

- [x] Сделать бесконечную сетку если нет разбивки по листам

### External

- [x] сохранение и открытие (SaveService). Для этого нужно реализовать методы toJSON у Cell, Link, Scene2D, AppState

- [x] Копирование/вставка [CopyPasteService](./src/engine/services/CopyPasteService/CopyPasteService.ts)

- [x] Редактирование текста [TextEditor](./src/engine/services/TextEditor/TextEditor.ts)
  - [ ] навигация + выделение с помощью клика
  - [ ] вынести общую логику по движению курсора, по сути они дублируют друг друга
  - [ ] есть бага при движении курсора в многострочном тексте
  - [ ] обновление выделения в textarea
  - [ ] получение текущего выделения из textarea
  - [ ] рендер выделения текста
  - [ ] реализовать копирование текста (нужно так же перебить хоткеи с основного канваса при редактировании текста)
  - [ ] реализовать вырезание текста (нужно так же перебить хоткеи с основного канваса при редактировании текста)
  - [ ] реализовать вставку текста из буфера обмена (нужно так же перебить хоткеи с основного канваса при редактировании текста)
  - [ ] реализовать отмену последнего действия (нужно так же перебить хоткеи с основного канваса при редактировании текста)
  - [ ] реализовать повтор отмененного действия (нужно так же перебить хоткеи с основного канваса при редактировании текста)

- [x] Работа со слоями [LayersManager](./src/engine/services/LayersManager/LayersManager.ts)

- [x] Работа с библиотеками и шаблонами [Stencil](./src/engine/services/Stencil/Stencil.ts)
  - [x] импорт библиотек из Autograph2.0

  - [x] добавление перетаскиванием

- [x] Предпросмотр и печать [PrintPreview](./src/engine/services/PrintPreview/PrintPreview.ts)

- [x] Экспорт [ExportService]
  - [x] Экспорт svg
  - [x] Экспорт png/jpg

- [x] Импорт [ImportService](./src/engine/services/ImportService/ImportService.ts)
  - [ ] импорт svg (частично)
  - [x] импорт png/jpg
  - [ ] импорт autographnew (частично)

- [x] реализовать поддержку тем ThemeService [ThemeService](./src/engine/services/ThemeService/ThemeService.ts)
  - [x] новые элементы стилизуются в соответсвии с установленной темой
  - [x] элементы, стиль которых не был изменен пользователем, изменяют стиль при изменении темы

- [x] фильтры и эффекты в отдельный сервис

## Улучшить

- [x] в режиме точного выделения - выделение ячейки с картинкой
- [x] при поиске точек привязки на некоторых фигурах очень тормозит
- [x] на некоторых фигурах промахивается клик
- [x] Функция вписать ячейки в область видимости работает некорректно. Неправильно пересчитвается rect ячеек.

- [ ] разобраться с размером и положением картинок в Cell.render
      "Россети схемы на правки\Схемы на правки\!!!Россети\ЧертежиОПОВ.vsdx"
      "Россети схемы на правки\Примеры схем.vsd"

- [ ] отрисовывать с учетом drawingScale (все уменьшать, а не увеличивать) надо ли? если надо - в последнюю очередь. UPDATE: нужно все уменьшать похоже, много работает неправильно. нужно глобально решить проблему, и сделать масштаб чертежа опциональным. При этом необходимо учесть расчет для роутинга, если сцена будет очень большая он просто упадет с out of memory. В текущей реализации это решено

### Effects

- [ ] relief TODO переделать на skia!

- [ ] обработать эффекты при кэшировании в рендере (нужны ли они при кэшировании?)

---

## DrawService

- [x] Сделать кнопки привязок и опции привязок в рисовании
- [x] радиус привязки.
- [ ] Привязка к центру
- [ ] Ортогональная привязка
- [ ] Привязка касание
- [ ] Привязка пересечение
- [ ] Привязка середина
- [ ] Выравнивание
- [x] Угол при рисовании
- [x] Контролы на самом элементе?

[< Back](README.md)
