1 #include "pixmapgenerator.h"
2 
3 #include "pb/serverinfo_user.pb.h"
4 
5 #include <QApplication>
6 #include <QPainter>
7 #include <QPalette>
8 #include <cmath>
9 #ifdef _WIN32
10 #include "round.h"
11 #endif /* _WIN32 */
12 #include <QDebug>
13 
14 QMap<QString, QPixmap> PhasePixmapGenerator::pmCache;
15 
generatePixmap(int height,QString name)16 QPixmap PhasePixmapGenerator::generatePixmap(int height, QString name)
17 {
18     QString key = name + QString::number(height);
19     if (pmCache.contains(key))
20         return pmCache.value(key);
21 
22     QPixmap pixmap =
23         QPixmap("theme:phases/" + name).scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
24 
25     pmCache.insert(key, pixmap);
26     return pixmap;
27 }
28 
29 QMap<QString, QPixmap> CounterPixmapGenerator::pmCache;
30 
generatePixmap(int height,QString name,bool highlight)31 QPixmap CounterPixmapGenerator::generatePixmap(int height, QString name, bool highlight)
32 {
33     if (highlight)
34         name.append("_highlight");
35     QString key = name + QString::number(height);
36     if (pmCache.contains(key))
37         return pmCache.value(key);
38 
39     QPixmap pixmap =
40         QPixmap("theme:counters/" + name).scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
41     if (pixmap.isNull()) {
42         name = "general";
43         if (highlight)
44             name.append("_highlight");
45         pixmap =
46             QPixmap("theme:counters/" + name).scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
47     }
48 
49     pmCache.insert(key, pixmap);
50     return pixmap;
51 }
52 
generatePixmap(int size,int value,int max)53 QPixmap PingPixmapGenerator::generatePixmap(int size, int value, int max)
54 {
55     int key = size * 1000000 + max * 1000 + value;
56     if (pmCache.contains(key))
57         return pmCache.value(key);
58 
59     QPixmap pixmap(size, size);
60     pixmap.fill(Qt::transparent);
61     QPainter painter(&pixmap);
62     QColor color;
63     if ((max == -1) || (value == -1))
64         color = Qt::black;
65     else
66         color.setHsv(120 * (1.0 - ((double)value / max)), 255, 255);
67 
68     QRadialGradient g(QPointF((double)pixmap.width() / 2, (double)pixmap.height() / 2),
69                       qMin(pixmap.width(), pixmap.height()) / 2.0);
70     g.setColorAt(0, color);
71     g.setColorAt(1, Qt::transparent);
72     painter.fillRect(0, 0, pixmap.width(), pixmap.height(), QBrush(g));
73 
74     pmCache.insert(key, pixmap);
75 
76     return pixmap;
77 }
78 
79 QMap<int, QPixmap> PingPixmapGenerator::pmCache;
80 
generatePixmap(int height)81 QPixmap GenderPixmapGenerator::generatePixmap(int height)
82 {
83     ServerInfo_User::Gender gender = ServerInfo_User::GenderUnknown;
84 
85     int key = gender * 100000 + height;
86     if (pmCache.contains(key))
87         return pmCache.value(key);
88 
89     QString genderStr;
90     genderStr = "unknown";
91 
92     QPixmap pixmap =
93         QPixmap("theme:genders/" + genderStr).scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
94     pmCache.insert(key, pixmap);
95     return pixmap;
96 }
97 
98 QMap<int, QPixmap> GenderPixmapGenerator::pmCache;
99 
generatePixmap(int height,const QString & countryCode)100 QPixmap CountryPixmapGenerator::generatePixmap(int height, const QString &countryCode)
101 {
102     if (countryCode.size() != 2)
103         return QPixmap();
104     QString key = countryCode + QString::number(height);
105     if (pmCache.contains(key))
106         return pmCache.value(key);
107 
108     int width = height * 2;
109     QPixmap pixmap = QPixmap("theme:countries/" + countryCode.toLower())
110                          .scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
111 
112     QPainter painter(&pixmap);
113     painter.setPen(Qt::black);
114     painter.drawRect(0, 0, pixmap.width() - 1, pixmap.height() - 1);
115 
116     pmCache.insert(key, pixmap);
117     return pixmap;
118 }
119 
120 QMap<QString, QPixmap> CountryPixmapGenerator::pmCache;
121 
generatePixmap(int height,UserLevelFlags userLevel,bool isBuddy,QString privLevel)122 QPixmap UserLevelPixmapGenerator::generatePixmap(int height, UserLevelFlags userLevel, bool isBuddy, QString privLevel)
123 {
124 
125     QString key = QString::number(height * 10000) + ":" + (int)userLevel + ":" + (int)isBuddy + ":" + privLevel;
126     if (pmCache.contains(key))
127         return pmCache.value(key);
128 
129     QString levelString;
130     if (userLevel.testFlag(ServerInfo_User::IsAdmin)) {
131         levelString = "admin";
132         if (privLevel.toLower() == "vip")
133             levelString.append("_" + privLevel.toLower());
134     } else if (userLevel.testFlag(ServerInfo_User::IsModerator)) {
135         levelString = "moderator";
136         if (privLevel.toLower() == "vip")
137             levelString.append("_" + privLevel.toLower());
138     } else if (userLevel.testFlag(ServerInfo_User::IsRegistered)) {
139         levelString = "registered";
140         if (privLevel.toLower() != "none")
141             levelString.append("_" + privLevel.toLower());
142     } else
143         levelString = "normal";
144 
145     if (isBuddy)
146         levelString.append("_buddy");
147 
148     QPixmap pixmap = QPixmap("theme:userlevels/" + levelString)
149                          .scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
150 
151     pmCache.insert(key, pixmap);
152     return pixmap;
153 }
154 
155 QMap<QString, QPixmap> UserLevelPixmapGenerator::pmCache;
156 
generatePixmap(int height)157 QPixmap LockPixmapGenerator::generatePixmap(int height)
158 {
159 
160     int key = height;
161     if (pmCache.contains(key))
162         return pmCache.value(key);
163 
164     QPixmap pixmap = QPixmap("theme:icons/lock").scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
165     pmCache.insert(key, pixmap);
166     return pixmap;
167 }
168 
169 QMap<int, QPixmap> LockPixmapGenerator::pmCache;
170 
loadColorAdjustedPixmap(QString name)171 const QPixmap loadColorAdjustedPixmap(QString name)
172 {
173     if (qApp->palette().windowText().color().lightness() > 200) {
174         QImage img(name);
175         img.invertPixels();
176         QPixmap result;
177         result.convertFromImage(img);
178         return result;
179     } else {
180         return QPixmap(name);
181     }
182 }
183