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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 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 - давно забытая утилитка. Получился довольно небольшой и вполне пригодный модуль. Позволяет открывать-закрывать узлы дерева, задавать глубину, на которую первоначально открываются узлы; просматривать в пассивной панели текущую папку и переходить в панели дерева на выбранную папку.



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

Версия 1.4.2
  1. Полностью реализован функционал при работе с деревом плагина ArcLite (открытие текущей папки на пассивной панели, выход из дерева с переходом на текущую папку)
  2. Очередная попытка навести порядок с корневой папкой при старте модуля и с папкой возврата.
  3. Реализовано восстановление позиций как активной, так и пассивной панелей.
  4. Для плагиновой (ArcLite) панели реализовано автоматическое открытие пути от корневой папки к текущей и позиционирование на ней при старте дерева.
  5. Изменена логика открытия узлов дерева при старте: "свёрнутыми" делаются не только узлы заданного уровня вложенности, но и все, входящие в них.
  6. При вызове по префиксу с указанием корневого пути (например, ptree:C:\%TEMP%), если текущая папка является вложенной по отношению к указанной в командной строке, дерево автоматически позиционируется на текущей папке.
  7. Добавлена возможность "косвенного" указания дерева в командной строке:
    ptree:@"<имя_файла_дерева>"
    где имя_файла_дерева - имя файла - результата вывода системной утилиты tree.com.
    *) Этот синтаксис делает возможным использование кэша… Ну, правда, пока только в полуавтоматическом режиме.
TreePanel_1_4_2.7z
(11.96 KiB) Downloaded 15 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Fri 10 Apr, 2020 15:36, edited 13 times in total.

citRiks
Posts: 672
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 196 times
Been thanked: 44 times

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

Post by citRiks »

Latest post of the previous page:

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

А то next() выглядит больше как тотальное сканирование,
хоть и по отсортированному оно конечно лучше чем по неотсортированном

Проблема бинарного поиска еще и в том что он не умеет искать по средней части строки,
например найти все папки *\some_folder*\*
Last edited by citRiks on Sun 12 Apr, 2020 14:12, edited 1 time in total.
А кто не поверит в наше миролюбие,
Тот кровью умоется.
И будет такая борьба за мир,
Что камня на камне не останется.

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

citRiks wrote:
Sun 12 Apr, 2020 14:10
next() выглядит больше как тотальное сканирование
Это и есть тотальное сканирование. И я его не использую. Я привёл его только как доказательство (некорректное, кстати!), что движок Lua сортирует хэшированные таблицы по индексу.
И, кстати, Вы писали про хэш-таблицы. Так вот: возможно, Lua заводит как раз для Lua-таблицы связанную с ней хэш-таблицу; именно за счёт этого (а также за счёт получения значения. Item[j].FileName - трудоёмкая операция) и получается скорость.
Last edited by buniak_a_h on Sun 12 Apr, 2020 14:21, edited 1 time in total.

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

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

Post by zg »

buniak_a_h wrote:
Wed 15 Apr, 2020 18:50
citRiks, я, наверно, неясно высказался.
Проблема не в событии смены папки (да хоть по таймеру проверять!). А в том, что функция panel.RedrawPanel, при помощи которой можно переместить указатель, требует либо хендлера (которого нету), либо whatpanel - призак активной-пассивной панели. Который без описанных мной танцев с бубнами тоже не определить.
вот я скачал ваш скрипт и вызова panel.RedrawPanel там не обнаружил. в каком месте вам нужно его вызывать?

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

zg, я не стал реализовывать такой функционал. Пока.
Если Вы всерьёз, то поищите места по IsPanelModule в этом скрипте и в "сопряжённом (поиск) скрипте BAX_QSearch.lua по слову ModuleId - это именно поиск панели, которые выводит панельный модуль. Если б был хендлер панели, который заносился бы в Open (хотя эта функция почему-то у меня не вызывается. Но это - уже следующий вопрос) - поиск был бы легче. Да и вообще на самом деле все функции таблицы panel были бы заточены на нужную панель по хендлеру. Например, ClosePanel вызывается для активной панели. Но ведь панель можно закрыть и находясь на другой (по AltF1/AltF2, например). И тогда это работать не будет.

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

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

Post by zg »

buniak_a_h wrote:
Thu 16 Apr, 2020 01:01
Если Вы всерьёз
нет, сейчас всем будет очень смешно.
buniak_a_h wrote:
Thu 16 Apr, 2020 01:01
то поищите места по IsPanelModule в этом скрипте
поискал. т.е. вам нужно вызвать panel.RedrawPanel для вашей же панели из mod.ClosePanel и mod.GetFindData. я правильно понимаю?

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

И из "внешнего" по отношению к mod скрипта, которому эта панель передана при "регистрации" (регистрация - из mod.ProcessPanelInput, далее BAX_QSearch как бы "знает"нужную панель.)

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

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

Post by zg »

buniak_a_h wrote:
Thu 16 Apr, 2020 05:00
mod.ProcessPanelInput
даже так. а перерисовать вам надо вашу же панель или какую-то другую?

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

zg wrote:
Thu 16 Apr, 2020 07:22
даже так.
В ProcessPanelInput - только "регистрация" - передача панели (GUID модуля панели и функций фильтрации/поиска) в другой скрипт. Тот его запоминает и использует для некоторых операций. В частности, для определения, доступен ли фильтр или только поиск, и функции фильтрации/поиска
zg wrote:
Thu 16 Apr, 2020 07:22
вашу же панель или какую-то другую?
Мою, но я не всегда знаю, активная она или нет
Last edited by buniak_a_h on Thu 16 Apr, 2020 10:20, edited 1 time in total.

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

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

Post by zg »

buniak_a_h wrote:
Thu 16 Apr, 2020 10:19
Мою, но я не всегда знаю, активная она или нет
это не нужно.
вот смотрите, из вашего же скрипта function mod.ProcessPanelInput (object, handle, Rec) и из док result = panel.RedrawPanel (handle, whatpanel [, redrawinfo]) и для второй функции вам нужен хендл, да? вы ничего не замечаете? подсказка: то что надо заметить находится между первой и второй запятой в первом куске кода.

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

zg, спасибо.

DV
Posts: 416
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 18 times
Been thanked: 14 times

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

Post by DV »

Вариант без использования tree.com отложен ввиду отсутствия очевидных преимуществ?

Post Reply

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