File indexing completed on 2024-06-16 04:16:02

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Adam Celarek <kdedev at xibo dot at>
0003  *  SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "kis_shade_selector_line_combo_box.h"
0009 #include "kis_shade_selector_line_combo_box_popup.h"
0010 
0011 #include <QVBoxLayout>
0012 #include <QMouseEvent>
0013 #include <QPainter>
0014 #include <QApplication>
0015 #include <kconfig.h>
0016 #include <ksharedconfig.h>
0017 #include <kconfiggroup.h>
0018 
0019 #include "kis_global.h"
0020 #include "kis_shade_selector_line.h"
0021 #include "kis_shade_selector_line_editor.h"
0022 #include "kis_color_selector_base_proxy.h"
0023 
0024 
0025 KisShadeSelectorLineComboBoxPopup::KisShadeSelectorLineComboBoxPopup(QWidget* parent)
0026     : QWidget(parent, Qt::Popup),
0027       spacing(10),
0028       m_lastHighlightedItem(0),
0029       m_lastSelectedItem(0),
0030       m_lineEditor(0),
0031       m_parentProxy(new KisColorSelectorBaseProxyNoop())
0032 {
0033     setMouseTracking(true);
0034 
0035     QVBoxLayout* layout = new QVBoxLayout(this);
0036     layout->setSpacing(spacing);
0037 
0038     layout->addWidget(new KisShadeSelectorLine(1.0, 0.0, 0.0, m_parentProxy.data(), this));
0039     layout->addWidget(new KisShadeSelectorLine(0.1, 0.0, 0.0, m_parentProxy.data(), this));
0040     layout->addWidget(new KisShadeSelectorLine(0.2, 0.0, 0.0, m_parentProxy.data(), this));
0041     layout->addWidget(new KisShadeSelectorLine(0.0, 0.5, 0.0, m_parentProxy.data(), this));
0042     layout->addWidget(new KisShadeSelectorLine(0.0, 1.0, 0.0, m_parentProxy.data(), this));
0043     layout->addWidget(new KisShadeSelectorLine(0.0, 0.0, 0.5, m_parentProxy.data(), this));
0044     layout->addWidget(new KisShadeSelectorLine(0.0, 0.0, 1.0, m_parentProxy.data(), this));
0045     layout->addWidget(new KisShadeSelectorLine(0.0, 0.5, 0.5, m_parentProxy.data(), this));
0046     layout->addWidget(new KisShadeSelectorLine(0.0, 1.0, 1.0, m_parentProxy.data(), this));
0047     layout->addWidget(new KisShadeSelectorLine(0.0, -0.5, 0.5, m_parentProxy.data(), this));
0048     layout->addWidget(new KisShadeSelectorLine(0.0, -1.0, 1.0, m_parentProxy.data(), this));
0049     layout->addWidget(new KisShadeSelectorLine(0.0, 0.5, 0.5, m_parentProxy.data(), this, -0.04));
0050     layout->addWidget(new KisShadeSelectorLine(0.0, 0.5, 0.5, m_parentProxy.data(), this, +0.04));
0051     layout->addWidget(new KisShadeSelectorLine(0.0, -0.5, 0.5, m_parentProxy.data(), this, -0.04));
0052 
0053     KisShadeSelectorLine* preview = new KisShadeSelectorLine(0.0, -0.5, 0.5, m_parentProxy.data(), this, +0.04);
0054     m_lineEditor = new KisShadeSelectorLineEditor(this, preview);
0055     layout->addWidget(preview);
0056     layout->addWidget(m_lineEditor);
0057 
0058     connect(m_lineEditor, SIGNAL(requestActivateLine(QWidget*)), SLOT(activateItem(QWidget*)));
0059 
0060     for(int i=0; i<this->layout()->count(); i++) {
0061         KisShadeSelectorLine* item = dynamic_cast<KisShadeSelectorLine*>(this->layout()->itemAt(i)->widget());
0062         if(item!=0) {
0063             item->setMouseTracking(true);
0064             item->setAttribute(Qt::WA_TransparentForMouseEvents);
0065             KoColor color;
0066             color.fromQColor(QColor(190, 50, 50));
0067             item->setColor(color);
0068             item->showHelpText();
0069         }
0070     }
0071 }
0072 
0073 KisShadeSelectorLineComboBoxPopup::~KisShadeSelectorLineComboBoxPopup()
0074 {
0075 }
0076 
0077 void KisShadeSelectorLineComboBoxPopup::setConfiguration(const QString &string)
0078 {
0079     m_lineEditor->fromString(string);
0080 }
0081 
0082 void KisShadeSelectorLineComboBoxPopup::updateSelectedArea(const QRect &newRect)
0083 {
0084     QRect oldSelectedArea = m_selectedArea;
0085     m_selectedArea = newRect;
0086     update(oldSelectedArea);
0087     update(m_selectedArea);
0088 }
0089 
0090 void KisShadeSelectorLineComboBoxPopup::updateHighlightedArea(const QRect &newRect)
0091 {
0092     QRect oldHighlightArea = m_highlightedArea;
0093     m_highlightedArea = newRect;
0094     update(oldHighlightArea);
0095     update(m_highlightedArea);
0096 }
0097 
0098 void KisShadeSelectorLineComboBoxPopup::activateItem(QWidget *widget)
0099 {
0100     KisShadeSelectorLineBase* item = dynamic_cast<KisShadeSelectorLineBase*>(widget);
0101     KIS_ASSERT_RECOVER_RETURN(item);
0102 
0103     QRect itemRect = kisGrowRect(item->geometry(), spacing / 2 - 1);
0104     m_lastSelectedItem = item;
0105 
0106     updateSelectedArea(itemRect);
0107 }
0108 
0109 void KisShadeSelectorLineComboBoxPopup::paintEvent(QPaintEvent *)
0110 {
0111     QPainter painter(this);
0112     QPainter p(this);
0113     KConfigGroup cfg =  KSharedConfig::openConfig()->group("advancedColorSelector");
0114 
0115     if (cfg.readEntry("useCustomColorForBackground", false)) {
0116         p.fillRect(0,0,width(), height(), cfg.readEntry("customSelectorBackgroundColor", QColor(Qt::gray)));
0117     } else {
0118         p.fillRect(0,0,width(), height(), qApp->palette().window().color());
0119     }
0120     painter.fillRect(m_selectedArea, palette().highlight());
0121 
0122     painter.setPen(QPen(palette().highlight(), 2));
0123     painter.drawRect(m_highlightedArea);
0124 }
0125 
0126 void KisShadeSelectorLineComboBoxPopup::mouseMoveEvent(QMouseEvent * e)
0127 {
0128     if(rect().contains(e->pos())) {
0129         for(int i = 0; i < layout()->count(); i++) {
0130             KisShadeSelectorLineBase* item = dynamic_cast<KisShadeSelectorLineBase*>(layout()->itemAt(i)->widget());
0131             KIS_ASSERT_RECOVER_RETURN(item);
0132 
0133             QRect itemRect = kisGrowRect(item->geometry(), spacing / 2 - 1);
0134             if(itemRect.contains(e->pos())) {
0135                 m_lastHighlightedItem = item;
0136 
0137                 updateHighlightedArea(itemRect);
0138             }
0139         }
0140     }
0141     else {
0142         updateHighlightedArea(QRect());
0143     }
0144 }
0145 
0146 void KisShadeSelectorLineComboBoxPopup::mousePressEvent(QMouseEvent* e)
0147 {
0148     if(rect().contains(e->pos())) {
0149         mouseMoveEvent(e);
0150 
0151         m_lastSelectedItem = m_lastHighlightedItem;
0152 
0153         if (m_lastSelectedItem != m_lineEditor) {
0154             m_lineEditor->blockSignals(true);
0155             m_lineEditor->fromString(m_lastSelectedItem->toString());
0156             m_lineEditor->blockSignals(false);
0157         }
0158         updateSelectedArea(m_highlightedArea);
0159     }
0160     if (m_lastSelectedItem) {
0161         KisShadeSelectorLineComboBox *parent = dynamic_cast<KisShadeSelectorLineComboBox*>(this->parent());
0162         Q_ASSERT(parent);
0163         parent->setConfiguration(m_lastSelectedItem->toString());
0164     }
0165     e->accept();
0166 
0167     this->parentWidget()->update();
0168     hide();
0169 }
0170