You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/khotkeys/kcontrol/gesturedrawer.cpp

162 lines
3.7 KiB

/****************************************************************************
KHotKeys
Copyright (C) 2003 Mike Pilone <mpilone@slac.com>
Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
Distributed under the terms of the GNU General Public License version 2.
****************************************************************************/
#include <qcolor.h>
#include <qpainter.h>
#include "gesturedrawer.h"
namespace KHotKeys
{
GestureDrawer::GestureDrawer(QWidget *parent, const char *name)
: QFrame(parent, name), _data(QString::null)
{
setBackgroundColor( colorGroup().base());
setFrameStyle(QFrame::Panel | QFrame::Sunken);
setMinimumSize(30, 30);
}
GestureDrawer::~GestureDrawer()
{
}
void GestureDrawer::setData(const QString &data)
{
_data = data;
repaint();
}
void GestureDrawer::paintEvent(QPaintEvent *ev)
{
// Iterate through the data points and draw a line to each of them
Q_UINT32 startCell = 0;
Q_UINT32 endCell = 0;
QPoint startPoint;
QPoint endPoint;
QPainter p(this);
if (_data.length() > 0)
{
startCell = QString(_data[0]).toUInt();
}
for (Q_UINT32 index = 1; index < _data.length(); ++index)
{
endCell = QString(_data[index]).toUInt();
startPoint = lookupCellCoords(startCell);
endPoint = lookupCellCoords(endCell);
if (index == 1)
{
// Draw something to show the starting point
p.drawRect(startPoint.x()-2, startPoint.y()-2, 4, 4);
p.fillRect(startPoint.x()-2, startPoint.y()-2, 4, 4,
QBrush(black));
}
p.drawLine(startPoint, endPoint);
drawArrowHead(startPoint, endPoint, p);
startCell = endCell;
}
p.end();
QFrame::paintEvent(ev);
}
QPoint GestureDrawer::lookupCellCoords(Q_UINT32 cell)
{
// First divide the widget into thirds, horizontally and vertically
Q_UINT32 w = width();
Q_UINT32 h = height();
Q_UINT32 wThird = w / 3;
Q_UINT32 hThird = h / 3;
switch(cell)
{
case 1:
return QPoint(wThird/2, 2*hThird+hThird/2);
case 2:
return QPoint(wThird+wThird/2, 2*hThird+hThird/2);
case 3:
return QPoint(2*wThird+wThird/2, 2*hThird+hThird/2);
case 4:
return QPoint(wThird/2, hThird+hThird/2);
case 5:
return QPoint(wThird+wThird/2, hThird+hThird/2);
case 6:
return QPoint(2*wThird+wThird/2, hThird+hThird/2);
case 7:
return QPoint(wThird/2, hThird/2);
case 8:
return QPoint(wThird+wThird/2, hThird/2);
case 9:
return QPoint(2*wThird+wThird/2, hThird/2);
}
return QPoint(0, 0);
}
void GestureDrawer::drawArrowHead(QPoint &start, QPoint &end,
QPainter &p)
{
int deltaX = end.x() - start.x();
int deltaY = end.y() - start.y();
if (deltaY == 0)
{
// horizontal line
int offset = 0;
if (deltaX > 0)
offset = -3;
else
offset = 3;
p.drawLine(QPoint(end.x()+offset, end.y()+2), end);
p.drawLine(QPoint(end.x()+offset, end.y()-2), end);
}
else if (deltaX == 0)
{
// vertical line
int offset = 0;
if (deltaY > 0)
offset = -3;
else
offset = +3;
p.drawLine(QPoint(end.x()+2, end.y()+offset), end);
p.drawLine(QPoint(end.x()-2, end.y()+offset), end);
}
else
{
// diagnal - The math would be pretty complex, so don't do anything
}
}
} // namespace KHotKeys
#include "gesturedrawer.moc"