[Проблема] Обновление иконок на событие "cm_RereadSource"
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Написание плагинов для Total Commander

#1: [Проблема] Обновление иконок на событие "cm_RereadSource" Author: hramm PostPosted: Fri Jul 02, 2010 21:22
    —
Привет всем.

Вот делаю плагин http://forum.wincmd.ru/viewtopic.php?t=13318
Это WFX плагин клиент DC++.
И столкнулся с такой проблемой.

Для изменения статуса хотел применить механизм смены иконки.
Чтобы сменить иконку необходимо кинуть тоталу сообщение "cm_RereadSource". Я так и делаю. Тотал заново опрашивает содержимое и иконки, но указанные иконки не применяет. При этом, если сменить путь и вернуться, иконка обновится.

Решаемо?

#2:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jul 02, 2010 21:50
    —
Вообще, вопрос сложный, так как ТК кэширует иконки. Но есть одна идея, которую ты заодно и проверишь. Smile

Когда ТК вызывает функцию FsExtractCustomIcon/FsExtractCustomIconW плагина для получения иконки, он добавляет иконку в кэш, в котором иконки различаются по строке RemoteName (этот параметр в FsExtractCustomIcon является как входным, так и выходным). Если нужно одну и ту же иконку применить много раз, нужно указывать произвольную строку в поле RemoteName, но одинаковую для всех файлов с такой иконкой - при этом в кэш иконка будет помещена лишь один раз (например, если ставишь собственную иконку папки, а папок в панели несколько тысяч, в функции FsExtractCustomIcon для каждой папки возвращаешь одну и ту же иконку, а в RemoteName записываешь строчку "/").

Собственно, идея вот в чем. При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName (например, генеришь случайное число, переводишь в строку и записываешь в это поле), чтобы дать ТК понять, что иконка уже другая. Возможно, это поможет установить измененную иконку.

А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...


Last edited by MVV on Fri Jul 02, 2010 21:55; edited 2 times in total

#3:  Author: CaptainFlintLocation: Москва PostPosted: Fri Jul 02, 2010 21:53
    —
Я в своём VirtualDisk (в разрабатываемой новой версии, где значки динамические) эту проблему решил обновлением даты-времени виртуального файла перед посылкой сообщения cm_RereadSource. Вроде бы, работает.

Правда, у меня до этого значки при обновлении вообще не запрашивались, я именно эту проблему обходил. А чтобы Тотал их запрашивал, но не отображал… Может, с дескрипторами чего накосячено? Там можно же их идентифицировать. Может, для разных значков возвращаешь одинаковые идентификаторы?


MVV wrote:
А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...

А какой хороший?

#4:  Author: hramm PostPosted: Fri Jul 02, 2010 22:33
    —
MVV wrote:
При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName


Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.

#5:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jul 02, 2010 22:39
    —
hramm wrote:
MVV wrote:
При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName


Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.

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

CaptainFlint wrote:
MVV wrote:
А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...

А какой хороший?

Не знаю. Smile
Сама идея постоянного изменения значка не очень вписыавется в рамки плагина файловой системы.

#6:  Author: hramm PostPosted: Fri Jul 02, 2010 22:53
    —
MVV wrote:
Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API


Сорри. Заработало.
Я сначала постояное имя писал, а потом вспомнил что надо случайное.
Сделал "sprintf(RemoteName, "%u", rand());" - заработало!

Тему предлагаю закрыть. Всем спасибо!

#7:  Author: CaptainFlintLocation: Москва PostPosted: Fri Jul 02, 2010 23:35
    —
MVV
Загляни сюда, плиз. Завёл отдельную тему, чтобы тут не оффтопить.

#8:  Author: MVVLocation: Ростов-Дон PostPosted: Sat Jul 03, 2010 09:26
    —
hramm wrote:
Сделал "sprintf(RemoteName, "%u", rand());" - заработало!

Как более логичное решение предлагаю все же не плодить рандомные идентификаторы, а возвращать определенные строки для определенных статусов - то есть, для каждого отдельно взятого состояния иконки возвращать одну и ту же строку (типа, для зеленой иконки возвращать "icon[1]", для красной - "icon[2]" и т.п.) - например, с индексом иконки из внутреннего массива иконок (или даже дескриптором иконки в виде текстовой строки). Так тотал не будет добавлять в кэш иконки, которые там уже есть, а будет просто использовать их повторно.

#9:  Author: hramm PostPosted: Sat Jul 03, 2010 14:21
    —
MVV wrote:
Как более логичное решение предлагаю все же не плодить рандомные идентификаторы

Я так и сделал. Это только пример. Спасибо.



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group