panel.SetSelection / panel.ClearSelection

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

panel.SetSelection / panel.ClearSelection

Post 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) даёт какие-либо преимущества?

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

Shmuel
Posts: 6035
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 27 times
Been thanked: 294 times

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

Post by Shmuel »

John Doe, я ответил вам на ру-борде т.к. этот сайт не работал.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

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

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

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

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

Альтернативно: можно совместить и теперешний, и прошлый способы.
На момент вызова setselection луафар знает предшествовала ли ему begin selection, и соответственно может действовать нужным образом в любом случае.

Smitis
Posts: 1611
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

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

Shmuel
Posts: 6035
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 27 times
Been thanked: 294 times

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

Post 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 (будет рассмотрен; не гарантия, что будет принят).

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post 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
Last edited by John Doe on Mon 20 Jan, 2020 13:49, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post 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 (что меня чрезвычайно устраивает).

User avatar
zg
zero-gravity
Posts: 5726
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 135 times
Contact:

panel.SetSelection / panel.ClearSelection

Post by zg »

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

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

panel.SetSelection / panel.ClearSelection

Post by John Doe »

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

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

User avatar
zg
zero-gravity
Posts: 5726
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 135 times
Contact:

panel.SetSelection / panel.ClearSelection

Post 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) — все файлы выделены.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

panel.SetSelection / panel.ClearSelection

Post by John Doe »

Действительно, теперь вижу.

Post Reply

Return to “Обсуждение макросов”