Страница 1 из 1

[Проблема] Обновление иконок на событие "cm_RereadSource"

Добавлено: Пт июл 02, 2010 21:22
hramm
Привет всем.

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

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

Решаемо?

Добавлено: Пт июл 02, 2010 21:50
MVV
Вообще, вопрос сложный, так как ТК кэширует иконки. Но есть одна идея, которую ты заодно и проверишь. :)

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

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

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

Добавлено: Пт июл 02, 2010 21:53
CaptainFlint
Я в своём VirtualDisk (в разрабатываемой новой версии, где значки динамические) эту проблему решил обновлением даты-времени виртуального файла перед посылкой сообщения cm_RereadSource. Вроде бы, работает.

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

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

Добавлено: Пт июл 02, 2010 22:33
hramm
MVV писал(а):При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName
Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.

Добавлено: Пт июл 02, 2010 22:39
MVV
hramm писал(а):
MVV писал(а):При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName
Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.
Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API, и это упоминал Гислер лично при обсуждении ситуации, когда нужно было для нескольких тысяч файлов, символизирующих папку, поставить значок папки. А обновляет ли ТК иконки при изменении возвращаемого значения - это и предстояло выяснить.
CaptainFlint писал(а):
MVV писал(а):А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
А какой хороший?
Не знаю. :)
Сама идея постоянного изменения значка не очень вписыавется в рамки плагина файловой системы.

Добавлено: Пт июл 02, 2010 22:53
hramm
MVV писал(а):Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API
Сорри. Заработало.
Я сначала постояное имя писал, а потом вспомнил что надо случайное.
Сделал "sprintf(RemoteName, "%u", rand());" - заработало!

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

Добавлено: Пт июл 02, 2010 23:35
CaptainFlint
MVV
Загляни сюда, плиз. Завёл отдельную тему, чтобы тут не оффтопить.

Добавлено: Сб июл 03, 2010 09:26
MVV
hramm писал(а):Сделал "sprintf(RemoteName, "%u", rand());" - заработало!
Как более логичное решение предлагаю все же не плодить рандомные идентификаторы, а возвращать определенные строки для определенных статусов - то есть, для каждого отдельно взятого состояния иконки возвращать одну и ту же строку (типа, для зеленой иконки возвращать "icon[1]", для красной - "icon[2]" и т.п.) - например, с индексом иконки из внутреннего массива иконок (или даже дескриптором иконки в виде текстовой строки). Так тотал не будет добавлять в кэш иконки, которые там уже есть, а будет просто использовать их повторно.

Добавлено: Сб июл 03, 2010 14:21
hramm
MVV писал(а):Как более логичное решение предлагаю все же не плодить рандомные идентификаторы
Я так и сделал. Это только пример. Спасибо.