[PATCH 11/11] [HiDPI] Resolution-independent trash icon

Giuseppe Bilotta giuseppe.bilotta at gmail.com
Wed Oct 15 06:30:55 PDT 2014


Also, generate the corresponding pixmap only once, and distribute it to
all models that need it.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta at gmail.com>
---
 qt-ui/diveplanner.cpp |  8 +++++++-
 qt-ui/models.cpp      | 36 +++++++++++++++++++++++++++++++++---
 qt-ui/models.h        |  3 +++
 qt-ui/tableview.cpp   |  2 +-
 4 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp
index f0ef565..fed6465 100644
--- a/qt-ui/diveplanner.cpp
+++ b/qt-ui/diveplanner.cpp
@@ -615,7 +615,13 @@ QVariant DivePlannerPointsModel::data(const QModelIndex &index, int role) const
 		switch (index.column()) {
 		case REMOVE:
 			if (rowCount() > 1)
-				return p.entered ? QIcon(":trash") : QVariant();
+				return p.entered ? trashIcon() : QVariant();
+		}
+	} else if (role == Qt::SizeHintRole) {
+		switch (index.column()) {
+		case REMOVE:
+			if (rowCount() > 1)
+				return p.entered ? trashIcon().size() : QVariant();
 		}
 	} else if (role == Qt::FontRole) {
 		if (divepoints.at(index.row()).entered) {
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 0e57b3b..ef76e7e 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -56,16 +56,31 @@ void CleanerTableModel::setHeaderDataStrings(const QStringList &newHeaders)
 	headers = newHeaders;
 }
 
+static QPixmap *trashIconPixmap;
+
+// initialize the trash icon if necessary
+static void initTrashIcon() {
+	if (!trashIconPixmap)
+		trashIconPixmap = new QPixmap(QIcon(":trash").pixmap(defaultIconMetrics().sz_small));
+}
+
+const QPixmap &trashIcon() {
+	return *trashIconPixmap;
+}
+
 CylindersModel::CylindersModel(QObject *parent) : rows(0)
 {
 	//	enum {REMOVE, TYPE, SIZE, WORKINGPRESS, START, END, O2, HE, DEPTH};
 	setHeaderDataStrings(QStringList() << "" << tr("Type") << tr("Size") << tr("Work press.") << tr("Start press.") << tr("End press.") << trUtf8("O" UTF8_SUBSCRIPT_2 "%") << tr("He%")
 					   << tr("Switch at")
 			     );
+
+	initTrashIcon();
 }
 
 CylindersModel *CylindersModel::instance()
 {
+
 	static QScopedPointer<CylindersModel> self(new CylindersModel());
 	return self.data();
 }
@@ -158,7 +173,11 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const
 		break;
 	case Qt::DecorationRole:
 		if (index.column() == REMOVE)
-			ret = QIcon(":trash");
+			ret = trashIcon();
+		break;
+	case Qt::SizeHintRole:
+		if (index.column() == REMOVE)
+			ret = trashIcon().size();
 		break;
 
 	case Qt::ToolTipRole:
@@ -394,6 +413,8 @@ WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent), rows(0)
 {
 	//enum Column {REMOVE, TYPE, WEIGHT};
 	setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
+
+	initTrashIcon();
 }
 
 weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
@@ -449,7 +470,11 @@ QVariant WeightModel::data(const QModelIndex &index, int role) const
 		break;
 	case Qt::DecorationRole:
 		if (index.column() == REMOVE)
-			ret = QIcon(":trash");
+			ret = trashIcon();
+		break;
+	case Qt::SizeHintRole:
+		if (index.column() == REMOVE)
+			ret = trashIcon().size();
 		break;
 	case Qt::ToolTipRole:
 		if (index.column() == REMOVE)
@@ -1466,6 +1491,8 @@ DiveComputerModel::DiveComputerModel(QMultiMap<QString, DiveComputerNode> &dcMap
 	setHeaderDataStrings(QStringList() << "" << tr("Model") << tr("Device ID") << tr("Nickname"));
 	dcWorkingMap = dcMap;
 	numRows = 0;
+
+	initTrashIcon();
 }
 
 QVariant DiveComputerModel::data(const QModelIndex &index, int role) const
@@ -1491,7 +1518,10 @@ QVariant DiveComputerModel::data(const QModelIndex &index, int role) const
 	if (index.column() == REMOVE) {
 		switch (role) {
 		case Qt::DecorationRole:
-			ret = QIcon(":trash");
+			ret = trashIcon();
+			break;
+		case Qt::SizeHintRole:
+			ret = trashIcon().size();
 			break;
 		case Qt::ToolTipRole:
 			ret = tr("Clicking here will remove this dive computer.");
diff --git a/qt-ui/models.h b/qt-ui/models.h
index 2345d0d..a0b2565 100644
--- a/qt-ui/models.h
+++ b/qt-ui/models.h
@@ -89,6 +89,9 @@ private:
 	QString biggerEntry;
 };
 
+/* Retrieve the trash icon pixmap, common to most table models */
+const QPixmap &trashIcon();
+
 /* Encapsulation of the Cylinder Model, that presents the
  * Current cylinders that are used on a dive. */
 class CylindersModel : public CleanerTableModel {
diff --git a/qt-ui/tableview.cpp b/qt-ui/tableview.cpp
index a05b174..0c02fd9 100644
--- a/qt-ui/tableview.cpp
+++ b/qt-ui/tableview.cpp
@@ -20,7 +20,7 @@ TableView::TableView(QWidget *parent) : QWidget(parent)
 	metrics.icon = &defaultIconMetrics();
 
 	metrics.col_width = 7*text_em;
-	metrics.rm_col_width = 3*text_em;
+	metrics.rm_col_width = metrics.icon->sz_small + 2*metrics.icon->spacing;
 	metrics.header_ht = text_ht + 10; // TODO DPI
 
 	/* There`s mostly a need for a Mac fix here too. */
-- 
2.1.0.255.gcd10c46



More information about the subsurface mailing list