Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Drag&Drop на главной панели инструментов
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Wed Jun 17, 2026 00:37    Post subject: Drag&Drop на главной панели инструментов Reply with quote

Реализация Drag&Drop при помощи плагина Autorun. Скрипт предназначен для перетаскивания кнопок на главной панели инструментов и отображения дополнительной информации о кнопках, включая их индекс.

Информация о кнопках отображается в подсказке при наведении указателя мыши с удержанием Shift (можно сначала навести указатель на кнопку, затем нажать Shift). Перетаскивание работает с удержанием CTRL (нужен только для захвата, при перетаскивании удерживать не требуется), но только после отображения первой подсказки. Первый вызов подсказки загружает информацию о панели (из соответствующего bar-файла) для дальнейшей работы с ним. Сочетание CTRL + ПКМ вызывает контекстное меню с дополнительными опциями. Меню становится доступным только после загрузки информации о панели (отображения первой подсказки).

 Плагин Autorun

 autorun.cfg

 Bars.aucfg

Функционал дает возможность почувствовать, как на самом деле приятно ощущается drag'n'drop на панели. Странно, что сам Гислер не хочет его реализовывать, не смотря на то, что расчет координат для кнопок уже есть (копирование и вставка через меню, перетаскивание значков с файловой панели), а это ведь самое сложное.

 Скриншот


Добавлено от 17.06.2026.

В последней версии скрипта я исправил несколько багов, которые приводили к неправильному перетаскиванию кнопок. Пока проблем больше не вижу, но это не значит, что их нет или не может быть. Желательно делать резервные копии перед использованием.

Окно панели (класс TButtonBar в ТС х32 и класс Window в ТС х64) дает информацию только об имени файла панели без пути к нему. Это накладывает ограничения при работе с bar-файлами. Сейчас путь к файлу панели ищется только в корне ТС, подкаталоге \Bars и текущем каталоге активной (файловой) панели. Можно при помощи команды OPENBAR загрузить bar-файл на главную панель и работать с ним, но нужно иметь в виду возможный конфликт имён. При одинаковых именах bar-файлов функционал может не работать или даже вредить.

Функционал хоть и рабочий, но больше демонстрационный. Безопасно использовать только подсказку, которая ничем не навредит.

P.S. Если кому-то интересно, на скрине используется функционал раскрытия главной панели инструментов в несколько строк и загрузки иконок на главную панель.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Wed Jun 17, 2026 14:52    Post subject: Reply with quote

Orion9
Хорошо бы учесть при расчёте координат вариант с использованием переноса строки в панели инструментов (значение -2 в поле команды кнопки).
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Thu Jun 18, 2026 00:08    Post subject: Reply with quote

sa
Я разрывом на главной панели никогда не пользовался, поэтому и в функционал это не попало. Но да, надо будет подумать над разрывом в будущих версиях. Хотя код скрипта открыт, и даже комментарии кое-где имеются Very Happy

Еще раз хочу снять с себя ответственность за возможную порчу панели. Я скрипт изначально вынес из темы Autorun, чтобы больше пользователей могло видеть, какие продвинутые вещи можно делать на языке этого плагина. О простых вещах и говорить нечего. Но функционал может быть "бажным", что не удивительно. Даже Гислер опасается делать drag&drop из-за косячного переноса, притом что он имеет доступ ко всем внутренним структурам и ничем неограниченному языку программирования. Используя Autorun, приходится заниматься обратным инженегрингом и постоянным поиском лазеек, а дело это, как известно, весьма неблагодарное )
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Thu Jun 18, 2026 13:37    Post subject: Reply with quote

sa wrote:
значение -2 в поле команды кнопки

Думал, что без поллитра обойтись не получится (давно я этот алгоритм делал), но оказалось все проще. Нужно заменить два фрагмента в коде:
 Hidden text

 Hidden text

Есть два недостатка. Значение ключей "cmd" при сохранении в объект oCmd не сохраняются, а сохраняется только их размер (не знаю, зачем я так делал, наверное, хотел каким-то образом ускориться), в результате разрыв строки проверяется не по значению "-2", а по размеру 2. Но поскольку вероятность команды с двумя символами очень мала, пока оставил так, но нужно будет переделать.
Второй недостаток — индекс после разрыва показывает на начало следующего ряда, но это мелочь, хотя тоже в идеале нужно переделать.
В остальном вроде работает. Но как уже писалось, пока все это только на свой страх и риск Smile

Забыл упомянуть, что в модуле действует клавиша CapsLock. Она закрепляет Shift, чтобы не держать его каждый раз при вызове подсказки.

