1 /**
2  * QtAwesome - use font-awesome (or other font icons) in your c++ / Qt Application
3  *
4  * MIT Licensed
5  *
6  * Copyright 2013-2015 - Reliable Bits Software by Blommers IT. All Rights Reserved.
7  * Author Rick Blommers
8  */
9 
10 #include "QtAwesome.h"
11 
12 #include <QDebug>
13 #include <QFile>
14 #include <QFontDatabase>
15 
16 
17 
18 /// The font-awesome icon painter
19 class QtAwesomeCharIconPainter: public QtAwesomeIconPainter
20 {
21 public:
paint(QtAwesome * awesome,QPainter * painter,const QRect & rect,QIcon::Mode mode,QIcon::State state,const QVariantMap & options)22     virtual void paint( QtAwesome* awesome, QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state, const QVariantMap& options  )
23     {
24         Q_UNUSED(mode);
25         Q_UNUSED(state);
26         Q_UNUSED(options);
27 
28         painter->save();
29 
30         // set the correct color
31         QColor color = options.value("color").value<QColor>();
32         QString text = options.value("text").toString();
33 
34         if( mode == QIcon::Disabled ) {
35             color = options.value("color-disabled").value<QColor>();
36             QVariant alt = options.value("text-disabled");
37             if( alt.isValid() ) {
38                 text = alt.toString();
39             }
40         } else if( mode == QIcon::Active ) {
41             color = options.value("color-active").value<QColor>();
42             QVariant alt = options.value("text-active");
43             if( alt.isValid() ) {
44                 text = alt.toString();
45             }
46         } else if( mode == QIcon::Selected ) {
47             color = options.value("color-selected").value<QColor>();
48             QVariant alt = options.value("text-selected");
49             if( alt.isValid() ) {
50                 text = alt.toString();
51             }
52         }
53         painter->setPen(color);
54 
55         // add some 'padding' around the icon
56         int drawSize = qRound(rect.height()*options.value("scale-factor").toFloat());
57 
58         painter->setFont( awesome->font(drawSize) );
59         painter->drawText( rect, text, QTextOption( Qt::AlignCenter|Qt::AlignVCenter ) );
60         painter->restore();
61     }
62 
63 };
64 
65 
66 //---------------------------------------------------------------------------------------
67 
68 
69 /// The painter icon engine.
70 class QtAwesomeIconPainterIconEngine : public QIconEngine
71 {
72 
73 public:
74 
QtAwesomeIconPainterIconEngine(QtAwesome * awesome,QtAwesomeIconPainter * painter,const QVariantMap & options)75     QtAwesomeIconPainterIconEngine( QtAwesome* awesome, QtAwesomeIconPainter* painter, const QVariantMap& options  )
76         : awesomeRef_(awesome)
77         , iconPainterRef_(painter)
78         , options_(options)
79     {
80     }
81 
~QtAwesomeIconPainterIconEngine()82     virtual ~QtAwesomeIconPainterIconEngine() {}
83 
clone() const84     QtAwesomeIconPainterIconEngine* clone() const
85     {
86         return new QtAwesomeIconPainterIconEngine( awesomeRef_, iconPainterRef_, options_ );
87     }
88 
paint(QPainter * painter,const QRect & rect,QIcon::Mode mode,QIcon::State state)89     virtual void paint(QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state)
90     {
91         Q_UNUSED( mode );
92         Q_UNUSED( state );
93         iconPainterRef_->paint( awesomeRef_, painter, rect, mode, state, options_ );
94     }
95 
pixmap(const QSize & size,QIcon::Mode mode,QIcon::State state)96     virtual QPixmap pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state)
97     {
98         QPixmap pm(size);
99         pm.fill( Qt::transparent ); // we need transparency
100         {
101             QPainter p(&pm);
102             paint(&p, QRect(QPoint(0,0),size), mode, state);
103         }
104         return pm;
105     }
106 
107 private:
108 
109     QtAwesome* awesomeRef_;                  ///< a reference to the QtAwesome instance
110     QtAwesomeIconPainter* iconPainterRef_;   ///< a reference to the icon painter
111     QVariantMap options_;                    ///< the options for this icon painter
112 };
113 
114 
115 //---------------------------------------------------------------------------------------
116 
117 /// The default icon colors
QtAwesome(QObject * parent)118 QtAwesome::QtAwesome( QObject* parent )
119     : QObject( parent )
120     , namedCodepoints_()
121 {
122     // initialize the default options
123     setDefaultOption( "color", QColor(50,50,50) );
124     setDefaultOption( "color-disabled", QColor(70,70,70,60));
125     setDefaultOption( "color-active", QColor(10,10,10));
126     setDefaultOption( "color-selected", QColor(10,10,10));
127     setDefaultOption( "scale-factor", 0.9 );
128 
129     setDefaultOption( "text", QVariant() );
130     setDefaultOption( "text-disabled", QVariant() );
131     setDefaultOption( "text-active", QVariant() );
132     setDefaultOption( "text-selected", QVariant() );
133 
134     fontIconPainter_ = new QtAwesomeCharIconPainter();
135 
136 }
137 
138 
~QtAwesome()139 QtAwesome::~QtAwesome()
140 {
141     delete fontIconPainter_;
142 //    delete errorIconPainter_;
143     qDeleteAll(painterMap_);
144 }
145 
146 /// initializes the QtAwesome icon factory with the given fontname
init(const QString & fontname)147 void QtAwesome::init(const QString& fontname)
148 {
149     fontName_ = fontname;
150 }
151 
152 
153 /// a specialized init function so font-awesome is loaded and initialized
154 /// this method return true on success, it will return false if the fnot cannot be initialized
155 /// To initialize QtAwesome with font-awesome you need to call this method
initFontAwesome()156 bool QtAwesome::initFontAwesome( )
157 {
158 #if 0
159     static int fontAwesomeFontId = -1;
160 
161     // only load font-awesome once
162     if( fontAwesomeFontId < 0 ) {
163 
164         // The macro below internally calls "qInitResources_QtAwesome()". this initializes
165         // the resource system. For a .pri project this isn't required, but when building and using a
166         // static library the resource need to initialized first.
167         ///
168         // I've checked th qInitResource_* code and calling this method mutliple times shouldn't be any problem
169         // (More info about this subject:  http://qt-project.org/wiki/QtResources)
170         Q_INIT_RESOURCE(QtAwesome);
171 
172         // load the font file
173         QFile res(":/fonts/fontawesome-4.3.0.ttf");
174         if(!res.open(QIODevice::ReadOnly)) {
175             qDebug() << "Font awesome font could not be loaded!";
176             return false;
177         }
178         QByteArray fontData( res.readAll() );
179         res.close();
180 
181         // fetch the given font
182         fontAwesomeFontId = QFontDatabase::addApplicationFontFromData(fontData);
183     }
184 
185     QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(fontAwesomeFontId);
186     if( !loadedFontFamilies.empty() ) {
187         fontName_= loadedFontFamilies.at(0);
188     } else {
189         qDebug() << "Font awesome font is empty?!";
190         fontAwesomeFontId = -1; // restore the font-awesome id
191         return false;
192     }
193 #endif
194 
195     // intialize the map
196     QHash<QString, int>& m = namedCodepoints_;
197     m.insert("adjust",              fa::adjust);
198     m.insert("adn",                 fa::adn);
199     m.insert("aligncenter",         fa::aligncenter);
200     m.insert("alignjustify",        fa::alignjustify);
201     m.insert("alignleft",           fa::alignleft);
202     m.insert("alignright",          fa::alignright);
203     m.insert("ambulance",           fa::ambulance);
204     m.insert("anchor",              fa::anchor);
205     m.insert("android",             fa::android);
206     m.insert("angellist",           fa::angellist);
207     m.insert("angledoubledown",     fa::angledoubledown);
208     m.insert("angledoubleleft",     fa::angledoubleleft);
209     m.insert("angledoubleright",    fa::angledoubleright);
210     m.insert("angledoubleup",       fa::angledoubleup);
211     m.insert("angledown",           fa::angledown);
212     m.insert("angleleft",           fa::angleleft);
213     m.insert("angleright",          fa::angleright);
214     m.insert("angleup",             fa::angleup);
215     m.insert("apple",               fa::apple);
216     m.insert("archive",             fa::archive);
217     m.insert("areachart",           fa::areachart);
218     m.insert("arrowcircledown",     fa::arrowcircledown);
219     m.insert("arrowcircleleft",     fa::arrowcircleleft);
220     m.insert("arrowcircleodown",    fa::arrowcircleodown);
221     m.insert("arrowcircleoleft",    fa::arrowcircleoleft);
222     m.insert("arrowcircleoright",   fa::arrowcircleoright);
223     m.insert("arrowcircleoup",      fa::arrowcircleoup);
224     m.insert("arrowcircleright",    fa::arrowcircleright);
225     m.insert("arrowcircleup",       fa::arrowcircleup);
226     m.insert("arrowdown",           fa::arrowdown);
227     m.insert("arrowleft",           fa::arrowleft);
228     m.insert("arrowright",          fa::arrowright);
229     m.insert("arrowup",             fa::arrowup);
230     m.insert("arrows",              fa::arrows);
231     m.insert("arrowsalt",           fa::arrowsalt);
232     m.insert("arrowsh",             fa::arrowsh);
233     m.insert("arrowsv",             fa::arrowsv);
234     m.insert("asterisk",            fa::asterisk);
235     m.insert("at",                  fa::at);
236     m.insert("automobile",          fa::automobile);
237     m.insert("backward",            fa::backward);
238     m.insert("ban",                 fa::ban);
239     m.insert("bank",                fa::bank);
240     m.insert("barchart",            fa::barchart);
241     m.insert("barcharto",           fa::barcharto);
242     m.insert("barcode",             fa::barcode);
243     m.insert("bars",                fa::bars);
244     m.insert("bed",                 fa::bed);
245     m.insert("beer",                fa::beer);
246     m.insert("behance",             fa::behance);
247     m.insert("behancesquare",       fa::behancesquare);
248     m.insert("bell",                fa::bell);
249     m.insert("bello",               fa::bello);
250     m.insert("bellslash",           fa::bellslash);
251     m.insert("bellslasho",          fa::bellslasho);
252     m.insert("bicycle",             fa::bicycle);
253     m.insert("binoculars",          fa::binoculars);
254     m.insert("birthdaycake",        fa::birthdaycake);
255     m.insert("bitbucket",           fa::bitbucket);
256     m.insert("bitbucketsquare",     fa::bitbucketsquare);
257     m.insert("bitcoin",             fa::bitcoin);
258     m.insert("bold",                fa::bold);
259     m.insert("bolt",                fa::bolt);
260     m.insert("bomb",                fa::bomb);
261     m.insert("book",                fa::book);
262     m.insert("bookmark",            fa::bookmark);
263     m.insert("bookmarko",           fa::bookmarko);
264     m.insert("briefcase",           fa::briefcase);
265     m.insert("btc",                 fa::btc);
266     m.insert("bug",                 fa::bug);
267     m.insert("building",            fa::building);
268     m.insert("buildingo",           fa::buildingo);
269     m.insert("bullhorn",            fa::bullhorn);
270     m.insert("bullseye",            fa::bullseye);
271     m.insert("bus",                 fa::bus);
272     m.insert("buysellads",          fa::buysellads);
273     m.insert("cab",                 fa::cab);
274     m.insert("calculator",          fa::calculator);
275     m.insert("calendar",            fa::calendar);
276     m.insert("calendaro",           fa::calendaro);
277     m.insert("camera",              fa::camera);
278     m.insert("cameraretro",         fa::cameraretro);
279     m.insert("car",                 fa::car);
280     m.insert("caretdown",           fa::caretdown);
281     m.insert("caretleft",           fa::caretleft);
282     m.insert("caretright",          fa::caretright);
283     m.insert("caretsquareodown",    fa::caretsquareodown);
284     m.insert("caretsquareoleft",    fa::caretsquareoleft);
285     m.insert("caretsquareoright",   fa::caretsquareoright);
286     m.insert("caretsquareoup",      fa::caretsquareoup);
287     m.insert("caretup",             fa::caretup);
288     m.insert("cartarrowdown",       fa::cartarrowdown);
289     m.insert("cartplus",            fa::cartplus);
290     m.insert("cc",                  fa::cc);
291     m.insert("ccamex",              fa::ccamex);
292     m.insert("ccdiscover",          fa::ccdiscover);
293     m.insert("ccmastercard",        fa::ccmastercard);
294     m.insert("ccpaypal",            fa::ccpaypal);
295     m.insert("ccstripe",            fa::ccstripe);
296     m.insert("ccvisa",              fa::ccvisa);
297     m.insert("certificate",         fa::certificate);
298     m.insert("chain",               fa::chain);
299     m.insert("chainbroken",         fa::chainbroken);
300     m.insert("check",               fa::check);
301     m.insert("checkcircle",         fa::checkcircle);
302     m.insert("checkcircleo",        fa::checkcircleo);
303     m.insert("checksquare",         fa::checksquare);
304     m.insert("checksquareo",        fa::checksquareo);
305     m.insert("chevroncircledown",   fa::chevroncircledown);
306     m.insert("chevroncircleleft",   fa::chevroncircleleft);
307     m.insert("chevroncircleright",  fa::chevroncircleright);
308     m.insert("chevroncircleup",     fa::chevroncircleup);
309     m.insert("chevrondown",         fa::chevrondown);
310     m.insert("chevronleft",         fa::chevronleft);
311     m.insert("chevronright",        fa::chevronright);
312     m.insert("chevronup",           fa::chevronup);
313     m.insert("child",               fa::child);
314     m.insert("circle",              fa::circle);
315     m.insert("circleo",             fa::circleo);
316     m.insert("circleonotch",        fa::circleonotch);
317     m.insert("circlethin",          fa::circlethin);
318     m.insert("clipboard",           fa::clipboard);
319     m.insert("clocko",              fa::clocko);
320     m.insert("close",               fa::close);
321     m.insert("cloud",               fa::cloud);
322     m.insert("clouddownload",       fa::clouddownload);
323     m.insert("cloudupload",         fa::cloudupload);
324     m.insert("cny",                 fa::cny);
325     m.insert("code",                fa::code);
326     m.insert("codefork",            fa::codefork);
327     m.insert("codepen",             fa::codepen);
328     m.insert("coffee",              fa::coffee);
329     m.insert("cog",                 fa::cog);
330     m.insert("cogs",                fa::cogs);
331     m.insert("columns",             fa::columns);
332     m.insert("comment",             fa::comment);
333     m.insert("commento",            fa::commento);
334     m.insert("comments",            fa::comments);
335     m.insert("commentso",           fa::commentso);
336     m.insert("compass",             fa::compass);
337     m.insert("compress",            fa::compress);
338     m.insert("connectdevelop",      fa::connectdevelop);
339     m.insert("copy",                fa::copy);
340     m.insert("copyright",           fa::copyright);
341     m.insert("creditcard",          fa::creditcard);
342     m.insert("crop",                fa::crop);
343     m.insert("crosshairs",          fa::crosshairs);
344     m.insert("css3",                fa::css3);
345     m.insert("cube",                fa::cube);
346     m.insert("cubes",               fa::cubes);
347     m.insert("cut",                 fa::cut);
348     m.insert("cutlery",             fa::cutlery);
349     m.insert("dashboard",           fa::dashboard);
350     m.insert("dashcube",            fa::dashcube);
351     m.insert("database",            fa::database);
352     m.insert("dedent",              fa::dedent);
353     m.insert("delicious",           fa::delicious);
354     m.insert("desktop",             fa::desktop);
355     m.insert("deviantart",          fa::deviantart);
356     m.insert("diamond",             fa::diamond);
357     m.insert("digg",                fa::digg);
358     m.insert("dollar",              fa::dollar);
359     m.insert("dotcircleo",          fa::dotcircleo);
360     m.insert("download",            fa::download);
361     m.insert("dribbble",            fa::dribbble);
362     m.insert("dropbox",             fa::dropbox);
363     m.insert("drupal",              fa::drupal);
364     m.insert("edit",                fa::edit);
365     m.insert("eject",               fa::eject);
366     m.insert("ellipsish",           fa::ellipsish);
367     m.insert("ellipsisv",           fa::ellipsisv);
368     m.insert("empire",              fa::empire);
369     m.insert("envelope",            fa::envelope);
370     m.insert("envelopeo",           fa::envelopeo);
371     m.insert("envelopesquare",      fa::envelopesquare);
372     m.insert("eraser",              fa::eraser);
373     m.insert("eur",                 fa::eur);
374     m.insert("euro",                fa::euro);
375     m.insert("exchange",            fa::exchange);
376     m.insert("exclamation",         fa::exclamation);
377     m.insert("exclamationcircle",   fa::exclamationcircle);
378     m.insert("exclamationtriangle", fa::exclamationtriangle);
379     m.insert("expand",              fa::expand);
380     m.insert("externallink",        fa::externallink);
381     m.insert("externallinksquare",  fa::externallinksquare);
382     m.insert("eye",                 fa::eye);
383     m.insert("eyeslash",            fa::eyeslash);
384     m.insert("eyedropper",          fa::eyedropper);
385     m.insert("facebook",            fa::facebook);
386     m.insert("facebookf",           fa::facebookf);
387     m.insert("facebookofficial",    fa::facebookofficial);
388     m.insert("facebooksquare",      fa::facebooksquare);
389     m.insert("fastbackward",        fa::fastbackward);
390     m.insert("fastforward",         fa::fastforward);
391     m.insert("fax",                 fa::fax);
392     m.insert("female",              fa::female);
393     m.insert("fighterjet",          fa::fighterjet);
394     m.insert("file",                fa::file);
395     m.insert("filearchiveo",        fa::filearchiveo);
396     m.insert("fileaudioo",          fa::fileaudioo);
397     m.insert("filecodeo",           fa::filecodeo);
398     m.insert("fileexcelo",          fa::fileexcelo);
399     m.insert("fileimageo",          fa::fileimageo);
400     m.insert("filemovieo",          fa::filemovieo);
401     m.insert("fileo",               fa::fileo);
402     m.insert("filepdfo",            fa::filepdfo);
403     m.insert("filephotoo",          fa::filephotoo);
404     m.insert("filepictureo",        fa::filepictureo);
405     m.insert("filepowerpointo",     fa::filepowerpointo);
406     m.insert("filesoundo",          fa::filesoundo);
407     m.insert("filetext",            fa::filetext);
408     m.insert("filetexto",           fa::filetexto);
409     m.insert("filevideoo",          fa::filevideoo);
410     m.insert("filewordo",           fa::filewordo);
411     m.insert("filezipo",            fa::filezipo);
412     m.insert("fileso",              fa::fileso);
413     m.insert("film",                fa::film);
414     m.insert("filter",              fa::filter);
415     m.insert("fire",                fa::fire);
416     m.insert("fireextinguisher",    fa::fireextinguisher);
417     m.insert("flag",                fa::flag);
418     m.insert("flagcheckered",       fa::flagcheckered);
419     m.insert("flago",               fa::flago);
420     m.insert("flash",               fa::flash);
421     m.insert("flask",               fa::flask);
422     m.insert("flickr",              fa::flickr);
423     m.insert("floppyo",             fa::floppyo);
424     m.insert("folder",              fa::folder);
425     m.insert("foldero",             fa::foldero);
426     m.insert("folderopen",          fa::folderopen);
427     m.insert("folderopeno",         fa::folderopeno);
428     m.insert("font",                fa::font);
429     m.insert("forumbee",            fa::forumbee);
430     m.insert("forward",             fa::forward);
431     m.insert("foursquare",          fa::foursquare);
432     m.insert("frowno",              fa::frowno);
433     m.insert("futbolo",             fa::futbolo);
434     m.insert("gamepad",             fa::gamepad);
435     m.insert("gavel",               fa::gavel);
436     m.insert("gbp",                 fa::gbp);
437     m.insert("ge",                  fa::ge);
438     m.insert("gear",                fa::gear);
439     m.insert("gears",               fa::gears);
440     m.insert("genderless",          fa::genderless);
441     m.insert("gift",                fa::gift);
442     m.insert("git",                 fa::git);
443     m.insert("gitsquare",           fa::gitsquare);
444     m.insert("github",              fa::github);
445     m.insert("githubalt",           fa::githubalt);
446     m.insert("githubsquare",        fa::githubsquare);
447     m.insert("gittip",              fa::gittip);
448     m.insert("glass",               fa::glass);
449     m.insert("globe",               fa::globe);
450     m.insert("google",              fa::google);
451     m.insert("googleplus",          fa::googleplus);
452     m.insert("googleplussquare",    fa::googleplussquare);
453     m.insert("googlewallet",        fa::googlewallet);
454     m.insert("graduationcap",       fa::graduationcap);
455     m.insert("gratipay",            fa::gratipay);
456     m.insert("group",               fa::group);
457     m.insert("hsquare",             fa::hsquare);
458     m.insert("hackernews",          fa::hackernews);
459     m.insert("handodown",           fa::handodown);
460     m.insert("handoleft",           fa::handoleft);
461     m.insert("handoright",          fa::handoright);
462     m.insert("handoup",             fa::handoup);
463     m.insert("hddo",                fa::hddo);
464     m.insert("header",              fa::header);
465     m.insert("headphones",          fa::headphones);
466     m.insert("heart",               fa::heart);
467     m.insert("hearto",              fa::hearto);
468     m.insert("heartbeat",           fa::heartbeat);
469     m.insert("history",             fa::history);
470     m.insert("home",                fa::home);
471     m.insert("hospitalo",           fa::hospitalo);
472     m.insert("hotel",               fa::hotel);
473     m.insert("html5",               fa::html5);
474     m.insert("ils",                 fa::ils);
475     m.insert("image",               fa::image);
476     m.insert("inbox",               fa::inbox);
477     m.insert("indent",              fa::indent);
478     m.insert("info",                fa::info);
479     m.insert("infocircle",          fa::infocircle);
480     m.insert("inr",                 fa::inr);
481     m.insert("instagram",           fa::instagram);
482     m.insert("institution",         fa::institution);
483     m.insert("ioxhost",             fa::ioxhost);
484     m.insert("italic",              fa::italic);
485     m.insert("joomla",              fa::joomla);
486     m.insert("jpy",                 fa::jpy);
487     m.insert("jsfiddle",            fa::jsfiddle);
488     m.insert("key",                 fa::key);
489     m.insert("keyboardo",           fa::keyboardo);
490     m.insert("krw",                 fa::krw);
491     m.insert("language",            fa::language);
492     m.insert("laptop",              fa::laptop);
493     m.insert("lastfm",              fa::lastfm);
494     m.insert("lastfmsquare",        fa::lastfmsquare);
495     m.insert("leaf",                fa::leaf);
496     m.insert("leanpub",             fa::leanpub);
497     m.insert("legal",               fa::legal);
498     m.insert("lemono",              fa::lemono);
499     m.insert("leveldown",           fa::leveldown);
500     m.insert("levelup",             fa::levelup);
501     m.insert("lifebouy",            fa::lifebouy);
502     m.insert("lifebuoy",            fa::lifebuoy);
503     m.insert("lifering",            fa::lifering);
504     m.insert("lifesaver",           fa::lifesaver);
505     m.insert("lightbulbo",          fa::lightbulbo);
506     m.insert("linechart",           fa::linechart);
507     m.insert("link",                fa::link);
508     m.insert("linkedin",            fa::linkedin);
509     m.insert("linkedinsquare",      fa::linkedinsquare);
510     m.insert("linux",               fa::linux);
511     m.insert("list",                fa::list);
512     m.insert("listalt",             fa::listalt);
513     m.insert("listol",              fa::listol);
514     m.insert("listul",              fa::listul);
515     m.insert("locationarrow",       fa::locationarrow);
516     m.insert("lock",                fa::lock);
517     m.insert("longarrowdown",       fa::longarrowdown);
518     m.insert("longarrowleft",       fa::longarrowleft);
519     m.insert("longarrowright",      fa::longarrowright);
520     m.insert("longarrowup",         fa::longarrowup);
521     m.insert("magic",               fa::magic);
522     m.insert("magnet",              fa::magnet);
523     m.insert("mailforward",         fa::mailforward);
524     m.insert("mailreply",           fa::mailreply);
525     m.insert("mailreplyall",        fa::mailreplyall);
526     m.insert("male",                fa::male);
527     m.insert("mapmarker",           fa::mapmarker);
528     m.insert("mars",                fa::mars);
529     m.insert("marsdouble",          fa::marsdouble);
530     m.insert("marsstroke",          fa::marsstroke);
531     m.insert("marsstrokeh",         fa::marsstrokeh);
532     m.insert("marsstrokev",         fa::marsstrokev);
533     m.insert("maxcdn",              fa::maxcdn);
534     m.insert("meanpath",            fa::meanpath);
535     m.insert("medium",              fa::medium);
536     m.insert("medkit",              fa::medkit);
537     m.insert("meho",                fa::meho);
538     m.insert("mercury",             fa::mercury);
539     m.insert("microphone",          fa::microphone);
540     m.insert("microphoneslash",     fa::microphoneslash);
541     m.insert("minus",               fa::minus);
542     m.insert("minuscircle",         fa::minuscircle);
543     m.insert("minussquare",         fa::minussquare);
544     m.insert("minussquareo",        fa::minussquareo);
545     m.insert("mobile",              fa::mobile);
546     m.insert("mobilephone",         fa::mobilephone);
547     m.insert("money",               fa::money);
548     m.insert("moono",               fa::moono);
549     m.insert("mortarboard",         fa::mortarboard);
550     m.insert("motorcycle",          fa::motorcycle);
551     m.insert("music",               fa::music);
552     m.insert("navicon",             fa::navicon);
553     m.insert("neuter",              fa::neuter);
554     m.insert("newspapero",          fa::newspapero);
555     m.insert("openid",              fa::openid);
556     m.insert("outdent",             fa::outdent);
557     m.insert("pagelines",           fa::pagelines);
558     m.insert("paintbrush",          fa::paintbrush);
559     m.insert("paperplane",          fa::paperplane);
560     m.insert("paperplaneo",         fa::paperplaneo);
561     m.insert("paperclip",           fa::paperclip);
562     m.insert("paragraph",           fa::paragraph);
563     m.insert("paste",               fa::paste);
564     m.insert("pause",               fa::pause);
565     m.insert("paw",                 fa::paw);
566     m.insert("paypal",              fa::paypal);
567     m.insert("pencil",              fa::pencil);
568     m.insert("pencilsquare",        fa::pencilsquare);
569     m.insert("pencilsquareo",       fa::pencilsquareo);
570     m.insert("phone",               fa::phone);
571     m.insert("phonesquare",         fa::phonesquare);
572     m.insert("photo",               fa::photo);
573     m.insert("pictureo",            fa::pictureo);
574     m.insert("piechart",            fa::piechart);
575     m.insert("piedpiper",           fa::piedpiper);
576     m.insert("piedpiperalt",        fa::piedpiperalt);
577     m.insert("pinterest",           fa::pinterest);
578     m.insert("pinterestp",          fa::pinterestp);
579     m.insert("pinterestsquare",     fa::pinterestsquare);
580     m.insert("plane",               fa::plane);
581     m.insert("play",                fa::play);
582     m.insert("playcircle",          fa::playcircle);
583     m.insert("playcircleo",         fa::playcircleo);
584     m.insert("plug",                fa::plug);
585     m.insert("plus",                fa::plus);
586     m.insert("pluscircle",          fa::pluscircle);
587     m.insert("plussquare",          fa::plussquare);
588     m.insert("plussquareo",         fa::plussquareo);
589     m.insert("poweroff",            fa::poweroff);
590     m.insert("print",               fa::print);
591     m.insert("puzzlepiece",         fa::puzzlepiece);
592     m.insert("qq",                  fa::qq);
593     m.insert("qrcode",              fa::qrcode);
594     m.insert("question",            fa::question);
595     m.insert("questioncircle",      fa::questioncircle);
596     m.insert("quoteleft",           fa::quoteleft);
597     m.insert("quoteright",          fa::quoteright);
598     m.insert("ra",                  fa::ra);
599     m.insert("random",              fa::random);
600     m.insert("rebel",               fa::rebel);
601     m.insert("recycle",             fa::recycle);
602     m.insert("reddit",              fa::reddit);
603     m.insert("redditsquare",        fa::redditsquare);
604     m.insert("refresh",             fa::refresh);
605     m.insert("remove",              fa::remove);
606     m.insert("renren",              fa::renren);
607     m.insert("reorder",             fa::reorder);
608     m.insert("repeat",              fa::repeat);
609     m.insert("reply",               fa::reply);
610     m.insert("replyall",            fa::replyall);
611     m.insert("retweet",             fa::retweet);
612     m.insert("rmb",                 fa::rmb);
613     m.insert("road",                fa::road);
614     m.insert("rocket",              fa::rocket);
615     m.insert("rotateleft",          fa::rotateleft);
616     m.insert("rotateright",         fa::rotateright);
617     m.insert("rouble",              fa::rouble);
618     m.insert("rss",                 fa::rss);
619     m.insert("rsssquare",           fa::rsssquare);
620     m.insert("rub",                 fa::rub);
621     m.insert("ruble",               fa::ruble);
622     m.insert("rupee",               fa::rupee);
623     m.insert("save",                fa::save);
624     m.insert("scissors",            fa::scissors);
625     m.insert("search",              fa::search);
626     m.insert("searchminus",         fa::searchminus);
627     m.insert("searchplus",          fa::searchplus);
628     m.insert("sellsy",              fa::sellsy);
629     m.insert("send",                fa::send);
630     m.insert("sendo",               fa::sendo);
631     m.insert("server",              fa::server);
632     m.insert("share",               fa::share);
633     m.insert("sharealt",            fa::sharealt);
634     m.insert("sharealtsquare",      fa::sharealtsquare);
635     m.insert("sharesquare",         fa::sharesquare);
636     m.insert("sharesquareo",        fa::sharesquareo);
637     m.insert("shekel",              fa::shekel);
638     m.insert("sheqel",              fa::sheqel);
639     m.insert("shield",              fa::shield);
640     m.insert("ship",                fa::ship);
641     m.insert("shirtsinbulk",        fa::shirtsinbulk);
642     m.insert("shoppingcart",        fa::shoppingcart);
643     m.insert("signin",              fa::signin);
644     m.insert("signout",             fa::signout);
645     m.insert("signal",              fa::signal);
646     m.insert("simplybuilt",         fa::simplybuilt);
647     m.insert("sitemap",             fa::sitemap);
648     m.insert("skyatlas",            fa::skyatlas);
649     m.insert("skype",               fa::skype);
650     m.insert("slack",               fa::slack);
651     m.insert("sliders",             fa::sliders);
652     m.insert("slideshare",          fa::slideshare);
653     m.insert("smileo",              fa::smileo);
654     m.insert("soccerballo",         fa::soccerballo);
655     m.insert("sort",                fa::sort);
656     m.insert("sortalphaasc",        fa::sortalphaasc);
657     m.insert("sortalphadesc",       fa::sortalphadesc);
658     m.insert("sortamountasc",       fa::sortamountasc);
659     m.insert("sortamountdesc",      fa::sortamountdesc);
660     m.insert("sortasc",             fa::sortasc);
661     m.insert("sortdesc",            fa::sortdesc);
662     m.insert("sortdown",            fa::sortdown);
663     m.insert("sortnumericasc",      fa::sortnumericasc);
664     m.insert("sortnumericdesc",     fa::sortnumericdesc);
665     m.insert("sortup",              fa::sortup);
666     m.insert("soundcloud",          fa::soundcloud);
667     m.insert("spaceshuttle",        fa::spaceshuttle);
668     m.insert("spinner",             fa::spinner);
669     m.insert("spoon",               fa::spoon);
670     m.insert("spotify",             fa::spotify);
671     m.insert("square",              fa::square);
672     m.insert("squareo",             fa::squareo);
673     m.insert("stackexchange",       fa::stackexchange);
674     m.insert("stackoverflow",       fa::stackoverflow);
675     m.insert("star",                fa::star);
676     m.insert("starhalf",            fa::starhalf);
677     m.insert("starhalfempty",       fa::starhalfempty);
678     m.insert("starhalffull",        fa::starhalffull);
679     m.insert("starhalfo",           fa::starhalfo);
680     m.insert("staro",               fa::staro);
681     m.insert("steam",               fa::steam);
682     m.insert("steamsquare",         fa::steamsquare);
683     m.insert("stepbackward",        fa::stepbackward);
684     m.insert("stepforward",         fa::stepforward);
685     m.insert("stethoscope",         fa::stethoscope);
686     m.insert("stop",                fa::stop);
687     m.insert("streetview",          fa::streetview);
688     m.insert("strikethrough",       fa::strikethrough);
689     m.insert("stumbleupon",         fa::stumbleupon);
690     m.insert("stumbleuponcircle",   fa::stumbleuponcircle);
691     m.insert("subscript",           fa::subscript);
692     m.insert("subway",              fa::subway);
693     m.insert("suitcase",            fa::suitcase);
694     m.insert("suno",                fa::suno);
695     m.insert("superscript",         fa::superscript);
696     m.insert("support",             fa::support);
697     m.insert("table",               fa::table);
698     m.insert("tablet",              fa::tablet);
699     m.insert("tachometer",          fa::tachometer);
700     m.insert("tag",                 fa::tag);
701     m.insert("tags",                fa::tags);
702     m.insert("tasks",               fa::tasks);
703     m.insert("taxi",                fa::taxi);
704     m.insert("tencentweibo",        fa::tencentweibo);
705     m.insert("terminal",            fa::terminal);
706     m.insert("textheight",          fa::textheight);
707     m.insert("textwidth",           fa::textwidth);
708     m.insert("th",                  fa::th);
709     m.insert("thlarge",             fa::thlarge);
710     m.insert("thlist",              fa::thlist);
711     m.insert("thumbtack",           fa::thumbtack);
712     m.insert("thumbsdown",          fa::thumbsdown);
713     m.insert("thumbsodown",         fa::thumbsodown);
714     m.insert("thumbsoup",           fa::thumbsoup);
715     m.insert("thumbsup",            fa::thumbsup);
716     m.insert("ticket",              fa::ticket);
717     m.insert("times",               fa::times);
718     m.insert("timescircle",         fa::timescircle);
719     m.insert("timescircleo",        fa::timescircleo);
720     m.insert("tint",                fa::tint);
721     m.insert("toggledown",          fa::toggledown);
722     m.insert("toggleleft",          fa::toggleleft);
723     m.insert("toggleoff",           fa::toggleoff);
724     m.insert("toggleon",            fa::toggleon);
725     m.insert("toggleright",         fa::toggleright);
726     m.insert("toggleup",            fa::toggleup);
727     m.insert("train",               fa::train);
728     m.insert("transgender",         fa::transgender);
729     m.insert("transgenderalt",      fa::transgenderalt);
730     m.insert("trash",               fa::trash);
731     m.insert("trasho",              fa::trasho);
732     m.insert("tree",                fa::tree);
733     m.insert("trello",              fa::trello);
734     m.insert("trophy",              fa::trophy);
735     m.insert("truck",               fa::truck);
736     m.insert("try",                 fa::fa_try);
737     m.insert("fa_try",              fa::fa_try);
738     m.insert("tty",                 fa::tty);
739     m.insert("tumblr",              fa::tumblr);
740     m.insert("tumblrsquare",        fa::tumblrsquare);
741     m.insert("turkishlira",         fa::turkishlira);
742     m.insert("twitch",              fa::twitch);
743     m.insert("twitter",             fa::twitter);
744     m.insert("twittersquare",       fa::twittersquare);
745     m.insert("umbrella",            fa::umbrella);
746     m.insert("underline",           fa::underline);
747     m.insert("undo",                fa::undo);
748     m.insert("university",          fa::university);
749     m.insert("unlink",              fa::unlink);
750     m.insert("unlock",              fa::unlock);
751     m.insert("unlockalt",           fa::unlockalt);
752     m.insert("unsorted",            fa::unsorted);
753     m.insert("upload",              fa::upload);
754     m.insert("usd",                 fa::usd);
755     m.insert("user",                fa::user);
756     m.insert("usermd",              fa::usermd);
757     m.insert("userplus",            fa::userplus);
758     m.insert("usersecret",          fa::usersecret);
759     m.insert("usertimes",           fa::usertimes);
760     m.insert("users",               fa::users);
761     m.insert("venus",               fa::venus);
762     m.insert("venusdouble",         fa::venusdouble);
763     m.insert("venusmars",           fa::venusmars);
764     m.insert("viacoin",             fa::viacoin);
765     m.insert("videocamera",         fa::videocamera);
766     m.insert("vimeosquare",         fa::vimeosquare);
767     m.insert("vine",                fa::vine);
768     m.insert("vk",                  fa::vk);
769     m.insert("volumedown",          fa::volumedown);
770     m.insert("volumeoff",           fa::volumeoff);
771     m.insert("volumeup",            fa::volumeup);
772     m.insert("warning",             fa::warning);
773     m.insert("wechat",              fa::wechat);
774     m.insert("weibo",               fa::weibo);
775     m.insert("weixin",              fa::weixin);
776     m.insert("whatsapp",            fa::whatsapp);
777     m.insert("wheelchair",          fa::wheelchair);
778     m.insert("wifi",                fa::wifi);
779     m.insert("windows",             fa::windows);
780     m.insert("won",                 fa::won);
781     m.insert("wordpress",           fa::wordpress);
782     m.insert("wrench",              fa::wrench);
783     m.insert("xing",                fa::xing);
784     m.insert("xingsquare",          fa::xingsquare);
785     m.insert("yahoo",               fa::yahoo);
786     m.insert("yelp",                fa::yelp);
787     m.insert("yen",                 fa::yen);
788     m.insert("youtube",             fa::youtube);
789     m.insert("youtubeplay",         fa::youtubeplay);
790     m.insert("youtubesquare",       fa::youtubesquare);
791 
792     return true;
793 }
794 
addNamedCodepoint(const QString & name,int codePoint)795 void QtAwesome::addNamedCodepoint( const QString& name, int codePoint)
796 {
797     namedCodepoints_.insert( name, codePoint);
798 }
799 
800 
801 /// Sets a default option. These options are passed on to the icon painters
setDefaultOption(const QString & name,const QVariant & value)802 void QtAwesome::setDefaultOption(const QString& name, const QVariant& value)
803 {
804     defaultOptions_.insert( name, value );
805 }
806 
807 
808 /// Returns the default option for the given name
defaultOption(const QString & name)809 QVariant QtAwesome::defaultOption(const QString& name)
810 {
811     return defaultOptions_.value( name );
812 }
813 
814 
815 // internal helper method to merge to option amps
mergeOptions(const QVariantMap & defaults,const QVariantMap & override)816 static QVariantMap mergeOptions( const QVariantMap& defaults, const QVariantMap& override )
817 {
818     QVariantMap result= defaults;
819     if( !override.isEmpty() ) {
820         QMapIterator<QString,QVariant> itr(override);
821         while( itr.hasNext() ) {
822             itr.next();
823             result.insert( itr.key(), itr.value() );
824         }
825     }
826     return result;
827 }
828 
829 
830 /// Creates an icon with the given code-point
831 /// <code>
832 ///     awesome->icon( icon_group )
833 /// </code>
icon(int character,const QVariantMap & options)834 QIcon QtAwesome::icon(int character, const QVariantMap &options)
835 {
836     // create a merged QVariantMap to have default options and icon-specific options
837     QVariantMap optionMap = mergeOptions( defaultOptions_, options );
838     optionMap.insert("text", QString( QChar(static_cast<int>(character)) ) );
839 
840     return icon( fontIconPainter_, optionMap );
841 }
842 
843 
844 
845 /// Creates an icon with the given name
846 ///
847 /// You can use the icon names as defined on http://fortawesome.github.io/Font-Awesome/design.html  withour the 'icon-' prefix
848 /// @param name the name of the icon
849 /// @param options extra option to pass to the icon renderer
icon(const QString & name,const QVariantMap & options)850 QIcon QtAwesome::icon(const QString& name, const QVariantMap& options)
851 {
852     // when it's a named codepoint
853     if( namedCodepoints_.count(name) ) {
854         return icon( namedCodepoints_.value(name), options );
855     }
856 
857 
858     // create a merged QVariantMap to have default options and icon-specific options
859     QVariantMap optionMap = mergeOptions( defaultOptions_, options );
860 
861     // this method first tries to retrieve the icon
862     QtAwesomeIconPainter* painter = painterMap_.value(name);
863     if( !painter ) {
864         return QIcon();
865     }
866 
867     return icon( painter, optionMap );
868 }
869 
870 /// Create a dynamic icon by simlpy supplying a painter object
871 /// The ownership of the painter is NOT transfered.
872 /// @param painter a dynamic painter that is going to paint the icon
873 /// @param optionmap the options to pass to the painter
icon(QtAwesomeIconPainter * painter,const QVariantMap & optionMap)874 QIcon QtAwesome::icon(QtAwesomeIconPainter* painter, const QVariantMap& optionMap )
875 {
876     // Warning, when you use memoryleak detection. You should turn it of for the next call
877     // QIcon's placed in gui items are often cached and not deleted when my memory-leak detection checks for leaks.
878     // I'm not sure if it's a Qt bug or something I do wrong
879     QtAwesomeIconPainterIconEngine* engine = new QtAwesomeIconPainterIconEngine( this, painter, optionMap  );
880     return QIcon( engine );
881 }
882 
883 /// Adds a named icon-painter to the QtAwesome icon map
884 /// As the name applies the ownership is passed over to QtAwesome
885 ///
886 /// @param name the name of the icon
887 /// @param painter the icon painter to add for this name
give(const QString & name,QtAwesomeIconPainter * painter)888 void QtAwesome::give(const QString& name, QtAwesomeIconPainter* painter)
889 {
890     delete painterMap_.value( name );   // delete the old one
891     painterMap_.insert( name, painter );
892 }
893 
894 /// Creates/Gets the icon font with a given size in pixels. This can be usefull to use a label for displaying icons
895 /// Example:
896 ///
897 ///    QLabel* label = new QLabel( QChar( icon_group ) );
898 ///    label->setFont( awesome->font(16) )
font(int size)899 QFont QtAwesome::font( int size )
900 {
901     QFont font( fontName_);
902     font.setPixelSize(size);
903     return font;
904 }
905