File indexing completed on 2024-05-19 05:54:09

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 }