Если руки доберуться, добавлю больше комментариев в модуль со временем, особенно если косяков больше не обнаружится и если Гислер вдруг сам не сделает Drag&Drop на панели Very Happy
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Fri Jun 19, 2026 10:48    Post subject: Reply with quote

Orion9 wrote:
давно я этот алгоритм делал
Я подумал, что скрипт выложен по горячим следам...

Остался пока на начальной версии.
Для неё, чтобы всё правильно работало, в панели инструментов забивал строки (до разрыва -2) дополнительными кнопками (у меня TC развёрнут на весь экран).
Вот на такой панели с добавленными кнопками, версия с исправлениями и дала сбои с определением индекса (вплоть до того, что у всех кнопок третьей строки он повторялся, хотя отладочная карта панели выглядела правильно).
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Fri Jun 19, 2026 12:47    Post subject: Reply with quote

sa wrote:
Я подумал, что скрипт выложен по горячим следам

Да нет. Еще осенью делал этот алгоритм, но были разные баги, поэтому скрипт долго находился в теме Autorun. В последней версии у меня получилось исправить эти баги и я довольно долго тестировал, прежде чем открыть тему в разделе автоматизации, но, видимо, недостаточно долго Very Happy
sa wrote:
Остался пока на начальной версии.

Мне пока не удалось воспроизвести этот косяк, но уверен, что он есть. Так-то оно вроде работает, ниже на скрине это видно. Косяк, о котором я писал, тоже проявляется. Пустое поле за разделителем строк определяет индекс кнопки в следующем ряду, в результате перенос за разделитель приводит к переносу в следующий ряд на второе место. Это, конечно, мелочь, но Гислера-то все работает (первое действие вырезки и вставки) Very Happy
 Скрин

Вообще реально удивляет: алгоритм с расчетом есть, а драгендропа нет Shocked Притом что алгоритм для расчета координат кнопок в разы сложнее, чем drag&drop. Drag&drop - это буквально полтора-два десятка строк в скрипте.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Fri Jun 19, 2026 17:55    Post subject: Reply with quote

Возможно, моя проблема с кнопками разрыва строки возникает из-за того, что при расчёте индекса кнопки неверно учитывается ширина кнопок разрыва, которая берётся из расчёта 1/3 ширины кнопки (как для обычного разделителя), а на самом деле равна 0.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Sat Jun 20, 2026 00:23    Post subject: Reply with quote

sa
А какие дополнительные кнопки вы добавляли перед разрывом, тоже разрывы? Да, я такое не проверял, пришлось доставать заначку, те самые поллитра Very Happy В общем, сделал что-то, сам не понял что, но вроде работает, хотя тоже не без изъянов.

 Скрин

Если закидывать за разделитель, то кнопка попадает в следующий ряд, но хотя бы на первое место. Если такое поведение сбивает с толку, то лучше не закидывать через разделитель Very Happy

Понятно, что в перспективе, скорее всего, придется пересматривать алгоритм. Но пока лучше обойтись малой кровью. Нужно заменить фрагмент
 Hidden text

На:
 Hidden text
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Sat Jun 20, 2026 13:09    Post subject: Reply with quote

Опохмелился немного с утра... Smile

В общем, если добавить одну строку между
Code:
If DragIdx < DropIdx Then
   For i = DragIdx + 1 To DropIdx

Т.е.
Code:
If DragIdx < DropIdx Then
   If gHBarMap[DropIdx-1] = -2 Then DropIdx -= 1
   For i = DragIdx + 1 To DropIdx

То теперь работает корректно, почти как у Гислера

 Hidden text

Но у Гислера все-равно лучше и правильнее. У него работает так: если при вставке кнопки указатель мыши ближе к левому краю, то вставка происходит перед этой кнопкой; если ближе к правому, то после этой кнопки. В скрипте не так. Если индекс перетаскиваемой кнопки больше индекса вставляемой кнопки, то новая кнопка встанет перед старой. Если индекс меньше, то кнопка встанет после.

Есть еще один баг, на скрине он виден. Если панель заканчивается разрывом -2, то перенос за такой разрыв приводит к потере кнопки. Для такого случая нужно отдельно вводить условие, но пока в ближайшее время не смогу поковыряться. Случай, конечно, больше надуманный, однако его тоже надо предусмотреть.

В общем, уже лучше. Но еще есть над чем работать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Mon Jun 22, 2026 13:48    Post subject: Reply with quote

