1 //=============================================================================
2 //
3 // File : KviIconManager.cpp
4 // Creation date : Sat Jun 24 2000 14:50:11 by Szymon Stefanek
5 //
6 // This file is part of the KVIrc IRC client distribution
7 // Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
8 //
9 // This program is FREE software. You can redistribute it and/or
10 // modify it under the terms of the GNU General Public License
11 // as published by the Free Software Foundation; either version 2
12 // of the License, or (at your option) any later version.
13 //
14 // This program is distributed in the HOPE that it will be USEFUL,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 // See the GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program. If not, write to the Free Software Foundation,
21 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 //=============================================================================
24
25 #define _KVI_ICONMANAGER_CPP_
26
27 #include "KviIconManager.h"
28 #include "KviApplication.h"
29 #include "kvi_settings.h"
30 #include "kvi_defaults.h"
31 #include "KviLocale.h"
32 #include "KviFileUtils.h"
33 #include "KviOptions.h"
34
35 #include <QCloseEvent>
36 #include <QCursor>
37 #include <QDir>
38 #include <QDrag>
39 #include <QEvent>
40 #include <QIcon>
41 #include <QLabel>
42 #include <QLayout>
43 #include <QMimeData>
44
45 /*
46 @doc: image_id
47 @title:
48 The image identifier
49 @keyterms:
50 image identifier, using builtin images, how KVIrc locates image files
51 @type:
52 language
53 @short:
54 Semantics of the <image_id> parameter
55 @body:
56 Some KVIrc commands and functions accept
57 the <image_id> as a parameter.
58 The <image_id> indicates an image to be displayed
59 by some GUI element. Since KVIrc has a set of
60 builtin icons, we want the user to be able to use it :).[br]
61 The <image_id> can be either a signed integer number
62 or a filename.[br]
63 If it is a signed integer it is interpreted as
64 index of the internal KVIrc image to use:
65 positive integers (starting at 0) indicate
66 small (16x16) icons (the ones used in the view widget).[br]
67 If <image_id> is anything else than a signed integer,
68 it is interpreted as a filename.
69 The filename can be an absolute file path or a relative one.
70 In this last case KVIrc will look for the file in a predefined set
71 of directories: First in the local [i]pics[/i] directory (usually
72 in ~/kvirc-version/pics/), then in the local [i]incoming[/i] directory,
73 then in the global [i]pics[/i] directory, then in the user home (~)
74 and in the current directory.[br]
75 */
76
77 // KviApplication.cpp
78 extern QPixmap * g_pUserChanStatePixmap;
79 extern QPixmap * g_pActivityMeterPixmap;
80
81 KviIconManager * g_pIconManager = nullptr;
82
83 static const char * g_szIconNames[KviIconManager::IconCount] = {
84 "none", // 0
85 "close", // 1
86 "history", // 2
87 "historyoff", // 3
88 "usermode", // 4
89 "defaulticon", // 5
90 "dock", // 6
91 "undock", // 7
92 "quitapp", // 8
93 "console", // 9
94 "save", // 10
95 "parsererror", // 11
96 "parserwarning", // 12
97 "server", // 13
98 "world", // 14
99 "proxy", // 15
100 "kvirc", // 16
101 "cut", // 17
102 "copy", // 18
103 "paste", // 19
104 "options", // 20
105 "socketmessage", // 21
106 "socketwarning", // 22
107 "socketerror", // 23
108 "systemerror", // 24
109 "raw", // 25
110 "systemwarning", // 26
111 "systemmessage", // 27
112 "unhandled", // 28
113 "serverinfo", // 29
114 "motd", // 30
115 "channel", // 31
116 "hidedoubleview", // 32
117 "showdoubleview", // 33
118 "op", // 34
119 "voice", // 35
120 "serverping", // 36
121 "showlistview", // 37
122 "hidelistview", // 38
123 "join", // 39
124 "part", // 40
125 "unrecognized", // 41
126 "topic", // 42
127 "accept", // 43
128 "discard", // 44
129 "ownprivmsg", // 45
130 "chanprivmsg", // 46
131 "query", // 48
132 "queryprivmsg", // 49
133 "help", // 49
134 "questionmark", // 50
135 "ctcpreply", // 51
136 "ctcprequestreplied", // 52
137 "ctcprequestignored", // 53
138 "ctcprequestflood", // 54
139 "ctcprequestunknown", // 55
140 "action", // 56
141 "avatar", // 57
142 "quit", // 58
143 "split", // 59
144 "quitsplit", // 60
145 "nick", // 61
146 "deop", // 62
147 "devoice", // 63
148 "mode", // 64
149 "key", // 65
150 "limit", // 66
151 "ban", // 67
152 "unban", // 68
153 "banexcept", // 69
154 "banunexcept", // 70
155 "inviteexcept", // 71
156 "inviteunexcept", // 72
157 "chanmode", // 73
158 "chanmodehide", // 74
159 "who", // 75
160 "editor", // 76
161 "dccrequest", // 77
162 "dccmsg", // 78
163 "dccerror", // 79
164 "iconmanager", // 80
165 "scriptcenter", // 81
166 "bomb", // 82
167 "event", // 83
168 "eventnohandlers", // 84
169 "handler", // 85
170 "handlerdisabled", // 86
171 "nicknameproblem", // 87
172 "whoisuser", // 88
173 "whoischannels", // 89
174 "whoisidle", // 90
175 "whoisserver", // 91
176 "whoisother", // 92
177 "time", // 93
178 "notifyonline", // 94
179 "notifyoffline", // 95
180 "locked", // 96
181 "unlocked", // 97
182 "lockedoff", // 98
183 "unlockedoff", // 99
184 "ownprivmsgcrypted", // 100
185 "chanprivmsgcrypted", // 101
186 "queryprivmsgcrypted", // 102
187 "dccchatmsg", // 103
188 "dccchatmsgcrypted", // 104
189 "irc", // 105
190 "folder", // 106
191 "home", // 107
192 "bookmarks", // 108
193 "spy", // 109
194 "kick", // 110
195 "linux", // 111
196 "links", // 112
197 "regusers", // 113
198 "trayicon", // 114
199 "unsetmode", // 115
200 "favorite", // 116
201 "toolbar", // 117
202 "serverfavorite", // 118
203 "log", // 119
204 "remove", // 120
205 "file", // 121
206 "icq", // 122
207 "icqyellow", // 123
208 "icqred", // 124
209 "icqblue", // 125
210 "icqlightgreen", // 126
211 "icqlightyellow", // 127
212 "message", // 128
213 "messagesent", // 129
214 "bluesquare", // 130
215 "violetsquare", // 131
216 "yellowsquare", // 132
217 "greensquare", // 133
218 "blacksquare", // 134
219 "redsquare", // 135
220 "cyansquare", // 136
221 "dkgreensquare", // 137
222 "terminal", // 138
223 "wallops", // 139
224 "invisible", // 140
225 "servernotice", // 141
226 "gnutella", // 142
227 "search", // 143
228 "files", // 144
229 "newnetwork", // 145
230 "package", // 146
231 "newserver", // 147
232 "idea", // 148
233 "colors", // 149
234 "gui", // 150
235 "ircview", // 151
236 "alias", // 152
237 "channelnotice", // 153
238 "channelnoticecrypted", // 154
239 "querynotice", // 155
240 "querynoticecrypted", // 156
241 "menubar", // 157
242 "popup", // 158
243 "prologue", // 159
244 "epilogue", // 160
245 "sharedfiles", // 161
246 "ctcpreplyunknown", // 162
247 "canvas", // 163
248 "nickserv", // 164
249 "chanserv", // 165
250 "dccvoice", // 166
251 "play", // 167
252 "record", // 168
253 "kickoff", // 169
254 "away", // 170
255 "ident", // 171
256 "homepage", // 172
257 "list", // 173
258 "halfop", // 174
259 "halfdeop", // 175
260 "invite", // 176
261 "multimedia", // 177
262 "user", // 178
263 "input", // 179
264 "messages", // 180
265 "querytrace", // 181
266 "nochannel", // 182
267 "broadcastprivmsg", // 183
268 "broadcastnotice", // 184
269 "url", // 185
270 "rawevent", // 186
271 "raweventnohandlers", // 187
272 "mekick", // 188
273 "meop", // 189
274 "mevoice", // 190
275 "medeop", // 191
276 "medevoice", // 192
277 "mehalfop", // 193
278 "medehalfop", // 194
279 "meban", // 195
280 "meunban", // 196
281 "mebanexcept", // 197
282 "mebanunexcept", // 198
283 "meinviteexcept", // 199
284 "meinviteunexcept", // 200
285 "classicwindowlist", // 201
286 "treewindowlist", // 202
287 "ignore", // 203
288 "userlist", // 204
289 "stats", // 205
290 "popupmenu", // 206
291 "serverconfiguration", // 207
292 "irc0", // 208
293 "irc1", // 209
294 "irc2", // 210
295 "irc3", // 211
296 "irc4", // 212
297 "irc5", // 213
298 "heart", // 214
299 "heartbroken", // 215
300 "rose", // 215
301 "biggrin", // 217
302 "biggringlasses", // 218
303 "biggrineyes", // 219
304 "textexclamative", // 220
305 "textpoints", // 221
306 "kiss", // 222
307 "surprised1", // 223
308 "ugly", // 224
309 "angry", // 225
310 "surprised2", // 226
311 "smile", // 227
312 "tongue", // 228
313 "ssl", // 229
314 "cry", // 230
315 "eye", // 231
316 "deadchannel", // 232
317 "deadquery", // 233
318 "sound", // 234
319 "toolbareditor", // 235
320 "textencoding", // 236
321 "newitem", // 237
322 "newitembywizard", // 238
323 "deleteitem", // 239
324 "edititem", // 240
325 "filetransfer", // 241
326 "chanadmin", // 242
327 "chanunadmin", // 243
328 "mechanadmin", // 244
329 "mechanunadmin", // 245
330 "userop", // 246
331 "deuserop", // 247
332 "meuserop", // 248
333 "medeuserop", // 249
334 "applet", // 250
335 "spam", // 251
336 "transparent", // 252
337 "notifier", // 253
338 "userwindow", // 254
339 "statusbar", // 255
340 "notaway", // 256
341 "plus", // 257
342 "minus", // 258
343 "binarytext", // 259
344 "chanowner", // 260
345 "chanunowner", // 261
346 "mechanowner", // 262
347 "mechanunowner", // 263
348 "afraid", // 264
349 "teeth", // 265
350 "sysmonitor", // 266
351 "saycolors", // 267
352 "finger", // 268
353 "highlighttext", // 269
354 "tearsmile", // 270
355 "shy", // 271
356 "servererror", // 272
357 "cafe", // 273
358 "addons", // 274
359 "chanowneraway", // 275
360 "opaway", // 276
361 "voiceaway", // 277
362 "chanadminaway", // 278
363 "useropaway", // 279
364 "halfopaway", // 280
365 "classeditor", // 281
366 "demoralized", // 282
367 "slurp", // 283
368 "namespace", // 284
369 "saysmile", // 285
370 "saykvs", // 286
371 "themeoptions", // 287
372 "bug", // 288
373 "refresh", // 289
374 "theme", // 290
375 "screenshot", // 291
376 "update", // 292
377 "notupdate", // 293
378 "failupdate", // 294
379 "unreadtext", // 295
380 "ircop", // 296
381 "ircopaway", // 297
382 "deircop", // 298
383 "meircop", // 299
384 "medeircop", // 300
385 "angel", // 301
386 "clown", // 302
387 "devil", // 303
388 "inlove", // 304
389 "ninja", // 305
390 "pirate", // 306
391 "puke", // 307
392 "rage", // 308
393 "class", // 309
394 "classnotbuilt", // 310
395 "function", // 311
396 "sexmale", // 312
397 "sexfemale", // 313
398 "ircbot", // 314
399 "alienircop", // 315
400 "memoserv", // 316
401 "info", // 317
402 "warning", // 318
403 "shield", // 319
404 "raweventeditor", // 320
405 "eventeditor", // 321
406 "actioneditor", // 322
407 "aliaseditor", // 323
408 "popupeditor", // 324
409 "dcc", // 325
410 "socket", // 326
411 "cake", // 327
412 "handily", // 328
413 "thumbdown", // 329
414 "thumbup", // 330
415 "facepalm", // 331
416 "identity", // 332
417 "nickpopup", // 333
418 "tools", // 334
419 "favoriteoff", // 335
420 "newproxy", // 336
421 "actioncrypted", // 337
422 "topiccrypted", // 338
423 "ctcpcrypted", // 339
424 "ownaction", // 340
425 "ownactioncrypted" // 341
426 };
427
KviIconWidget(QWidget * pPar)428 KviIconWidget::KviIconWidget(QWidget * pPar)
429 : QWidget(pPar)
430 {
431 setObjectName("global_icon_widget");
432 init();
433 }
434
init()435 void KviIconWidget::init()
436 {
437 setWindowTitle(__tr2qs("Icon Table - KVIrc"));
438 setWindowIcon(QIcon(*(g_pIconManager->getSmallIcon(KviIconManager::IconManager))));
439
440 int iRows = KviIconManager::IconCount / 20;
441 if((iRows * 20) < KviIconManager::IconCount)
442 iRows++;
443
444 QGridLayout * pLayout = new QGridLayout(this);
445 for(int i = 0; i < 20; i++)
446 {
447 KviCString szTmp(KviCString::Format, "%d", i);
448 QLabel * pLabel = new QLabel(szTmp.ptr(), this);
449 pLayout->addWidget(pLabel, 0, i + 1);
450 }
451 for(int i = 0; i < iRows; i++)
452 {
453 KviCString szTmp(KviCString::Format, "%d", i * 20);
454 QLabel * pLabel = new QLabel(szTmp.ptr(), this);
455 pLayout->addWidget(pLabel, i + 1, 0);
456 }
457 for(int i = 0; i < KviIconManager::IconCount; i++)
458 {
459 KviCString szTmp(KviCString::Format, "%d", i);
460 QLabel * pLabel = new QLabel(this);
461 pLabel->setObjectName(szTmp.ptr());
462 pLabel->setPixmap(*(g_pIconManager->getSmallIcon(i)));
463 pLabel->installEventFilter(this);
464 pLabel->setAcceptDrops(true);
465 pLayout->addWidget(pLabel, (i / 20) + 1, (i % 20) + 1);
466 }
467 }
468
469 KviIconWidget::~KviIconWidget()
470 = default;
471
closeEvent(QCloseEvent * pEvent)472 void KviIconWidget::closeEvent(QCloseEvent * pEvent)
473 {
474 pEvent->ignore();
475 emit closed();
476 }
477
eventFilter(QObject * pObject,QEvent * pEvent)478 bool KviIconWidget::eventFilter(QObject * pObject, QEvent * pEvent)
479 {
480 if(pEvent->type() == QEvent::MouseButtonPress)
481 {
482 if(pObject->inherits("QLabel"))
483 {
484 KviCString szName = ((QLabel *)pObject)->objectName();
485 bool bOk;
486 KviIconManager::SmallIcon eIcon = (KviIconManager::SmallIcon)szName.toInt(&bOk);
487 if(bOk)
488 emit selected(eIcon);
489
490 if(parentWidget() && isVisible() && parentWidget()->inherits("QMenu"))
491 {
492 parentWidget()->close();
493 return true;
494 }
495 else
496 {
497 if(const QPixmap * pPix = ((QLabel *)pObject)->pixmap())
498 {
499 QDrag * pDrag = new QDrag(this);
500 QMimeData * pMime = new QMimeData;
501
502 pMime->setText(pObject->objectName());
503 pMime->setImageData(*pPix);
504 pDrag->setMimeData(pMime);
505 pDrag->setPixmap(*pPix);
506 }
507 }
508 }
509 }
510 else if(pEvent->type() == QEvent::DragEnter)
511 {
512 ((QDragEnterEvent *)pEvent)->setAccepted(true);
513 return true;
514 }
515 return QWidget::eventFilter(pObject, pEvent);
516 }
517
KviCachedPixmap(QPixmap * pPix,const QString & szPath)518 KviCachedPixmap::KviCachedPixmap(QPixmap * pPix, const QString & szPath)
519 {
520 m_szPath = szPath;
521 m_tLastAccess = kvi_unixTime();
522 m_pPixmap = pPix;
523 m_uSize = m_pPixmap->width() * m_pPixmap->height() * (m_pPixmap->depth() / 8);
524 }
525
~KviCachedPixmap()526 KviCachedPixmap::~KviCachedPixmap()
527 {
528 delete m_pPixmap;
529 }
530
updateLastAccessTime()531 void KviCachedPixmap::updateLastAccessTime()
532 {
533 m_tLastAccess = kvi_unixTime();
534 }
535
KviIconManager()536 KviIconManager::KviIconManager()
537 {
538 initQResourceBackend();
539
540 m_pCachedImages = new KviPointerHashTable<QString, KviCachedPixmap>(21, true);
541 m_pCachedImages->setAutoDelete(true);
542
543 QString szBuffer;
544
545 // Load the userchanstate image
546 g_pApp->findImage(szBuffer, KVI_USERCHANSTATE_IMAGE_NAME);
547 g_pUserChanStatePixmap = new QPixmap(szBuffer);
548
549 g_pApp->findImage(szBuffer, KVI_ACTIVITYMETER_IMAGE_NAME);
550 g_pActivityMeterPixmap = new QPixmap(szBuffer);
551 }
552
~KviIconManager()553 KviIconManager::~KviIconManager()
554 {
555 delete g_pUserChanStatePixmap;
556 delete g_pActivityMeterPixmap;
557
558 if(m_pIconWidget)
559 delete m_pIconWidget;
560
561 for(int i = 0; i < KviIconManager::IconCount; i++)
562 {
563 if(m_smallIcons[i])
564 delete m_smallIcons[i];
565 }
566 delete m_pCachedImages;
567 if(m_pIconNames)
568 delete m_pIconNames;
569 }
570
initQResourceBackend()571 void KviIconManager::initQResourceBackend()
572 {
573 QString szPath;
574
575 g_pApp->getLocalKvircDirectory(szPath, KviApplication::Pics);
576 QDir::addSearchPath("icons", szPath);
577
578 g_pApp->getGlobalKvircDirectory(szPath, KviApplication::Pics);
579 QDir::addSearchPath("icons", szPath);
580
581 g_pApp->getLocalKvircDirectory(szPath, KviApplication::SmallIcons);
582 QDir::addSearchPath("smallicons", szPath);
583
584 g_pApp->getGlobalKvircDirectory(szPath, KviApplication::SmallIcons);
585 QDir::addSearchPath("smallicons", szPath);
586 }
587
getSmallIconResourceName(SmallIcon eIcon)588 QString KviIconManager::getSmallIconResourceName(SmallIcon eIcon)
589 {
590 QString szName("smallicons:kcs_");
591 szName.append(g_szIconNames[eIcon]);
592 szName.append(".png");
593 return szName;
594 }
595
iconName(int iIcon)596 KviIconManager::SmallIcon KviIconManager::iconName(int iIcon)
597 {
598 switch(iIcon)
599 {
600 case 1:
601 return KviIconManager::Close;
602 break;
603 case 2:
604 return KviIconManager::History;
605 break;
606 case 3:
607 return KviIconManager::HistoryOff;
608 break;
609 case 4:
610 return KviIconManager::UserMode;
611 break;
612 case 5:
613 return KviIconManager::DefaultIcon;
614 break;
615 case 6:
616 return KviIconManager::Dock;
617 break;
618 case 7:
619 return KviIconManager::UnDock;
620 break;
621 case 8:
622 return KviIconManager::QuitApp;
623 break;
624 case 9:
625 return KviIconManager::Console;
626 break;
627 case 10:
628 return KviIconManager::Save;
629 break;
630 case 11:
631 return KviIconManager::ParserError;
632 break;
633 case 12:
634 return KviIconManager::ParserWarning;
635 break;
636 case 13:
637 return KviIconManager::Server;
638 break;
639 case 14:
640 return KviIconManager::World;
641 break;
642 case 15:
643 return KviIconManager::Proxy;
644 break;
645 case 16:
646 return KviIconManager::KVIrc;
647 break;
648 case 17:
649 return KviIconManager::Cut;
650 break;
651 case 18:
652 return KviIconManager::Copy;
653 break;
654 case 19:
655 return KviIconManager::Paste;
656 break;
657 case 20:
658 return KviIconManager::Options;
659 break;
660 case 21:
661 return KviIconManager::SocketMessage;
662 break;
663 case 22:
664 return KviIconManager::SocketWarning;
665 break;
666 case 23:
667 return KviIconManager::SocketError;
668 break;
669 case 24:
670 return KviIconManager::SystemError;
671 break;
672 case 25:
673 return KviIconManager::Raw;
674 break;
675 case 26:
676 return KviIconManager::SystemWarning;
677 break;
678 case 27:
679 return KviIconManager::SystemMessage;
680 break;
681 case 28:
682 return KviIconManager::UnHandled;
683 break;
684 case 29:
685 return KviIconManager::ServerInfo;
686 break;
687 case 30:
688 return KviIconManager::Motd;
689 break;
690 case 31:
691 return KviIconManager::Channel;
692 break;
693 case 32:
694 return KviIconManager::HideDoubleView;
695 break;
696 case 33:
697 return KviIconManager::ShowDoubleView;
698 break;
699 case 34:
700 return KviIconManager::Op;
701 break;
702 case 35:
703 return KviIconManager::Voice;
704 break;
705 case 36:
706 return KviIconManager::ServerPing;
707 break;
708 case 37:
709 return KviIconManager::ShowListView;
710 break;
711 case 38:
712 return KviIconManager::HideListView;
713 break;
714 case 39:
715 return KviIconManager::Join;
716 break;
717 case 40:
718 return KviIconManager::Part;
719 break;
720 case 41:
721 return KviIconManager::Unrecognized;
722 break;
723 case 42:
724 return KviIconManager::Topic;
725 break;
726 case 43:
727 return KviIconManager::Accept;
728 break;
729 case 44:
730 return KviIconManager::Discard;
731 break;
732 case 45:
733 return KviIconManager::OwnPrivMsg;
734 break;
735 case 46:
736 return KviIconManager::ChanPrivMsg;
737 break;
738 case 47:
739 return KviIconManager::Query;
740 break;
741 case 48:
742 return KviIconManager::QueryPrivMsg;
743 break;
744 case 49:
745 return KviIconManager::Help;
746 break;
747 case 50:
748 return KviIconManager::QuestionMark;
749 break;
750 case 51:
751 return KviIconManager::CtcpReply;
752 break;
753 case 52:
754 return KviIconManager::CtcpRequestReplied;
755 break;
756 case 53:
757 return KviIconManager::CtcpRequestIgnored;
758 break;
759 case 54:
760 return KviIconManager::CtcpRequestFlood;
761 break;
762 case 55:
763 return KviIconManager::CtcpRequestUnknown;
764 break;
765 case 56:
766 return KviIconManager::Action;
767 break;
768 case 57:
769 return KviIconManager::Avatar;
770 break;
771 case 58:
772 return KviIconManager::Quit;
773 break;
774 case 59:
775 return KviIconManager::Split;
776 break;
777 case 60:
778 return KviIconManager::QuitSplit;
779 break;
780 case 61:
781 return KviIconManager::Nick;
782 break;
783 case 62:
784 return KviIconManager::DeOp;
785 break;
786 case 63:
787 return KviIconManager::DeVoice;
788 break;
789 case 64:
790 return KviIconManager::Mode;
791 break;
792 case 65:
793 return KviIconManager::Key;
794 break;
795 case 66:
796 return KviIconManager::Limit;
797 break;
798 case 67:
799 return KviIconManager::Ban;
800 break;
801 case 68:
802 return KviIconManager::UnBan;
803 break;
804 case 69:
805 return KviIconManager::BanExcept;
806 break;
807 case 70:
808 return KviIconManager::BanUnExcept;
809 break;
810 case 71:
811 return KviIconManager::InviteExcept;
812 break;
813 case 72:
814 return KviIconManager::InviteUnExcept;
815 break;
816 case 73:
817 return KviIconManager::ChanMode;
818 break;
819 case 74:
820 return KviIconManager::ChanModeHide;
821 break;
822 case 75:
823 return KviIconManager::Who;
824 break;
825 case 76:
826 return KviIconManager::Editor;
827 break;
828 case 77:
829 return KviIconManager::DccRequest;
830 break;
831 case 78:
832 return KviIconManager::DccMsg;
833 break;
834 case 79:
835 return KviIconManager::DccError;
836 break;
837 case 80:
838 return KviIconManager::IconManager;
839 break;
840 case 81:
841 return KviIconManager::ScriptCenter;
842 break;
843 case 82:
844 return KviIconManager::Bomb;
845 break;
846 case 83:
847 return KviIconManager::Event;
848 break;
849 case 84:
850 return KviIconManager::EventNoHandlers;
851 break;
852 case 85:
853 return KviIconManager::Handler;
854 break;
855 case 86:
856 return KviIconManager::HandlerDisabled;
857 break;
858 case 87:
859 return KviIconManager::NickNameProblem;
860 break;
861 case 88:
862 return KviIconManager::WhoisUser;
863 break;
864 case 89:
865 return KviIconManager::WhoisChannels;
866 break;
867 case 90:
868 return KviIconManager::WhoisIdle;
869 break;
870 case 91:
871 return KviIconManager::WhoisServer;
872 break;
873 case 92:
874 return KviIconManager::WhoisOther;
875 break;
876 case 93:
877 return KviIconManager::Time;
878 break;
879 case 94:
880 return KviIconManager::NotifyOnLine;
881 break;
882 case 95:
883 return KviIconManager::NotifyOffLine;
884 break;
885 case 96:
886 return KviIconManager::Locked;
887 break;
888 case 97:
889 return KviIconManager::UnLocked;
890 break;
891 case 98:
892 return KviIconManager::LockedOff;
893 break;
894 case 99:
895 return KviIconManager::UnLockedOff;
896 break;
897 case 100:
898 return KviIconManager::OwnPrivMsgCrypted;
899 break;
900 case 101:
901 return KviIconManager::ChanPrivMsgCrypted;
902 break;
903 case 102:
904 return KviIconManager::QueryPrivMsgCrypted;
905 break;
906 case 103:
907 return KviIconManager::DccChatMsg;
908 break;
909 case 104:
910 return KviIconManager::DccChatMsgCrypted;
911 break;
912 case 105:
913 return KviIconManager::Irc;
914 break;
915 case 106:
916 return KviIconManager::Folder;
917 break;
918 case 107:
919 return KviIconManager::Home;
920 break;
921 case 108:
922 return KviIconManager::BookMarks;
923 break;
924 case 109:
925 return KviIconManager::Spy;
926 break;
927 case 110:
928 return KviIconManager::Kick;
929 break;
930 case 111:
931 return KviIconManager::Linux;
932 break;
933 case 112:
934 return KviIconManager::Links;
935 break;
936 case 113:
937 return KviIconManager::RegUsers;
938 break;
939 case 114:
940 return KviIconManager::TrayIcon;
941 break;
942 case 115:
943 return KviIconManager::UnsetMode;
944 break;
945 case 116:
946 return KviIconManager::Favorite;
947 break;
948 case 117:
949 return KviIconManager::Toolbar;
950 break;
951 case 118:
952 return KviIconManager::ServerFavorite;
953 break;
954 case 119:
955 return KviIconManager::Log;
956 break;
957 case 120:
958 return KviIconManager::Remove;
959 break;
960 case 121:
961 return KviIconManager::File;
962 break;
963 case 122:
964 return KviIconManager::Icq;
965 break;
966 case 123:
967 return KviIconManager::IcqYellow;
968 break;
969 case 124:
970 return KviIconManager::IcqRed;
971 break;
972 case 125:
973 return KviIconManager::IcqBlue;
974 break;
975 case 126:
976 return KviIconManager::IcqLightGreen;
977 break;
978 case 127:
979 return KviIconManager::IcqLightYellow;
980 break;
981 case 128:
982 return KviIconManager::Message;
983 break;
984 case 129:
985 return KviIconManager::MessageSent;
986 break;
987 case 130:
988 return KviIconManager::BlueSquare;
989 break;
990 case 131:
991 return KviIconManager::VioletSquare;
992 break;
993 case 132:
994 return KviIconManager::YellowSquare;
995 break;
996 case 133:
997 return KviIconManager::GreenSquare;
998 break;
999 case 134:
1000 return KviIconManager::BlackSquare;
1001 break;
1002 case 135:
1003 return KviIconManager::RedSquare;
1004 break;
1005 case 136:
1006 return KviIconManager::CyanSquare;
1007 break;
1008 case 137:
1009 return KviIconManager::DarkGreenSquare;
1010 break;
1011 case 138:
1012 return KviIconManager::Terminal;
1013 break;
1014 case 139:
1015 return KviIconManager::WallOps;
1016 break;
1017 case 140:
1018 return KviIconManager::Invisible;
1019 break;
1020 case 141:
1021 return KviIconManager::ServerNotice;
1022 break;
1023 case 142:
1024 return KviIconManager::Gnutella;
1025 break;
1026 case 143:
1027 return KviIconManager::Search;
1028 break;
1029 case 144:
1030 return KviIconManager::Files;
1031 break;
1032 case 145:
1033 return KviIconManager::NewNetwork;
1034 break;
1035 case 146:
1036 return KviIconManager::Package;
1037 break;
1038 case 147:
1039 return KviIconManager::NewServer;
1040 break;
1041 case 148:
1042 return KviIconManager::Idea;
1043 break;
1044 case 149:
1045 return KviIconManager::Colors;
1046 break;
1047 case 150:
1048 return KviIconManager::Gui;
1049 break;
1050 case 151:
1051 return KviIconManager::IrcView;
1052 break;
1053 case 152:
1054 return KviIconManager::Alias;
1055 break;
1056 case 153:
1057 return KviIconManager::ChannelNotice;
1058 break;
1059 case 154:
1060 return KviIconManager::ChannelNoticeCrypted;
1061 break;
1062 case 155:
1063 return KviIconManager::QueryNotice;
1064 break;
1065 case 156:
1066 return KviIconManager::QueryNoticeCrypted;
1067 break;
1068 case 157:
1069 return KviIconManager::MenuBar;
1070 break;
1071 case 158:
1072 return KviIconManager::Popup;
1073 break;
1074 case 159:
1075 return KviIconManager::Prologue;
1076 break;
1077 case 160:
1078 return KviIconManager::Epilogue;
1079 break;
1080 case 161:
1081 return KviIconManager::SharedFiles;
1082 break;
1083 case 162:
1084 return KviIconManager::CtcpReplyUnknown;
1085 break;
1086 case 163:
1087 return KviIconManager::Canvas;
1088 break;
1089 case 164:
1090 return KviIconManager::NickServ;
1091 break;
1092 case 165:
1093 return KviIconManager::ChanServ;
1094 break;
1095 case 166:
1096 return KviIconManager::DccVoice;
1097 break;
1098 case 167:
1099 return KviIconManager::Play;
1100 break;
1101 case 168:
1102 return KviIconManager::Record;
1103 break;
1104 case 169:
1105 return KviIconManager::KickOff;
1106 break;
1107 case 170:
1108 return KviIconManager::Away;
1109 break;
1110 case 171:
1111 return KviIconManager::Ident;
1112 break;
1113 case 172:
1114 return KviIconManager::HomePage;
1115 break;
1116 case 173:
1117 return KviIconManager::List;
1118 break;
1119 case 174:
1120 return KviIconManager::HalfOp;
1121 break;
1122 case 175:
1123 return KviIconManager::HalfDeOp;
1124 break;
1125 case 176:
1126 return KviIconManager::Invite;
1127 break;
1128 case 177:
1129 return KviIconManager::MultiMedia;
1130 break;
1131 case 178:
1132 return KviIconManager::User;
1133 break;
1134 case 179:
1135 return KviIconManager::Input;
1136 break;
1137 case 180:
1138 return KviIconManager::Messages;
1139 break;
1140 case 181:
1141 return KviIconManager::QueryTrace;
1142 break;
1143 case 182:
1144 return KviIconManager::NoChannel;
1145 break;
1146 case 183:
1147 return KviIconManager::BroadcastPrivMsg;
1148 break;
1149 case 184:
1150 return KviIconManager::BroadcastNotice;
1151 break;
1152 case 185:
1153 return KviIconManager::Url;
1154 break;
1155 case 186:
1156 return KviIconManager::RawEvent;
1157 break;
1158 case 187:
1159 return KviIconManager::RawEventNoHandlers;
1160 break;
1161 case 188:
1162 return KviIconManager::MeKick;
1163 break;
1164 case 189:
1165 return KviIconManager::MeOp;
1166 break;
1167 case 190:
1168 return KviIconManager::MeVoice;
1169 break;
1170 case 191:
1171 return KviIconManager::MeDeOp;
1172 break;
1173 case 192:
1174 return KviIconManager::MeDeVoice;
1175 break;
1176 case 193:
1177 return KviIconManager::MeHalfOp;
1178 break;
1179 case 194:
1180 return KviIconManager::MeDeHalfOp;
1181 break;
1182 case 195:
1183 return KviIconManager::MeBan;
1184 break;
1185 case 196:
1186 return KviIconManager::MeUnBan;
1187 break;
1188 case 197:
1189 return KviIconManager::MeBanExcept;
1190 break;
1191 case 198:
1192 return KviIconManager::MeBanUnExcept;
1193 break;
1194 case 199:
1195 return KviIconManager::MeInviteExcept;
1196 break;
1197 case 200:
1198 return KviIconManager::MeInviteUnExcept;
1199 break;
1200 case 201:
1201 return KviIconManager::ClassicWindowList;
1202 break;
1203 case 202:
1204 return KviIconManager::TreeWindowList;
1205 break;
1206 case 203:
1207 return KviIconManager::Ignore;
1208 break;
1209 case 204:
1210 return KviIconManager::UserList;
1211 break;
1212 case 205:
1213 return KviIconManager::Stats;
1214 break;
1215 case 206:
1216 return KviIconManager::PopupMenu;
1217 break;
1218 case 207:
1219 return KviIconManager::ServerConfiguration;
1220 break;
1221 case 208:
1222 return KviIconManager::Irc0;
1223 break;
1224 case 209:
1225 return KviIconManager::Irc1;
1226 break;
1227 case 210:
1228 return KviIconManager::Irc2;
1229 break;
1230 case 211:
1231 return KviIconManager::Irc3;
1232 break;
1233 case 212:
1234 return KviIconManager::Irc4;
1235 break;
1236 case 213:
1237 return KviIconManager::Irc5;
1238 break;
1239 case 214:
1240 return KviIconManager::Heart;
1241 break;
1242 case 215:
1243 return KviIconManager::HeartBroken;
1244 break;
1245 case 216:
1246 return KviIconManager::Rose;
1247 break;
1248 case 217:
1249 return KviIconManager::BigGrin;
1250 break;
1251 case 218:
1252 return KviIconManager::BigGrinGlasses;
1253 break;
1254 case 219:
1255 return KviIconManager::BigGrinEyes;
1256 break;
1257 case 220:
1258 return KviIconManager::TextExclamative;
1259 break;
1260 case 221:
1261 return KviIconManager::TextPoints;
1262 break;
1263 case 222:
1264 return KviIconManager::Kiss;
1265 break;
1266 case 223:
1267 return KviIconManager::Surprised1;
1268 break;
1269 case 224:
1270 return KviIconManager::Ugly;
1271 break;
1272 case 225:
1273 return KviIconManager::Angry;
1274 break;
1275 case 226:
1276 return KviIconManager::Surprised2;
1277 break;
1278 case 227:
1279 return KviIconManager::Smile;
1280 break;
1281 case 228:
1282 return KviIconManager::Tongue;
1283 break;
1284 case 229:
1285 return KviIconManager::Ssl;
1286 break;
1287 case 230:
1288 return KviIconManager::Cry;
1289 break;
1290 case 231:
1291 return KviIconManager::Eye;
1292 break;
1293 case 232:
1294 return KviIconManager::DeadChannel;
1295 break;
1296 case 233:
1297 return KviIconManager::DeadQuery;
1298 break;
1299 case 234:
1300 return KviIconManager::Sound;
1301 break;
1302 case 235:
1303 return KviIconManager::ToolBarEditor;
1304 break;
1305 case 236:
1306 return KviIconManager::TextEncoding;
1307 break;
1308 case 237:
1309 return KviIconManager::NewItem;
1310 break;
1311 case 238:
1312 return KviIconManager::NewItemByWizard;
1313 break;
1314 case 239:
1315 return KviIconManager::DeleteItem;
1316 break;
1317 case 240:
1318 return KviIconManager::EditItem;
1319 break;
1320 case 241:
1321 return KviIconManager::FileTransfer;
1322 break;
1323 case 242:
1324 return KviIconManager::ChanAdmin;
1325 break;
1326 case 243:
1327 return KviIconManager::ChanUnAdmin;
1328 break;
1329 case 244:
1330 return KviIconManager::MeChanAdmin;
1331 break;
1332 case 245:
1333 return KviIconManager::MeChanUnAdmin;
1334 break;
1335 case 246:
1336 return KviIconManager::UserOp;
1337 break;
1338 case 247:
1339 return KviIconManager::DeUserOp;
1340 break;
1341 case 248:
1342 return KviIconManager::MeUserOp;
1343 break;
1344 case 249:
1345 return KviIconManager::MeDeUserOp;
1346 break;
1347 case 250:
1348 return KviIconManager::Applet;
1349 break;
1350 case 251:
1351 return KviIconManager::Spam;
1352 break;
1353 case 252:
1354 return KviIconManager::Transparent;
1355 break;
1356 case 253:
1357 return KviIconManager::Notifier;
1358 break;
1359 case 254:
1360 return KviIconManager::UserWindow;
1361 break;
1362 case 255:
1363 return KviIconManager::StatusBar;
1364 break;
1365 case 256:
1366 return KviIconManager::NotAway;
1367 break;
1368 case 257:
1369 return KviIconManager::Plus;
1370 break;
1371 case 258:
1372 return KviIconManager::Minus;
1373 break;
1374 case 259:
1375 return KviIconManager::BinaryText;
1376 break;
1377 case 260:
1378 return KviIconManager::ChanOwner;
1379 break;
1380 case 261:
1381 return KviIconManager::ChanUnOwner;
1382 break;
1383 case 262:
1384 return KviIconManager::MeChanOwner;
1385 break;
1386 case 263:
1387 return KviIconManager::MeChanUnOwner;
1388 break;
1389 case 264:
1390 return KviIconManager::Afraid;
1391 break;
1392 case 265:
1393 return KviIconManager::Teeth;
1394 break;
1395 case 266:
1396 return KviIconManager::SysMonitor;
1397 break;
1398 case 267:
1399 return KviIconManager::SayColors;
1400 break;
1401 case 268:
1402 return KviIconManager::Finger;
1403 break;
1404 case 269:
1405 return KviIconManager::HighlightText;
1406 break;
1407 case 270:
1408 return KviIconManager::TearSmile;
1409 break;
1410 case 271:
1411 return KviIconManager::Shy;
1412 break;
1413 case 272:
1414 return KviIconManager::ServerError;
1415 break;
1416 case 273:
1417 return KviIconManager::Cafe;
1418 break;
1419 case 274:
1420 return KviIconManager::Addons;
1421 break;
1422 case 275:
1423 return KviIconManager::ChanOwnerAway;
1424 break;
1425 case 276:
1426 return KviIconManager::OpAway;
1427 break;
1428 case 277:
1429 return KviIconManager::VoiceAway;
1430 break;
1431 case 278:
1432 return KviIconManager::ChanAdminAway;
1433 break;
1434 case 279:
1435 return KviIconManager::UserOpAway;
1436 break;
1437 case 280:
1438 return KviIconManager::HalfOpAway;
1439 break;
1440 case 281:
1441 return KviIconManager::ClassEditor;
1442 break;
1443 case 282:
1444 return KviIconManager::Demoralized;
1445 break;
1446 case 283:
1447 return KviIconManager::Slurp;
1448 break;
1449 case 284:
1450 return KviIconManager::NameSpace;
1451 break;
1452 case 285:
1453 return KviIconManager::SaySmile;
1454 break;
1455 case 286:
1456 return KviIconManager::SayKvs;
1457 break;
1458 case 287:
1459 return KviIconManager::ThemeOptions;
1460 break;
1461 case 288:
1462 return KviIconManager::Bug;
1463 break;
1464 case 289:
1465 return KviIconManager::Refresh;
1466 break;
1467 case 290:
1468 return KviIconManager::Theme;
1469 break;
1470 case 291:
1471 return KviIconManager::ScreenShot;
1472 break;
1473 case 292:
1474 return KviIconManager::Update;
1475 break;
1476 case 293:
1477 return KviIconManager::NotUpdate;
1478 break;
1479 case 294:
1480 return KviIconManager::FailUpdate;
1481 break;
1482 case 295:
1483 return KviIconManager::UnreadText;
1484 break;
1485 case 296:
1486 return KviIconManager::IrcOp;
1487 break;
1488 case 297:
1489 return KviIconManager::IrcOpAway;
1490 break;
1491 case 298:
1492 return KviIconManager::DeIrcOp;
1493 break;
1494 case 299:
1495 return KviIconManager::MeIrcOp;
1496 break;
1497 case 300:
1498 return KviIconManager::MeDeIrcOp;
1499 break;
1500 case 301:
1501 return KviIconManager::Angel;
1502 break;
1503 case 302:
1504 return KviIconManager::Clown;
1505 break;
1506 case 303:
1507 return KviIconManager::Devil;
1508 break;
1509 case 304:
1510 return KviIconManager::InLove;
1511 break;
1512 case 305:
1513 return KviIconManager::Ninja;
1514 break;
1515 case 306:
1516 return KviIconManager::Pirate;
1517 break;
1518 case 307:
1519 return KviIconManager::Puke;
1520 break;
1521 case 308:
1522 return KviIconManager::Rage;
1523 break;
1524 case 309:
1525 return KviIconManager::Class;
1526 break;
1527 case 310:
1528 return KviIconManager::ClassNotBuilt;
1529 break;
1530 case 311:
1531 return KviIconManager::Function;
1532 break;
1533 case 312:
1534 return KviIconManager::SexMale;
1535 break;
1536 case 313:
1537 return KviIconManager::SexFemale;
1538 break;
1539 case 314:
1540 return KviIconManager::IrcBot;
1541 break;
1542 case 315:
1543 return KviIconManager::AlienIrcOp;
1544 break;
1545 case 316:
1546 return KviIconManager::MemoServ;
1547 break;
1548 case 317:
1549 return KviIconManager::Info;
1550 break;
1551 case 318:
1552 return KviIconManager::Warning;
1553 break;
1554 case 319:
1555 return KviIconManager::Shield;
1556 break;
1557 case 320:
1558 return KviIconManager::RawEventEditor;
1559 break;
1560 case 321:
1561 return KviIconManager::EventEditor;
1562 break;
1563 case 322:
1564 return KviIconManager::ActionEditor;
1565 break;
1566 case 323:
1567 return KviIconManager::AliasEditor;
1568 break;
1569 case 324:
1570 return KviIconManager::PopupEditor;
1571 break;
1572 case 325:
1573 return KviIconManager::Dcc;
1574 break;
1575 case 326:
1576 return KviIconManager::Socket;
1577 break;
1578 case 327:
1579 return KviIconManager::Cake;
1580 break;
1581 case 328:
1582 return KviIconManager::HandIly;
1583 break;
1584 case 329:
1585 return KviIconManager::ThumbDown;
1586 break;
1587 case 330:
1588 return KviIconManager::ThumbUp;
1589 break;
1590 case 331:
1591 return KviIconManager::FacePalm;
1592 break;
1593 case 332:
1594 return KviIconManager::Identity;
1595 break;
1596 case 333:
1597 return KviIconManager::NickPopup;
1598 break;
1599 case 334:
1600 return KviIconManager::Tools;
1601 break;
1602 case 335:
1603 return KviIconManager::FavoriteOff;
1604 break;
1605 case 336:
1606 return KviIconManager::NewProxy;
1607 break;
1608 case 337:
1609 return KviIconManager::ActionCrypted;
1610 break;
1611 case 338:
1612 return KviIconManager::TopicCrypted;
1613 break;
1614 case 339:
1615 return KviIconManager::CtcpCrypted;
1616 break;
1617 case 340:
1618 return KviIconManager::OwnAction;
1619 break;
1620 case 341:
1621 return KviIconManager::OwnActionCrypted;
1622 break;
1623 case 0:
1624 case KviIconManager::IconCount:
1625 default:
1626 return KviIconManager::None;
1627 break;
1628 }
1629 }
1630
getSmallIconName(SmallIcon eIcon)1631 const char * KviIconManager::getSmallIconName(SmallIcon eIcon)
1632 {
1633 return g_szIconNames[eIcon];
1634 }
1635
getSmallIconName(int iIcon)1636 const char * KviIconManager::getSmallIconName(int iIcon)
1637 {
1638 return g_szIconNames[iIcon];
1639 }
1640
getSmallIconIdFromName(const QString & szName)1641 int KviIconManager::getSmallIconIdFromName(const QString & szName)
1642 {
1643 if(!m_pIconNames)
1644 {
1645 m_pIconNames = new KviPointerHashTable<QString, int>(257, false);
1646 m_pIconNames->setAutoDelete(true);
1647
1648 for(int i = 0; i < IconCount; i++)
1649 {
1650 int * pInt = new int;
1651 *pInt = i;
1652 m_pIconNames->replace(QString(g_szIconNames[i]), pInt);
1653 }
1654 }
1655 int * pInt = m_pIconNames->find(szName);
1656 if(!pInt)
1657 return 0;
1658 return *pInt;
1659 }
1660
showIconWidget()1661 void KviIconManager::showIconWidget()
1662 {
1663 if(!m_pIconWidget)
1664 {
1665 m_pIconWidget = new KviIconWidget();
1666 connect(m_pIconWidget, SIGNAL(closed()), this, SLOT(iconWidgetClosed()));
1667 }
1668 m_pIconWidget->show();
1669 m_pIconWidget->raise();
1670 m_pIconWidget->setFocus();
1671 }
1672
iconWidgetClosed()1673 void KviIconManager::iconWidgetClosed()
1674 {
1675 delete m_pIconWidget;
1676 m_pIconWidget = nullptr;
1677 }
1678
getPixmapWithCache(const QString & szName)1679 KviCachedPixmap * KviIconManager::getPixmapWithCache(const QString & szName)
1680 {
1681 if(szName.isEmpty())
1682 return nullptr;
1683
1684 KviCachedPixmap * pCache = m_pCachedImages->find(szName);
1685
1686 if(pCache)
1687 {
1688 pCache->updateLastAccessTime();
1689 return pCache;
1690 }
1691
1692 QPixmap * pPix = nullptr;
1693
1694 QString szRetPath;
1695
1696 if(!g_pApp->findImage(szRetPath, szName))
1697 return nullptr;
1698
1699 pPix = new QPixmap(szRetPath);
1700 if(pPix->isNull())
1701 {
1702 delete pPix; // it is not an valid image!!! (really bad situation...)
1703 pPix = nullptr;
1704 return nullptr;
1705 }
1706
1707 pCache = new KviCachedPixmap(pPix, QString(szRetPath));
1708 addToCache(szName, pCache);
1709
1710 return pCache;
1711 }
1712
getPixmapWithCacheScaleOnLoad(const QString & szName,int iMaxWidth,int iMaxHeight)1713 KviCachedPixmap * KviIconManager::getPixmapWithCacheScaleOnLoad(const QString & szName, int iMaxWidth, int iMaxHeight)
1714 {
1715 if(szName.isEmpty())
1716 return nullptr;
1717
1718 KviCachedPixmap * pCache = m_pCachedImages->find(szName);
1719
1720 if(pCache)
1721 {
1722 pCache->updateLastAccessTime();
1723 return pCache;
1724 }
1725
1726 QPixmap * pPix = nullptr;
1727
1728 QString szRetPath;
1729
1730 if(!g_pApp->findImage(szRetPath, szName))
1731 return nullptr;
1732
1733 pPix = new QPixmap(szRetPath);
1734 if(pPix->isNull())
1735 {
1736 delete pPix; // it is not an valid image!!! (really bad situation...)
1737 pPix = nullptr;
1738 return nullptr;
1739 }
1740 if((pPix->width() > iMaxWidth) || (pPix->height() > iMaxHeight))
1741 {
1742 // scale to fit
1743 int scaleW = iMaxWidth;
1744 int scaleH;
1745 scaleH = (pPix->height() * iMaxWidth) / pPix->width();
1746 if(scaleH > iMaxHeight)
1747 {
1748 scaleH = iMaxHeight;
1749 scaleW = (scaleH * pPix->width()) / pPix->height();
1750 }
1751
1752 QImage img = pPix->toImage();
1753 *pPix = QPixmap::fromImage(img.scaled(scaleW, scaleH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
1754 }
1755
1756 pCache = new KviCachedPixmap(pPix, QString(szRetPath));
1757 addToCache(szName, pCache);
1758
1759 return pCache;
1760 }
1761
addToCache(const QString & szName,KviCachedPixmap * pCache)1762 void KviIconManager::addToCache(const QString & szName, KviCachedPixmap * pCache)
1763 {
1764 //if((m_uCacheTotalSize + pCache->size()) >= m_uCacheMaxSize)
1765 // cacheCleanup();
1766
1767 m_pCachedImages->insert(szName, pCache);
1768 m_uCacheTotalSize += pCache->size();
1769 }
1770
getImage(const QString & szId,bool bCanBeNumber,QString * pszRetPath)1771 QPixmap * KviIconManager::getImage(const QString & szId, bool bCanBeNumber, QString * pszRetPath)
1772 {
1773 if(szId.isEmpty())
1774 return nullptr;
1775
1776 if(bCanBeNumber)
1777 {
1778 bool bOk;
1779 int iIdx = szId.toInt(&bOk);
1780 if(bOk)
1781 {
1782 // was a number : this is not a filename
1783 if(iIdx >= 0)
1784 return getSmallIcon(iIdx % KviIconManager::IconCount);
1785 }
1786 else
1787 {
1788 if(szId.startsWith("$icon"))
1789 {
1790 QString szTmp = szId.trimmed();
1791 szTmp.replace("$icon(", "");
1792 szTmp.replace(")", "");
1793 szTmp = szTmp.trimmed();
1794 szTmp.replace("\"", "");
1795 iIdx = getSmallIconIdFromName(szTmp.trimmed());
1796 if(iIdx >= 0)
1797 return getSmallIcon(iIdx % KviIconManager::IconCount);
1798 }
1799 }
1800 }
1801
1802 KviCachedPixmap * pCache = getPixmapWithCache(szId);
1803 if(!pCache)
1804 return nullptr;
1805
1806 if(pszRetPath)
1807 *pszRetPath = pCache->path();
1808
1809 return pCache->pixmap();
1810 }
1811
getBigIcon(const QString & szName)1812 QPixmap * KviIconManager::getBigIcon(const QString & szName)
1813 {
1814 QPixmap * pPix = getPixmap(szName);
1815 if(pPix)
1816 return pPix;
1817
1818 bool bOk;
1819 int iIdx = szName.toInt(&bOk);
1820 if(bOk && (iIdx >= 0))
1821 {
1822 // was a number : this is not a filename
1823 // it was a small icon: scale it and cache it
1824 QString szTmpName = szName;
1825 szTmpName += ".scaled16to32";
1826 pPix = getPixmap(szTmpName);
1827 if(pPix)
1828 return pPix;
1829 pPix = getSmallIcon(iIdx % KviIconManager::IconCount);
1830 if(pPix)
1831 {
1832 QImage tmp = pPix->toImage();
1833 QImage tmp2 = tmp.scaled(32, 32, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
1834 QPixmap * pPix2 = new QPixmap();
1835 *pPix2 = QPixmap::fromImage(tmp2);
1836 KviCachedPixmap * pCache = new KviCachedPixmap(pPix2, QString());
1837 addToCache(szTmpName, pCache);
1838 return pCache->pixmap();
1839 }
1840 }
1841
1842 pPix = getPixmap("kvi_bigicon_unknown.png");
1843 if(pPix)
1844 return pPix;
1845 KviCachedPixmap * pCache = new KviCachedPixmap(new QPixmap(32, 32), QString());
1846 addToCache(szName, pCache);
1847 return pCache->pixmap();
1848 }
1849
urlToCachedFileName(QString & szName)1850 void KviIconManager::urlToCachedFileName(QString & szName)
1851 {
1852 szName.replace(":", "_");
1853 szName.replace(";", "_");
1854 szName.replace("/", "_");
1855 szName.replace("\\", "_");
1856 szName.replace("\"", "_");
1857 szName.replace("\'", "_");
1858 szName.replace("(", "_");
1859 szName.replace(")", "_");
1860 szName.replace("?", "_");
1861 szName.replace("___", ".");
1862 //cut filenames to 255 chars, trying to preserve file name/extension (bug #616)
1863 if(szName.size() > 255)
1864 {
1865 QString szExt = szName.right(55);
1866 szName.truncate(200);
1867 szName.append(szExt);
1868 }
1869 }
1870
getAvatar(const QString & szLocalPath,const QString & szName)1871 KviAvatar * KviIconManager::getAvatar(const QString & szLocalPath, const QString & szName)
1872 {
1873 QString szP, szN;
1874
1875 if(szLocalPath.isEmpty())
1876 {
1877 //both path and name empty => fail
1878 if(szName.isEmpty())
1879 return nullptr;
1880 if(KviQString::equalCIN("http://", szName, 7) || KviQString::equalCIN("https://", szName, 8))
1881 {
1882 // it's a URL, cache it locally
1883 szN = szName;
1884 urlToCachedFileName(szN);
1885 g_pApp->getLocalKvircDirectory(szP, KviApplication::Avatars, szN);
1886 szN = szName; // keep the remote URL as name
1887 }
1888 else
1889 {
1890 //locally cached avatar, called only by its szName
1891 szN = KviFileUtils::extractFileName(szName);
1892 g_pApp->getLocalKvircDirectory(szP, KviApplication::Avatars, szN);
1893 }
1894 }
1895 else if(szName.isEmpty())
1896 {
1897 if(szLocalPath.isEmpty())
1898 return nullptr;
1899 szP = szLocalPath;
1900 szN = KviFileUtils::extractFileName(szLocalPath);
1901 }
1902 else
1903 {
1904 szP = szLocalPath;
1905 szN = szName;
1906 }
1907
1908 KviAvatar * pResult = nullptr;
1909
1910 if(KviFileUtils::fileExists(szP))
1911 {
1912 if(KVI_OPTION_BOOL(KviOption_boolScaleAvatarsOnLoad))
1913 {
1914 pResult = new KviAvatar(szP, szN,
1915 QSize(
1916 KVI_OPTION_UINT(KviOption_uintScaleAvatarsOnLoadWidth),
1917 KVI_OPTION_UINT(KviOption_uintScaleAvatarsOnLoadHeight)));
1918 }
1919 else
1920 {
1921 pResult = new KviAvatar(szP, szN);
1922 }
1923 }
1924
1925 //Can't load it
1926 if(pResult && !pResult->isValid())
1927 {
1928 delete pResult;
1929 pResult = nullptr;
1930 }
1931
1932 return pResult;
1933 }
1934
clearCache()1935 void KviIconManager::clearCache()
1936 {
1937 m_pCachedImages->clear();
1938 }
1939
reloadImages()1940 void KviIconManager::reloadImages()
1941 {
1942 clearCache();
1943 for(auto & m_smallIcon : m_smallIcons)
1944 {
1945 if(m_smallIcon)
1946 delete m_smallIcon;
1947 m_smallIcon = nullptr;
1948 }
1949 }
1950
loadSmallIcon(int iIdx)1951 QPixmap * KviIconManager::loadSmallIcon(int iIdx)
1952 {
1953 if(iIdx >= KviIconManager::IconCount)
1954 return nullptr;
1955 if(iIdx < 0)
1956 return nullptr;
1957
1958 QString szPath = QString(KVI_SMALLICONS_PREFIX "%1.png").arg(g_szIconNames[iIdx]);
1959 //KviQString::sprintf(szPath,KVI_SMALLICONS_PREFIX "%s.png",g_szIconNames[iIdx]);
1960 QString szBuffer;
1961
1962 g_pApp->findSmallIcon(szBuffer, szPath);
1963 m_smallIcons[iIdx] = new QPixmap(szBuffer);
1964
1965 return m_smallIcons[iIdx];
1966 }
1967
1968 #ifdef __GNUC__
1969 //#warning IMPLEMENT CLEANUP
1970 #endif
1971 /*
1972 void KviIconManager::cacheCleanup()
1973 {
1974 QStringList l;
1975 KviPointerHashTableIterator<QString,KviCachedPixmap> it(*m_pCachedImages);
1976
1977 while(it.current())
1978 {
1979 kvi_time_t curTime = kvi_unixTime();
1980
1981 if((((unsigned int)it.current()->timestamp) - ((unsigned int)curTime)) > 120)
1982 {
1983 // unused since 2 minutes
1984 // time to cleanup it...
1985 l.append(new KviCString(it.currentKey()));
1986 }
1987 ++it;
1988 }
1989
1990 for(QStringList::Iterator it = l.begin();it != l.end();++it)
1991 {
1992 m_pCachedImages->remove(*it);
1993 }
1994
1995 for(KviCString * p =l.first();p;p = l.next())
1996 {
1997 m_pCachedImages->remove(p->ptr());
1998 }
1999 if(m_pCachedImages->isEmpty())m_pCleanupTimer->stop();
2000 }
2001 */
2002