Реализовать дерево директорий панельным модулем на Луа

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Sun 08 Mar, 2020 21:37
buniak_a_h wrote: Sat 07 Mar, 2020 19:41 Я начинал делать дерево в виде панельного модуля. Вот это мне показалось наиболее удобным. Но… Отвлекли на работе.
ну положите куда-нибудь на видное место если там есть хоть что-то полезное, может кто-нибудь продолжит
Спасибо citRiks-у за наводку на tree.com - давно забытая утилитка. Получился довольно небольшой и вполне пригодный модуль. Позволяет открывать-закрывать узлы дерева, задавать глубину, на которую первоначально открываются узлы; просматривать в пассивной панели текущую папку и переходить в панели дерева на выбранную папку.



Чего может не хватать:
  • обновления дерева (по таймеру, например);
  • вывода характеристик (суммарный размер поддерева, самого нового файла, количество файлов).
  • Что ещё - не знаю.
Если кому-нить это интересно, перечисленные недоделки я по возможности доделаю. Также принимаются предложения, чего может ещё не хватать для нормальной работы. Но так-то вроде вполне удобненько получилось … :-)
Опять же если будут добровольцы - локализацию и перевод хелпа были бы полезны. Если скрипт кому-нить покажется полезным …

Версия 2.6.6.
  1. Исправлен «снос» имени текущей папки в командную строку: теперь оно заменяет отмеченную часть командной строки или (если ничего не отмечено) вставляется в текущую позицию строки.
  2. Исправлена мелкая неточность: вопрос о пересоздании кэша задаётся только в том случае, если задан период актуализации кэша
TreePanel_2_6_6.7z
(31.08 KiB) Downloaded 143 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Mon 14 Dec, 2020 07:40, edited 37 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

Latest post of the previous page:

buniak_a_h wrote: Mon 30 Mar, 2020 04:39 Передайте им, что вариант 1.4.1 сделан, не сильно тестирован - возможны ошибки и ограничения.
Потестил, вродь работаить, пасиба )
То что не работает - это переход в архивах из дерева на противоположную панель
Это легко доделать?
Может быть вам в помошь тут окажется вот эта функция:

Code: Select all

local naive_path
local function fnc_set_same(the_pan, dir_enter)

	local dir = panel.GetPanelDirectory(nil, 1 - the_pan)
	local itm = panel.GetCurrentPanelItem(nil, 1 - the_pan)
	local is_dir, sz_full_path, hard_links_cnt
	local plain_path = dir.Name.."\\"..itm.FileName
	local time_now = Far.UpTime
	local is_fast_enough = dt_goto and plain_path == naive_path and (time_now - dt_goto < DIR_ENTER_INT)
	seq_cnt = is_fast_enough and not (seq_cnt > 2) and (seq_cnt or 0) + 1 or 0
	link_enter = seq_cnt > 1 and 1 or 0
	dir_enter = seq_cnt % 2 == 1
	dt_goto = time_now
        naive_path = plain_path

	if APanel.DriveType == -1
	then	is_dir = false
		sz_full_path = APanel.HostFile
	else	is_dir = itm.FileAttributes:find("d")
		sz_full_path = far.ConvertPath(dir.Name.."\\"..itm.FileName, link_enter)
		hard_links_cnt = Panel.Item(ACT_PAN, APanel.CurPos, 9)
		if	hard_links_cnt > 1 
		then	sz_full_path = fnc_show_hard_links_choice(sz_full_path) end
	end

	local	res_set_path
	if	is_dir and dir_enter
	then	panel.SetPanelDirectory(nil, the_pan, sz_full_path)
	else	res_set_path = APanel.DriveType == -1 and APanel.HostFile == PPanel.HostFile 
		if	APanel.DriveType ~= -1 or not res_set_path
		then	res_set_path = Panel.SetPath(1 - the_pan, mf.fsplit(sz_full_path, 3), mf.fsplit(sz_full_path, 12)) 
		end
	end
	if	APanel.DriveType == -1 and res_set_path 
	then	if	PPanel.DriveType ~= -1 and PPanel.HostFile == ""
		then	Keys("Tab CtrlPgDn Tab") end
		if	APanel.HostFile == PPanel.HostFile 
		then	Panel.SetPath(1, APanel.Path, APanel.Current) end
	end
