File indexing completed on 2024-04-14 03:59:20

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 #include "kbbgraphicsitemrayresult.h"
0011 
0012 
0013 
0014 #include <QFont>
0015 #include <QGraphicsScene>
0016 
0017 
0018 #include "kbbscalablegraphicwidget.h"
0019 #include "kbbthememanager.h"
0020 
0021 
0022 
0023 //
0024 // Constructor / Destructor
0025 //
0026 
0027 KBBGraphicsItemRayResult::KBBGraphicsItemRayResult( KBBScalableGraphicWidget* parent, KBBThemeManager* themeManager, QGraphicsScene* scene, const int borderPosition, const int columns, const int rows, const int rayNumber) : KBBGraphicsItemBorder( borderPosition, columns, rows, KBBScalableGraphicWidget::BORDER_SIZE/2), KBBGraphicsItem(KBBScalableGraphicWidget::resultBackground, scene, themeManager), KBBItemWithPosition()
0028 {
0029     m_widget = parent;
0030     m_scene = scene;
0031     m_elementIdResultBackground = themeManager->elementId(KBBScalableGraphicWidget::resultBackground);
0032     m_elementIdResultBackgroundHighlight = themeManager->elementId(KBBScalableGraphicWidget::resultBackgroundHighlight);
0033     m_number = nullptr;
0034     m_notNumber = nullptr;
0035     m_pause = false;
0036     
0037     float centerRadius = 3*KBBScalableGraphicWidget::RATIO/8.;
0038     float radius = KBBScalableGraphicWidget::BORDER_SIZE/4.;
0039 
0040     m_opposite = this;
0041     
0042     setPos(m_centerX - radius, m_centerY - radius);
0043     
0044     if(rayNumber<=0) {
0045 
0046         if (rayNumber==0)
0047             m_notNumber = new KBBGraphicsItem(KBBScalableGraphicWidget::resultReflection, m_scene, themeManager);
0048         else
0049             m_notNumber = new KBBGraphicsItem(KBBScalableGraphicWidget::resultHit, m_scene, themeManager);
0050         m_notNumber->setTransform(QTransform::fromTranslate(radius,radius), true);
0051         m_notNumber->setTransform(QTransform().rotate(rotationAngle()), true);
0052         m_notNumber->setTransform(QTransform::fromTranslate(-radius,-radius), true);
0053         m_notNumber->setPos(m_centerX - radius, m_centerY - radius);
0054     } else {
0055         QString text;
0056         text.setNum(rayNumber);
0057 
0058         m_number = new QGraphicsSimpleTextItem ( text, this);
0059         QFont font;
0060         font.setStyleHint(QFont::SansSerif);
0061         font.setWeight(QFont::DemiBold);
0062         float offset;
0063         if (rayNumber<10) {
0064             font.setPixelSize((int)(3*centerRadius/2));
0065             offset = 0.;
0066         } else {
0067             font.setPixelSize((int)(5*centerRadius/4));
0068             offset = 1.*centerRadius/6;
0069         }
0070         m_number->setFont(font);
0071         m_number->setPos(radius - centerRadius/2 - 2*offset, radius - centerRadius + offset);
0072         m_number->setZValue(themeManager->zValue(KBBScalableGraphicWidget::resultText));
0073     }
0074     setAcceptHoverEvents(true);
0075 }
0076 
0077 
0078 
0079 //
0080 // Public
0081 //
0082 
0083 void KBBGraphicsItemRayResult::cleanDelete()
0084 {
0085     delete m_notNumber;
0086     delete m_number;
0087     delete this;
0088 }
0089 
0090 
0091 void KBBGraphicsItemRayResult::highlight(bool state)
0092 {
0093     if (state && !m_pause)
0094         setElementId(m_elementIdResultBackgroundHighlight);
0095     else
0096         setElementId(m_elementIdResultBackground);
0097 }
0098 
0099 
0100 void KBBGraphicsItemRayResult::highlightBoth(bool state)
0101 {
0102     m_opposite->highlight(state);
0103     highlight(state);
0104 }
0105 
0106 
0107 int KBBGraphicsItemRayResult::position ()
0108 {
0109     return m_borderPosition;
0110 }
0111 
0112 
0113 void KBBGraphicsItemRayResult::setOpposite(KBBGraphicsItemRayResult* opposite)
0114 {
0115     m_opposite = opposite;
0116 }
0117 
0118 
0119 void KBBGraphicsItemRayResult::setPause(bool state)
0120 {
0121     if (m_number!=nullptr)
0122         m_number->setVisible(!state);
0123     if (m_notNumber!=nullptr)
0124         m_notNumber->setVisible(!state);
0125 
0126     m_pause = state;
0127 }
0128 
0129 
0130 
0131 //
0132 // Private
0133 //
0134 
0135 void KBBGraphicsItemRayResult::hoverEnterEvent (QGraphicsSceneHoverEvent*)
0136 {
0137     highlightBoth(true);
0138     m_widget->drawRay(position());
0139 }
0140 
0141 
0142 void KBBGraphicsItemRayResult::hoverLeaveEvent (QGraphicsSceneHoverEvent*)
0143 {
0144     highlightBoth(false);
0145     m_widget->removeRay();
0146 }