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"