Мда, надеялся, с наскока получится все решить, но увы.

Добавил небольшую приблуду для первой и последней кнопки

 Hidden text

 Полный модуль

Но все-равно в последний ряд кнопка не встает из-за ограничений, введенных ранее, но теперь она хотя бы не теряеется и встает корректно перед разделителем. Чтобы переместить кнопку в последний ряд после разделителя (разрыва), придется использовать вырезку и вставку

 Hidden text

Пока такие ограничения. Возможно, такими они и остануться, ибо не велика беда Smile
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Mon Jun 22, 2026 15:09    Post subject: Reply with quote

Orion9 wrote:
А какие дополнительные кнопки вы добавляли перед разрывом, тоже разрывы?

Нет, обычные.
Вот для простоты пример со стандартной панелью инструментов TC. Вставляем в неё два разрыва (после кнопок "Назад" и "Поиск файлов") и уменьшаем окно TC по горизонтали до размера, чтобы в верхней строке не оставалось места для ещё одной кнопки:
https://disk.yandex.ru/i/BDsT9hxN5UCEkg
Получаем повторяющийся индекс (23) для всех кнопок нижней строки.
Стоит немного расширить окно - результат нормальный:
https://disk.yandex.ru/i/l8xxs088-qCYLw
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Mon Jun 22, 2026 19:51    Post subject: Reply with quote

sa wrote:
Получаем повторяющийся индекс (23) для всех кнопок нижней строки.

Да, понял теперь. Удалось повторить эту проблему.

В общем-то, вы были правы: нулевая ширина определялась неправильно, а вернее, она вообще не определялась (просто не была предусмотрена).

Обновленный фрагмент кода, начиная с абстрактных координат

 Hidden text

Я там поудалял лишние gHBarMap[i] = -2 (сразу на трезвую голову тяжело думается), да и переменные надо заменить на нормальные, а не эти cx, ex, что это вообще такое, ассемблер что ли Laughing

Я тут заметил еще, что в ТС х64 подсказка тотала не удаляется и тем самым мешаеет часто, сразу забыл для этой версии сделать
Code:
# удаление подсказки тотала
Local hTip = WinFind(0, auX64 ? "HintWindow" : "TToolTip")

 Полный последний модуль

Функционал - топ. Жаль, что Гислер сам не хочет его делать. Особенно мне нравится, что разделители можно преносить наряду с другими кнопками и разрывами.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Mon Jun 22, 2026 22:18    Post subject: Reply with quote

Orion9 wrote:
Полный последний модуль

Этот вариант как будто работает с переносами строк! Спасибо за терпение!
А левую/правую половину кнопки (как у Гислера) сложно будет учесть при переносе? Или заначка закончилась уже?Smile
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1173

Post (Separately) Posted: Tue Jun 23, 2026 00:29    Post subject: Reply with quote

sa wrote:
А левую/правую половину кнопки (как у Гислера) сложно будет учесть при переносе? Или заначка закончилась уже?

Заначка-то всегда найдется, но для таких случаев нужен особый вид цифрового опьянения — тот самый грув, под который сам Гислер отжигал в лучшие годы на танцполе )

 Mo-Do

Если серьезно, то можно, конечно, сделать. Переменная tx указывает текущие координаты мыши в абстрактной плоскости, а cx обозначает границу текущей кнопки. Если отнять от сх ширину текущей кнопки, то получится нижняя граница кнопки. Останется только посмотреть к чему ближе tx — к верхней границе или к нижней.

Однако не все так просто. Еще придется переделывать HBarDragnDrop (сборку новой панели) с учетом возможных отклонений индекса в ту или иную сторону, а это чуть сложнее.

В общем, можно будет подумать, хотя мне текущий вариант тоже по-своему нравится. Хотелось бы только убедиться, что косяков больше нету. Парочку мы отловили, но это не значит, что других нет Smile Нужно больше тестов, а алгоритм я так и так буду пересматривать, чтобы избавится от этих cx, ex и т.п. Именно из-за них и пришлось поднимать поллитра (из-за трудночитаемасти алгоритма с такими малоинформативными именами), будто не сам это делал, фактически заново пришлось вникать )
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2738

Post (Separately) Posted: Tue Jun 23, 2026 09:36    Post subject: Reply with quote

Orion9 wrote:
Перетаскивание работает с удержанием CTRL

С самого начала поменял у себя на SHIFT - как-то привычнее для перетаскивания и, наоборот, вместо Shift назначил Ctrl. Глядишь, со временем CTRL для операции копирования пригодится Smile.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group