end
она делает позиционирование на пассивной панели файла который в активной.
Прекрасно работает и в архивах, т.е. понимает что файл в архиве и позиционирует в архивe.
и еще нет перечитывания архива если, архив не поменялся, а был переход внутри архива, что важно для больших архивов.
Поделился добрый дедушка @XeRoX, из скрипта Shell-Same-File-position.@Xer0X.lua тута:
https://github.com/dr-dba/LUA-FAR-STUFF ... 0Xer0X.lua
Shell-Same-File-position.@Xer0X.Lua.7z
(1.99 KiB) Downloaded 15 times
Last edited by citRiks on Mon 30 Mar, 2020 09:50, edited 2 times in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 30 Mar, 2020 09:40 То что не работает - это переход в архивах из дерева на противоположную панель
Это легко доделать?
Может быть вам в помошь тут окажется вот эта функция:
1. Я знаю, что не работает - сам заблокировал.
2. Функция не нужна. Я теперь и так знаю, как сделать. Выход из дерева обратно в архив я же делаю! Функция не нужна: там две строчки … Придумал уже после публикации; было 6 часов утра, неохота было делать.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h,
Глянул ваш код дерева энтого, и я в шоке
унутри там есть гениальнейшая реализация дерева на Луа!! ))
т. е. эффективнейшая "tree data structure", такого на форуме еще не было..
Должен признать, что я сам собирался сделать дерево на Луа,
посвятил даже несколько часов на гугление и обдумывание, но вы меня опередили :)

Из дальнейших предложений это сделать кэшинг.
Для больших дисков это будет весьма актуально.

и может быть быстрый поиск (по Альту) все таки запилить?
Можно конечно Ф7 делать, но для больших дисков (опять же) это будет грустно,
а в дереве как раз должно быть быстро, оно уже имеет весь список

если вам нужны идеи по реализации кэшинга, чего-то еще?
то могу подкинуть

Вот еще, мне кажется можно добавить к "пониманию" АркЛайта еще и Обсервер?
вроде это не должно потребовать измения в коде кроме как добавить собственно ObserverId где сейчас ArcLiteId
Last edited by citRiks on Mon 30 Mar, 2020 10:20, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 30 Mar, 2020 10:18 и может быть быстрый поиск (по Альту) все таки запилить?
Вообще-то он "запилен"! Просто скачайте ещё один скрипт (ссылка есть и в хелпе, и в тексте скрипта дерева, и в головном сообщении в спойлере о версии 1.3.1 пункт 4). Мне мой Alt-поиск настолько понравился, что я заменил им стандартный . К тому же для дерева он даёт возможность не только поиска, но и фильтрации. Для стандартных панелей фильтрацию доделаю.
citRiks wrote: Mon 30 Mar, 2020 10:18 Из дальнейших предложений это сделать кэшинг.
В экспериментах сделано формирование дерева не сразу на все подпапки, а только на первые пару уровней. А достраивать при открытии узла. Это решает проблему "долгого" построения дерева (у меня tree.com на диске работает почти минуту) и делает кэшинг ненужным.
citRiks wrote: Mon 30 Mar, 2020 10:18 Вот еще, мне кажется можно добавить к "пониманию" АркЛайта еще и Обсервер?
Я с Обсервером незнаком. Можно ли получить листинг того, что открыто в Обсервере? Он, вроде, не только архивы (в обобщённом смысле) показывает, но и медиа-файлы.
citRiks wrote: Mon 30 Mar, 2020 10:18 реализация дерева на Луа!!
Вообще-то там нет ничего про дерево; дерево (с Вашей же подачи) рисует tree.com.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks, P/S (о поиске).
Ещё доделаю поиск в свёрнутых" узлах. Я думаю, это тоже удобно будет…
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 10:43 Для стандартных панелей фильтрацию доделаю.
эм, ну вот в том-то "увы и ах", люблю фильтрацию.
(от JonDoe, потом открыл для себя еще не менее замечателную от @ШмуэльЗ, но по инерции есть Джоновская фильтрация.
они бы хоть в своий топиках ссылки друг на друга разместили)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks, код был бы намного проще, если бы функция panel.SetPanelDirectory работала всегда. У меня она не всегда работает. В частности, на не-плагиновых пнелях (и в некоторых плагинах, в частности MultiArc). Казалось бы, симметричные действия типа

Code: Select all

local PanDir = panel.GetPanelDirectory(nil, 1)
<…>
panel.SetPanelDirectory(nil,1,PanDir)
должны восстанавливать статус-кво независимо от того, что делалось внутри <…> (почти - за исключением случая, когда исходная панель становится недоступной). Увы, пришлось делать проверку, плагиновая ли панель. Я писал, просил исправить (очень на баг похоже) - очень давно; увы - нет ответа.
Last edited by buniak_a_h on Mon 30 Mar, 2020 10:57, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 10:43 Вообще-то там нет ничего про дерево; дерево (с Вашей же подачи) рисует tree.com.
Ну да, все верно, но самое главно его отпарсить и перевести в иерархию.
мне показалось что там это иерархическая структура получается (ну таблицы в таблицах, которые в таблицах итд) нет разве?
Last edited by citRiks on Mon 30 Mar, 2020 10:58, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 30 Mar, 2020 10:55 ну вот в том-то "увы и ах", люблю фильтрацию.
Не понял, в чём "увы и ах". Как я там писал, можно убрать поле key= и тогда он вообще не будет влиять на работу FAR-а
citRiks wrote: Mon 30 Mar, 2020 10:58 там это иерархическая структура получается
Не-не. Не стал я иерархическую структуру делать. Просто линейный массив с уровнем вложенности папки. Некрасиво, но работает.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 10:56 код был бы намного проще, если бы функция panel.SetPanelDirectory работала всегда.
У меня она не всегда работает.
В частности, на не-плагиновых пaнелях (и в некоторых плагинах, в частности MultiArc)
..
должны восстанавливать статус-кво независимо от того, что делалось внутри <…> (почти - за исключением случая, когда исходная панель становится недоступной). Увы, пришлось делать проверку, плагиновая ли панель. Я писал, просил исправить (очень на баг похоже) - очень давно; увы - нет ответа.
Невьехал, какой статус-кво? выделенные файлы?
сейчас потестил на арклайте и обычных панелях, у меня все работает как ожидалось

