File indexing completed on 2024-04-21 07:27:35

0001 /*
0002     ElementItem - Element Item, part of the Periodic Table Graphics View for
0003     Avogadro
0004 
0005     SPDX-FileCopyrightText: 2007-2009 Marcus D. Hanwell <marcus@cryos.org>
0006     SPDX-FileContributor: 2010 Konstantin Tokarev
0007     SPDX-FileCopyrightText: 2010 Etienne Rebetez <etienne.rebetez@oberwallis.ch>
0008 
0009     This file is part of the Avogadro molecular editor project.
0010     For more information, see <https://avogadro.cc/>
0011 
0012     SPDX-License-Identifier: LGPL-2.1-or-later
0013 */
0014 
0015 #include "elementitem.h"
0016 
0017 #include <prefs.h>
0018 
0019 #include <QFont>
0020 #include <QGraphicsSceneMouseEvent>
0021 #include <QPainter>
0022 #include <QStyleOption>
0023 
0024 #include <KLocalizedString>
0025 
0026 ElementItem::ElementItem(KalziumElementProperty *elProperty, int elementNumber)
0027     : m_width(40)
0028     , m_height(40)
0029     , m_element(elementNumber)
0030     , m_property(elProperty)
0031 {
0032     // Want these items to be selectable
0033     setFlags(QGraphicsItem::ItemIsSelectable);
0034     setAcceptHoverEvents(true);
0035 
0036     m_symbol = KalziumDataObject::instance()->element(m_element)->dataAsString(ChemicalDataObject::symbol);
0037 
0038     // Set some custom data to make it easy to figure out which element we are
0039     setData(0, m_element);
0040 }
0041 
0042 ElementItem::~ElementItem()
0043 {
0044 }
0045 
0046 QRectF ElementItem::boundingRect() const
0047 {
0048     return QRectF(0, 0, m_width, m_height);
0049 }
0050 
0051 QPainterPath ElementItem::shape() const
0052 {
0053     QPainterPath path;
0054     path.addRect(0, 0, m_width, m_height);
0055     return path;
0056 }
0057 
0058 void ElementItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
0059 {
0060     if (m_hovered) {
0061         QPen pen;
0062         pen.setColor(m_borderColor);
0063         pen.setWidth(1);
0064         painter->setPen(pen);
0065     } else {
0066         painter->setPen(Qt::NoPen);
0067     }
0068     painter->setBrush(m_brush);
0069     painter->drawRoundedRect(boundingRect(), 3, 3);
0070 
0071     if (isSelected()) {
0072         QColor selectedBackgroundColor = m_borderColor;
0073         selectedBackgroundColor.setAlpha(160);
0074         painter->setBrush(QBrush(QColor(selectedBackgroundColor)));
0075         painter->drawRoundedRect(boundingRect(), 3, 3);
0076     }
0077 
0078     QPen pen;
0079     pen.setColor(m_textColor);
0080     pen.setWidth(1);
0081     painter->setPen(pen);
0082 
0083     QFont symbolFont;
0084 
0085     switch (m_property->getMode()) {
0086     case KalziumElementProperty::NORMAL:
0087         symbolFont.setPointSize(12);
0088         symbolFont.setBold(true);
0089         painter->setFont(symbolFont);
0090         painter->drawText(boundingRect(), Qt::AlignCenter, m_symbol);
0091         symbolFont.setPointSize(7);
0092         symbolFont.setBold(false);
0093         painter->setFont(symbolFont);
0094         painter->drawText(QRectF(m_width / 14, m_height / 20, m_width, m_height / 2), Qt::AlignLeft, QString::number(m_element));
0095         break;
0096 
0097     case KalziumElementProperty::GRADIENTVALUE:
0098         painter->drawText(QRectF(0, m_height / 20, m_width, m_height / 2), Qt::AlignCenter, m_symbol);
0099 
0100         symbolFont.setPointSize(7);
0101         painter->setFont(symbolFont);
0102 
0103         painter->drawText(QRectF(0, m_height / 2 - m_height / 20, m_width, m_height / 2), Qt::AlignCenter, m_textValue);
0104         break;
0105     }
0106 }
0107 
0108 void ElementItem::redraw()
0109 {
0110     m_brush = m_property->getElementBrush(m_element);
0111     m_textColor = m_property->getTextColor(m_element);
0112     m_borderColor = m_property->getBorderColor(m_element);
0113     m_textValue = getCurrentElementValue();
0114     update();
0115 }
0116 
0117 QString ElementItem::getCurrentElementValue()
0118 {
0119     double value = m_property->getValue(m_element);
0120 
0121     if (value == -1) {
0122         return i18n("n/a");
0123     }
0124 
0125     return QString::number(value);
0126 }
0127 
0128 void ElementItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
0129 {
0130     setZValue(200);
0131     moveBy(-m_width / 4, -m_height / 4);
0132     setScale(1.5);
0133     m_hovered = true;
0134     QGraphicsItem::hoverEnterEvent(event);
0135 }
0136 
0137 void ElementItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
0138 {
0139     resetTransform();
0140     moveBy(m_width / 4, m_height / 4);
0141     setZValue(100);
0142     setScale(1);
0143     m_hovered = false;
0144     QGraphicsItem::hoverLeaveEvent(event);
0145 }
0146 
0147 #include "moc_elementitem.cpp"