Page 2 of 2

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

Posted: Sun 15 Dec, 2013 18:28
by Shmuel

Latest post of the previous page:

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

Примечание модератора:
Код макроса перенесён в шапку темы.

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

Posted: Mon 09 May, 2016 21:05
by HaRT
Представляю на суд общественности свой вариант, сделанный на основе выложенного в шапке.
Отличия:
1. Добавлены горячие клавиши от 0 до Z, далее просто выравнивание пробелами.
2. Выбор элемента означает не переход в директорию, а переход на директорию — об этом напоминает отсутствие разделителя (‘\’) на концах путей.
3. При попытке перехода на саму букву диска открывается меню дисков.
4. Макрос назначен на AltPgUp.

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

Posted: Fri 20 Apr, 2018 19:41
by siberia-man
Еще один вариант макроса. Причины написания:
1. Во всех предыдущих реализациях список "перевернут" - вершина дерева директорий расположена снизу
2. Было желание расширить функционал макроса функционалом дерева каталогов (примерно так как это сделано в Проводнике или Редакторе реестра)

Первое решается легко, а вот второе - трудоемеко и лениво: надо отрисовывать пункты меню с учетом вложенности каждого элемента. Оставляю идею здесь. Возможно, кто-то подхватит и реализует.
  1.  
  2.  
  3. -- https://forum.farmanager.com/viewtopic.php?p=149194#p149194
  4.  
  5.  
  6.  
  7. ---------------------------------------------------------------------------
  8.  
  9.  
  10.  
  11. local FARPANEL_BRODER_WIDTH_LEFT = 1
  12.  
  13. local FARPANEL_BRODER_WIDTH_RIGHT = 1
  14.  
  15.  
  16.  
  17. local FARMENU_BORDER_WIDTH_LEFT = 5
  18.  
  19. local FARMENU_BORDER_WIDTH_RIGHT = 6
  20.  
  21.  
  22.  
  23. ---------------------------------------------------------------------------
  24.  
  25.  
  26.  
  27. local OMIT = "..."
  28.  
  29. local oLen = string.len(OMIT)
  30.  
  31.  
  32.  
  33. function string.shrink(s, width)
  34.  
  35.     local sLen = string.len(s)
  36.  
  37.     return sLen <= width and s or OMIT .. string.sub(s, sLen - width + oLen + 1)
  38.  
  39. end
  40.  
  41.  
  42.  
  43. ---------------------------------------------------------------------------
  44.  
  45.  
  46.  
  47. local function FillTable(t, path, width)
  48.  
  49.     local pLen = string.len(path)
  50.  
  51.     local pos = 0
  52.  
  53.  
  54.  
  55.     repeat
  56.  
  57.         pos = string.find(path, "\\", pos + 1, true)
  58.  
  59.  
  60.  
  61.         local s = string.sub(path, 1, pos and pos or pLen)
  62.  
  63.         if s == "" then s = "\\" end
  64.  
  65.  
  66.  
  67.         local sLen = string.len(s)
  68.  
  69.         table.insert(t, {
  70.  
  71.             path = s;
  72.  
  73.             text = string.shrink(s, width);
  74.  
  75.         })
  76.  
  77.     until not pos or pos >= pLen
  78.  
  79. end
  80.  
  81.  
  82.  
  83. ---------------------------------------------------------------------------
  84.  
  85.  
  86.  
  87. local function ShowMenu()
  88.  
  89.     local items = {}
  90.  
  91.  
  92.  
  93.     -- max width for the menu items
  94.  
  95.     local width = APanel.Width - FARMENU_BORDER_WIDTH_LEFT - FARMENU_BORDER_WIDTH_RIGHT
  96.  
  97.  
  98.  
  99.     FillTable(items, APanel.Path0, width)
  100.  
  101.  
  102.  
  103.     if APanel.Plugin then
  104.  
  105.         table.insert(items, { separator = true })
  106.  
  107.         FillTable(items, APanel.Path, width)
  108.  
  109.     end
  110.  
  111.  
  112.  
  113.     local item = far.Menu({
  114.  
  115.         Title = "Go to...";
  116.  
  117.         SelectIndex = #items;
  118.  
  119.         -- Fit the menu into the width of the active panel taking into account the border widths
  120.  
  121.         X = ( APanel.Left and 0 or PPanel.Width ) + FARPANEL_BRODER_WIDTH_LEFT + FARPANEL_BRODER_WIDTH_RIGHT;
  122.  
  123.     }, items)
  124.  
  125.  
  126.  
  127.     if item then Panel.SetPath(0, item.path) end
  128.  
  129. end
  130.  
  131.  
  132.  
  133. ---------------------------------------------------------------------------
  134.  
  135.  
  136.  
  137. if Macro == nil then
  138.  
  139.     ShowMenu()
  140.  
  141.     return
  142.  
  143. end
  144.  
  145.  
  146.  
  147. Macro {
  148.  
  149.     description = "Shell: Cd Up (Light)";
  150.  
  151.     area = "Shell";
  152.  
  153.     key = "AltPgUp";
  154.  
  155.     --condition = function() return APanel.Visible end;
  156.  
  157.     action = ShowMenu;
  158.  
  159. }
  160.  
  161.  
  162.  
  163. ---------------------------------------------------------------------------
  164.  
  165.  
  166.  
  167. -- EOF

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

