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 Previous  1, 2, 3, 4
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
sa



Joined: 29 Apr 2009
Posts: 2753

Post (Separately) Posted: Thu Jul 16, 2026 11:28    Post subject: Reply with quote

Orion9 wrote:
Попробовал как с включеннной кнопкой истории, так и выключенной.
Я ещё и без заголовка файловой панели пробовал.
Можно использовать и 2926 (Цепочки навигации: вкл/выкл) и 2910 (Командная строка: вкл/выкл) и т.п.

Orion9 wrote:
В usercmd.ini нужна команда
У меня команда заработала, когда вместо %A0 записал просто %A.

Orion9 wrote:
Вроде удобно.
Да, хорошо!
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1207

Post (Separately) Posted: Thu Jul 16, 2026 14:14    Post subject: Reply with quote

sa wrote:
Можно использовать и 2926 (Цепочки навигации: вкл/выкл) и 2910 (Командная строка: вкл/выкл) и т.п.

Ну, пока и так работает Very Happy Целый час вчера гонял. Нельзя назвать это стресс-тестом панели, конечно, но уже что-то.

И кстати, ошибок никаких не словил, это радует! Думаю, сейчас ошибки могут быть только на стадии поиска и загрузки панели (первые три функции - HBarShowHint, HBarGetFile, HBarLoad). Плохо, что окно панели не хранит путь к панели, это создает трудности. Т.ч. придется пересматривать эти функции и делать проверку на конфликт имен, что-то вроде
Code:
Func HBarConflict()
    Local bars = List(), text, num = 0
    bars.Text = FileFind(COMMANDER_PATH, "*.bar", -1, 1)
    For i = 0 To bars.Count - 1
        If StrPos(bars[i], gHBarName, -1) > 0 Then
           num += 1
           text &= bars[i] & auCRLF
        Endif   
    Next
    If num < 2 Then text = ""
    Return text   
EndFunc

Но здесь не учитывается путь к панели из wincmd.ini и путь активной панели. От последнего, думаю, надо избавляться, чтобы он не создавал путаницу. Но это всё-равно не поможет, если OPENBAR будет вызван из самого ТС с произвольным путем к панели.

Самое неприятное, что когда OPENBAR открывает файл, дескриптор панели не меняется. Т.е. если я открою DEFAULT.BAR из каталога D:\Temp и если у меня открыта главная панель как %COMMANDER_PATH%\DEFAULT.BAR, то нет никакой возможности узнать, какая из этих двух панелей открыта в данный момент только по имени файла.

Ладно, подумаю над этим чуть позже. Сейчас, видимо, придется взять небольшую паузу, но если будут какие-то ошибки, постараюсь потихоньку исправлять. Главное иметь в виду, что открытие панели сейчас самое уязвимое место, и что остальной функционал еще недостаточно тестирован, т.ч. могут быть ошибки и косяки.

sa wrote:
У меня команда заработала, когда вместо %A0 записал просто %A.

Спасибо, подправил. Убрал заодно снятие оконной процедуры при открытии через OPENBAR. Видимо, в нем была проблема. Еще Loopback писал, что вешается-то она легко, а вот снимается с ошибками. У меня она, похоже, вообше не снималась или снималась через раз
Code:
DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
         "hwnd", hBarWnd, "int", -4, "long_ptr", gHBarWndProc, "ptr")

Добавил еще пункт "Индекс удаления 1", чтобы можно было сразу очистить панель и проверку в HBarSaveAs, хотя там лучше сделать через копипование файла, но это потом.

Последний тестовый модуль.

 Bars.aucfg


Если кто-то хочет попробовать не подключая к своему ТС, можно взять готовую сборку и заменить модуль Bars.aucfg в каталоге Scripts
Ссылка 1
Ссылка 1
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2753

Post (Separately) Posted: Thu Jul 16, 2026 15:59    Post subject: Reply with quote

Orion9
Хотел всё-таки разобраться, в чём проблема удаления группы кнопок путём последовательного указания мышью (наведением, пусть с тем же модификатором Shift) двух крайних кнопок диапазона: ведь индексы этих кнопок определяются надёжно, а остальное кажется уже делом техники…
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1207

Post (Separately) Posted: Thu Jul 16, 2026 20:27    Post subject: Reply with quote

sa wrote:
в чём проблема удаления группы кнопок путём последовательного указания мышью

Да вроде нет больших проблем. Я просто подумал, что надо как-то визуально или графически делать выбор или через поля ввода, а с этим в Autorun сложности. Через DllCall многое можно порешать: и окна можно создать, и функции gdi вызывать, только зачем так заморачиваться Smile

Благодаря вашей идее с копированием, поставленную задачу можно решить буквально за несколько секунд. Если на панели уже есть разрывы, достаточно просто скопировать один разрыв в начало диапазона, а второй разрыв в конец. После этого удалить кнопки между этими разрывами через меню. Если на панели нет разрывов, то нужно добавить один разрыв через меню и повторить описанные действия. Даже последний пункт меню, который я добавил для удаления всех кнопок после индекса 1, можно было не делать, т.к. задача тоже решается через копирование разрыва (за первый индекс) с последующим удлением всего за разрывом Very Happy

Но если делать последовательное указание диапазона через запоминание индекса, то сделать можно, и это не должно быть сложно. Например:
 Hidden text

