Меню со списком родительских папок (CD up)

Здесь выкладываются готовые к использованию макросы и скрипты.
Shmuel
Posts: 5538
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 182 times

Re: Меню со списком родительских папок (CD up)

Post by Shmuel » Sun 15 Dec, 2013 18:28

Latest post of the previous page:

DV wrote:Портировал ли кто этот (или подобный) макрос под FAR3?
Независимая реализация той же функциональности + выравнивание по правому краю слишком длинных пунктов меню:

Примечание модератора:
Код макроса перенесён в шапку темы.
Last edited by Shmuel on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Edit

User avatar
HaRT
Moderator
Posts: 8476
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 74 times
Been thanked: 136 times

Меню со списком родительских папок (CD up)

Post by HaRT » Mon 09 May, 2016 21:05

Представляю на суд общественности свой вариант, сделанный на основе выложенного в шапке.
Отличия:
1. Добавлены горячие клавиши от 0 до Z, далее просто выравнивание пробелами.
2. Выбор элемента означает не переход в директорию, а переход на директорию — об этом напоминает отсутствие разделителя (‘\’) на концах путей.
3. При попытке перехода на саму букву диска открывается меню дисков.
4. Макрос назначен на [b]AltPgUp[/b].
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Опубликована версия 2016.05.10.1; изменения смотри в начале исходного кода (по-английски).
Фар есть инструмент, а не нянька. © 2009 DrKnS

siberia-man
Posts: 86
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Меню со списком родительских папок (CD up)

Post by siberia-man » Fri 20 Apr, 2018 19:41

Еще один вариант макроса. Причины написания:
1. Во всех предыдущих реализациях список "перевернут" - вершина дерева директорий расположена снизу
2. Было желание расширить функционал макроса функционалом дерева каталогов (примерно так как это сделано в Проводнике или Редакторе реестра)

Первое решается легко, а вот второе - трудоемеко и лениво: надо отрисовывать пункты меню с учетом вложенности каждого элемента. Оставляю идею здесь. Возможно, кто-то подхватит и реализует.
  1.  
  2. -- https://forum.farmanager.com/viewtopic.php?p=149194#p149194
  3.  
  4. ---------------------------------------------------------------------------
  5.  
  6. local FARPANEL_BRODER_WIDTH_LEFT = 1
  7. local FARPANEL_BRODER_WIDTH_RIGHT = 1
  8.  
  9. local FARMENU_BORDER_WIDTH_LEFT = 5
  10. local FARMENU_BORDER_WIDTH_RIGHT = 6
  11.  
  12. ---------------------------------------------------------------------------
  13.  
  14. local OMIT = "..."
  15. local oLen = string.len(OMIT)
  16.  
  17. function string.shrink(s, width)
  18.     local sLen = string.len(s)
  19.     return sLen <= width and s or OMIT .. string.sub(s, sLen - width + oLen + 1)
  20. end
  21.  
  22. ---------------------------------------------------------------------------
  23.  
  24. local function FillTable(t, path, width)
  25.     local pLen = string.len(path)
  26.     local pos = 0
  27.  
  28.     repeat
  29.         pos = string.find(path, "\\", pos + 1, true)
  30.  
  31.         local s = string.sub(path, 1, pos and pos or pLen)
  32.         if s == "" then s = "\\" end
  33.  
  34.         local sLen = string.len(s)
  35.         table.insert(t, {
  36.             path = s;
  37.             text = string.shrink(s, width);
  38.         })
  39.     until not pos or pos >= pLen
  40. end
  41.  
  42. ---------------------------------------------------------------------------
  43.  
  44. local function ShowMenu()
  45.     local items = {}
  46.  
  47.     -- max width for the menu items
  48.     local width = APanel.Width - FARMENU_BORDER_WIDTH_LEFT - FARMENU_BORDER_WIDTH_RIGHT
  49.  
  50.     FillTable(items, APanel.Path0, width)
  51.  
  52.     if APanel.Plugin then
  53.         table.insert(items, { separator = true })
  54.         FillTable(items, APanel.Path, width)
  55.     end
  56.  
  57.     local item = far.Menu({
  58.         Title = "Go to...";
  59.         SelectIndex = #items;
  60.         -- Fit the menu into the width of the active panel taking into account the border widths
  61.         X = ( APanel.Left and 0 or PPanel.Width ) + FARPANEL_BRODER_WIDTH_LEFT + FARPANEL_BRODER_WIDTH_RIGHT;
  62.     }, items)
  63.  
  64.     if item then Panel.SetPath(0, item.path) end
  65. end
  66.  
  67. ---------------------------------------------------------------------------
  68.  
  69. if Macro == nil then
  70.     ShowMenu()
  71.     return
  72. end
  73.  
  74. Macro {
  75.     description = "Shell: Cd Up (Light)";
  76.     area = "Shell";
  77.     key = "AltPgUp";
  78.     --condition = function() return APanel.Visible end;
  79.     action = ShowMenu;
  80. }
  81.  
  82. ---------------------------------------------------------------------------
  83.  
  84. -- EOF
Last edited by siberia-man on Fri 20 Apr, 2018 19:41, edited 1 time in total.

User avatar
HaRT
Moderator
Posts: 8476
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 74 times
Been thanked: 136 times

Меню со списком родительских папок (CD up)

Post by HaRT » Fri 20 Apr, 2018 20:51

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

Отличия от версии 2016.05.10.1:
1. Добавлена опция, чтобы отображать только последний компонент пути. По умолчанию ВКЛ.
2. Добавлена опция, чтобы отображать директории от корня диска к текущей сверху вниз. По умолчанию ВКЛ.
3. Меню присвоен GUID.
4. Добавлена возможность перехода на выбранный элемент на пассивную панель по ShiftEnter. Это реализовано только для путей в настоящей ФС (в противоположность «виртуальным» ФС, эмулируемым панельными плагинами).
5. Документация: добавлены TODO (см. исходник ниже).
6. Внутренне: улучшена декомпозиция кода, удалён ненужный код, добавлена диагностика.

Пока нет поддержки для плагиновых панелей, где разделитель не \, например, NetBox.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Post Reply

Return to “Полезные макросы и скрипты”