Posted: Fri 20 Apr, 2018 20:51
by HaRT
Ха, оказывается, я забыл тогда выложить свою обновлённую версию, где к корню диска движемся вверх (и это включено по умолчанию).

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

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

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

Posted: Fri 16 Nov, 2018 13:23
by John Doe
HaRT wrote: Fri 20 Apr, 2018 20:51 1. Добавлена опция, чтобы отображать только последний компонент пути.
Идея: псевдодерево

Code: Select all

╔═════════ Go up to ... ═════════╗
║  e G:                          ║
║  d └Public                     ║
║  c  └Software                  ║
║  b   └Shells                   ║
║  a    └Far                     ║
╟────────────────────────────────╢
║  9 Far30b5193.x86.20180416.msi ║
...
╚═════════ Shift-/Enter ═════════╝

Code: Select all

╔═════════ Go up to ... ═════════╗
║  a    ┌Far                     ║
║  b   ┌Shells                   ║
║  c  ┌Software                  ║
║  d ┌Public                     ║
║  e G:                          ║
╟────────────────────────────────╢
║  9 Far30b5193.x86.20180416.msi ║
...
╚═════════ Shift-/Enter ═════════╝

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

Posted: Fri 16 Nov, 2018 13:32
by HaRT
John Doe wrote: Fri 16 Nov, 2018 13:23 Идея: псевдодерево
Если/когда кто-то соберётся это делать, можно параметризовать 2 символами: └┌. Если строка пустая, значит без псевдодерева; если задан только один (например, +), он используется в обоих случаях.

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

Posted: Fri 16 Nov, 2018 13:58
by John Doe
можно параметризовать 2 символами:
Символ ведь зависит от displayDirsRootToCurrent.
HaRT wrote: Fri 16 Nov, 2018 13:32 Если/когда кто-то соберётся это делать,
Очень быстрый хак:

Code: Select all

local symbol = Options.displayDirsRootToCurrent and "└" or "┌"
local function attachText( v )
    --...skipped...--
    local level = select(2,v.path:gsub("\\","\\"))
    local branch = level==0 and "" or (" "):rep(level-1)..symbol
    v.text = '&' .. v.hotkey .. ' ' .. branch .. path
  end
end

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

Posted: Fri 16 Nov, 2018 14:18
by HaRT
John Doe wrote: Fri 16 Nov, 2018 13:58
можно параметризовать 2 символами:
Символ ведь зависит от displayDirsRootToCurrent.
Именно поэтому я и веду речь про два символа, а не про один. А если они не заданы, то и псевдодерево не надо выводить.