Skip to content

fix: контекстное меню навигатора закрывалось при установке readonly - #17

Open
iljyxa wants to merge 10 commits into
Macegor:developfrom
iljyxa:feature/context-menu-focus-loss
Open

fix: контекстное меню навигатора закрывалось при установке readonly#17
iljyxa wants to merge 10 commits into
Macegor:developfrom
iljyxa:feature/context-menu-focus-loss

Conversation

@iljyxa

@iljyxa iljyxa commented Aug 24, 2026

Copy link
Copy Markdown

Проблема

Контекстное меню webview-панели навигатора («Редактор конфигурации») самопроизвольно закрывалось сразу после открытия — конкретно в момент, когда открытому BSL-модулю проставляется readonly-статус (объект заблокирован поддержкой/хранилищем).

Причина

setEditorReadonly() (src/ui/commands/open/OpenXmlCommand.ts), общая для openModule/openXmlFile/OpenTemplateContentCommand, вызывалась сразу после того, как вызывающий код уже корректно открывал документ с осмысленным preserveFocus (например, true из UniversalPanelViewProvider.selectNode — открытие модуля по выбору узла дерева намеренно не отбирает фокус у навигатора). Внутри setEditorReadonly второй showTextDocument вызывался без preserveFocus (то есть false по умолчанию) и безусловно перехватывал фокус клавиатуры заново — webview воспринимал это как клик мимо меню (window.blur) и закрывал его.

Заодно устранена смежная проблема того же рода в BslReadonlyGuard (фоновая простановка readonly через onDidChangeVisibleTextEditors — тоже безусловно перехватывала фокус) и добавлена идемпотентность повторного применения readonly-статуса для одного документа.

Изменения

  • setEditorReadonlyshowTextDocument теперь с preserveFocus: true.
  • BslReadonlyGuard.applyReadonlypreserveFocus: true вместо false; не переприменяет readonly, если уже применён для документа в сессии (WeakSet по идентичности TextDocument).

Macegor and others added 10 commits June 29, 2026 14:34
Фикс ошибок и оптимизация
Генерация формата 2.20/2.21, сквозной аудит и декомпозиция God-классов (v0.4.1)
Обновление до v0.4.2
chore: настройка публикации в Marketplace и ссылки в README
…атуса

Контекстное меню навигатора (webview) закрывалось само собой, потому что
BslReadonlyGuard.applyReadonly вызывал showTextDocument с preserveFocus:
false при каждом (пере)применении readonly-статуса BSL-файлу, включая
фоновые срабатывания через onDidChangeVisibleTextEditors. Это безусловно
перехватывало фокус клавиатуры у текущего фокуса (в том числе у webview
с открытым контекстным меню), что webview воспринимал как клик мимо
меню и закрывал его.

preserveFocus: true по-прежнему делает документ window.activeTextEditor
(это всё, что нужно команде setActiveEditorReadonlyInSession), но не
отбирает фокус клавиатуры.

Closes #4
… документа

Синхронный путь и fallback-watcher onDidChangeVisibleTextEditors в
BslReadonlyGuard.register() теоретически могут пересечься для одного и
того же документа (например, split-editor: документ становится видимым
сразу в нескольких группах). WeakSet по идентичности TextDocument
исключает повторное выполнение showTextDocument/readonly-команды —
при реальном закрытии и повторном открытии файла VS Code создаёт новый
объект документа, трекинг сбрасывается сам собой.
Для локализации issue #4 — фикс BslReadonlyGuard не устранил закрытие
меню на практике, причина закрытия неизвестна. Логирует reason/target/
activeElement в консоль webview (Developer: Open Webview Developer
Tools). Убрать после диагностики.
…рытый модуль

Настоящая причина issue #4 (предыдущий фикс BslReadonlyGuard её не устранял):
setEditorReadonly() — общая функция, которую openModule/openXmlFile/
OpenTemplateContentCommand вызывают сразу после того, как уже открыли
документ с осмысленным preserveFocus (например, true из
UniversalPanelViewProvider.selectNode — открытие модуля по выбору узла
дерева намеренно не отбирает фокус у навигатора). Внутри setEditorReadonly
второй showTextDocument вызывался вообще без preserveFocus (то есть false
по умолчанию) и безусловно перехватывал фокус клавиатуры заново — именно
в момент простановки readonly, что закрывало открытое контекстное меню
навигатора.

Диагностика (временное логирование в AppContextMenu.vue из предыдущего
коммита) подтвердила: единственный сработавший обработчик — window-blur,
что указывало на реальную потерю фокуса окна, а не на побочный эффект
перерисовки дерева. Диагностика отменена отдельным revert-коммитом.
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