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 }