File indexing completed on 2024-05-12 04:04:16

0001 /*
0002     This file is part of Knights, a chess board for KDE SC 4.
0003     SPDX-FileCopyrightText: 2009, 2010, 2011 Miha Čančula <miha@noughmad.eu>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "proto/seekgraph.h"
0009 #include "proto/ficsprotocol.h"
0010 
0011 #include <KPlotObject>
0012 #include <KPlotPoint>
0013 #include <KPlotAxis>
0014 #include <KLocalizedString>
0015 
0016 #include <QPainter>
0017 #include <QMouseEvent>
0018 
0019 using namespace Knights;
0020 
0021 SeekGraph::SeekGraph ( QWidget* parent ) : KPlotWidget ( parent ) {
0022     setBackgroundColor( Qt::white );
0023     setShowGrid(true);
0024     setForegroundColor( Qt::black );
0025     setGridColor( QColor::fromRgb(220,220,220) );
0026     axis ( BottomAxis )->setLabel ( i18n("Time limit [minutes]") );
0027     axis ( LeftAxis )->setLabel ( i18n("Opponent's rating") );
0028     setMouseTracking(true);
0029 }
0030 
0031 SeekGraph::~SeekGraph() = default;
0032 
0033 void SeekGraph::paintEvent ( QPaintEvent* event ) {
0034     QFrame::paintEvent( event );
0035     QPainter p;
0036 
0037     p.begin( this );
0038     p.setRenderHint( QPainter::Antialiasing, true );
0039     p.fillRect( rect(), backgroundColor() );
0040     p.translate( leftPadding() + 0.5, topPadding() + 0.5 );
0041 
0042     p.setClipping( false );
0043     drawAxes( &p );
0044 
0045     setPixRect();
0046     p.setClipRect( pixRect() );
0047     p.setClipping( true );
0048 
0049     resetPlotMask();
0050 
0051     for (KPlotObject *po : plotObjects())
0052         po->draw( &p, this );
0053 
0054     p.end();
0055 }
0056 
0057 void SeekGraph::mouseMoveEvent ( QMouseEvent* event ) {
0058     bool isOverPoint = false;
0059     for (KPlotObject* o : plotObjects()) {
0060         if ( o->points().isEmpty() )
0061             continue;
0062         QPointF d = mapToWidget ( o->points().first()->position()) - event->pos() + QPoint(leftPadding(), topPadding());
0063         if ( d.x() * d.x() + d.y() * d.y() < 64.0 ) {
0064             isOverPoint = true;
0065             break;
0066         }
0067     }
0068     if ( isOverPoint ) {
0069         setCursor( Qt::PointingHandCursor );
0070         event->accept();
0071     } else {
0072         setCursor( Qt::ArrowCursor );
0073         event->ignore();
0074     }
0075 }
0076 
0077 void SeekGraph::mouseReleaseEvent ( QMouseEvent* event ) {
0078     for (KPlotObject* o : plotObjects()) {
0079         if ( o->points().isEmpty() )
0080             continue;
0081         QPointF d = mapToWidget ( o->points().first()->position()) - event->pos() + QPoint(leftPadding(), topPadding());
0082         if ( d.x() * d.x() + d.y() * d.y() < 64.0 ) {
0083             Q_EMIT seekClicked ( m_objects.key(o) );
0084             return;
0085         }
0086     }
0087 }
0088 
0089 void SeekGraph::removeSeek ( int id ) {
0090     m_objects.value(id)->clearPoints();
0091     update();
0092 }
0093 
0094 void SeekGraph::addSeek ( const FicsGameOffer& offer ) {
0095     KPlotObject* object = new KPlotObject;
0096     QPen labelPen = object->labelPen();
0097     labelPen.setColor(Qt::black);
0098     object->setLabelPen(labelPen);
0099     QPointF point = QPointF( offer.baseTime, offer.player.second );
0100     object->addPoint( point, QLatin1Char(' ') + offer.player.first + QLatin1String(" (") + QString::number(offer.player.second) +  QLatin1String(") ") );
0101     object->setBrush( QBrush(Qt::blue) );
0102     object->setSize(8.0);
0103     addPlotObject(object);
0104     QRectF pRect = QRectF( point - QPointF(2,50), QSizeF(5,100) );
0105     setRect ( m_dataRect.isValid() ? m_dataRect.united(pRect) : pRect );
0106     m_objects.insert ( offer.gameId, object );
0107     m_pointIds.insert ( object->points().first(), offer.gameId );
0108     update();
0109 }
0110 
0111 void SeekGraph::clearOffers() {
0112     m_objects.clear();
0113     m_pointIds.clear();
0114     removeAllPlotObjects();
0115     update();
0116 }
0117 
0118 void SeekGraph::setRect ( const QRectF rect ) {
0119     m_dataRect = rect;
0120     setLimits ( rect.left(), rect.right(), rect.top(), rect.bottom() );
0121 }
0122 
0123 #include "moc_seekgraph.cpp"