File indexing completed on 2024-03-24 03:44:22
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"