From 89f9bc2f3f66fdf98bcf529e90639385b0a0cef2 Mon Sep 17 00:00:00 2001 From: Rick Blommers Date: Fri, 19 Apr 2013 08:26:54 +0200 Subject: [PATCH] initial commit --- .gitignore | 3 + LICENSE.md | 29 ++ QtAwesome/QtAwesome.cpp | 543 ++++++++++++++++++++++++++++ QtAwesome/QtAwesome.h | 363 +++++++++++++++++++ QtAwesome/QtAwesome.pri | 10 + QtAwesome/QtAwesome.pro | 15 + QtAwesome/QtAwesome.qrc | 5 + QtAwesome/fonts/fontawesome.ttf | Bin 0 -> 55096 bytes QtAwesomeSample/QtAwesomeSample.pro | 20 + QtAwesomeSample/main.cpp | 26 ++ README.md | 117 ++++++ 11 files changed, 1131 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 QtAwesome/QtAwesome.cpp create mode 100644 QtAwesome/QtAwesome.h create mode 100644 QtAwesome/QtAwesome.pri create mode 100644 QtAwesome/QtAwesome.pro create mode 100644 QtAwesome/QtAwesome.qrc create mode 100755 QtAwesome/fonts/fontawesome.ttf create mode 100644 QtAwesomeSample/QtAwesomeSample.pro create mode 100644 QtAwesomeSample/main.cpp create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ca40fa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +*.pro.user +/*build* \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..27c3147 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,29 @@ +MIT License +=========== + +Copyright 2013 - [Reliable Bits Software by Blommers IT](http://blommersit.nl). All Rights Reserved. +Author [Rick Blommers](mailto:rick@blommersit.nl) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Font Awesome License +==================== + +[https://github.com/FortAwesome/Font-Awesome](https://github.com/FortAwesome/Font-Awesome) + +The Font Awesome font is licensed under the SIL Open Font License - [http://scripts.sil.org/OFL](http://scripts.sil.org/OFL) +The Font Awesome pictograms are licensed under the CC BY 3.0 License - [http://creativecommons.org/licenses/by/3.0/](http://creativecommons.org/licenses/by/3.0/) +"Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome" + + diff --git a/QtAwesome/QtAwesome.cpp b/QtAwesome/QtAwesome.cpp new file mode 100644 index 0000000..85186db --- /dev/null +++ b/QtAwesome/QtAwesome.cpp @@ -0,0 +1,543 @@ +/** + * QtAwesome - use font-awesome (or other font icons) in your c++ / Qt Application + * + * MIT License: + * + * Copyright 2013 - Reliable Bits Software by Blommers IT. All Rights Reserved. + * Author Rick Blommers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS + * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * I would appriciate it if you let me know which projects you are using this for + */ + +#include "QtAwesome.h" + +#include +#include +#include + + +/// 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(); + + // set the correct color + QColor color = options.value("color").value(); + if( mode == QIcon::Disabled ) { + color = options.value("color-disabled").value(); + } else if( mode == QIcon::Active ) { + color = options.value("color-active").value(); + } else if( mode == QIcon::Selected ) { + color = options.value("color-selected").value(); + } + painter->setPen(color); + + // add some 'padding' around the icon + int drawSize = qRound(rect.height()*options.value("scale-factor").toFloat()); + QFont font(awesome->fontName()); + font.setPixelSize(drawSize); // use pixel size + + painter->setFont( font ); + painter->drawText( rect, options.value("text").toString(), 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 ); + + 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; +} + + +/// 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 ) { + QFile res(":/fonts/fontawesome.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& m = namedCodepoints_; + m.insert( "glass", icon_glass ); + m.insert( "music", icon_music ); + m.insert( "search", icon_search ); + m.insert( "envelope", icon_envelope ); + m.insert( "heart", icon_heart ); + m.insert( "star", icon_star ); + m.insert( "star-empty", icon_star_empty ); + m.insert( "user", icon_user ); + m.insert( "film", icon_film ); + m.insert( "th-large", icon_th_large ); + m.insert( "th", icon_th ); + m.insert( "th-list", icon_th_list ); + m.insert( "ok", icon_ok ); + m.insert( "remove", icon_remove ); + m.insert( "zoom-in", icon_zoom_in ); + + m.insert( "zoom-out", icon_zoom_out ); + m.insert( "off", icon_off ); + m.insert( "signal", icon_signal ); + m.insert( "cog", icon_cog ); + m.insert( "trash", icon_trash ); + m.insert( "home", icon_home ); + m.insert( "file", icon_file ); + m.insert( "time", icon_time ); + m.insert( "road", icon_road ); + m.insert( "download-alt", icon_download_alt ); + m.insert( "download", icon_download ); + m.insert( "upload", icon_upload ); + m.insert( "inbox", icon_inbox ); + m.insert( "play-circle", icon_play_circle ); + m.insert( "repeat", icon_repeat ); + + /* \f020 doesn't work in Safari. all shifted one down */ + + + m.insert( "refresh", icon_refresh ); + m.insert( "list-alt", icon_list_alt ); + m.insert( "lock", icon_lock ); + m.insert( "flag", icon_flag ); + m.insert( "headphones", icon_headphones ); + m.insert( "volume-off", icon_volume_off ); + m.insert( "volume-down", icon_volume_down ); + m.insert( "volume-up", icon_volume_up ); + m.insert( "qrcode", icon_qrcode ); + m.insert( "barcode", icon_barcode ); + m.insert( "tag", icon_tag ); + m.insert( "tags", icon_tags ); + m.insert( "book", icon_book ); + m.insert( "bookmark", icon_bookmark ); + m.insert( "print", icon_print ); + + m.insert( "camera", icon_camera ); + m.insert( "font", icon_font ); + m.insert( "bold", icon_bold ); + m.insert( "italic", icon_italic ); + m.insert( "text-height", icon_text_height ); + m.insert( "text-width", icon_text_width ); + m.insert( "align-left", icon_align_left ); + m.insert( "align-center", icon_align_center ); + m.insert( "align-right", icon_align_right ); + m.insert( "align-justify", icon_align_justify ); + m.insert( "list", icon_list ); + m.insert( "indent-left", icon_indent_left ); + m.insert( "indent-right", icon_indent_right ); + m.insert( "facetime-video", icon_facetime_video ); + m.insert( "picture", icon_picture ); + + m.insert( "pencil", icon_pencil ); + m.insert( "map-marker", icon_map_marker ); + m.insert( "adjust", icon_adjust ); + m.insert( "tint", icon_tint ); + m.insert( "edit", icon_edit ); + m.insert( "share", icon_share ); + m.insert( "check", icon_check ); + m.insert( "move", icon_move ); + m.insert( "step-backward", icon_step_backward ); + m.insert( "fast-backward", icon_fast_backward ); + m.insert( "backward", icon_backward ); + m.insert( "play", icon_play ); + m.insert( "pause", icon_pause ); + m.insert( "stop", icon_stop ); + m.insert( "forward", icon_forward ); + + m.insert( "fast-forward", icon_fast_forward ); + m.insert( "step-forward", icon_step_forward ); + m.insert( "eject", icon_eject ); + m.insert( "chevron-left", icon_chevron_left ); + m.insert( "chevron-right", icon_chevron_right ); + m.insert( "plus-sign", icon_plus_sign ); + m.insert( "minus-sign", icon_minus_sign ); + m.insert( "remove-sign", icon_remove_sign ); + m.insert( "ok-sign", icon_ok_sign ); + m.insert( "question-sign", icon_question_sign ); + m.insert( "info-sign", icon_info_sign ); + m.insert( "screenshot", icon_screenshot ); + m.insert( "remove-circle", icon_remove_circle ); + m.insert( "ok-circle", icon_ok_circle ); + m.insert( "ban-circle", icon_ban_circle ); + + m.insert( "arrow-left", icon_arrow_left ); + m.insert( "arrow-right", icon_arrow_right ); + m.insert( "arrow-up", icon_arrow_up ); + m.insert( "arrow-down", icon_arrow_down ); + m.insert( "share-alt", icon_share_alt ); + m.insert( "resize-full", icon_resize_full ); + m.insert( "resize-small", icon_resize_small ); + m.insert( "plus", icon_plus ); + m.insert( "minus", icon_minus ); + m.insert( "asterisk", icon_asterisk ); + m.insert( "exclamation-sign", icon_exclamation_sign ); + m.insert( "gift", icon_gift ); + m.insert( "leaf", icon_leaf ); + m.insert( "fire", icon_fire ); + m.insert( "eye-open", icon_eye_open ); + + m.insert( "eye-close", icon_eye_close ); + m.insert( "warning-sign", icon_warning_sign ); + m.insert( "plane", icon_plane ); + m.insert( "calendar", icon_calendar ); + m.insert( "random", icon_random ); + m.insert( "comment", icon_comment ); + m.insert( "magnet", icon_magnet ); + m.insert( "chevron-up", icon_chevron_up ); + m.insert( "chevron-down", icon_chevron_down ); + m.insert( "retweet", icon_retweet ); + m.insert( "shopping-cart", icon_shopping_cart ); + m.insert( "folder-close", icon_folder_close ); + m.insert( "folder-open", icon_folder_open ); + m.insert( "resize-vertical", icon_resize_vertical ); + m.insert( "resize-horizontal", icon_resize_horizontal ); + + m.insert( "bar-chart", icon_bar_chart ); + m.insert( "twitter-sign", icon_twitter_sign ); + m.insert( "facebook-sign", icon_facebook_sign ); + m.insert( "camera-retro", icon_camera_retro ); + m.insert( "key", icon_key ); + m.insert( "cogs", icon_cogs ); + m.insert( "comments", icon_comments ); + m.insert( "thumbs-up", icon_thumbs_up ); + m.insert( "thumbs-down", icon_thumbs_down ); + m.insert( "star-half", icon_star_half ); + m.insert( "heart-empty", icon_heart_empty ); + m.insert( "signout", icon_signout ); + m.insert( "linkedin-sign", icon_linkedin_sign ); + m.insert( "pushpin", icon_pushpin ); + m.insert( "external-link", icon_external_link ); + + m.insert( "signin", icon_signin ); + m.insert( "trophy", icon_trophy ); + m.insert( "github-sign", icon_github_sign ); + m.insert( "upload-alt", icon_upload_alt ); + m.insert( "lemon", icon_lemon ); + m.insert( "phone", icon_phone ); + m.insert( "check-empty", icon_check_empty ); + m.insert( "bookmark-empty", icon_bookmark_empty ); + m.insert( "phone-sign", icon_phone_sign ); + m.insert( "twitter", icon_twitter ); + m.insert( "facebook", icon_facebook ); + m.insert( "github", icon_github ); + m.insert( "unlock", icon_unlock ); + m.insert( "credit-card", icon_credit_card ); + m.insert( "rss", icon_rss ); + + m.insert( "hdd", icon_hdd ); + m.insert( "bullhorn", icon_bullhorn ); + m.insert( "bell", icon_bell ); + m.insert( "certificate", icon_certificate ); + m.insert( "hand-right", icon_hand_right ); + m.insert( "hand-left", icon_hand_left ); + m.insert( "hand-up", icon_hand_up ); + m.insert( "hand-down", icon_hand_down ); + m.insert( "circle-arrow-left", icon_circle_arrow_left ); + m.insert( "circle-arrow-right", icon_circle_arrow_right ); + m.insert( "circle-arrow-up", icon_circle_arrow_up ); + m.insert( "circle-arrow-down", icon_circle_arrow_down ); + m.insert( "globe", icon_globe ); + m.insert( "wrench", icon_wrench ); + m.insert( "tasks", icon_tasks ); + + m.insert( "filter", icon_filter ); + m.insert( "briefcase", icon_briefcase ); + m.insert( "fullscreen", icon_fullscreen ); + + m.insert( "group", icon_group ); + m.insert( "link", icon_link ); + m.insert( "cloud", icon_cloud ); + m.insert( "beaker", icon_beaker ); + m.insert( "cut", icon_cut ); + m.insert( "copy", icon_copy ); + m.insert( "paper-clip", icon_paper_clip ); + m.insert( "save", icon_save ); + m.insert( "sign-blank", icon_sign_blank ); + m.insert( "reorder", icon_reorder ); + m.insert( "list-ul", icon_list_ul ); + m.insert( "list-ol", icon_list_ol ); + m.insert( "strikethrough", icon_strikethrough ); + m.insert( "underline", icon_underline ); + m.insert( "table", icon_table ); + + m.insert( "magic", icon_magic ); + m.insert( "truck", icon_truck ); + m.insert( "pinterest", icon_pinterest ); + m.insert( "pinterest-sign", icon_pinterest_sign ); + m.insert( "google-plus-sign", icon_google_plus_sign ); + m.insert( "google-plus", icon_google_plus ); + m.insert( "money", icon_money ); + m.insert( "caret-down", icon_caret_down ); + m.insert( "caret-up", icon_caret_up ); + m.insert( "caret-left", icon_caret_left ); + m.insert( "caret-right", icon_caret_right ); + m.insert( "columns", icon_columns ); + m.insert( "sort", icon_sort ); + m.insert( "sort-down", icon_sort_down ); + m.insert( "sort-up", icon_sort_up ); + + m.insert( "envelope-alt", icon_envelope_alt ); + m.insert( "linkedin", icon_linkedin ); + m.insert( "undo", icon_undo ); + m.insert( "legal", icon_legal ); + m.insert( "dashboard", icon_dashboard ); + m.insert( "comment-alt", icon_comment_alt ); + m.insert( "comments-alt", icon_comments_alt ); + m.insert( "bolt", icon_bolt ); + m.insert( "sitemap", icon_sitemap ); + m.insert( "umbrella", icon_umbrella ); + m.insert( "paste", icon_paste ); + m.insert( "lightbulb", icon_lightbulb ); + m.insert( "exchange", icon_exchange ); + m.insert( "cloud-download", icon_cloud_download ); + m.insert( "cloud-upload", icon_cloud_upload ); + + m.insert( "user-md", icon_user_md ); + m.insert( "stethoscope", icon_stethoscope ); + m.insert( "suitcase", icon_suitcase ); + m.insert( "bell-alt", icon_bell_alt ); + m.insert( "coffee", icon_coffee ); + m.insert( "food", icon_food ); + m.insert( "file-alt", icon_file_alt ); + m.insert( "building", icon_building ); + m.insert( "hospital", icon_hospital ); + m.insert( "ambulance", icon_ambulance ); + m.insert( "medkit", icon_medkit ); + m.insert( "fighter-jet", icon_fighter_jet ); + m.insert( "beer", icon_beer ); + m.insert( "h-sign", icon_h_sign ); + m.insert( "plus-sign-alt", icon_plus_sign_alt ); + + m.insert( "double-angle-left", icon_double_angle_left ); + m.insert( "double-angle-right", icon_double_angle_right ); + m.insert( "double-angle-up", icon_double_angle_up ); + m.insert( "double-angle-down", icon_double_angle_down ); + m.insert( "angle-left", icon_angle_left ); + m.insert( "angle-right", icon_angle_right ); + m.insert( "angle-up", icon_angle_up ); + m.insert( "angle-down", icon_angle_down ); + m.insert( "desktop", icon_desktop ); + m.insert( "laptop", icon_laptop ); + m.insert( "tablet", icon_tablet ); + m.insert( "mobile-phone", icon_mobile_phone ); + m.insert( "circle-blank", icon_circle_blank ); + m.insert( "quote-left", icon_quote_left ); + m.insert( "quote-right", icon_quote_right ); + + m.insert( "spinner", icon_spinner ); + m.insert( "circle", icon_circle ); + m.insert( "reply", icon_reply ); + m.insert( "github-alt", icon_github_alt ); + m.insert( "folder-close-alt", icon_folder_close_alt ); + m.insert( "folder-open-alt", icon_folder_open_alt ); + 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 defaultOption( 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 itr(override); + while( itr.hasNext() ) { + itr.next(); + result.insert( itr.key(), itr.value() ); + } + } + return result; +} + + +/// Creates an icon with the given code-point +/// +/// awesome->icon( icon_group ) +/// +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(character) ) ); + + QtAwesomeIconPainterIconEngine* engine = new QtAwesomeIconPainterIconEngine( this, fontIconPainter_, optionMap ); + return QIcon( engine ); +} + + + +/// 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(); + } + + // 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 ); +} + diff --git a/QtAwesome/QtAwesome.h b/QtAwesome/QtAwesome.h new file mode 100644 index 0000000..6589ee0 --- /dev/null +++ b/QtAwesome/QtAwesome.h @@ -0,0 +1,363 @@ +/** + * QtAwesome - use font-awesome (or other font icons) in your c++ / Qt Application + * + * MIT License: + * + * Copyright 2013 - Reliable Bits Software by Blommers IT. All Rights Reserved. + * Author Rick Blommers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS + * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * I would appriciate it if you let me know which projects you are using this for. + */ + +#ifndef QTAWESOME_H +#define QTAWESOME_H + +#include +#include +#include +#include +#include + + +/// A list of all icon-names with the codepoint (unicode-value) on the right +/// You can use the names on the page http://fortawesome.github.io/Font-Awesome/design.html ( replace every dash '-' with an underscore '_') +enum QtFontAwesomeName { + icon_glass = 0xf000, + icon_music = 0xf001, + icon_search = 0xf002, + icon_envelope = 0xf003, + icon_heart = 0xf004, + icon_star = 0xf005, + icon_star_empty = 0xf006, + icon_user = 0xf007, + icon_film = 0xf008, + icon_th_large = 0xf009, + icon_th = 0xf00a, + icon_th_list = 0xf00b, + icon_ok = 0xf00c, + icon_remove = 0xf00d, + icon_zoom_in = 0xf00e, + + icon_zoom_out = 0xf010, + icon_off = 0xf011, + icon_signal = 0xf012, + icon_cog = 0xf013, + icon_trash = 0xf014, + icon_home = 0xf015, + icon_file = 0xf016, + icon_time = 0xf017, + icon_road = 0xf018, + icon_download_alt = 0xf019, + icon_download = 0xf01a, + icon_upload = 0xf01b, + icon_inbox = 0xf01c, + icon_play_circle = 0xf01d, + icon_repeat = 0xf01e, + + /* \f020 doesn't work in Safari. all shifted one down */ + icon_refresh = 0xf021, + icon_list_alt = 0xf022, + icon_lock = 0xf023, + icon_flag = 0xf024, + icon_headphones = 0xf025, + icon_volume_off = 0xf026, + icon_volume_down = 0xf027, + icon_volume_up = 0xf028, + icon_qrcode = 0xf029, + icon_barcode = 0xf02a, + icon_tag = 0xf02b, + icon_tags = 0xf02c, + icon_book = 0xf02d, + icon_bookmark = 0xf02e, + icon_print = 0xf02f, + + icon_camera = 0xf030, + icon_font = 0xf031, + icon_bold = 0xf032, + icon_italic = 0xf033, + icon_text_height = 0xf034, + icon_text_width = 0xf035, + icon_align_left = 0xf036, + icon_align_center = 0xf037, + icon_align_right = 0xf038, + icon_align_justify = 0xf039, + icon_list = 0xf03a, + icon_indent_left = 0xf03b, + icon_indent_right = 0xf03c, + icon_facetime_video = 0xf03d, + icon_picture = 0xf03e, + + icon_pencil = 0xf040, + icon_map_marker = 0xf041, + icon_adjust = 0xf042, + icon_tint = 0xf043, + icon_edit = 0xf044, + icon_share = 0xf045, + icon_check = 0xf046, + icon_move = 0xf047, + icon_step_backward = 0xf048, + icon_fast_backward = 0xf049, + icon_backward = 0xf04a, + icon_play = 0xf04b, + icon_pause = 0xf04c, + icon_stop = 0xf04d, + icon_forward = 0xf04e, + + icon_fast_forward = 0xf050, + icon_step_forward = 0xf051, + icon_eject = 0xf052, + icon_chevron_left = 0xf053, + icon_chevron_right = 0xf054, + icon_plus_sign = 0xf055, + icon_minus_sign = 0xf056, + icon_remove_sign = 0xf057, + icon_ok_sign = 0xf058, + icon_question_sign = 0xf059, + icon_info_sign = 0xf05a, + icon_screenshot = 0xf05b, + icon_remove_circle = 0xf05c, + icon_ok_circle = 0xf05d, + icon_ban_circle = 0xf05e, + + icon_arrow_left = 0xf060, + icon_arrow_right = 0xf061, + icon_arrow_up = 0xf062, + icon_arrow_down = 0xf063, + icon_share_alt = 0xf064, + icon_resize_full = 0xf065, + icon_resize_small = 0xf066, + icon_plus = 0xf067, + icon_minus = 0xf068, + icon_asterisk = 0xf069, + icon_exclamation_sign = 0xf06a, + icon_gift = 0xf06b, + icon_leaf = 0xf06c, + icon_fire = 0xf06d, + icon_eye_open = 0xf06e, + + icon_eye_close = 0xf070, + icon_warning_sign = 0xf071, + icon_plane = 0xf072, + icon_calendar = 0xf073, + icon_random = 0xf074, + icon_comment = 0xf075, + icon_magnet = 0xf076, + icon_chevron_up = 0xf077, + icon_chevron_down = 0xf078, + icon_retweet = 0xf079, + icon_shopping_cart = 0xf07a, + icon_folder_close = 0xf07b, + icon_folder_open = 0xf07c, + icon_resize_vertical = 0xf07d, + icon_resize_horizontal = 0xf07e, + + icon_bar_chart = 0xf080, + icon_twitter_sign = 0xf081, + icon_facebook_sign = 0xf082, + icon_camera_retro = 0xf083, + icon_key = 0xf084, + icon_cogs = 0xf085, + icon_comments = 0xf086, + icon_thumbs_up = 0xf087, + icon_thumbs_down = 0xf088, + icon_star_half = 0xf089, + icon_heart_empty = 0xf08a, + icon_signout = 0xf08b, + icon_linkedin_sign = 0xf08c, + icon_pushpin = 0xf08d, + icon_external_link = 0xf08e, + + icon_signin = 0xf090, + icon_trophy = 0xf091, + icon_github_sign = 0xf092, + icon_upload_alt = 0xf093, + icon_lemon = 0xf094, + icon_phone = 0xf095, + icon_check_empty = 0xf096, + icon_bookmark_empty = 0xf097, + icon_phone_sign = 0xf098, + icon_twitter = 0xf099, + icon_facebook = 0xf09a, + icon_github = 0xf09b, + icon_unlock = 0xf09c, + icon_credit_card = 0xf09d, + icon_rss = 0xf09e, + + icon_hdd = 0xf0a0, + icon_bullhorn = 0xf0a1, + icon_bell = 0xf0a2, + icon_certificate = 0xf0a3, + icon_hand_right = 0xf0a4, + icon_hand_left = 0xf0a5, + icon_hand_up = 0xf0a6, + icon_hand_down = 0xf0a7, + icon_circle_arrow_left = 0xf0a8, + icon_circle_arrow_right = 0xf0a9, + icon_circle_arrow_up = 0xf0aa, + icon_circle_arrow_down = 0xf0ab, + icon_globe = 0xf0ac, + icon_wrench = 0xf0ad, + icon_tasks = 0xf0ae, + + icon_filter = 0xf0b0, + icon_briefcase = 0xf0b1, + icon_fullscreen = 0xf0b2, + + icon_group = 0xf0c0, + icon_link = 0xf0c1, + icon_cloud = 0xf0c2, + icon_beaker = 0xf0c3, + icon_cut = 0xf0c4, + icon_copy = 0xf0c5, + icon_paper_clip = 0xf0c6, + icon_save = 0xf0c7, + icon_sign_blank = 0xf0c8, + icon_reorder = 0xf0c9, + icon_list_ul = 0xf0ca, + icon_list_ol = 0xf0cb, + icon_strikethrough = 0xf0cc, + icon_underline = 0xf0cd, + icon_table = 0xf0ce, + + icon_magic = 0xf0d0, + icon_truck = 0xf0d1, + icon_pinterest = 0xf0d2, + icon_pinterest_sign = 0xf0d3, + icon_google_plus_sign = 0xf0d4, + icon_google_plus = 0xf0d5, + icon_money = 0xf0d6, + icon_caret_down = 0xf0d7, + icon_caret_up = 0xf0d8, + icon_caret_left = 0xf0d9, + icon_caret_right = 0xf0da, + icon_columns = 0xf0db, + icon_sort = 0xf0dc, + icon_sort_down = 0xf0dd, + icon_sort_up = 0xf0de, + + icon_envelope_alt = 0xf0e0, + icon_linkedin = 0xf0e1, + icon_undo = 0xf0e2, + icon_legal = 0xf0e3, + icon_dashboard = 0xf0e4, + icon_comment_alt = 0xf0e5, + icon_comments_alt = 0xf0e6, + icon_bolt = 0xf0e7, + icon_sitemap = 0xf0e8, + icon_umbrella = 0xf0e9, + icon_paste = 0xf0ea, + icon_lightbulb = 0xf0eb, + icon_exchange = 0xf0ec, + icon_cloud_download = 0xf0ed, + icon_cloud_upload = 0xf0ee, + + icon_user_md = 0xf0f0, + icon_stethoscope = 0xf0f1, + icon_suitcase = 0xf0f2, + icon_bell_alt = 0xf0f3, + icon_coffee = 0xf0f4, + icon_food = 0xf0f5, + icon_file_alt = 0xf0f6, + icon_building = 0xf0f7, + icon_hospital = 0xf0f8, + icon_ambulance = 0xf0f9, + icon_medkit = 0xf0fa, + icon_fighter_jet = 0xf0fb, + icon_beer = 0xf0fc, + icon_h_sign = 0xf0fd, + icon_plus_sign_alt = 0xf0fe, + + icon_double_angle_left = 0xf100, + icon_double_angle_right = 0xf101, + icon_double_angle_up = 0xf102, + icon_double_angle_down = 0xf103, + icon_angle_left = 0xf104, + icon_angle_right = 0xf105, + icon_angle_up = 0xf106, + icon_angle_down = 0xf107, + icon_desktop = 0xf108, + icon_laptop = 0xf109, + icon_tablet = 0xf10a, + icon_mobile_phone = 0xf10b, + icon_circle_blank = 0xf10c, + icon_quote_left = 0xf10d, + icon_quote_right = 0xf10e, + + icon_spinner = 0xf110, + icon_circle = 0xf111, + icon_reply = 0xf112, + icon_github_alt = 0xf113, + icon_folder_close_alt = 0xf114, + icon_folder_open_alt = 0xf115 +}; + + +//--------------------------------------------------------------------------------------- + +class QtAwesomeIconPainter; + +/// The main objet for creating icons. +/// This class requires a 2-phase construction +class QtAwesome : public QObject +{ +Q_OBJECT + +public: + + QtAwesome(QObject *parent ); + virtual ~QtAwesome(); + + void init( const QString& fontname ); + bool initFontAwesome(); + + void addNamedCodepoint( const QString& name, int codePoint ); + QHash namedCodePoints() { return namedCodepoints_; } + + void setDefaultOption( const QString& name, const QVariant& value ); + QVariant defaultOption( const QString& name ); + + QIcon icon( int character, const QVariantMap& options = QVariantMap() ); + QIcon icon( const QString& name, const QVariantMap& options = QVariantMap() ); + + void give( const QString& name, QtAwesomeIconPainter* painter ); + + /// Returns the font-name that is used as icon-map + QString fontName() { return fontName_ ; } + +private: + QString fontName_; ///< The font name used for this map + QHash namedCodepoints_; ///< A map with names mapped to code-points + + QHash painterMap_; ///< A map of custom painters + QVariantMap defaultOptions_; ///< The default icon options + QtAwesomeIconPainter* fontIconPainter_; ///< A special painter fo painting codepoints +}; + + +//--------------------------------------------------------------------------------------- + + +/// The QtAwesomeIconPainter is a specialized painter for painting icons +/// your can implement an iconpainter to create custom font-icon code +class QtAwesomeIconPainter +{ +public: + virtual ~QtAwesomeIconPainter() {} + virtual void paint( QtAwesome* awesome, QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state, const QVariantMap& options ) = 0; +}; + + + +#endif // QTAWESOME_H diff --git a/QtAwesome/QtAwesome.pri b/QtAwesome/QtAwesome.pri new file mode 100644 index 0000000..5e4002d --- /dev/null +++ b/QtAwesome/QtAwesome.pri @@ -0,0 +1,10 @@ + +INCLUDEPATH += $$PWD + +SOURCES += $$PWD/QtAwesome.cpp + +HEADERS += $$PWD/QtAwesome.h + +RESOURCES += $$PWD/QtAwesome.qrc + + diff --git a/QtAwesome/QtAwesome.pro b/QtAwesome/QtAwesome.pro new file mode 100644 index 0000000..e6c1ece --- /dev/null +++ b/QtAwesome/QtAwesome.pro @@ -0,0 +1,15 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2013-04-18T13:28:42 +# +#------------------------------------------------- + +TARGET = QtAwesome +TEMPLATE = lib +CONFIG += staticlib + +SOURCES += QtAwesome.cpp +HEADERS += QtAwesome.h + +RESOURCES += \ + QtAwesome.qrc diff --git a/QtAwesome/QtAwesome.qrc b/QtAwesome/QtAwesome.qrc new file mode 100644 index 0000000..40ffd6a --- /dev/null +++ b/QtAwesome/QtAwesome.qrc @@ -0,0 +1,5 @@ + + + fonts/fontawesome.ttf + + diff --git a/QtAwesome/fonts/fontawesome.ttf b/QtAwesome/fonts/fontawesome.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d46172476a3c7caf4f44946e3c40218559f3edfa GIT binary patch literal 55096 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%0D$gSMd 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