В самый конец функции HBarLoad нужно добавить сброс маркеров диапазона, чтобы при смене панели или состояния панели указанный наполовину диапазон сбрасывался.
Code:
gHBarMark1 = 0
gHBarMark2 = 0

Функцию можно повесить и на среднюю кнопку мыши, но сейчас она у меня вызывается через Alt
Code:
# правый клик с удержанием Alt
ControlSetMouseAction /R /K:A 28 "HBarMarkToDelete"

Навскидку всё работает, но могут быть, конечно, неучтенные моменты. Если вам понравится, можно добавить к функционалу Very Happy
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2753

Post (Separately) Posted: Fri Jul 17, 2026 10:41    Post subject: Reply with quote

Orion9 wrote:
неучтенные моменты

Удобнее не ограничивать задание диапазона началом и концом, чтобы можно было, к примеру, начать с большего индекса, а закончить меньшим. Если оба раза указана одна кнопка, то её и удалять. Сейчас, например, при указании диапазона 67-68, удаляется только 67.

P.S.
Ну и сам интерфейс удаления сейчас такой, как будто пользователь сам помогает скрипту удалять кнопки (почти как с установкой разрывов), а не наоборот.
В идеале хотелось, чтобы была одна операция, а не две, не связанные друг с другом. Что-то нажать, получить запрос на указание первой граничной кнопки, зависнуть над ней мышью (если надо, то ещё что-то нажать дополнительно), следом получить запрос на указание второй граничной кнопки, зависнуть над ней мышью (если надо, то ещё что-то нажать дополнительно) и, наконец, подтвердить/отменить удаление.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1207

Post (Separately) Posted: Fri Jul 17, 2026 13:15    Post subject: Reply with quote

sa wrote:
начать с большего индекса, а закончить меньшим

Это можно сделать через функции Min и Max. Вроде работает.
sa wrote:
Если оба раза указана одна кнопка, то её и удалять

А зачем? Одну кнопку можно удалить и так.

Вообще, функция HBarBreakErase задумывалась для удаления между разделителями, одну кнопку она удалить не может, поэтому пришлось ввести это ограничение при выборе диапазона, т.к. если указать один и тот же индекс, то удалятся все кнопки за этим индексом, как при
Code:
text &= 'MENUITEM "Индекс удаления 1", em_aucmd -1 HBarBreakErase ' & 2 & ' ' & 2 & auCRLF

где передается диапазон 2-2. Поэтому для удаления одной кнопки придется делать дополнительную функцию.

Но можно ведь и не делать. Одну кнопку можно удалить простым дропом за панель, поэтому пока оставил как было, т.е. нельзя задать диапазон равный одной кнопке.
sa wrote:
Сейчас, например, при указании диапазона 67-68, удаляется только 67.

Исправил. Там просто +1 нужно было добавить к параметру.
sa wrote:
Ну и сам интерфейс удаления сейчас такой, как будто пользователь сам помогает скрипту удалять кнопки (почти как с установкой разрывов), а не наоборот.

Да нормальный интерфейс, мне даже нравится Smile Конечно, было бы лучше, если бы первая кнопка как-то отмечалась, чтобы не держать ее в уме, но и так, вроде бы, удобно: навёл на кнопку, получил подсказку, убедился, что это нужный индекс, нажал следом Alt+ПКЛ для выбора диапазона, и всё.

В справке к Autohotkey есть пример на DllCall для закрашивания области экрана.
 Hidden text

Я перевел его в Autorun с небольшой особенностью и добавил к функции.
 Hidden text

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

Надо подумать над этим. Но вы попробуйте обновленный вариант: он удобен по-своему, к нему просто привыкнуть надо.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2753

Post (Separately) Posted: Fri Jul 17, 2026 15:00    Post subject: Reply with quote

Orion9 wrote:
нельзя задать диапазон равный одной кнопке
Ничего страшного! А то получится, что при удалении можно обойтись и без Drag&Drop Very Happy.

Orion9 wrote:
Да нормальный интерфейс, мне даже нравится
...
Сейчас намного лучше стало.
Я ещё и подтверждения убрал (сначала все три, потом на удаление всё-таки зачем-то вернул - хотя и так имеется отмена последнего действия). Вместо первых двух стало достаточно красных квадратиков. Теперь можно при нажатом Alt щёлкнуть правой клавишей мыши по двум произвольным кнопкам панели и получить запрос на удаление – чем не одна операция?!
В окошке подтверждения удаления дополнительно указал количество кнопок в группе (Удалить группу кнопок: 12шт?)
Спасибо!
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1207

Post (Separately) Posted: Sat Jul 18, 2026 00:36    Post subject: Reply with quote

sa wrote:
В окошке подтверждения удаления дополнительно указал количество кнопок в группе (Удалить группу кнопок: 12шт?)

Хорошая идея. Тоже добавил. Только сообщение немножко другое .
sa wrote:
Я ещё и подтверждения убрал

Да, теперь я понял задумку — сверхскоростное удаление! Удобно получилось Very Happy Но, имхо, последнее сообщение я бы все же оставил, а то мало ло что. К тому же, так можно сбросить диапазон, если вдруг понял, что граница неправильно выбрана. Хотя и откаты есть.

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

sa wrote:
чем не одна операция?!

Согласен. Прикольно получилось и удобно.

 Hidden text

 Hidden text
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 Previous  1, 2, 3, 4
Page 4 of 4

 
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