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