]> granicus.if.org Git - transmission/commitdiff
Improve Qt client look on hi-dpi displays
authorMike Gelfand <mikedld@mikedld.com>
Tue, 7 Feb 2017 22:06:28 +0000 (01:06 +0300)
committerMike Gelfand <mikedld@mikedld.com>
Tue, 7 Feb 2017 22:06:28 +0000 (01:06 +0300)
12 files changed:
qt/Application.cc
qt/CMakeLists.txt
qt/FaviconCache.cc
qt/FilterBar.cc
qt/FilterBarComboBox.cc
qt/FilterBarComboBoxDelegate.cc
qt/StyleHelper.cc [new file with mode: 0644]
qt/StyleHelper.h [new file with mode: 0644]
qt/TrackerModel.cc
qt/Utils.cc
qt/Utils.h
qt/qtr.pro

index 77909aca5544938468a142f0cf53a506b9dfafae..4051bb5835de21267cf6428986d82fa0b1702186 100644 (file)
@@ -589,6 +589,9 @@ tr_main (int    argc,
 {
   InteropHelper::initialize ();
 
+  Application::setAttribute (Qt::AA_EnableHighDpiScaling);
+  Application::setAttribute (Qt::AA_UseHighDpiPixmaps);
+
   Application app (argc, argv);
   return app.exec ();
 }
index 7822f9f02c0b15854c655c38e784a10e4e42d993..6c9363c107fd6f687c8f459450a304a80f2c4a17 100644 (file)
@@ -59,6 +59,7 @@ set(${PROJECT_NAME}_SOURCES
     SessionDialog.cc
     SqueezeLabel.cc
     StatsDialog.cc
+    StyleHelper.cc
     Torrent.cc
     TorrentDelegate.cc
     TorrentDelegateMin.cc
@@ -119,6 +120,7 @@ set(${PROJECT_NAME}_HEADERS
     Speed.h
     SqueezeLabel.h
     StatsDialog.h
+    StyleHelper.h
     Torrent.h
     TorrentDelegate.h
     TorrentDelegateMin.h
index f6915c073eca521bbeaa401ac3ab9fb733b5b57a..420d724506d63cf2b77399fd0ef1d5e967fe2628 100644 (file)
@@ -104,9 +104,7 @@ FaviconCache::findFromHost (const QString& host)
 {
   ensureCacheDirHasBeenScanned ();
 
-  const QPixmap pixmap = myPixmaps[host];
-  const QSize rightSize = getIconSize ();
-  return pixmap.isNull () || pixmap.size () == rightSize ? pixmap : pixmap.scaled (rightSize);
+  return myPixmaps[host];
 }
 
 void
index fc4a07e70d70b65feef66c45d54802e8b616ac0e..d84b3d17a195380f8e105f057ee82898340a0af6 100644 (file)
@@ -147,7 +147,7 @@ FilterBar::refreshTrackers ()
       const int count = torrentsPerHost[name];
       row->setData (count, FilterBarComboBox::CountRole);
       row->setData (getCountString (count), FilterBarComboBox::CountStringRole);
-      row->setData (favicons.findFromHost (host), Qt::DecorationRole);
+      row->setData (QIcon (favicons.findFromHost (host)), Qt::DecorationRole);
     }
 
   // rows to remove
@@ -182,7 +182,7 @@ FilterBar::refreshTrackers ()
       const int count = torrentsPerHost[host];
       row->setData (count, FilterBarComboBox::CountRole);
       row->setData (getCountString (count), FilterBarComboBox::CountStringRole);
-      row->setData (favicons.findFromHost (host), Qt::DecorationRole);
+      row->setData (QIcon (favicons.findFromHost (host)), Qt::DecorationRole);
       row->setData (host, TrackerRole);
       myTrackerModel->insertRow (i, row);
       anyAdded = true;
index 2e2270557e623a2452693c7429577d99c2ae5ebd..91fb5d26e36f806f8e99352155a46b789203cdc8 100644 (file)
@@ -11,6 +11,7 @@
 #include <QStylePainter>
 
 #include "FilterBarComboBox.h"
+#include "StyleHelper.h"
 #include "Utils.h"
 
 namespace
@@ -109,19 +110,12 @@ FilterBarComboBox::paintEvent (QPaintEvent * e)
       rect.adjust (2, 1, -2, -1);
 
       // draw the icon
-      QPixmap pixmap;
-      QVariant variant = modelIndex.data (Qt::DecorationRole);
-      switch (variant.type ())
-        {
-          case QVariant::Pixmap: pixmap = qvariant_cast<QPixmap> (variant); break;
-          case QVariant::Icon:   pixmap = qvariant_cast<QIcon> (variant).pixmap (iconSize ()); break;
-          default: break;
-        }
-      if (!pixmap.isNull ())
+      const QIcon icon = Utils::getIconFromIndex (modelIndex);
+      if (!icon.isNull ())
         {
           const QRect iconRect = QStyle::alignedRect(opt.direction, Qt::AlignLeft | Qt::AlignVCenter,
                                                      opt.iconSize, rect);
-          painter.drawPixmap (iconRect.topLeft (), pixmap);
+          icon.paint (&painter, iconRect, Qt::AlignCenter, StyleHelper::getIconMode (opt.state), QIcon::Off);
           Utils::narrowRect (rect, iconRect.width () + hmargin, 0, opt.direction);
         }
 
index 29c889627c6ae884ccf969c617a1dc3b96c9f4ab..ff67c27b947ff0714c1b7fb16ceb12def6fa6e20 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "FilterBarComboBox.h"
 #include "FilterBarComboBoxDelegate.h"
+#include "StyleHelper.h"
 #include "Utils.h"
 
 namespace
@@ -86,10 +87,10 @@ FilterBarComboBoxDelegate::paint (QPainter                    * painter,
       Utils::narrowRect (boundingBox, 0, countRect.width () + hmargin, option.direction);
       const QRect displayRect = boundingBox;
 
+      const QIcon icon = Utils::getIconFromIndex (index);
+
       drawBackground (painter, option, index);
-      QStyleOptionViewItem option2 = option;
-      option2.decorationSize = myCombo->iconSize ();
-      drawDecoration (painter, option, decorationRect, decoration (option2,index.data (Qt::DecorationRole)));
+      icon.paint (painter, decorationRect, Qt::AlignCenter, StyleHelper::getIconMode (option.state), QIcon::Off);
       drawDisplay (painter, option, displayRect, index.data (Qt::DisplayRole).toString ());
       drawDisplay (painter, disabledOption, countRect, index.data (FilterBarComboBox::CountStringRole).toString ());
       drawFocus (painter, option, displayRect|countRect);
@@ -113,7 +114,7 @@ FilterBarComboBoxDelegate::sizeHint (const QStyleOptionViewItem & option,
       QSize size = QItemDelegate::sizeHint (option, index);
       size.setHeight (qMax (size.height (), myCombo->iconSize ().height () + 6));
       size.rwidth () += s->pixelMetric (QStyle::PM_FocusFrameHMargin, 0, myCombo);
-      size.rwidth () += rect (option,index,FilterBarComboBox::CountStringRole).width ();
+      size.rwidth () += rect (option, index, FilterBarComboBox::CountStringRole).width ();
       size.rwidth () += hmargin * 4;
       return size;
     }
diff --git a/qt/StyleHelper.cc b/qt/StyleHelper.cc
new file mode 100644 (file)
index 0000000..7818266
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * This file Copyright (C) 2017 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ *
+ */
+
+#include "StyleHelper.h"
+
+QIcon::Mode
+StyleHelper::getIconMode (QStyle::State state)
+{
+  if ((state & QStyle::State_Enabled) == 0)
+    return QIcon::Disabled;
+  if ((state & QStyle::State_Selected) != 0)
+    return QIcon::Selected;
+  return QIcon::Normal;
+}
diff --git a/qt/StyleHelper.h b/qt/StyleHelper.h
new file mode 100644 (file)
index 0000000..821d050
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * This file Copyright (C) 2017 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ *
+ */
+
+#pragma once
+
+#include <QIcon>
+#include <QStyle>
+
+class StyleHelper
+{
+  public:
+    static QIcon::Mode getIconMode (QStyle::State state);
+};
index d72e3deca8ce1e5b3cfbd271485c7f2ab3622a41..d27c835b35487f4841d4f6e12b5d4edcabc42f4f 100644 (file)
@@ -40,7 +40,7 @@ TrackerModel::data (const QModelIndex& index, int role) const
             break;
 
           case Qt::DecorationRole:
-            var = trackerInfo.st.getFavicon ();
+            var = QIcon (trackerInfo.st.getFavicon ());
             break;
 
           case TrackerRole:
index 6f1cd437f5b85b2b29fada335c728bb806d3d4d3..ac67bbcc635b79272a40fc2e5ebf830ea14cce2d 100644 (file)
@@ -181,6 +181,23 @@ Utils::guessMimeIcon (const QString& filename)
   return fallback;
 }
 
+QIcon
+Utils::getIconFromIndex (const QModelIndex& index)
+{
+  const QVariant variant = index.data (Qt::DecorationRole);
+  switch (variant.type ())
+    {
+      case QVariant::Icon:
+        return qvariant_cast<QIcon> (variant);
+
+      case QVariant::Pixmap:
+        return QIcon (qvariant_cast<QPixmap> (variant));
+
+      default:
+        return QIcon ();
+    }
+}
+
 bool
 Utils::isValidUtf8 (const char * s)
 {
index ce73d97a669567dcbc1568295be2da840dae6c4b..60e9f19a7048c655f51c27b78dd5b3f7360ecc7e 100644 (file)
@@ -18,11 +18,14 @@ class QAbstractItemView;
 class QColor;
 class QHeaderView;
 class QIcon;
+class QModelIndex;
 
 class Utils
 {
   public:
     static QIcon guessMimeIcon (const QString& filename);
+    static QIcon getIconFromIndex (const QModelIndex& index);
+
     // Test if string is UTF-8 or not
     static bool isValidUtf8 (const char * s);
 
index 4598997f0e1a4fca2655939753f083be2144add1..3d35805caeea8c84e6b227a789603152ca23faad 100644 (file)
@@ -105,6 +105,7 @@ SOURCES += AboutDialog.cc \
            SessionDialog.cc \
            SqueezeLabel.cc \
            StatsDialog.cc \
+           StyleHelper.cc \
            Torrent.cc \
            TorrentDelegate.cc \
            TorrentDelegateMin.cc \