Warning, file /utilities/konsole/src/filterHotSpots/ColorFilterHotSpot.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 SPDX-FileCopyrightText: 2020-2020 Gustavo Carneiro <gcarneiroa@hotmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "ColorFilterHotSpot.h" 0008 0009 #include <QApplication> 0010 #include <QBuffer> 0011 #include <QMouseEvent> 0012 #include <QPainter> 0013 #include <QPixmap> 0014 #include <QTimer> 0015 #include <QToolTip> 0016 0017 #include "KonsoleSettings.h" 0018 0019 using namespace Konsole; 0020 0021 bool ColorFilterHotSpot::_canGenerateTooltip = false; 0022 0023 ColorFilterHotSpot::ColorFilterHotSpot(int startLine, int startColumn, int endLine, int endColumn, const QStringList &capturedTexts, const QColor &color) 0024 : RegExpFilterHotSpot(startLine, startColumn, endLine, endColumn, capturedTexts) 0025 , _color(color) 0026 { 0027 setType(Color); 0028 } 0029 0030 void ColorFilterHotSpot::mouseEnterEvent(TerminalDisplay *td, QMouseEvent *ev) 0031 { 0032 HotSpot::mouseEnterEvent(td, ev); 0033 _toolPos = ev->globalPosition().toPoint(); 0034 _canGenerateTooltip = true; 0035 0036 QTimer::singleShot(100, this, [&] { 0037 tooltipRequested(); 0038 }); 0039 } 0040 0041 void ColorFilterHotSpot::mouseLeaveEvent(TerminalDisplay *td, QMouseEvent *ev) 0042 { 0043 HotSpot::mouseLeaveEvent(td, ev); 0044 _canGenerateTooltip = false; 0045 QToolTip::hideText(); 0046 } 0047 0048 void ColorFilterHotSpot::tooltipRequested() 0049 { 0050 if (!_canGenerateTooltip) { 0051 return; 0052 } 0053 0054 Q_ASSERT(_color.isValid()); 0055 0056 int sideUnit = 10; 0057 int sideLength = sideUnit * sideUnit; 0058 QRect square(0, 0, sideLength, sideLength); 0059 0060 QPixmap pix(square.size()); 0061 QPainter paint(&pix); 0062 0063 // Add a nice checkerboard pattern for translucent colors. 0064 if (_color.alpha() < 255) { 0065 // Base background 0066 paint.fillRect(square, Qt::lightGray); 0067 0068 // Checkerboard pattern 0069 QBrush brush(Qt::white, Qt::Dense4Pattern); 0070 brush.setTransform(QTransform::fromScale(sideUnit, sideUnit)); 0071 paint.setBrush(brush); 0072 paint.drawRect(square); 0073 } 0074 0075 paint.fillRect(square, _color); 0076 0077 QByteArray data; 0078 QBuffer buffer(&data); 0079 pix.save(&buffer, "PNG"); 0080 0081 const auto tooltipString = QStringLiteral("<img src='data:image/png;base64, %0'>").arg(QString::fromLocal8Bit(data.toBase64())); 0082 0083 QPoint tooltipPosition = QPoint(_toolPos.x(), _toolPos.y()); 0084 QToolTip::showText(tooltipPosition, tooltipString, qApp->focusWidget()); 0085 }