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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 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.5
  1. Исправлена ошибка, возникавшая при перестроении всего дерева по клавише Ctrl+R (обновить). Кроме того, по этой клавише возможно обновление кэша.
  2. При выходе из дерева состояние другой панели теперь восстанавливается только в случае, если включено немедленное открытие текущего каталога на противоположной панели.
  3. Добавлен минимальный контроль актуальности данных о папке в кэше: если в корневой папке имеются подпапки, а дерево формируется пустым, то выводится сообщение о критической неактуальности кэша и предлагается его перестроить. В случае отказа только перестраивается в памяти ветка корневого каталога дерева.
  4. При обновлении дерева по Ctrl+R также предлагается обновить кэш диска.
  5. Экспериментально!] При смене каталога на другой (не_древесной) панели (если она активна) указатель в дереве переносится на соответствующий узел дерева; при этом он помечается символом «►».
TreePanel_2_6_5.7z
(30.63 KiB) Downloaded 12 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Tue 17 Nov, 2020 18:12, edited 35 times in total.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

Latest post of the previous page:

Вышла версия 2.6.2. В этой версии:
  1. Изменены некоторые хоткеи. В частности, CtrlEnter теперь не открывает текущую папку на пассивной панели, а сносит имя текущей папки в командную строку (стандартное действие для панели); CtrlF не открывает диалог поиска, а сносит полный путь к текущей папке в командную строку (тоже стандартное действие), а поиск начинается по клавише F7.
  2. Исправлены неточности первоначального позиционирования в дереве.
  3. Панели плагинов MultiArc и Observer приравнены (с точки зрения ограничения) к панели плагина ArcLite.
  4. Рефакторинг.
DV
Posts: 437
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 23 times
Been thanked: 15 times

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

Post by DV »

Спасибо за обновление!
Случайно обнаружил, что если в панели поиска (F7) сначала выбрать режим "Фильтр" и затем в отфильтрованной панели дерева нажать на любом элементе стрелку влево (клавишу "стрелка влево"), то получаем ошибку: "TreePanel.lua:1026: attempt to index local 'ItemI' (a nil value)".
Также не понял, возможно ли из режима "Фильтр" вернуться обратно в режим "Поиск", чтобы в панели дерева отображались все элементы, а не только отфильтрованные.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

DV, на режим фильтрации я не получил ни одной реакции, думал - никого не интересует. Сделал первый (стартовый) вариант и оставил со знакомыми мне недоделками. Ок, займусь.
Для снятия фильтра, вроде, работает такой алгоритм: инициировать поиск, там мышкой переключиться на фильтр Или просто закрыть диалог фильтрации (Esc, Enter) и инициировать его снова (в "древесной" панели это - Ctrl+F7). Неудобно, конечно. Просто пока не приходит в голову, как лучше. Очень не хочется городить полный диалог. Ну, раз есть спрос - буду думать.
DV
Posts: 437
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 23 times
Been thanked: 15 times

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

Post by DV »

Интуитивно я предполагал, что изменение режима "Поиск" на "Фильтр" (и наоборот) нажатием мышки или выбором с клавиатуры моментально меняет отображение панели дерева (в режиме "Поиск" - все элементы, в режиме "Фильтр" - только отфильтрованные).
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

Вышла версия 2.6.3. В ней:
  1. Исправлена ошибка, приводившая к вылету при активном фильтре и попытке выйти на узел верхнего уровня,
    если он (узел) не виден из-за наложенного фильтра. Ошибка описана тут.
  2. Реализовано составление дерева для контейнеров, не поддерживаемых утилитой 7z. Проверено для случаев: контейнер - msi-пакет и виртуальный диск для vmware; открыты плагином Observer (отдельная благодарность citRiks-у за напоминание о far.Host)
  3. Реализовано закрытие дерева по повторному нажатию Ctrl+T (если дерево уже открыто)
  4. Оптимизация, рефакторинг
Last edited by buniak_a_h on Sun 15 Nov, 2020 12:16, edited 1 time in total.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

