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 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
hramm



Joined: 17 Jun 2010
Posts: 19

Post (Separately) Posted: Fri Jul 02, 2010 21:22    Post subject: [Проблема] Обновление иконок на событие "cm_RereadSource" Reply with quote

Привет всем.

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

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

Решаемо?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4453
Location: Ростов-Дон

Post (Separately) Posted: Fri Jul 02, 2010 21:50    Post subject: Reply with quote

Вообще, вопрос сложный, так как ТК кэширует иконки. Но есть одна идея, которую ты заодно и проверишь. Smile

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

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

А вообще, конечно, менять иконки и обновлять панель - не есть хороший вариант...
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…


Last edited by MVV on Fri Jul 02, 2010 21:55; edited 2 times in total
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5824
Location: Москва

Post (Separately) Posted: Fri Jul 02, 2010 21:53    Post subject: Reply with quote

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

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


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

А какой хороший?
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
hramm



Joined: 17 Jun 2010
Posts: 19

Post (Separately) Posted: Fri Jul 02, 2010 22:33    Post subject: Reply with quote

MVV wrote:
При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName


Не прокатило. Тотал видимо не проверяет после метода "FsExtractCustomIcon" поле "RemoteName". Оно является входным параметром и только.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4453
Location: Ростов-Дон

Post (Separately) Posted: Fri Jul 02, 2010 22:39    Post subject: Reply with quote

hramm wrote:
MVV wrote:
При обновлении панели, если ТК запросит иконки повторно, возвращаешь другую строку в RemoteName


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

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

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

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

Не знаю. Smile
Сама идея постоянного изменения значка не очень вписыавется в рамки плагина файловой системы.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
hramm



Joined: 17 Jun 2010
Posts: 19

Post (Separately) Posted: Fri Jul 02, 2010 22:53    Post subject: Reply with quote

MVV wrote:
Как я написал, этот параметр является как входным, так и выходным, и используется для кэширования, это написано в справке по WFX API


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

Тему предлагаю закрыть. Всем спасибо!
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5824
Location: Москва

Post (Separately) Posted: Fri Jul 02, 2010 23:35    Post subject: Reply with quote

MVV
Загляни сюда, плиз. Завёл отдельную тему, чтобы тут не оффтопить.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4453
Location: Ростов-Дон

Post (Separately) Posted: Sat Jul 03, 2010 09:26    Post subject: Reply with quote

hramm wrote:
Сделал "sprintf(RemoteName, "%u", rand());" - заработало!

Как более логичное решение предлагаю все же не плодить рандомные идентификаторы, а возвращать определенные строки для определенных статусов - то есть, для каждого отдельно взятого состояния иконки возвращать одну и ту же строку (типа, для зеленой иконки возвращать "icon[1]", для красной - "icon[2]" и т.п.) - например, с индексом иконки из внутреннего массива иконок (или даже дескриптором иконки в виде текстовой строки). Так тотал не будет добавлять в кэш иконки, которые там уже есть, а будет просто использовать их повторно.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
hramm



Joined: 17 Jun 2010
Posts: 19

Post (Separately) Posted: Sat Jul 03, 2010 14:21    Post subject: Reply with quote

MVV wrote:
Как более логичное решение предлагаю все же не плодить рандомные идентификаторы

Я так и сделал. Это только пример. Спасибо.
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
Page 1 of 1

 
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