File indexing completed on 2024-04-21 04:02:02

0001 /*
0002     KBlackBox - A simple game inspired by an emacs module
0003 
0004     SPDX-FileCopyrightText: 1999-2000 Robert Cimrman <cimrman3@students.zcu.cz>
0005     SPDX-FileCopyrightText: 2007 Nicolas Roffet <nicolas-kde@roffet.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 
0011 #include "kbbgraphicsitemray.h"
0012 
0013 #include <QGraphicsScene>
0014 #include <QList>
0015 #include <QPainterPath>
0016 #include <QPen>
0017 
0018 
0019 #include "kbbballsonboard.h"
0020 #include "kbbgamedoc.h"
0021 #include "kbbthememanager.h"
0022 
0023 
0024 
0025 //
0026 // Constructor / Destructor
0027 //
0028 
0029 KBBGraphicsItemRay::KBBGraphicsItemRay(KBBScalableGraphicWidget::itemType itemType, QGraphicsScene* scene, KBBThemeManager* themeManager) : KBBGraphicsItemBorder(0, 1, 1, KBBScalableGraphicWidget::BORDER_SIZE/2), QGraphicsPathItem (nullptr)
0030 {
0031     scene->addItem(this);
0032     QPen pen;
0033 
0034     pen.setColor(themeManager->color(itemType));
0035     pen.setStyle(themeManager->style(itemType));
0036     pen.setWidthF(themeManager->width(itemType));
0037     setZValue(themeManager->zValue(itemType));
0038 
0039     pen.setJoinStyle(Qt::RoundJoin);
0040     pen.setCapStyle(Qt::RoundCap);
0041 
0042     setPen(pen);
0043 }
0044 
0045 
0046 
0047 //
0048 // Public
0049 //
0050 
0051 void KBBGraphicsItemRay::draw(KBBBallsOnBoard* ballsOnBoard, const int borderPosition)
0052 {
0053     const int columns = ballsOnBoard->columns();
0054     const int rows = ballsOnBoard->rows();
0055     
0056     QList<int> points;
0057     const int oppositeBorderPosition = ballsOnBoard->oppositeBorderPositionWithPoints(borderPosition, points);
0058     
0059     QPainterPath path;
0060     setSize(borderPosition, columns, rows);
0061     path.moveTo(m_centerX, m_centerY);
0062 
0063     const float b = (float) KBBScalableGraphicWidget::BORDER_SIZE;
0064     const float r = (float) KBBScalableGraphicWidget::RATIO;
0065     float x;
0066     float y;
0067     for (int i=0; i<points.count(); i++) {
0068         x = b - r/2 + r*((points[i] % columns) + 1);
0069         y = b - r/2 + r*((points[i] / columns) + 1);
0070         path.lineTo(x,y);
0071     }
0072     
0073     if (oppositeBorderPosition!=KBBGameDoc::HIT_POSITION) {
0074         float x1;
0075         float y1;
0076         centerCoordinate(oppositeBorderPosition, x1, y1, b/2.);
0077         path.lineTo(x1,y1);
0078     }
0079     
0080     setPath(path);
0081 }
0082 
0083 
0084 void KBBGraphicsItemRay::hide()
0085 {
0086     setPath(QPainterPath());
0087 }