Вышла версия 2.6.4. В версии:
  1. Реализована возможность копирования файла в папку, соответствующую текущему узлу дерева. Имя папки назначения подставляется в диалог копирования вместо имени формата папки плагина.
  2. Реализован переход на узел того же уровня, имеющий того же предка (sibling node). Для этого предусмотрены клавиши Alt+↑ и Alt+↓
  3. Добавлена возможность выводить столбец с количеством файлов в папке, соответствующей узлу дерева.
Last edited by buniak_a_h on Mon 16 Nov, 2020 03:25, edited 1 time in total.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

Вышла версия 2.6.5
В версии:
  1. Исправлена ошибка, возникавшая при перестроении всего дерева по клавише Ctrl+R (обновить). Кроме того, по этой клавише возможно обновление кэша.
  2. При выходе из дерева состояние другой панели теперь восстанавливается только в случае, если включено немедленное открытие текущего каталога на противоположной панели.
  3. Добавлен минимальный контроль актуальности данных о папке в кэше: если в корневой папке имеются подпапки, а дерево формируется пустым, то выводится сообщение о критической неактуальности кэша и предлагается его перестроить. В случае отказа только перестраивается в памяти ветка корневого каталога дерева.
  4. При обновлении дерева по Ctrl+R также предлагается обновить кэш диска.
  5. Экспериментально!] При смене каталога на другой (не_древесной) панели (если она активна) указатель в дереве переносится на соответствующий узел дерева; при этом он помечается символом «►».
citRiks
Posts: 899
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 274 times
Been thanked: 47 times

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

Post by citRiks »

Спасибо что улучшаете :)
надо бы запилить что-то менее потребляющее память,
Мне показалось что "древесные" структуры хорошо (эффективно) хранятся в CDB
http://cr.yp.to/cdb.html
https://github.com/istr/lua-cdb
И сделать "ленивую" (отложенную) загрузку из CDB по мере переходов по дереву.
хотя это может быть мой лишний перфекционизм
Надеюсь когда-нибудь сам доберусь до этого
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

citRiks, несколько вопросов.
1. Чем CDB лучше SQLite? или это вопрос из серии "что лучше - красное или мягкое"?
2. Чем в плане потребления памяти поможет хранение в БД, если применяется «отложенная загрузка»? Или имеется в виду случай, когда не потребуется загрузка дерева всего диска?
К первому вопросу: очень не хочется подключать какие-то "левые" продукты. Чем хорош макрос: всё доступно и достаточно. Но если SQLite, хоть и не входит в поставку FAR-а, но более распространён. Хотя мне это всё равно не нравится…
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

citRiks, Вы писали где-то про изменение порядка построения дерева (не вглубь, а вширь). В принципе, я реализовал такой подход, но наткнулся на несколько "особенностей", сводящих преимущества на "нет":
1. far.RecursiveSearch с флагом FRS_RECUR обеспечивает обход всего дерева за один вызов функции, но, есессно, "вглубь". Для того, чтобы реализовать обход диска "вширь", надо не использовать рекурсивный поиск внутри функции, а читать только список одного каталога, затем снова вызывать far.RecursiveSearch для получения списка папок первого уровня, затем для каждой папки 1-го уровня вызывать снова far.RecursiveSearch для получения списка папок 2-го уровня и т.д. При этом теряется преимущество эффективной реализации far.RecursiveSearch, что резко снижает быстродействие.
2. На системном диске имеется "рекурсивная" организация папок и линков таким образом, что просто обход зацикливается. Либо надо запрещать обход линков, либо запоминать реальные пути и проверять, были ли мы здесь. Первый вариант - линки не отобразятся дереве; второй - тормоза кошмарные. Как это делает far.RecursiveSearch - я не проверял. Но как-то делает.
P/S. Чтобы запретить сканирование симлинков достаточно просто не указывать флаг FRS_SCANSYMLINK. А для идеологии "вширь" надо проверять именно атрибуты папки. Это наверняка ещё замедлит процедуру.
Резюмирую.
Единственный способ получить выигрыш из чтения папок "вширь" - это начальное чтение на небольшую глубину, а затем дочитывание в фоне. Но Вы сами почему-то были резко против фонового чтения…
Post Reply

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