Files
QtAwesome/QtAwesome/QtAwesome.cpp
2016-11-21 13:31:18 +01:00

1114 lines
75 KiB
C++

/**
* QtAwesome - use font-awesome (or other font icons) in your c++ / Qt Application
*
* MIT Licensed
*
* Copyright 2013-2016 - Reliable Bits Software by Blommers IT. All Rights Reserved.
* Author Rick Blommers
*/
#include "QtAwesome.h"
#include "QtAwesomeAnim.h"
#include <QDebug>
#include <QFile>
#include <QFontDatabase>
/// The font-awesome icon painter
class QtAwesomeCharIconPainter: public QtAwesomeIconPainter
{
public:
virtual void paint( QtAwesome* awesome, QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state, const QVariantMap& options )
{
Q_UNUSED(mode);
Q_UNUSED(state);
Q_UNUSED(options);
painter->save();
QObject* qanim = qvariant_cast<QObject*>(options.value("anim"));
QtAwesomeAnimation* anim = qobject_cast<QtAwesomeAnimation*>(qanim);
if( anim ) {
anim->setup( *painter, rect );
}
// set the correct color
QColor color = options.value("color").value<QColor>();
QString text = options.value("text").toString();
if( mode == QIcon::Disabled ) {
color = options.value("color-disabled").value<QColor>();
QVariant alt = options.value("text-disabled");
if( alt.isValid() ) {
text = alt.toString();
}
} else if( mode == QIcon::Active ) {
color = options.value("color-active").value<QColor>();
QVariant alt = options.value("text-active");
if( alt.isValid() ) {
text = alt.toString();
}
} else if( mode == QIcon::Selected ) {
color = options.value("color-selected").value<QColor>();
QVariant alt = options.value("text-selected");
if( alt.isValid() ) {
text = alt.toString();
}
}
painter->setPen(color);
// add some 'padding' around the icon
int drawSize = qRound(rect.height()*options.value("scale-factor").toFloat());
painter->setFont( awesome->font(drawSize) );
painter->drawText( rect, text, QTextOption( Qt::AlignCenter|Qt::AlignVCenter ) );
painter->restore();
}
};
//---------------------------------------------------------------------------------------
/// The painter icon engine.
class QtAwesomeIconPainterIconEngine : public QIconEngine
{
public:
QtAwesomeIconPainterIconEngine( QtAwesome* awesome, QtAwesomeIconPainter* painter, const QVariantMap& options )
: awesomeRef_(awesome)
, iconPainterRef_(painter)
, options_(options)
{
}
virtual ~QtAwesomeIconPainterIconEngine() {}
QtAwesomeIconPainterIconEngine* clone() const
{
return new QtAwesomeIconPainterIconEngine( awesomeRef_, iconPainterRef_, options_ );
}
virtual void paint(QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state)
{
Q_UNUSED( mode );
Q_UNUSED( state );
iconPainterRef_->paint( awesomeRef_, painter, rect, mode, state, options_ );
}
virtual QPixmap pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state)
{
QPixmap pm(size);
pm.fill( Qt::transparent ); // we need transparency
{
QPainter p(&pm);
paint(&p, QRect(QPoint(0,0),size), mode, state);
}
return pm;
}
private:
QtAwesome* awesomeRef_; ///< a reference to the QtAwesome instance
QtAwesomeIconPainter* iconPainterRef_; ///< a reference to the icon painter
QVariantMap options_; ///< the options for this icon painter
};
//---------------------------------------------------------------------------------------
/// The default icon colors
QtAwesome::QtAwesome( QObject* parent )
: QObject( parent )
, namedCodepoints_()
{
// initialize the default options
setDefaultOption( "color", QColor(50,50,50) );
setDefaultOption( "color-disabled", QColor(70,70,70,60));
setDefaultOption( "color-active", QColor(10,10,10));
setDefaultOption( "color-selected", QColor(10,10,10));
setDefaultOption( "scale-factor", 0.9 );
setDefaultOption( "text", QVariant() );
setDefaultOption( "text-disabled", QVariant() );
setDefaultOption( "text-active", QVariant() );
setDefaultOption( "text-selected", QVariant() );
fontIconPainter_ = new QtAwesomeCharIconPainter();
}
QtAwesome::~QtAwesome()
{
delete fontIconPainter_;
// delete errorIconPainter_;
qDeleteAll(painterMap_);
}
/// initializes the QtAwesome icon factory with the given fontname
void QtAwesome::init(const QString& fontname)
{
fontName_ = fontname;
}
struct FANameIcon {
const char *name;
fa::icon icon;
};
static const FANameIcon faNameIconArray[] = {
{ "fa_500px" , fa::fa_500px },
{ "addressbook" , fa::addressbook },
{ "addressbooko" , fa::addressbooko },
{ "addresscard" , fa::addresscard },
{ "addresscardo" , fa::addresscardo },
{ "adjust" , fa::adjust },
{ "adn" , fa::adn },
{ "aligncenter" , fa::aligncenter },
{ "alignjustify" , fa::alignjustify },
{ "alignleft" , fa::alignleft },
{ "alignright" , fa::alignright },
{ "amazon" , fa::amazon },
{ "ambulance" , fa::ambulance },
{ "americansignlanguageinterpreting" , fa::americansignlanguageinterpreting },
{ "anchor" , fa::anchor },
{ "android" , fa::android },
{ "angellist" , fa::angellist },
{ "angledoubledown" , fa::angledoubledown },
{ "angledoubleleft" , fa::angledoubleleft },
{ "angledoubleright" , fa::angledoubleright },
{ "angledoubleup" , fa::angledoubleup },
{ "angledown" , fa::angledown },
{ "angleleft" , fa::angleleft },
{ "angleright" , fa::angleright },
{ "angleup" , fa::angleup },
{ "apple" , fa::apple },
{ "archive" , fa::archive },
{ "areachart" , fa::areachart },
{ "arrowcircledown" , fa::arrowcircledown },
{ "arrowcircleleft" , fa::arrowcircleleft },
{ "arrowcircleodown" , fa::arrowcircleodown },
{ "arrowcircleoleft" , fa::arrowcircleoleft },
{ "arrowcircleoright" , fa::arrowcircleoright },
{ "arrowcircleoup" , fa::arrowcircleoup },
{ "arrowcircleright" , fa::arrowcircleright },
{ "arrowcircleup" , fa::arrowcircleup },
{ "arrowdown" , fa::arrowdown },
{ "arrowleft" , fa::arrowleft },
{ "arrowright" , fa::arrowright },
{ "arrowup" , fa::arrowup },
{ "arrows" , fa::arrows },
{ "arrowsalt" , fa::arrowsalt },
{ "arrowsh" , fa::arrowsh },
{ "arrowsv" , fa::arrowsv },
{ "aslinterpreting" , fa::aslinterpreting },
{ "assistivelisteningsystems" , fa::assistivelisteningsystems },
{ "asterisk" , fa::asterisk },
{ "at" , fa::at },
{ "audiodescription" , fa::audiodescription },
{ "automobile" , fa::automobile },
{ "backward" , fa::backward },
{ "balancescale" , fa::balancescale },
{ "ban" , fa::ban },
{ "bandcamp" , fa::bandcamp },
{ "bank" , fa::bank },
{ "barchart" , fa::barchart },
{ "barcharto" , fa::barcharto },
{ "barcode" , fa::barcode },
{ "bars" , fa::bars },
{ "bath" , fa::bath },
{ "bathtub" , fa::bathtub },
{ "battery" , fa::battery },
{ "battery0" , fa::battery0 },
{ "battery1" , fa::battery1 },
{ "battery2" , fa::battery2 },
{ "battery3" , fa::battery3 },
{ "battery4" , fa::battery4 },
{ "batteryempty" , fa::batteryempty },
{ "batteryfull" , fa::batteryfull },
{ "batteryhalf" , fa::batteryhalf },
{ "batteryquarter" , fa::batteryquarter },
{ "batterythreequarters" , fa::batterythreequarters },
{ "bed" , fa::bed },
{ "beer" , fa::beer },
{ "behance" , fa::behance },
{ "behancesquare" , fa::behancesquare },
{ "bell" , fa::bell },
{ "bello" , fa::bello },
{ "bellslash" , fa::bellslash },
{ "bellslasho" , fa::bellslasho },
{ "bicycle" , fa::bicycle },
{ "binoculars" , fa::binoculars },
{ "birthdaycake" , fa::birthdaycake },
{ "bitbucket" , fa::bitbucket },
{ "bitbucketsquare" , fa::bitbucketsquare },
{ "bitcoin" , fa::bitcoin },
{ "blacktie" , fa::blacktie },
{ "blind" , fa::blind },
{ "bluetooth" , fa::bluetooth },
{ "bluetoothb" , fa::bluetoothb },
{ "bold" , fa::bold },
{ "bolt" , fa::bolt },
{ "bomb" , fa::bomb },
{ "book" , fa::book },
{ "bookmark" , fa::bookmark },
{ "bookmarko" , fa::bookmarko },
{ "braille" , fa::braille },
{ "briefcase" , fa::briefcase },
{ "btc" , fa::btc },
{ "bug" , fa::bug },
{ "building" , fa::building },
{ "buildingo" , fa::buildingo },
{ "bullhorn" , fa::bullhorn },
{ "bullseye" , fa::bullseye },
{ "bus" , fa::bus },
{ "buysellads" , fa::buysellads },
{ "cab" , fa::cab },
{ "calculator" , fa::calculator },
{ "calendar" , fa::calendar },
{ "calendarchecko" , fa::calendarchecko },
{ "calendarminuso" , fa::calendarminuso },
{ "calendaro" , fa::calendaro },
{ "calendarpluso" , fa::calendarpluso },
{ "calendartimeso" , fa::calendartimeso },
{ "camera" , fa::camera },
{ "cameraretro" , fa::cameraretro },
{ "car" , fa::car },
{ "caretdown" , fa::caretdown },
{ "caretleft" , fa::caretleft },
{ "caretright" , fa::caretright },
{ "caretsquareodown" , fa::caretsquareodown },
{ "caretsquareoleft" , fa::caretsquareoleft },
{ "caretsquareoright" , fa::caretsquareoright },
{ "caretsquareoup" , fa::caretsquareoup },
{ "caretup" , fa::caretup },
{ "cartarrowdown" , fa::cartarrowdown },
{ "cartplus" , fa::cartplus },
{ "cc" , fa::cc },
{ "ccamex" , fa::ccamex },
{ "ccdinersclub" , fa::ccdinersclub },
{ "ccdiscover" , fa::ccdiscover },
{ "ccjcb" , fa::ccjcb },
{ "ccmastercard" , fa::ccmastercard },
{ "ccpaypal" , fa::ccpaypal },
{ "ccstripe" , fa::ccstripe },
{ "ccvisa" , fa::ccvisa },
{ "certificate" , fa::certificate },
{ "chain" , fa::chain },
{ "chainbroken" , fa::chainbroken },
{ "check" , fa::check },
{ "checkcircle" , fa::checkcircle },
{ "checkcircleo" , fa::checkcircleo },
{ "checksquare" , fa::checksquare },
{ "checksquareo" , fa::checksquareo },
{ "chevroncircledown" , fa::chevroncircledown },
{ "chevroncircleleft" , fa::chevroncircleleft },
{ "chevroncircleright" , fa::chevroncircleright },
{ "chevroncircleup" , fa::chevroncircleup },
{ "chevrondown" , fa::chevrondown },
{ "chevronleft" , fa::chevronleft },
{ "chevronright" , fa::chevronright },
{ "chevronup" , fa::chevronup },
{ "child" , fa::child },
{ "chrome" , fa::chrome },
{ "circle" , fa::circle },
{ "circleo" , fa::circleo },
{ "circleonotch" , fa::circleonotch },
{ "circlethin" , fa::circlethin },
{ "clipboard" , fa::clipboard },
{ "clocko" , fa::clocko },
{ "clone" , fa::clone },
{ "close" , fa::close },
{ "cloud" , fa::cloud },
{ "clouddownload" , fa::clouddownload },
{ "cloudupload" , fa::cloudupload },
{ "cny" , fa::cny },
{ "code" , fa::code },
{ "codefork" , fa::codefork },
{ "codepen" , fa::codepen },
{ "codiepie" , fa::codiepie },
{ "coffee" , fa::coffee },
{ "cog" , fa::cog },
{ "cogs" , fa::cogs },
{ "columns" , fa::columns },
{ "comment" , fa::comment },
{ "commento" , fa::commento },
{ "commenting" , fa::commenting },
{ "commentingo" , fa::commentingo },
{ "comments" , fa::comments },
{ "commentso" , fa::commentso },
{ "compass" , fa::compass },
{ "compress" , fa::compress },
{ "connectdevelop" , fa::connectdevelop },
{ "contao" , fa::contao },
{ "copy" , fa::copy },
{ "copyright" , fa::copyright },
{ "creativecommons" , fa::creativecommons },
{ "creditcard" , fa::creditcard },
{ "creditcardalt" , fa::creditcardalt },
{ "crop" , fa::crop },
{ "crosshairs" , fa::crosshairs },
{ "css3" , fa::css3 },
{ "cube" , fa::cube },
{ "cubes" , fa::cubes },
{ "cut" , fa::cut },
{ "cutlery" , fa::cutlery },
{ "dashboard" , fa::dashboard },
{ "dashcube" , fa::dashcube },
{ "database" , fa::database },
{ "deaf" , fa::deaf },
{ "deafness" , fa::deafness },
{ "dedent" , fa::dedent },
{ "delicious" , fa::delicious },
{ "desktop" , fa::desktop },
{ "deviantart" , fa::deviantart },
{ "diamond" , fa::diamond },
{ "digg" , fa::digg },
{ "dollar" , fa::dollar },
{ "dotcircleo" , fa::dotcircleo },
{ "download" , fa::download },
{ "dribbble" , fa::dribbble },
{ "driverslicense" , fa::driverslicense },
{ "driverslicenseo" , fa::driverslicenseo },
{ "dropbox" , fa::dropbox },
{ "drupal" , fa::drupal },
{ "edge" , fa::edge },
{ "edit" , fa::edit },
{ "eercast" , fa::eercast },
{ "eject" , fa::eject },
{ "ellipsish" , fa::ellipsish },
{ "ellipsisv" , fa::ellipsisv },
{ "empire" , fa::empire },
{ "envelope" , fa::envelope },
{ "envelopeo" , fa::envelopeo },
{ "envelopeopen" , fa::envelopeopen },
{ "envelopeopeno" , fa::envelopeopeno },
{ "envelopesquare" , fa::envelopesquare },
{ "envira" , fa::envira },
{ "eraser" , fa::eraser },
{ "etsy" , fa::etsy },
{ "eur" , fa::eur },
{ "euro" , fa::euro },
{ "exchange" , fa::exchange },
{ "exclamation" , fa::exclamation },
{ "exclamationcircle" , fa::exclamationcircle },
{ "exclamationtriangle" , fa::exclamationtriangle },
{ "expand" , fa::expand },
{ "expeditedssl" , fa::expeditedssl },
{ "externallink" , fa::externallink },
{ "externallinksquare" , fa::externallinksquare },
{ "eye" , fa::eye },
{ "eyeslash" , fa::eyeslash },
{ "eyedropper" , fa::eyedropper },
{ "fa" , fa::fa },
{ "facebook" , fa::facebook },
{ "facebookf" , fa::facebookf },
{ "facebookofficial" , fa::facebookofficial },
{ "facebooksquare" , fa::facebooksquare },
{ "fastbackward" , fa::fastbackward },
{ "fastforward" , fa::fastforward },
{ "fax" , fa::fax },
{ "feed" , fa::feed },
{ "female" , fa::female },
{ "fighterjet" , fa::fighterjet },
{ "file" , fa::file },
{ "filearchiveo" , fa::filearchiveo },
{ "fileaudioo" , fa::fileaudioo },
{ "filecodeo" , fa::filecodeo },
{ "fileexcelo" , fa::fileexcelo },
{ "fileimageo" , fa::fileimageo },
{ "filemovieo" , fa::filemovieo },
{ "fileo" , fa::fileo },
{ "filepdfo" , fa::filepdfo },
{ "filephotoo" , fa::filephotoo },
{ "filepictureo" , fa::filepictureo },
{ "filepowerpointo" , fa::filepowerpointo },
{ "filesoundo" , fa::filesoundo },
{ "filetext" , fa::filetext },
{ "filetexto" , fa::filetexto },
{ "filevideoo" , fa::filevideoo },
{ "filewordo" , fa::filewordo },
{ "filezipo" , fa::filezipo },
{ "fileso" , fa::fileso },
{ "film" , fa::film },
{ "filter" , fa::filter },
{ "fire" , fa::fire },
{ "fireextinguisher" , fa::fireextinguisher },
{ "firefox" , fa::firefox },
{ "firstorder" , fa::firstorder },
{ "flag" , fa::flag },
{ "flagcheckered" , fa::flagcheckered },
{ "flago" , fa::flago },
{ "flash" , fa::flash },
{ "flask" , fa::flask },
{ "flickr" , fa::flickr },
{ "floppyo" , fa::floppyo },
{ "folder" , fa::folder },
{ "foldero" , fa::foldero },
{ "folderopen" , fa::folderopen },
{ "folderopeno" , fa::folderopeno },
{ "font" , fa::font },
{ "fontawesome" , fa::fontawesome },
{ "fonticons" , fa::fonticons },
{ "fortawesome" , fa::fortawesome },
{ "forumbee" , fa::forumbee },
{ "forward" , fa::forward },
{ "foursquare" , fa::foursquare },
{ "freecodecamp" , fa::freecodecamp },
{ "frowno" , fa::frowno },
{ "futbolo" , fa::futbolo },
{ "gamepad" , fa::gamepad },
{ "gavel" , fa::gavel },
{ "gbp" , fa::gbp },
{ "ge" , fa::ge },
{ "gear" , fa::gear },
{ "gears" , fa::gears },
{ "genderless" , fa::genderless },
{ "getpocket" , fa::getpocket },
{ "gg" , fa::gg },
{ "ggcircle" , fa::ggcircle },
{ "gift" , fa::gift },
{ "git" , fa::git },
{ "gitsquare" , fa::gitsquare },
{ "github" , fa::github },
{ "githubalt" , fa::githubalt },
{ "githubsquare" , fa::githubsquare },
{ "gitlab" , fa::gitlab },
{ "gittip" , fa::gittip },
{ "glass" , fa::glass },
{ "glide" , fa::glide },
{ "glideg" , fa::glideg },
{ "globe" , fa::globe },
{ "google" , fa::google },
{ "googleplus" , fa::googleplus },
{ "googlepluscircle" , fa::googlepluscircle },
{ "googleplusofficial" , fa::googleplusofficial },
{ "googleplussquare" , fa::googleplussquare },
{ "googlewallet" , fa::googlewallet },
{ "graduationcap" , fa::graduationcap },
{ "gratipay" , fa::gratipay },
{ "grav" , fa::grav },
{ "group" , fa::group },
{ "hsquare" , fa::hsquare },
{ "hackernews" , fa::hackernews },
{ "handgrabo" , fa::handgrabo },
{ "handlizardo" , fa::handlizardo },
{ "handodown" , fa::handodown },
{ "handoleft" , fa::handoleft },
{ "handoright" , fa::handoright },
{ "handoup" , fa::handoup },
{ "handpapero" , fa::handpapero },
{ "handpeaceo" , fa::handpeaceo },
{ "handpointero" , fa::handpointero },
{ "handrocko" , fa::handrocko },
{ "handscissorso" , fa::handscissorso },
{ "handspocko" , fa::handspocko },
{ "handstopo" , fa::handstopo },
{ "handshakeo" , fa::handshakeo },
{ "hardofhearing" , fa::hardofhearing },
{ "hashtag" , fa::hashtag },
{ "hddo" , fa::hddo },
{ "header" , fa::header },
{ "headphones" , fa::headphones },
{ "heart" , fa::heart },
{ "hearto" , fa::hearto },
{ "heartbeat" , fa::heartbeat },
{ "history" , fa::history },
{ "home" , fa::home },
{ "hospitalo" , fa::hospitalo },
{ "hotel" , fa::hotel },
{ "hourglass" , fa::hourglass },
{ "hourglass1" , fa::hourglass1 },
{ "hourglass2" , fa::hourglass2 },
{ "hourglass3" , fa::hourglass3 },
{ "hourglassend" , fa::hourglassend },
{ "hourglasshalf" , fa::hourglasshalf },
{ "hourglasso" , fa::hourglasso },
{ "hourglassstart" , fa::hourglassstart },
{ "houzz" , fa::houzz },
{ "html5" , fa::html5 },
{ "icursor" , fa::icursor },
{ "idbadge" , fa::idbadge },
{ "idcard" , fa::idcard },
{ "idcardo" , fa::idcardo },
{ "ils" , fa::ils },
{ "image" , fa::image },
{ "imdb" , fa::imdb },
{ "inbox" , fa::inbox },
{ "indent" , fa::indent },
{ "industry" , fa::industry },
{ "info" , fa::info },
{ "infocircle" , fa::infocircle },
{ "inr" , fa::inr },
{ "instagram" , fa::instagram },
{ "institution" , fa::institution },
{ "internetexplorer" , fa::internetexplorer },
{ "intersex" , fa::intersex },
{ "ioxhost" , fa::ioxhost },
{ "italic" , fa::italic },
{ "joomla" , fa::joomla },
{ "jpy" , fa::jpy },
{ "jsfiddle" , fa::jsfiddle },
{ "key" , fa::key },
{ "keyboardo" , fa::keyboardo },
{ "krw" , fa::krw },
{ "language" , fa::language },
{ "laptop" , fa::laptop },
{ "lastfm" , fa::lastfm },
{ "lastfmsquare" , fa::lastfmsquare },
{ "leaf" , fa::leaf },
{ "leanpub" , fa::leanpub },
{ "legal" , fa::legal },
{ "lemono" , fa::lemono },
{ "leveldown" , fa::leveldown },
{ "levelup" , fa::levelup },
{ "lifebouy" , fa::lifebouy },
{ "lifebuoy" , fa::lifebuoy },
{ "lifering" , fa::lifering },
{ "lifesaver" , fa::lifesaver },
{ "lightbulbo" , fa::lightbulbo },
{ "linechart" , fa::linechart },
{ "link" , fa::link },
{ "linkedin" , fa::linkedin },
{ "linkedinsquare" , fa::linkedinsquare },
{ "linode" , fa::linode },
{ "fa_linux" , fa::fa_linux },
{ "list" , fa::list },
{ "listalt" , fa::listalt },
{ "listol" , fa::listol },
{ "listul" , fa::listul },
{ "locationarrow" , fa::locationarrow },
{ "lock" , fa::lock },
{ "longarrowdown" , fa::longarrowdown },
{ "longarrowleft" , fa::longarrowleft },
{ "longarrowright" , fa::longarrowright },
{ "longarrowup" , fa::longarrowup },
{ "lowvision" , fa::lowvision },
{ "magic" , fa::magic },
{ "magnet" , fa::magnet },
{ "mailforward" , fa::mailforward },
{ "mailreply" , fa::mailreply },
{ "mailreplyall" , fa::mailreplyall },
{ "male" , fa::male },
{ "map" , fa::map },
{ "mapmarker" , fa::mapmarker },
{ "mapo" , fa::mapo },
{ "mappin" , fa::mappin },
{ "mapsigns" , fa::mapsigns },
{ "mars" , fa::mars },
{ "marsdouble" , fa::marsdouble },
{ "marsstroke" , fa::marsstroke },
{ "marsstrokeh" , fa::marsstrokeh },
{ "marsstrokev" , fa::marsstrokev },
{ "maxcdn" , fa::maxcdn },
{ "meanpath" , fa::meanpath },
{ "medium" , fa::medium },
{ "medkit" , fa::medkit },
{ "meetup" , fa::meetup },
{ "meho" , fa::meho },
{ "mercury" , fa::mercury },
{ "microchip" , fa::microchip },
{ "microphone" , fa::microphone },
{ "microphoneslash" , fa::microphoneslash },
{ "minus" , fa::minus },
{ "minuscircle" , fa::minuscircle },
{ "minussquare" , fa::minussquare },
{ "minussquareo" , fa::minussquareo },
{ "mixcloud" , fa::mixcloud },
{ "mobile" , fa::mobile },
{ "mobilephone" , fa::mobilephone },
{ "modx" , fa::modx },
{ "money" , fa::money },
{ "moono" , fa::moono },
{ "mortarboard" , fa::mortarboard },
{ "motorcycle" , fa::motorcycle },
{ "mousepointer" , fa::mousepointer },
{ "music" , fa::music },
{ "navicon" , fa::navicon },
{ "neuter" , fa::neuter },
{ "newspapero" , fa::newspapero },
{ "objectgroup" , fa::objectgroup },
{ "objectungroup" , fa::objectungroup },
{ "odnoklassniki" , fa::odnoklassniki },
{ "odnoklassnikisquare" , fa::odnoklassnikisquare },
{ "opencart" , fa::opencart },
{ "openid" , fa::openid },
{ "opera" , fa::opera },
{ "optinmonster" , fa::optinmonster },
{ "outdent" , fa::outdent },
{ "pagelines" , fa::pagelines },
{ "paintbrush" , fa::paintbrush },
{ "paperplane" , fa::paperplane },
{ "paperplaneo" , fa::paperplaneo },
{ "paperclip" , fa::paperclip },
{ "paragraph" , fa::paragraph },
{ "paste" , fa::paste },
{ "pause" , fa::pause },
{ "pausecircle" , fa::pausecircle },
{ "pausecircleo" , fa::pausecircleo },
{ "paw" , fa::paw },
{ "paypal" , fa::paypal },
{ "pencil" , fa::pencil },
{ "pencilsquare" , fa::pencilsquare },
{ "pencilsquareo" , fa::pencilsquareo },
{ "percent" , fa::percent },
{ "phone" , fa::phone },
{ "phonesquare" , fa::phonesquare },
{ "photo" , fa::photo },
{ "pictureo" , fa::pictureo },
{ "piechart" , fa::piechart },
{ "piedpiper" , fa::piedpiper },
{ "piedpiperalt" , fa::piedpiperalt },
{ "piedpiperpp" , fa::piedpiperpp },
{ "pinterest" , fa::pinterest },
{ "pinterestp" , fa::pinterestp },
{ "pinterestsquare" , fa::pinterestsquare },
{ "plane" , fa::plane },
{ "play" , fa::play },
{ "playcircle" , fa::playcircle },
{ "playcircleo" , fa::playcircleo },
{ "plug" , fa::plug },
{ "plus" , fa::plus },
{ "pluscircle" , fa::pluscircle },
{ "plussquare" , fa::plussquare },
{ "plussquareo" , fa::plussquareo },
{ "podcast" , fa::podcast },
{ "poweroff" , fa::poweroff },
{ "print" , fa::print },
{ "producthunt" , fa::producthunt },
{ "puzzlepiece" , fa::puzzlepiece },
{ "qq" , fa::qq },
{ "qrcode" , fa::qrcode },
{ "question" , fa::question },
{ "questioncircle" , fa::questioncircle },
{ "questioncircleo" , fa::questioncircleo },
{ "quora" , fa::quora },
{ "quoteleft" , fa::quoteleft },
{ "quoteright" , fa::quoteright },
{ "ra" , fa::ra },
{ "random" , fa::random },
{ "ravelry" , fa::ravelry },
{ "rebel" , fa::rebel },
{ "recycle" , fa::recycle },
{ "reddit" , fa::reddit },
{ "redditalien" , fa::redditalien },
{ "redditsquare" , fa::redditsquare },
{ "refresh" , fa::refresh },
{ "registered" , fa::registered },
{ "remove" , fa::remove },
{ "renren" , fa::renren },
{ "reorder" , fa::reorder },
{ "repeat" , fa::repeat },
{ "reply" , fa::reply },
{ "replyall" , fa::replyall },
{ "resistance" , fa::resistance },
{ "retweet" , fa::retweet },
{ "rmb" , fa::rmb },
{ "road" , fa::road },
{ "rocket" , fa::rocket },
{ "rotateleft" , fa::rotateleft },
{ "rotateright" , fa::rotateright },
{ "rouble" , fa::rouble },
{ "rss" , fa::rss },
{ "rsssquare" , fa::rsssquare },
{ "rub" , fa::rub },
{ "ruble" , fa::ruble },
{ "rupee" , fa::rupee },
{ "s15" , fa::s15 },
{ "safari" , fa::safari },
{ "save" , fa::save },
{ "scissors" , fa::scissors },
{ "scribd" , fa::scribd },
{ "search" , fa::search },
{ "searchminus" , fa::searchminus },
{ "searchplus" , fa::searchplus },
{ "sellsy" , fa::sellsy },
{ "send" , fa::send },
{ "sendo" , fa::sendo },
{ "server" , fa::server },
{ "share" , fa::share },
{ "sharealt" , fa::sharealt },
{ "sharealtsquare" , fa::sharealtsquare },
{ "sharesquare" , fa::sharesquare },
{ "sharesquareo" , fa::sharesquareo },
{ "shekel" , fa::shekel },
{ "sheqel" , fa::sheqel },
{ "shield" , fa::shield },
{ "ship" , fa::ship },
{ "shirtsinbulk" , fa::shirtsinbulk },
{ "shoppingbag" , fa::shoppingbag },
{ "shoppingbasket" , fa::shoppingbasket },
{ "shoppingcart" , fa::shoppingcart },
{ "shower" , fa::shower },
{ "signin" , fa::signin },
{ "signlanguage" , fa::signlanguage },
{ "signout" , fa::signout },
{ "signal" , fa::signal },
{ "signing" , fa::signing },
{ "simplybuilt" , fa::simplybuilt },
{ "sitemap" , fa::sitemap },
{ "skyatlas" , fa::skyatlas },
{ "skype" , fa::skype },
{ "slack" , fa::slack },
{ "sliders" , fa::sliders },
{ "slideshare" , fa::slideshare },
{ "smileo" , fa::smileo },
{ "snapchat" , fa::snapchat },
{ "snapchatghost" , fa::snapchatghost },
{ "snapchatsquare" , fa::snapchatsquare },
{ "snowflakeo" , fa::snowflakeo },
{ "soccerballo" , fa::soccerballo },
{ "sort" , fa::sort },
{ "sortalphaasc" , fa::sortalphaasc },
{ "sortalphadesc" , fa::sortalphadesc },
{ "sortamountasc" , fa::sortamountasc },
{ "sortamountdesc" , fa::sortamountdesc },
{ "sortasc" , fa::sortasc },
{ "sortdesc" , fa::sortdesc },
{ "sortdown" , fa::sortdown },
{ "sortnumericasc" , fa::sortnumericasc },
{ "sortnumericdesc" , fa::sortnumericdesc },
{ "sortup" , fa::sortup },
{ "soundcloud" , fa::soundcloud },
{ "spaceshuttle" , fa::spaceshuttle },
{ "spinner" , fa::spinner },
{ "spoon" , fa::spoon },
{ "spotify" , fa::spotify },
{ "square" , fa::square },
{ "squareo" , fa::squareo },
{ "stackexchange" , fa::stackexchange },
{ "stackoverflow" , fa::stackoverflow },
{ "star" , fa::star },
{ "starhalf" , fa::starhalf },
{ "starhalfempty" , fa::starhalfempty },
{ "starhalffull" , fa::starhalffull },
{ "starhalfo" , fa::starhalfo },
{ "staro" , fa::staro },
{ "steam" , fa::steam },
{ "steamsquare" , fa::steamsquare },
{ "stepbackward" , fa::stepbackward },
{ "stepforward" , fa::stepforward },
{ "stethoscope" , fa::stethoscope },
{ "stickynote" , fa::stickynote },
{ "stickynoteo" , fa::stickynoteo },
{ "stop" , fa::stop },
{ "stopcircle" , fa::stopcircle },
{ "stopcircleo" , fa::stopcircleo },
{ "streetview" , fa::streetview },
{ "strikethrough" , fa::strikethrough },
{ "stumbleupon" , fa::stumbleupon },
{ "stumbleuponcircle" , fa::stumbleuponcircle },
{ "subscript" , fa::subscript },
{ "subway" , fa::subway },
{ "suitcase" , fa::suitcase },
{ "suno" , fa::suno },
{ "superpowers" , fa::superpowers },
{ "superscript" , fa::superscript },
{ "support" , fa::support },
{ "table" , fa::table },
{ "tablet" , fa::tablet },
{ "tachometer" , fa::tachometer },
{ "tag" , fa::tag },
{ "tags" , fa::tags },
{ "tasks" , fa::tasks },
{ "taxi" , fa::taxi },
{ "telegram" , fa::telegram },
{ "television" , fa::television },
{ "tencentweibo" , fa::tencentweibo },
{ "terminal" , fa::terminal },
{ "textheight" , fa::textheight },
{ "textwidth" , fa::textwidth },
{ "th" , fa::th },
{ "thlarge" , fa::thlarge },
{ "thlist" , fa::thlist },
{ "themeisle" , fa::themeisle },
{ "thermometer" , fa::thermometer },
{ "thermometer0" , fa::thermometer0 },
{ "thermometer1" , fa::thermometer1 },
{ "thermometer2" , fa::thermometer2 },
{ "thermometer3" , fa::thermometer3 },
{ "thermometer4" , fa::thermometer4 },
{ "thermometerempty" , fa::thermometerempty },
{ "thermometerfull" , fa::thermometerfull },
{ "thermometerhalf" , fa::thermometerhalf },
{ "thermometerquarter" , fa::thermometerquarter },
{ "thermometerthreequarters" , fa::thermometerthreequarters },
{ "thumbtack" , fa::thumbtack },
{ "thumbsdown" , fa::thumbsdown },
{ "thumbsodown" , fa::thumbsodown },
{ "thumbsoup" , fa::thumbsoup },
{ "thumbsup" , fa::thumbsup },
{ "ticket" , fa::ticket },
{ "times" , fa::times },
{ "timescircle" , fa::timescircle },
{ "timescircleo" , fa::timescircleo },
{ "timesrectangle" , fa::timesrectangle },
{ "timesrectangleo" , fa::timesrectangleo },
{ "tint" , fa::tint },
{ "toggledown" , fa::toggledown },
{ "toggleleft" , fa::toggleleft },
{ "toggleoff" , fa::toggleoff },
{ "toggleon" , fa::toggleon },
{ "toggleright" , fa::toggleright },
{ "toggleup" , fa::toggleup },
{ "trademark" , fa::trademark },
{ "train" , fa::train },
{ "transgender" , fa::transgender },
{ "transgenderalt" , fa::transgenderalt },
{ "trash" , fa::trash },
{ "trasho" , fa::trasho },
{ "tree" , fa::tree },
{ "trello" , fa::trello },
{ "tripadvisor" , fa::tripadvisor },
{ "trophy" , fa::trophy },
{ "truck" , fa::truck },
{ "fa_try" , fa::fa_try },
{ "tty" , fa::tty },
{ "tumblr" , fa::tumblr },
{ "tumblrsquare" , fa::tumblrsquare },
{ "turkishlira" , fa::turkishlira },
{ "tv" , fa::tv },
{ "twitch" , fa::twitch },
{ "twitter" , fa::twitter },
{ "twittersquare" , fa::twittersquare },
{ "umbrella" , fa::umbrella },
{ "underline" , fa::underline },
{ "undo" , fa::undo },
{ "universalaccess" , fa::universalaccess },
{ "university" , fa::university },
{ "unlink" , fa::unlink },
{ "unlock" , fa::unlock },
{ "unlockalt" , fa::unlockalt },
{ "unsorted" , fa::unsorted },
{ "upload" , fa::upload },
{ "usb" , fa::usb },
{ "usd" , fa::usd },
{ "user" , fa::user },
{ "usercircle" , fa::usercircle },
{ "usercircleo" , fa::usercircleo },
{ "usermd" , fa::usermd },
{ "usero" , fa::usero },
{ "userplus" , fa::userplus },
{ "usersecret" , fa::usersecret },
{ "usertimes" , fa::usertimes },
{ "users" , fa::users },
{ "vcard" , fa::vcard },
{ "vcardo" , fa::vcardo },
{ "venus" , fa::venus },
{ "venusdouble" , fa::venusdouble },
{ "venusmars" , fa::venusmars },
{ "viacoin" , fa::viacoin },
{ "viadeo" , fa::viadeo },
{ "viadeosquare" , fa::viadeosquare },
{ "videocamera" , fa::videocamera },
{ "vimeo" , fa::vimeo },
{ "vimeosquare" , fa::vimeosquare },
{ "vine" , fa::vine },
{ "vk" , fa::vk },
{ "volumecontrolphone" , fa::volumecontrolphone },
{ "volumedown" , fa::volumedown },
{ "volumeoff" , fa::volumeoff },
{ "volumeup" , fa::volumeup },
{ "warning" , fa::warning },
{ "wechat" , fa::wechat },
{ "weibo" , fa::weibo },
{ "weixin" , fa::weixin },
{ "whatsapp" , fa::whatsapp },
{ "wheelchair" , fa::wheelchair },
{ "wheelchairalt" , fa::wheelchairalt },
{ "wifi" , fa::wifi },
{ "wikipediaw" , fa::wikipediaw },
{ "windowclose" , fa::windowclose },
{ "windowcloseo" , fa::windowcloseo },
{ "windowmaximize" , fa::windowmaximize },
{ "windowminimize" , fa::windowminimize },
{ "windowrestore" , fa::windowrestore },
{ "windows" , fa::windows },
{ "won" , fa::won },
{ "wordpress" , fa::wordpress },
{ "wpbeginner" , fa::wpbeginner },
{ "wpexplorer" , fa::wpexplorer },
{ "wpforms" , fa::wpforms },
{ "wrench" , fa::wrench },
{ "xing" , fa::xing },
{ "xingsquare" , fa::xingsquare },
{ "ycombinator" , fa::ycombinator },
{ "ycombinatorsquare" , fa::ycombinatorsquare },
{ "yahoo" , fa::yahoo },
{ "yc" , fa::yc },
{ "ycsquare" , fa::ycsquare },
{ "yelp" , fa::yelp },
{ "yen" , fa::yen },
{ "yoast" , fa::yoast },
{ "youtube" , fa::youtube },
{ "youtubeplay" , fa::youtubeplay },
{ "youtubesquare" , fa::youtubesquare }
};
/// a specialized init function so font-awesome is loaded and initialized
/// this method return true on success, it will return false if the fnot cannot be initialized
/// To initialize QtAwesome with font-awesome you need to call this method
bool QtAwesome::initFontAwesome( )
{
static int fontAwesomeFontId = -1;
// only load font-awesome once
if( fontAwesomeFontId < 0 ) {
// The macro below internally calls "qInitResources_QtAwesome()". this initializes
// the resource system. For a .pri project this isn't required, but when building and using a
// static library the resource need to initialized first.
///
// I've checked th qInitResource_* code and calling this method mutliple times shouldn't be any problem
// (More info about this subject: http://qt-project.org/wiki/QtResources)
Q_INIT_RESOURCE(QtAwesome);
// load the font file
QFile res(":/fonts/fontawesome-4.7.0.ttf");
if(!res.open(QIODevice::ReadOnly)) {
qDebug() << "Font awesome font could not be loaded!";
return false;
}
QByteArray fontData( res.readAll() );
res.close();
// fetch the given font
fontAwesomeFontId = QFontDatabase::addApplicationFontFromData(fontData);
}
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(fontAwesomeFontId);
if( !loadedFontFamilies.empty() ) {
fontName_= loadedFontFamilies.at(0);
} else {
qDebug() << "Font awesome font is empty?!";
fontAwesomeFontId = -1; // restore the font-awesome id
return false;
}
// intialize the map
QHash<QString, int>& m = namedCodepoints_;
for (unsigned i = 0; i < sizeof(faNameIconArray)/sizeof(FANameIcon); ++i) {
m.insert(faNameIconArray[i].name, faNameIconArray[i].icon);
}
return true;
}
void QtAwesome::addNamedCodepoint( const QString& name, int codePoint)
{
namedCodepoints_.insert( name, codePoint);
}
/// Sets a default option. These options are passed on to the icon painters
void QtAwesome::setDefaultOption(const QString& name, const QVariant& value)
{
defaultOptions_.insert( name, value );
}
/// Returns the default option for the given name
QVariant QtAwesome::defaultOption(const QString& name)
{
return defaultOptions_.value( name );
}
// internal helper method to merge to option amps
static QVariantMap mergeOptions( const QVariantMap& defaults, const QVariantMap& override )
{
QVariantMap result= defaults;
if( !override.isEmpty() ) {
QMapIterator<QString,QVariant> itr(override);
while( itr.hasNext() ) {
itr.next();
result.insert( itr.key(), itr.value() );
}
}
return result;
}
/// Creates an icon with the given code-point
/// <code>
/// awesome->icon( icon_group )
/// </code>
QIcon QtAwesome::icon(int character, const QVariantMap &options)
{
// create a merged QVariantMap to have default options and icon-specific options
QVariantMap optionMap = mergeOptions( defaultOptions_, options );
optionMap.insert("text", QString( QChar(static_cast<int>(character)) ) );
return icon( fontIconPainter_, optionMap );
}
/// Creates an icon with the given name
///
/// You can use the icon names as defined on http://fortawesome.github.io/Font-Awesome/design.html withour the 'icon-' prefix
/// @param name the name of the icon
/// @param options extra option to pass to the icon renderer
QIcon QtAwesome::icon(const QString& name, const QVariantMap& options)
{
// when it's a named codepoint
if( namedCodepoints_.count(name) ) {
return icon( namedCodepoints_.value(name), options );
}
// create a merged QVariantMap to have default options and icon-specific options
QVariantMap optionMap = mergeOptions( defaultOptions_, options );
// this method first tries to retrieve the icon
QtAwesomeIconPainter* painter = painterMap_.value(name);
if( !painter ) {
return QIcon();
}
return icon( painter, optionMap );
}
/// Create a dynamic icon by simlpy supplying a painter object
/// The ownership of the painter is NOT transfered.
/// @param painter a dynamic painter that is going to paint the icon
/// @param optionmap the options to pass to the painter
QIcon QtAwesome::icon(QtAwesomeIconPainter* painter, const QVariantMap& optionMap )
{
// Warning, when you use memoryleak detection. You should turn it of for the next call
// QIcon's placed in gui items are often cached and not deleted when my memory-leak detection checks for leaks.
// I'm not sure if it's a Qt bug or something I do wrong
QtAwesomeIconPainterIconEngine* engine = new QtAwesomeIconPainterIconEngine( this, painter, optionMap );
return QIcon( engine );
}
/// Adds a named icon-painter to the QtAwesome icon map
/// As the name applies the ownership is passed over to QtAwesome
///
/// @param name the name of the icon
/// @param painter the icon painter to add for this name
void QtAwesome::give(const QString& name, QtAwesomeIconPainter* painter)
{
delete painterMap_.value( name ); // delete the old one
painterMap_.insert( name, painter );
}
/// Creates/Gets the icon font with a given size in pixels. This can be usefull to use a label for displaying icons
/// Example:
///
/// QLabel* label = new QLabel( QChar( icon_group ) );
/// label->setFont( awesome->font(16) )
QFont QtAwesome::font( int size )
{
QFont font( fontName_);
font.setPixelSize(size);
return font;
}