diff --git a/src/app/main.cpp b/src/app/main.cpp index c7fe2c623cc..f9b2cd747a0 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -307,6 +307,10 @@ int main(int argc, char **argv) QtSystemExceptionHandler systemExceptionHandler; #endif +#if QT_VERSION >= 0x050100 + app.setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif + // Manually determine -settingspath command line option // We can't use the regular way of the plugin manager, because that needs to parse pluginspecs // but the settings path can influence which plugins are enabled diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 5d7285c5baa..0bb8327d44e 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -35,6 +35,7 @@ #include #include #include +#include // Clamps float color values within (0, 255) static int clamp(float x) @@ -363,15 +364,32 @@ void StyleHelper::menuGradient(QPainter *painter, const QRect &spanRect, const Q } } +static qreal pixmapDevicePixelRatio(const QPixmap &pixmap) +{ +#if QT_VERSION > 0x050000 + return pixmap.devicePixelRatio(); +#else + return 1.0; +#endif +} + // Draws a cached pixmap with shadow void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect, - QPainter *p, QIcon::Mode iconMode, int radius, const QColor &color, const QPoint &offset) + QPainter *p, QIcon::Mode iconMode, int dipRadius, const QColor &color, const QPoint &dipOffset) { QPixmap cache; QString pixmapName = QString::fromLatin1("icon %0 %1 %2").arg(icon.cacheKey()).arg(iconMode).arg(rect.height()); if (!QPixmapCache::find(pixmapName, cache)) { + // High-dpi support: The in parameters (rect, radius, offset) are in + // device-independent pixels. The call to QIcon::pixmap() below might + // return a high-dpi pixmap, which will in that case have a devicePixelRatio + // different than 1. The shadow drawing caluculations are done in device + // pixels. QPixmap px = icon.pixmap(rect.size()); + int devicePixelRatio = qCeil(pixmapDevicePixelRatio(px)); + int radius = dipRadius * devicePixelRatio; + QPoint offset = dipOffset * devicePixelRatio; cache = QPixmap(px.size() + QSize(radius * 2, radius * 2)); cache.fill(Qt::transparent); @@ -396,7 +414,7 @@ void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter tmpPainter(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); - tmpPainter.drawPixmap(QPoint(radius, radius), px); + tmpPainter.drawPixmap(QRect(radius, radius, px.width(), px.height()), px); tmpPainter.end(); // blur the alpha channel @@ -423,13 +441,17 @@ void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect, cachePainter.drawImage(QRect(0, 0, cache.rect().width(), cache.rect().height()), tmp); // Draw the actual pixmap... - cachePainter.drawPixmap(QPoint(radius, radius) + offset, px); + cachePainter.drawPixmap(QRect(QPoint(radius, radius) + offset, QSize(px.width(), px.height())), px); +#if QT_VERSION > 0x050000 + cache.setDevicePixelRatio(devicePixelRatio); +#endif QPixmapCache::insert(pixmapName, cache); } QRect targetRect = cache.rect(); - targetRect.moveCenter(rect.center()); - p->drawPixmap(targetRect.topLeft() - offset, cache); + targetRect.setSize(targetRect.size() / pixmapDevicePixelRatio(cache)); + targetRect.moveCenter(rect.center() - dipOffset); + p->drawPixmap(targetRect, cache); } // Draws a CSS-like border image where the defined borders are not stretched diff --git a/src/libs/utils/stylehelper.h b/src/libs/utils/stylehelper.h index 75be2220adc..39044d8aafb 100644 --- a/src/libs/utils/stylehelper.h +++ b/src/libs/utils/stylehelper.h @@ -83,8 +83,8 @@ public: static bool usePixmapCache() { return true; } static void drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter *p, QIcon::Mode iconMode, - int radius = 3, const QColor &color = QColor(0, 0, 0, 130), - const QPoint &offset = QPoint(1, -2)); + int dipRadius = 3, const QColor &color = QColor(0, 0, 0, 130), + const QPoint &dipOffset = QPoint(1, -2)); static void drawCornerImage(const QImage &img, QPainter *painter, QRect rect, int left = 0, int top = 0, int right = 0, int bottom = 0); diff --git a/src/plugins/analyzerbase/analyzerbase.qrc b/src/plugins/analyzerbase/analyzerbase.qrc index 679ef7db3df..12b8ad1f54e 100644 --- a/src/plugins/analyzerbase/analyzerbase.qrc +++ b/src/plugins/analyzerbase/analyzerbase.qrc @@ -1,6 +1,7 @@ images/analyzer_mode.png + images/analyzer_mode@2x.png images/analyzer_category.png images/analyzer_start_small.png diff --git a/src/plugins/analyzerbase/images/analyzer_mode@2x.png b/src/plugins/analyzerbase/images/analyzer_mode@2x.png new file mode 100644 index 00000000000..af8b8dea8c1 Binary files /dev/null and b/src/plugins/analyzerbase/images/analyzer_mode@2x.png differ diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index ab257ca744d..eb234d3d866 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -204,6 +204,7 @@ const char ICON_CLOSE_SPLIT_RIGHT[] = ":/core/images/splitbutton_closeright.png const char ICON_FILTER[] = ":/core/images/filtericon.png"; const char ICON_LINK[] = ":/core/images/linkicon.png"; const char ICON_QTLOGO_32[] = ":/core/images/logo/32/QtProject-qtcreator.png"; +const char ICON_QTLOGO_64[] = ":/core/images/logo/64/QtProject-qtcreator.png"; const char ICON_QTLOGO_128[] = ":/core/images/logo/128/QtProject-qtcreator.png"; const char WIZARD_CATEGORY_QT[] = "R.Qt"; diff --git a/src/plugins/coreplugin/fancyactionbar.qrc b/src/plugins/coreplugin/fancyactionbar.qrc index c06c43e476d..cc1edb5ef34 100644 --- a/src/plugins/coreplugin/fancyactionbar.qrc +++ b/src/plugins/coreplugin/fancyactionbar.qrc @@ -1,10 +1,15 @@ images/mode_Debug.png + images/mode_Debug@2x.png images/mode_Edit.png + images/mode_Edit@2x.png images/mode_Output.png images/mode_Project.png + images/mode_Project@2x.png images/mode_Reference.png + images/mode_Reference@2x.png images/mode_Design.png + images/mode_Design@2x.png diff --git a/src/plugins/coreplugin/images/mode_Debug@2x.png b/src/plugins/coreplugin/images/mode_Debug@2x.png new file mode 100644 index 00000000000..0dc56c6d93c Binary files /dev/null and b/src/plugins/coreplugin/images/mode_Debug@2x.png differ diff --git a/src/plugins/coreplugin/images/mode_Design@2x.png b/src/plugins/coreplugin/images/mode_Design@2x.png new file mode 100644 index 00000000000..85e08c360b8 Binary files /dev/null and b/src/plugins/coreplugin/images/mode_Design@2x.png differ diff --git a/src/plugins/coreplugin/images/mode_Edit@2x.png b/src/plugins/coreplugin/images/mode_Edit@2x.png new file mode 100644 index 00000000000..d223679dc36 Binary files /dev/null and b/src/plugins/coreplugin/images/mode_Edit@2x.png differ diff --git a/src/plugins/coreplugin/images/mode_Project@2x.png b/src/plugins/coreplugin/images/mode_Project@2x.png new file mode 100644 index 00000000000..f0b7fdae0ef Binary files /dev/null and b/src/plugins/coreplugin/images/mode_Project@2x.png differ diff --git a/src/plugins/coreplugin/images/mode_Reference@2x.png b/src/plugins/coreplugin/images/mode_Reference@2x.png new file mode 100644 index 00000000000..ae8db24fd75 Binary files /dev/null and b/src/plugins/coreplugin/images/mode_Reference@2x.png differ diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index bf8fdf9e946..36c53cda764 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -136,7 +136,11 @@ WelcomeMode::WelcomeMode() : , m_networkAccessManagerFactory(new NetworkAccessManagerFactory) { setDisplayName(tr("Welcome")); - setIcon(QIcon(QLatin1String(Core::Constants::ICON_QTLOGO_32))); + QIcon qtLogo; + qtLogo.addFile(QLatin1String(Core::Constants::ICON_QTLOGO_32)); + qtLogo.addFile(QLatin1String(Core::Constants::ICON_QTLOGO_64)); + qtLogo.addFile(QLatin1String(Core::Constants::ICON_QTLOGO_128)); + setIcon(qtLogo); setPriority(Core::Constants::P_MODE_WELCOME); setId(Core::Constants::MODE_WELCOME); setType(Core::Constants::MODE_WELCOME_TYPE);