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"