Skip to content

feat(graph): interactive node drag, 3-tier focus hierarchy, local graph, search, and sidebar sync - #69

Merged
kostyk348 merged 8 commits into
mainfrom
feat/graph-interactive-enhancement
Nov 8, 2026
Merged

kostyk348 merged 8 commits into
mainfrom
feat/graph-interactive-enhancement

Conversation

@kobaltgit

Copy link
Copy Markdown
Collaborator

Summary / Краткое описание

Комплексное интерактивное улучшение графа связей и синхронизации с сайдбаром для нативного клиента CapsuleCraft (native/src/graph/, native/src/views/graph/, native/src/views/sidebar/).

Архитектурная документация для мейнтейнера добавлена в docs/NATIVE_INTERACTIVE_GRAPH.md.


Что сделано / Key Features

1. Архитектурная декомпозиция монолитов (Лимит 500–800 строк на файл)

Монолиты graph.rs (1,361 строк), graph_view.rs (1,209 строк) и sidebar_view.rs (1,150 строк) разделены на компактные, модульные компоненты:

  • native/src/graph/: mod.rs (571), layout.rs (480), metrics.rs (313).
  • native/src/views/graph/: mod.rs (779), render_pages.rs (388), render_clusters.rs (347), interaction.rs (107), render_density.rs (97).
  • native/src/views/sidebar/: mod.rs (718), tree.rs (377), dnd.rs (98).

2. Изолированный $O(1)$ драг узлов и сохранение координат

  • Перетаскивание узлов в реальном времени с нулевой перераскладкой через таблицу drag_overrides: HashMap<u32, [f32; 2]>.
  • Сохранение финальных мировых координат в PositionCache (graph_layout.json) при отпускании мыши (drag_stopped).
  • Переключение курсоров Grab / Grabbing.

3. Трёхслойная модель фокуса (3-Tier Focus Hierarchy) и сброс выделения

Устранено постоянное 20% затемнение хранилища:

  1. Состояние 1: «Чистый обзор» (100% полная яркость): по умолчанию и после клика по пустому месту холста все узлы, рёбра и подписи отрисовываются на 100% яркости в естественных цветах своих папок/кластеров.
  2. Состояние 2: «Выбрана страница» (85% фон): выбранный узел выделен двойным золотистым ореолом свечения, а фон (все остальные узлы) сохраняет 85% контрастности и цвета, оставаясь полностью читаемым.
  3. Состояние 3: «Наведение курсора» (22% глубокий рентген связей): при наведении мыши на любой узел фон гаснет до 22%, моментально изолируя инцидентные связи толщиной 2.2px.
  4. Клик по пустому холсту (Click-to-Deselect): короткий клик по свободному холсту сбрасывает фокус в 100% обзор и скрывает карточку страницы.

4. Режим «Локальный граф» (Local Graph Mode)

  • Тулбар: кнопка переключения «Глобальный граф» $\leftrightarrow$ «Локальный граф: Глубина 1..3».
  • Построение подграфа алгоритмом neighborhood_bfs по предвычисленному списку смежности adjacency в GraphMetrics.

5. Поиск по графу и фильтр сирот

  • Поиск: строка ввода с кнопкой очистки; совпавшие узлы подсвечиваются акцентным кольцом, а их подписи гарантированно сохраняются (не отсекаются лимитом LABEL_MAX).
  • Фильтр изолированных заметок («Скрыть сироты»): мгновенное скрытие узлов со степенью связности 0.

6. Контекстное меню по правой кнопке мыши (ПКМ)

  • ПКМ по узлу: «Открыть заметку», «Копировать ссылку» (capsule://...), «Копировать [[вики-ссылку]]» (с тостами).
  • ПКМ по пустому холсту: «Вписать» (Fit).

7. Двусторонняя синхронизация с сайдбаром (Zero-Main Bloat)

  • Рекурсивное автораскрытие дерева родителей expand_ancestors.
  • Плавное центрирование скролла response.scroll_to_me(Some(egui::Align::Center)) при клике на узел графа.
  • Чистота ядра: 0 изменений в структуре NativeApp и файле main.rs.

8. Адаптивные плашки на egui::Frame и векторный UI

  • Замена жестко захардкоженных прямоугольников painter.rect на самоадаптирующиеся egui::Frame (панель кластеров и карточка выбранной страницы) — предотвращает выпадение текста и тегов за границы при переносе длинных названий.
  • Полный отказ от нестабильных Unicode-символов (●, ✓, ⚙, 🔍) в пользу векторных примитивов и системных Icon.

Тестирование и верификация

  • Команда: cargo test --manifest-path native/Cargo.toml --lib -j 1
  • Результат: 320 passed; 0 failed; 2 ignored; finished in 0.94s
  • Release-сборка: cargo build --manifest-path native/Cargo.toml --bin capsuleos-native --release -j 1 завершена с кодом 0 (бинарник 32.3 МБ проверен локально).
  • i18n пуризм: тесты english_strings_are_cyrillic_free и every_key_has_both_languages пройдены без ошибок.

kobaltgit and others added 8 commits November 8, 2026 12:26
Conflict resolution: keep the branch's sidebar module split
(sidebar/{mod,tree,dnd}.rs) and its function structure, and carry main's
v2.12 sidebar features (pinned pages, recents, sort menu) plus the
v2.12.2 drag-and-drop fixes, which the branch predated:

- drop-target probing in tree.rs uses contains_pointer() and rows carry
  the stable page-row id (egui suppresses hovered() for every widget
  while a drag is in flight);
- the root drop zone in dnd.rs is probed with contains_pointer();
- the stale-drag cleanup at the top of draw_sidebar survived the merge;
- main's headless sidebar drag tests (drop emits reparent, cycle drop
  rejected, lost release cannot stick) ride along on draw_sidebar and
  pass against the new module structure.

Cargo.lock taken from main and regenerated. Tests: 333 passed.
@kostyk348
kostyk348 merged commit c4c7253 into main Nov 8, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants