File indexing completed on 2024-05-12 05:47:30

0001 /*
0002  * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kitemlistselectiontoggle.h"
0008 
0009 #include <KIconLoader>
0010 
0011 #include <QIcon>
0012 #include <QPainter>
0013 
0014 KItemListSelectionToggle::KItemListSelectionToggle(QGraphicsItem *parent)
0015     : QGraphicsWidget(parent)
0016     , m_checked(false)
0017     , m_hovered(false)
0018 {
0019 }
0020 
0021 KItemListSelectionToggle::~KItemListSelectionToggle()
0022 {
0023 }
0024 
0025 void KItemListSelectionToggle::setChecked(bool checked)
0026 {
0027     if (m_checked != checked) {
0028         m_checked = checked;
0029         m_pixmap = QPixmap();
0030         update();
0031     }
0032 }
0033 
0034 bool KItemListSelectionToggle::isChecked() const
0035 {
0036     return m_checked;
0037 }
0038 
0039 void KItemListSelectionToggle::setHovered(bool hovered)
0040 {
0041     if (m_hovered != hovered) {
0042         m_hovered = hovered;
0043         m_pixmap = QPixmap();
0044         update();
0045     }
0046 }
0047 
0048 void KItemListSelectionToggle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
0049 {
0050     Q_UNUSED(option)
0051     Q_UNUSED(widget)
0052 
0053     if (m_pixmap.isNull()) {
0054         updatePixmap();
0055     }
0056 
0057     const qreal x = (size().width() - qreal(m_pixmap.width() / m_pixmap.devicePixelRatioF())) / 2;
0058     const qreal y = (size().height() - qreal(m_pixmap.height() / m_pixmap.devicePixelRatioF())) / 2;
0059     painter->drawPixmap(x, y, m_pixmap);
0060 }
0061 
0062 void KItemListSelectionToggle::resizeEvent(QGraphicsSceneResizeEvent *event)
0063 {
0064     QGraphicsWidget::resizeEvent(event);
0065 
0066     if (!m_pixmap.isNull()) {
0067         const int pixmapSize = m_pixmap.size().width() / m_pixmap.devicePixelRatioF(); // Pixmap width is always equal pixmap height
0068 
0069         if (pixmapSize != iconSize()) {
0070             // If the required icon size is different from the actual pixmap size,
0071             // overwrite the m_pixmap with an empty pixmap and reload the new
0072             // icon on next re-painting.
0073             m_pixmap = QPixmap();
0074         }
0075     }
0076 }
0077 
0078 void KItemListSelectionToggle::updatePixmap()
0079 {
0080     const QString icon = m_checked ? QStringLiteral("emblem-remove") : QStringLiteral("emblem-added");
0081     m_pixmap = QIcon::fromTheme(icon).pixmap(iconSize(), m_hovered ? QIcon::Active : QIcon::Disabled);
0082 }
0083 
0084 int KItemListSelectionToggle::iconSize() const
0085 {
0086     const int iconSize = qMin(size().width(), size().height());
0087 
0088     if (iconSize < KIconLoader::SizeSmallMedium) {
0089         return KIconLoader::SizeSmall;
0090     } else if (iconSize < KIconLoader::SizeMedium) {
0091         return KIconLoader::SizeSmallMedium;
0092     } else if (iconSize < KIconLoader::SizeLarge) {
0093         return KIconLoader::SizeMedium;
0094     } else if (iconSize < KIconLoader::SizeHuge) {
0095         return KIconLoader::SizeLarge;
0096     } else if (iconSize < KIconLoader::SizeEnormous) {
0097         return KIconLoader::SizeHuge;
0098     }
0099 
0100     return iconSize;
0101 }
0102 
0103 #include "moc_kitemlistselectiontoggle.cpp"