salexdv / bsl_console

Консоль кода для 1С 8.3 (Управляемые и обычные формы)
MIT License
297 stars 55 forks source link

Нестабильное отображение пользовательской подсказки по вызову метода #176

Closed tormozit closed 3 years ago

tormozit commented 3 years ago

Проблема давняя. Но сегодня удалось найти ее достаточно надежное воспроизведение. Имею текст

а = Новый ТаблицаЗначений;
а.Колонки.Добавить("пара", Новый ОписаниеТипов());

Открываю его в свеже инициализированном поле редактора. Каретка сразу стоит между скобок. Нажимаю CTRL+SHIFT+SPACE. Срабатывает событие EVENT_BEFORE_SIGNATURE и отрабатывает мой код РедакторHTML.setCustomSignatures(ВариантыСинтаксиса); Строка из переменной ВариантыСинтаксиса При этом открывается подсказка по вызову метода со стандартным содержанием

изображение

Нажимаю CTRL+SHIFT+SPACE еще раз. Все повторяется, но уже открывается подсказка по вызову метода с моим содержанием

изображение

Повторные нажатия CTRL+SHIFT+SPACE всегда отображают мое содержимое. Однако если удалить "("

изображение

и напечатать снова, то отобразится опять стандартное содержимое подсказки.

изображение

salexdv commented 3 years ago

В этом поведении всё логично, кроме последнего шага про

Однако если удалить "("

Такое поведение у себя я воспроизвести не смог.

Вызов setCustomSignatures() сам по себе не приводит к появлению подсказки по вызову метода, как это реализовано в showCustomSuggestions(). Если после установки своих описаний ты не вызываешь triggerSigHelp(), то при первой подсказке редактор и будет себя вести так, как ты описал. При повторном вызове пользовательские описания уже есть и показываются уже они.

salexdv commented 3 years ago

Могу предложить добавить 3 опции. Например, disableNativeSuggestions, disableNativeSignatures и disableNativeHovers. При их установке в true соответственно не будут показываться стандартные подсказки, но будут генерироваться события.

tormozit commented 3 years ago

Теперь сделал обработку события аналогично EVENT_BEFORE_SHOW_SUGGEST:

    Если мРазрешеноПодсказкаМетодаHTML = Истина Тогда 
        мРазрешеноПодсказкаМетодаHTML = Ложь;
        Возврат;
    КонецЕсли; 
    РедакторHTML = ПолеТекста.ЭлементФормы.Документ.defaultView;
    РедакторHTML.hideSignatureList();
        РедакторHTML.setCustomSignatures(ирОбщий.ОбъектВСтрокуJSONЛкс(ВариантыСинтаксиса));
        мРазрешеноПодсказкаМетодаHTML = Истина;
        РедакторHTML.triggerSigHelp();

Почти все проблемы ушли. Осталось только первое срабатывание. При нем окно не появляется, хотя код отрабатывает.

tormozit commented 3 years ago

Могу предложить добавить 3 опции. Например, disableNativeSuggestions, disableNativeSignatures и disableNativeHovers. При их установке в true соответственно не будут показываться стандартные подсказки, но будут генерироваться события.

Да. Кажется тогда работа с этими событиями станет прямее и понятнее, а то сейчас мне их второй раз приходится вызывать и код выглядит непрозрачно.

tormozit commented 3 years ago

Новые опции заработали. После их включения я выключил вызовы скрытия штатных списков. Однако в остальном схема работы не изменилась - первый раз обрабатываю событие с формированием содержания подсказки и вызываю явно отображение окна подсказки, а следующий вызов события игнорирую.

salexdv commented 3 years ago

а следующий вызов события игнорируют

Что это значит?

tormozit commented 3 years ago

В слове "игнорируют" буква "т" была лишней. Исправил. Значит, что событие вызывается 2 раза вместо 1. Первый раз его вызываешь ты, а второй уже я через show/trigger...() и его обработку в этом случае мне уже надо НЕ делать.

Но я уже избавился от этого подхода и перешел на подавление второго вызова события через

    РедакторHTML.enableBeforeSignatureEvent(Ложь);
    РедакторHTML.enableBeforeShowSuggestEvent(Ложь);

Так что проблема уже не актуальна.