File indexing completed on 2024-05-12 16:02:07
0001 /* This file is part of the KDE project 0002 SPDX-FileCopyrightText: 2007, 2012 C. Boemann <cbo@boemann.dk> 0003 SPDX-FileCopyrightText: 2007-2008 Fredy Yanardi <fyanardi@gmail.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 #include "KoColorSetWidget.h" 0008 #include "KoColorSetWidget_p.h" 0009 0010 #include <QApplication> 0011 #include <QSize> 0012 #include <QToolButton> 0013 #include <QHBoxLayout> 0014 #include <QCheckBox> 0015 #include <QFrame> 0016 #include <QLabel> 0017 #include <QMouseEvent> 0018 #include <QMenu> 0019 #include <QWidgetAction> 0020 #include <QDir> 0021 #include <QScrollArea> 0022 #include <QGroupBox> 0023 #include <QVBoxLayout> 0024 0025 #include <klocalizedstring.h> 0026 #include <ksharedconfig.h> 0027 0028 #include <resources/KoColorSet.h> 0029 #include <KoColorPatch.h> 0030 #include <KoColorSpaceRegistry.h> 0031 #include <KoResourceServer.h> 0032 #include <KoResourceServerProvider.h> 0033 0034 #include <kis_palette_view.h> 0035 #include <KisPaletteDelegate.h> 0036 #include <KisPaletteModel.h> 0037 #include <kis_icon_utils.h> 0038 0039 void KoColorSetWidget::KoColorSetWidgetPrivate::addRecent(const KoColor &color) 0040 { 0041 if(numRecents < 6) { 0042 recentPatches[numRecents] = new KoColorPatch(thePublic); 0043 recentPatches[numRecents]->setFrameShape(QFrame::StyledPanel); 0044 recentPatches[numRecents]->setDisplayRenderer(displayRenderer); 0045 recentsLayout->insertWidget(numRecents + 1, recentPatches[numRecents]); 0046 connect(recentPatches[numRecents], SIGNAL(triggered(KoColorPatch*)), thePublic, SLOT(slotPatchTriggered(KoColorPatch*))); 0047 numRecents++; 0048 } 0049 // shift colors to the right 0050 for (int i = numRecents- 1; i >0; i--) { 0051 recentPatches[i]->setColor(recentPatches[i-1]->color()); 0052 } 0053 0054 //Finally set the recent color 0055 recentPatches[0]->setColor(color); 0056 } 0057 0058 void KoColorSetWidget::KoColorSetWidgetPrivate::activateRecent(int i) 0059 { 0060 KoColor color = recentPatches[i]->color(); 0061 0062 while (i >0) { 0063 recentPatches[i]->setColor(recentPatches[i-1]->color()); 0064 i--; 0065 } 0066 recentPatches[0]->setColor(color); 0067 } 0068 0069 KoColorSetWidget::KoColorSetWidget(QWidget *parent) 0070 : QFrame(parent) 0071 , d(new KoColorSetWidgetPrivate()) 0072 { 0073 d->thePublic = this; 0074 0075 d->numRecents = 0; 0076 d->recentsLayout = new QHBoxLayout; 0077 d->recentsLayout->setMargin(0); 0078 d->recentsLayout->addWidget(new QLabel(i18n("Recent:"))); 0079 d->recentsLayout->addStretch(1); 0080 0081 KoColor color(KoColorSpaceRegistry::instance()->rgb8()); 0082 color.fromQColor(QColor(128,0,0)); 0083 d->addRecent(color); 0084 0085 d->paletteView = new KisPaletteView(this); 0086 KisPaletteModel *paletteModel = new KisPaletteModel(d->paletteView); 0087 d->paletteView->setPaletteModel(paletteModel); 0088 d->paletteView->setDisplayRenderer(d->displayRenderer); 0089 0090 d->paletteChooser = new KisPaletteChooser(this); 0091 d->paletteChooserButton = new KisPopupButton(this); 0092 d->paletteChooserButton->setPopupWidget(d->paletteChooser); 0093 d->paletteChooserButton->setIcon(KisIconUtils::loadIcon("palette-library")); 0094 d->paletteChooserButton->setToolTip(i18n("Choose palette")); 0095 0096 d->colorNameCmb = new KisPaletteComboBox(this); 0097 d->colorNameCmb->setCompanionView(d->paletteView); 0098 0099 d->bottomLayout = new QHBoxLayout; 0100 d->bottomLayout->addWidget(d->paletteChooserButton); 0101 d->bottomLayout->addWidget(d->colorNameCmb); 0102 d->bottomLayout->setStretch(0, 0); // minimize chooser button 0103 d->bottomLayout->setStretch(1, 1); // maximize color name cmb 0104 0105 d->mainLayout = new QVBoxLayout(this); 0106 d->mainLayout->setMargin(4); 0107 d->mainLayout->setSpacing(2); 0108 d->mainLayout->addLayout(d->recentsLayout); 0109 d->mainLayout->addWidget(d->paletteView); 0110 d->mainLayout->addLayout(d->bottomLayout); 0111 0112 connect(d->paletteChooser, SIGNAL(sigPaletteSelected(KoColorSetSP)), SLOT(slotPaletteChoosen(KoColorSetSP))); 0113 connect(d->paletteView, SIGNAL(sigColorSelected(KoColor)), SLOT(slotColorSelectedByPalette(KoColor))); 0114 connect(d->colorNameCmb, SIGNAL(sigColorSelected(KoColor)), SLOT(slotNameListSelection(KoColor))); 0115 0116 d->rServer = KoResourceServerProvider::instance()->paletteServer(); 0117 KoColorSetSP defaultColorSet = d->rServer->resource("", "", "Default"); 0118 if (!defaultColorSet && d->rServer->resourceCount() > 0) { 0119 defaultColorSet = d->rServer->firstResource(); 0120 } 0121 setColorSet(defaultColorSet); 0122 } 0123 0124 KoColorSetWidget::~KoColorSetWidget() 0125 { 0126 delete d; 0127 } 0128 0129 void KoColorSetWidget::setColorSet(KoColorSetSP colorSet) 0130 { 0131 if (!colorSet) return; 0132 if (colorSet == d->colorSet) return; 0133 0134 d->paletteView->paletteModel()->setPalette(colorSet); 0135 d->colorSet = colorSet; 0136 } 0137 0138 KoColorSetSP KoColorSetWidget::colorSet() 0139 { 0140 return d->colorSet; 0141 } 0142 0143 void KoColorSetWidget::setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer) 0144 { 0145 if (displayRenderer) { 0146 d->displayRenderer = displayRenderer; 0147 for (int i=0; i<6; i++) { 0148 if (d->recentPatches[i]) { 0149 d->recentPatches[i]->setDisplayRenderer(displayRenderer); 0150 } 0151 } 0152 } 0153 } 0154 0155 void KoColorSetWidget::resizeEvent(QResizeEvent *event) 0156 { 0157 emit widgetSizeChanged(event->size()); 0158 QFrame::resizeEvent(event); 0159 } 0160 0161 void KoColorSetWidget::slotColorSelectedByPalette(const KoColor &color) 0162 { 0163 emit colorChanged(color, true); 0164 d->addRecent(color); 0165 } 0166 0167 void KoColorSetWidget::slotPatchTriggered(KoColorPatch *patch) 0168 { 0169 emit colorChanged(patch->color(), true); 0170 0171 int i; 0172 0173 for (i = 0; i < d->numRecents; i++) { 0174 if(patch == d->recentPatches[i]) { 0175 d->activateRecent(i); 0176 break; 0177 } 0178 } 0179 0180 if (i == d->numRecents) { // we didn't find it above 0181 d->addRecent(patch->color()); 0182 } 0183 } 0184 0185 void KoColorSetWidget::slotPaletteChoosen(KoColorSetSP colorSet) 0186 { 0187 d->colorSet = colorSet; 0188 d->paletteView->paletteModel()->setPalette(colorSet); 0189 } 0190 0191 void KoColorSetWidget::slotNameListSelection(const KoColor &color) 0192 { 0193 emit colorChanged(color, true); 0194 } 0195 0196 //have to include this because of Q_PRIVATE_SLOT 0197 #include "moc_KoColorSetWidget.cpp"