File indexing completed on 2024-04-28 16:44:48

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-only
0003     SPDX-FileCopyrightText: 2003 Mike Pilone <mpilone@slac.com>
0004     SPDX-FileCopyrightText: 2003 Lubos Lunak <l.lunak@kde.org>
0005     SPDX-FileCopyrightText: 2009 Michael Jansen <kde@michael-jansen.biz>
0006  */
0007 
0008 #include <QColor>
0009 #include <QGradient>
0010 #include <QPaintEvent>
0011 #include <QPainter>
0012 
0013 #include "gesture_drawer.h"
0014 
0015 GestureDrawer::GestureDrawer(QWidget *parent, const char *name)
0016     : QFrame(parent)
0017     , _data(KHotKeys::StrokePoints())
0018 {
0019     setObjectName(name);
0020     QPalette p;
0021     p.setColor(backgroundRole(), palette().color(QPalette::Base));
0022     setPalette(p);
0023     setFrameStyle(QFrame::Panel | QFrame::Sunken);
0024     setMinimumSize(30, 30);
0025 }
0026 
0027 GestureDrawer::~GestureDrawer()
0028 {
0029 }
0030 
0031 KHotKeys::StrokePoints GestureDrawer::pointData() const
0032 {
0033     return _data;
0034 }
0035 
0036 void GestureDrawer::setPointData(const KHotKeys::StrokePoints &data)
0037 {
0038     _data = data;
0039 
0040     repaint();
0041 }
0042 
0043 void GestureDrawer::paintEvent(QPaintEvent *ev)
0044 {
0045     const int n = _data.size();
0046 
0047     if (n < 2) {
0048         QFrame::paintEvent(ev);
0049         return;
0050     }
0051 
0052     const int border = 6;
0053 
0054     const int l = width() < height() ? width() : height();
0055     const int x_offset = border + (width() - l) / 2;
0056     const int y_offset = border + (height() - l) / 2;
0057 
0058     QPainter p(this);
0059     p.setRenderHint(QPainter::Antialiasing);
0060     QPen pen;
0061     pen.setWidth(4);
0062     pen.setCapStyle(Qt::RoundCap);
0063 
0064     // starting point
0065     double x = x_offset + _data[0].x * (l - 2 * border);
0066     double y = y_offset + _data[0].y * (l - 2 * border);
0067 
0068     for (int i = 0; i < n - 1; i++) {
0069         double nextx = x_offset + _data[i + 1].x * (l - 2 * border);
0070         double nexty = y_offset + _data[i + 1].y * (l - 2 * border);
0071 
0072         QLinearGradient grad(x, y, nextx, nexty);
0073         const int startRed = 0;
0074         const int startGreen = (1 - _data[i].s) * 255;
0075         const int startBlue = _data[i].s * 255;
0076         const int endRed = 0;
0077         const int endGreen = (1 - _data[i + 1].s) * 255;
0078         const int endBlue = _data[i + 1].s * 255;
0079         QColor startColor(startRed, startGreen, startBlue);
0080         QColor endColor(endRed, endGreen, endBlue);
0081         grad.setColorAt(0, startColor);
0082         grad.setColorAt(1, endColor);
0083 
0084         pen.setBrush(grad);
0085         p.setPen(pen);
0086         p.drawLine(x, y, nextx, nexty);
0087 
0088         x = nextx;
0089         y = nexty;
0090     }
0091 
0092     QFrame::paintEvent(ev);
0093 }
0094 
0095 #include "moc_gesture_drawer.cpp"