Page 1 of 1

panel.SetSelection / panel.ClearSelection

Posted: Mon 06 Jan, 2020 15:41
by John Doe

Code: Select all

shmuel 16.08.2019 17:25:50 +0200 - build 698

1. LuaFAR: из реализации функций panel.SetSelection() / panel.ClearSelection() убраны внутренние вызовы
   FCTL_BEGINSELECTION / FCTL_ENDSELECTION; это отдано на усмотрение пользовательских скриптов.
   Причина изменения: Far Manager не поддерживает вложенные вызовы  FCTL_BEGINSELECTION / FCTL_ENDSELECTION.

shmuel 14.08.2019 10:43:37 +0200 - build 697

1. LuaFAR: добавлены функции panel.BeginSelection и panel.EndSelection.
Однако в статье мануала об panel.SetSelection об это не сказано, и даже напротив:

Code: Select all

Far API used:
  PanelControl, FCTL_GETPANELINFO, FCTL_BEGINSELECTION,
  FCTL_SETSELECTION, FCTL_ENDSELECTION
В таких вещах я обычно верю тому что сказано в changelog, однако тут я не уверен что всё правильно понял:
Сейчас даже если в функцию передан массив, то надо ещё вручную добавить panel.BeginSelection и panel.EndSelection, которые ранее подразумевались?

Я не совсем понял, ради чего это сделано. Нельзя ли привести гипотетический сценарий в такая гибкость (BeginSelection/EndSelection) даёт какие-либо преимущества?

И забегая вперёд: вложенные вызовы не поддерживаются, но разве луафар не может разрешить этот вопрос самостоятельно, не перекладывая на пользователя?

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Tue 07 Jan, 2020 16:18
by Shmuel
John Doe, я ответил вам на ру-борде т.к. этот сайт не работал.

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Fri 10 Jan, 2020 16:50
by John Doe
Shmuel wrote:1. Верьте чейнжлогу. Лишние ссылки из мануала убрал.
2. История вопроса - отсюда и далее.
selection: boolean
относится к целой команде, а не к каждому items, то table (array of item indexes подразумевает массив выбранных/погашенных. Соответственно требуется 2 отдельных операции - снятия и установки, в результате получается то, что написал выше.
(А выше описано что первая команда изменяет индексы)

Проблема понятна, но предложенное решение не вполне ей соответствует: описанный сценарий - редкий, а begin/endselection придётся пихать всюду.

Предлагаю добавить третье возможное значение для selection: при котором можно будет указать одновременно и элементы для снятия, и для установки (тут возможен разный синтаксис).

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Fri 10 Jan, 2020 17:15
by John Doe
Альтернативно: можно совместить и теперешний, и прошлый способы.
На момент вызова setselection луафар знает предшествовала ли ему begin selection, и соответственно может действовать нужным образом в любом случае.

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Fri 10 Jan, 2020 18:41
by Smitis
John Doe wrote: Fri 10 Jan, 2020 16:50 Предлагаю добавить третье возможное значение для selection: при котором можно будет указать одновременно и элементы для снятия, и для установки (тут возможен разный синтаксис).
Вариант: если selection таблица, значит она содержит элементы для снятия. Тогда items - таблица элементов для установки или nil. Соответственно, если selection==nil, items содержит элементы для установки.

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Sat 11 Jan, 2020 09:18
by Shmuel
John Doe wrote: Fri 10 Jan, 2020 16:50 Проблема понятна, но предложенное решение не вполне ей соответствует: описанный сценарий - редкий, а begin/endselection придётся пихать всюду.
Предлагаю [...] Альтернативно [...]
Существующая имплементация - это практически прямая трансляция данного Far API для Lua. Ни один плагинописатель на C/Pascal/etc. не жалуется, что приходится "пихать всюду" begin/endselection.
Если же очень хочется своего особого API, то есть как минимум 2 варианта:
1. Сделать его на Lua (модуль).
2. Сделать его на Си + pull request (будет рассмотрен; не гарантия, что будет принят).

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Sat 11 Jan, 2020 09:59
by John Doe
Shmuel wrote: Sat 11 Jan, 2020 09:18 Существующая имплементация - это практически прямая трансляция данного Far API для Lua
Именно.
А от Lua ожидается несколько большей обстракции.
Собственно предыдущая реализация полностью устраивала.
Shmuel wrote: Sat 11 Jan, 2020 09:18 Если же очень хочется своего особого API.
Хочется не особого, а всего лишь вернуть былую лаконичность, но с учётом нового сценария использования.

Также хочу подчеркнуть, что произошедшее в 698 изменение setselection ломает API.
Разумеется все плагины и макросы несложно адаптировать.
Но зачем (ради редкого сценария использования) ломать то, что можно изменить совместимым образом?
Shmuel wrote: Sat 11 Jan, 2020 09:18 Сделать его на Си + pull request (будет рассмотрен; не гарантия, что будет принят).
К сожалению Си я не владею.
А модуль на луа ради одной функции не оправдан.

Edit:
https://bugs.farmanager.com/view.php?id=3766

LuaFAR — библиотека для создания плагинов на языке Lua

Posted: Mon 20 Jan, 2020 11:39
by John Doe
Shmuel wrote: Sat 11 Jan, 2020 09:18 Существующая имплементация - это практически прямая трансляция данного Far API для Lua.
https://github.com/FarGroup/FarManager/ ... 3ef34d44fc
Remove obsolete links.

Линки удалены, но ясности всё ещё нет: если у нас действительно прямая трансляция, то в Энциклопедии также сказано:
Нужно вызвать FCTL_REDRAWPANEL для показа изменений.
Т.е. в итоге для выделения элемента на панели нужны 4 вызова:

Code: Select all

FCTL_BEGINSELECTION
FCTL_SETSELECTION
FCTL_ENDSELECTION
FCTL_REDRAWPANEL
По факту же в актуальной версии фара мне почему-то до сих пор достаточно одного panel.SetSelection (что меня чрезвычайно устраивает).

panel.SetSelection / panel.ClearSelection

Posted: Mon 20 Jan, 2020 12:20
by zg
John Doe wrote: Mon 20 Jan, 2020 11:39По факту же в актуальной версии фара мне почему-то до сих пор достаточно одного panel.SetSelection (что меня чрезвычайно устраивает).
ctrl-m — не работает. selection first — не работает. если выделить 1000, то время скорее всего будет разное.

panel.SetSelection / panel.ClearSelection

Posted: Mon 20 Jan, 2020 13:00
by John Doe
zg wrote: Mon 20 Jan, 2020 12:20 ctrl-m — не работает. selection first — не работает
Первое работает, второе нет.

И без FCTL_REDRAWPANEL панель обновляется не сразу.

panel.SetSelection / panel.ClearSelection

Posted: Mon 20 Jan, 2020 20:12
by zg
John Doe wrote: Mon 20 Jan, 2020 13:00Первое работает, второе нет.
прямо даже не знаю. зажожу в папку, выделяю все файлы плюсиком, выполняю lua:panel.SetSelection(nil,1,2,false);panel.RedrawPanel(nil,1), жму ctrl-m — выделение нет вообще.
если код заменить на lua:panel.BeginSelection(nil,1);panel.SetSelection(nil,1,2,false);panel.EndSelection(nil,1);panel.RedrawPanel(nil,1) — все файлы выделены.

panel.SetSelection / panel.ClearSelection

Posted: Tue 21 Jan, 2020 08:39
by John Doe
Действительно, теперь вижу.