Code: Select all

local the_dir = panel.GetPanelDirectory(nil, 0)
local res = panel.SetPanelDirectory(nil, 1, the_dir)
и каких неплагиновых панелях, обычных файловых что ли?
то что в мультиарке на пашет - это может проблемы МультиАрка? я не знаю, но выглядит логичным.
у меня в арклайте работает и фаиловых тож, но предлагаю разобраться
Т.е., как произвести пробелму без МультиАрка, с чем-то штатным?
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 11:12массив
buniak_a_h wrote: Mon 30 Mar, 2020 11:12 Не понял, в чём "увы и ах". Как я там писал, можно убрать поле key= и тогда он вообще не будет влиять на работу FAR-а
ну я его переназначил на другой кей допустим, но цель пользоваться Альтом/быстрый поиск+фильтр всегда и везде,
а не думать "ок сейчас я в файловой панели, значит такое нажатие, а сейчас я в архиве - значит другое нажатие делать"
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 10:45 Ещё доделаю поиск в свёрнутых" узлах. Я думаю, это тоже удобно будет…
будет невыразимо удобно, спасибо что двигаетесь в этом направлении
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 30 Mar, 2020 11:18 и каких неплагиновых панелях, обычных файловых что ли?
"файловая" тут некорректно говорить. Неплагиновые - это те, у которых APanel.Plugin=false
По сути - да, систему не понял, но иногда SetPanelDirectory то работает, то нет. Посмотрите в ClickToTitleDir - там приходится сначала делать SetPanelDirectory, а если не получается - то ли Panel.SetPath, то ли RedrawPanel. С МультиАрк-ом я уже понял, что именно он не поддерживает.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 10:43 Я с Обсервером незнаком. Можно ли получить листинг того, что открыто в Обсервере?
Он, вроде, не только архивы (в обобщённом смысле) показывает, но и медиа-файлы.
Обсервер - это считайте то же самое что АркЛайт/МултиАрк, но более всеяден, и например MSI АркЛайт тоже открывает, но не понимая его структуры делает "плоский" список содержимого, а Обсервер отображает с папаками, т.е. структурой MSI.
Да, можно и так сказать "кроме архивов открывает еще и кучу всего того что с некоторой натяжкой, но можно считать архивом" :)
viewtopic.php?t=4644
Считаю что это из списка полезнейших плагинов
Как задать использовать ли для архивов АркЛАйт или Обсервер (или что иное) :
ой.. не очень помню, кажется что тут:

Code: Select all

╔═══════ Plugins manager settings ═══════╗
║ [x] OEM plugins support                ║
║ [x] Scan symbolic links                ║
╟──────────── Plugin selection ──────────╢
║ [?] File processing                    ║
║   [x] Show standard association item   ║
║     [ ] Even if only one plugin found  ║
║ [x] Search results (SetFindList)       ║
║ [ ] Prefix processing                  ║
╟────────────────────────────────────────╢
║           { OK } [ Cancel ]            ║
╚════════════════════════════════════════╝
там где "?"
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 30 Mar, 2020 11:30 там приходится сначала делать SetPanelDirectory, а если не получается - то ли Panel.SetPath, то ли RedrawPanel
Хорошо что вы это победили
И что, это абсолютно рандомно, или можно найти закономерность, как-то воспроизвести?
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 30 Mar, 2020 11:22 не думать "ок сейчас я в файловой панели, значит такое нажатие, а сейчас я в архиве - значит другое нажатие делать"
1. Я - не думаю. У меня Alt вызывает мой поиск. Но если это мешает (хотите пользоваться стандартным Atl-поиском), добавьте в condition условие, что работает только в дереве (пример, как определить, панель дерева или нет, есть в TreePanel.lua, функция IsPanelModule).
2. Перехватить одиночное нажатие ALt-а, на которое назначен макрос (искаробочный AltSearch.lua) невозможно. Перехватить Alt+букву тоже. Париться с ещё одним макросом - думаю, очень накладно будет. А стандартный Alt-поиск на дереве у меня не заработал.
Post Reply

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