R}45_uzO@F4>M&+fi#l7 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�BcG>P)^DXFH|n4bmKVUj~;gSQkVFL7%ihZM>XC4 yQMX@enqCS@LyX>zjG!}8S``+2*O*S81puws$XSmd6%#S@(X+rh{^NpC5dI5Q|KZmF literal 0 HcmV?d00001 diff --git a/QtAwesomeSample/QtAwesomeSample.pro b/QtAwesomeSample/QtAwesomeSample.pro new file mode 100644 index 0000000..3f9082a --- /dev/null +++ b/QtAwesomeSample/QtAwesomeSample.pro @@ -0,0 +1,20 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2013-04-18T15:05:07 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = QtAwesomeSample +TEMPLATE = app + + +SOURCES += main.cpp + +HEADERS += + + +include(../QtAwesome/QtAwesome.pri) diff --git a/QtAwesomeSample/main.cpp b/QtAwesomeSample/main.cpp new file mode 100644 index 0000000..146439f --- /dev/null +++ b/QtAwesomeSample/main.cpp @@ -0,0 +1,26 @@ +/** + * Copyright 2011-2013 - Reliable Bits Software by Blommers IT. All Rights Reserved. + * Author Rick Blommers + */ + +#include "QtAwesome.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QMainWindow w; + + QtAwesome* awesome = new QtAwesome(&w); + awesome->initFontAwesome(); + + // a simple beer button + QPushButton* beerButton = new QPushButton( awesome->icon( icon_beer), "Cheers!" ); + w.setCentralWidget( beerButton ); + w.show(); + + return app.exec(); +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e5c5d2a --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +QtAwesome - FontAwesome support for Qt applications +=================================================== + +Description +----------- + +QtAwesome is a simple library that can be used to add font-awesome icons to your Qt application. +Though the name is QtAwesome and currently it's very FontAwesome based, you can use every other +iconfont you want. + +The class can also be used to manage your own dynamic code-drawn icons, by adding named icon-painters. + + +Installation +------------ + +The easiest way to include QtAweome in your project is to copy the QtAwesome directory to your +project tree and add the the following code include to your Qt project file: + + include(QtAwesome/QtAwesome.pri) + +Now your good to go!! + + +Usage +----- + +You probably want to create a single QtAwesome object for your whole application. + + QtAwesome* awesome = new QtAwesome( qApp ) + awesome->initFontAwesome(); // This line is important as it loads the font and initializes the named icon map + +Add an accessor to this object. (a global function, membor of your application object whatever you like). + + +Example +-------- + + // You should create a single object of QtAwesome. + QtAwesome* awesome = new QtAwesome( qApp ); + awesome->initFontAwesome(); + + // Next create your icon with the help of the icon-enumeration: (all dashes are replaced by underscores) + QPushButton* beerButton new QPushButton( awesome->icon( icon_beer ), "Cheers!" ); + + // You can also use 'string' names to access the icons. (The string version omits the 'icon-' prefix ) + QPushButton* coffeeButton new QPushButton( awesome->icon( "coffee" ), "Black please!" ); + + // When you create an icon you can supply some options for your icons: + // The available options can be found at the "Default options"-section + + QVariantMap options; + options.insert( "color" , QColor(255,0,0) ); + QPushButton* musicButton = new QPushButton( awesome->icon( icon_music ), "Music" ); + + // You can also change the default options. + // for example if you always would like to have green icons you could call) + awesome->setDefaultOption( "color-disabled", QColor(0,255,0) ); + + + +Default options: +---------------- + + The following options are default in the QtAwesome class. + + 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 ); + + When creating an icon, it first populates the options-map with the default options from the QtAwesome object. + After that the options are expanded/overwritten by the options supplied to the icon. + + +License +------- + +MIT License. Copyright 2013 - Reliable Bits Software by Blommers IT. [http://blommersit.nl/](http://blommersit.nl) + +The Font Awesome font is licensed under the SIL Open Font License - [http://scripts.sil.org/OFL](http://scripts.sil.org/OFL) +The Font Awesome pictograms are licensed under the CC BY 3.0 License - [http://creativecommons.org/licenses/by/3.0/](http://creativecommons.org/licenses/by/3.0/) +"Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome" + +Contact +------- + +* email: +* twitter: [https://twitter.com/gamecreature](https://twitter.com/gamecreature) +* website: [http://blommersit.nl](http://blommersit.nl) (warning Dutch content ahead) +* github: [https://github.com/gamecreature/QtAwesome](https://github.com/gamecreature/QtAwesome) + +Remarks +------- + +I've created this project because I needed some nice icons for my own Qt project. After doing a lot of +css/html5 work and being spoiled by the ease of twitter bootstrap with FontAwesome, +I thought it would be nice to be able to use these icons for my Qt project. + +I've slightly changed the code from the original, added some more documentation, but it's still +a work in progress. So feel free to drop me an e-mail for your suggestions and improvements! + +There are still some things todo, like: + + * document the usage of a custom icon painter + * document the usage of another icon font + * add some tests + * do some code cleanup + +And of course last but not least, + +Many thanks go to Dave Gandy an the other FontAwesome contributors!! [http://fortawesome.github.com/Font-Awesome](http://fortawesome.github.com/Font-Awesome) +And of course to the Qt team/contributors for supplying this great cross-platform c++ library. + + +Contributions are welcome! Feel free to fork and send a pull request through Github.