File indexing completed on 2024-06-16 04:16:13
0001 /* 0002 SPDX-FileCopyrightText: 2006 Gábor Lehel <illissius@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #include "NodeToolTip.h" 0007 #include "kis_node_model.h" 0008 0009 #include <QImage> 0010 #include <QModelIndex> 0011 #include <QTextDocument> 0012 #include <QUrl> 0013 #include <klocalizedstring.h> 0014 0015 #include <kis_base_node.h> 0016 #include <kis_layer_properties_icons.h> 0017 0018 NodeToolTip::NodeToolTip() 0019 { 0020 } 0021 0022 NodeToolTip::~NodeToolTip() 0023 { 0024 } 0025 0026 QTextDocument *NodeToolTip::createDocument(const QModelIndex &index) 0027 { 0028 QTextDocument *doc = new QTextDocument(this); 0029 0030 int size = 250*devicePixelRatioF(); 0031 QImage thumb = index.data(int(KisNodeModel::BeginThumbnailRole) + size).value<QImage>(); 0032 thumb.setDevicePixelRatio(devicePixelRatioF()); 0033 doc->addResource(QTextDocument::ImageResource, QUrl("data:thumbnail"), thumb); 0034 0035 QString name = index.data(Qt::DisplayRole).toString(); 0036 KisBaseNode::PropertyList properties = index.data(KisNodeModel::PropertiesRole).value<KisBaseNode::PropertyList>(); 0037 QString rows; 0038 // Note: Can't use <nobr> due to https://bugreports.qt.io/browse/QTBUG-1135 0039 // It breaks randomly with CJK. Works fine with `white-space:pre` though. 0040 const QString row = QString("<tr><td align=\"right\"><p style=\"white-space:pre\">%1:</p></td><td align=\"left\">%2</td></tr>"); 0041 QString value; 0042 for(int i = 0, n = properties.count(); i < n; ++i) { 0043 if (properties[i].id == KisLayerPropertiesIcons::layerError.id()) continue; 0044 0045 if (properties[i].isMutable) 0046 value = properties[i].state.toBool() ? i18n("Yes") : i18n("No"); 0047 else 0048 value = properties[i].state.toString(); 0049 0050 rows.append(row.arg(properties[i].name).arg(value)); 0051 } 0052 0053 QString dropReason = index.data(KisNodeModel::DropReasonRole).toString(); 0054 0055 if (!dropReason.isEmpty()) { 0056 dropReason = QString("<p align=\"center\"><b>%1</b></p>").arg(dropReason); 0057 } 0058 0059 QString errorMessage; 0060 { 0061 auto it = std::find_if(properties.begin(), properties.end(), 0062 kismpl::mem_equal_to(&KisBaseNode::Property::id, 0063 KisLayerPropertiesIcons::layerError.id())); 0064 0065 if (it != properties.end()) { 0066 doc->addResource(QTextDocument::ImageResource, QUrl("data:warn_symbol"), it->onIcon.pixmap(QSize(32,32)).toImage()); 0067 errorMessage = QString("<table align=\"center\" border=\"0\"><tr valign=\"middle\"><td align=\"right\"><img src=\"data:warn_symbol\"></td><td align=\"left\"><b>%1</b></td></tr></table>").arg(it->state.toString()); 0068 } 0069 } 0070 0071 rows = QString("<table>%1</table>").arg(rows); 0072 0073 const QString image = QString("<table border=\"1\"><tr><td><img src=\"data:thumbnail\"></td></tr></table>"); 0074 const QString body = QString("<h3 align=\"center\">%1</h3>").arg(name) 0075 + errorMessage 0076 + dropReason 0077 + QString("<p><table><tr><td>%1</td><td>%2</td></tr></table></p>").arg(image).arg(rows); 0078 const QString html = QString("<html><body>%1</body></html>").arg(body); 0079 0080 doc->setHtml(html); 0081 0082 const int margin = 16; 0083 doc->setTextWidth(qMin(doc->size().width() + 2 * margin, qreal(600.0))); 0084 0085 doc->setDocumentMargin(margin); 0086 doc->setUseDesignMetrics(true); 0087 0088 return doc; 0089 }