[Проблема] Обновление иконок на событие "cm_RereadSource"
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
[Проблема] Обновление иконок на событие "cm_RereadSource"
Привет всем.
Вот делаю плагин http://forum.wincmd.ru/viewtopic.php?t=13318
Это WFX плагин клиент DC++.
И столкнулся с такой проблемой.
Для изменения статуса хотел применить механизм смены иконки.
Чтобы сменить иконку необходимо кинуть тоталу сообщение "cm_RereadSource". Я так и делаю. Тотал заново опрашивает содержимое и иконки, но указанные иконки не применяет. При этом, если сменить путь и вернуться, иконка обновится.
Решаемо?
Вот делаю плагин http://forum.wincmd.ru/viewtopic.php?t=13318
Это WFX плагин клиент DC++.
И столкнулся с такой проблемой.
Для изменения статуса хотел применить механизм смены иконки.
Чтобы сменить иконку необходимо кинуть тоталу сообщение "cm_RereadSource". Я так и делаю. Тотал заново опрашивает содержимое и иконки, но указанные иконки не применяет. При этом, если сменить путь и вернуться, иконка обновится.
Решаемо?
Вообще, вопрос сложный, так как ТК кэширует иконки. Но есть одна идея, которую ты заодно и проверишь. 
Когда ТК вызывает функцию FsExtractCustomIcon/FsExtractCustomIconW плагина для получения иконки, он добавляет иконку в кэш, в котором иконки различаются по строке RemoteName (этот параметр в FsExtractCustomIcon является как входным, так и выходным). Если нужно одну и ту же иконку применить много раз, нужно указывать произвольную строку в поле RemoteName, но одинаковую для всех файлов с такой иконкой - при этом в кэш иконка будет помещена лишь один раз (например, если ставишь собственную иконку папки, а папок в панели несколько тысяч, в функции FsExtractCustomIcon для каждой папки возвращаешь одну и ту же иконку, а в RemoteName записываешь строчку "/").
Собственно, идея вот в чем. При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName (например, генеришь случайное число, переводишь в строку и записываешь в это поле), чтобы дать ТК понять, что иконка уже другая. Возможно, это поможет установить измененную иконку.
А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
Когда ТК вызывает функцию FsExtractCustomIcon/FsExtractCustomIconW плагина для получения иконки, он добавляет иконку в кэш, в котором иконки различаются по строке RemoteName (этот параметр в FsExtractCustomIcon является как входным, так и выходным). Если нужно одну и ту же иконку применить много раз, нужно указывать произвольную строку в поле RemoteName, но одинаковую для всех файлов с такой иконкой - при этом в кэш иконка будет помещена лишь один раз (например, если ставишь собственную иконку папки, а папок в панели несколько тысяч, в функции FsExtractCustomIcon для каждой папки возвращаешь одну и ту же иконку, а в RemoteName записываешь строчку "/").
Собственно, идея вот в чем. При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName (например, генеришь случайное число, переводишь в строку и записываешь в это поле), чтобы дать ТК понять, что иконка уже другая. Возможно, это поможет установить измененную иконку.
А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
Последний раз редактировалось MVV Пт июл 02, 2010 21:55, всего редактировалось 2 раза.
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Я в своём VirtualDisk (в разрабатываемой новой версии, где значки динамические) эту проблему решил обновлением даты-времени виртуального файла перед посылкой сообщения cm_RereadSource. Вроде бы, работает.
Правда, у меня до этого значки при обновлении вообще не запрашивались, я именно эту проблему обходил. А чтобы Тотал их запрашивал, но не отображал… Может, с дескрипторами чего накосячено? Там можно же их идентифицировать. Может, для разных значков возвращаешь одинаковые идентификаторы?
Правда, у меня до этого значки при обновлении вообще не запрашивались, я именно эту проблему обходил. А чтобы Тотал их запрашивал, но не отображал… Может, с дескрипторами чего накосячено? Там можно же их идентифицировать. Может, для разных значков возвращаешь одинаковые идентификаторы?
А какой хороший?MVV писал(а):А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
Почему же, ё-моё, ты нигде не пишешь "ё"?
Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API, и это упоминал Гислер лично при обсуждении ситуации, когда нужно было для нескольких тысяч файлов, символизирующих папку, поставить значок папки. А обновляет ли ТК иконки при изменении возвращаемого значения - это и предстояло выяснить.hramm писал(а):Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.MVV писал(а):При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName
Не знаю.CaptainFlint писал(а):А какой хороший?MVV писал(а):А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
Сама идея постоянного изменения значка не очень вписыавется в рамки плагина файловой системы.
Сорри. Заработало.MVV писал(а):Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API
Я сначала постояное имя писал, а потом вспомнил что надо случайное.
Сделал "sprintf(RemoteName, "%u", rand());" - заработало!
Тему предлагаю закрыть. Всем спасибо!
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
MVV
Загляни сюда, плиз. Завёл отдельную тему, чтобы тут не оффтопить.
Загляни сюда, плиз. Завёл отдельную тему, чтобы тут не оффтопить.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Как более логичное решение предлагаю все же не плодить рандомные идентификаторы, а возвращать определенные строки для определенных статусов - то есть, для каждого отдельно взятого состояния иконки возвращать одну и ту же строку (типа, для зеленой иконки возвращать "icon[1]", для красной - "icon[2]" и т.п.) - например, с индексом иконки из внутреннего массива иконок (или даже дескриптором иконки в виде текстовой строки). Так тотал не будет добавлять в кэш иконки, которые там уже есть, а будет просто использовать их повторно.hramm писал(а):Сделал "sprintf(RemoteName, "%u", rand());" - заработало!