File indexing completed on 2024-05-12 16:02:03

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Sven Langkamp <sven.langkamp@gmail.com>
0003  *  SPDX-FileCopyrightText: 2018 Michael Zhou <simeirxh@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include <QPointer>
0009 #include <QScopedPointer>
0010 #include <QGridLayout>
0011 #include <QSet>
0012 #include <QStringList>
0013 #include <QFile>
0014 #include <QMessageBox>
0015 #include <QInputDialog>
0016 #include <QDir>
0017 
0018 #include <kis_icon.h>
0019 #include <KoFileDialog.h>
0020 
0021 #include <KisResourceModel.h>
0022 #include <KisResourceItemListView.h>
0023 
0024 #include <ui_WdgPaletteListWidget.h>
0025 #include "KisPaletteChooser.h"
0026 #include "KisPaletteChooser_p.h"
0027 
0028 KisPaletteChooser::KisPaletteChooser(QWidget *parent)
0029     : QWidget(parent)
0030     , m_ui(new Ui_WdgPaletteListWidget)
0031     , m_d(new KisPaletteChooserPrivate(this))
0032 {
0033     m_d->actAdd.reset(new QAction(KisIconUtils::loadIcon("list-add"),
0034                                   i18n("Add a new palette")));
0035     m_d->actRemove.reset(new QAction(KisIconUtils::loadIcon("edit-delete"),
0036                                      i18n("Remove current palette")));
0037     m_d->actImport.reset(new QAction(KisIconUtils::loadIcon("document-import-16"),
0038                                      i18n("Import a new palette from file")));
0039     m_d->actExport.reset(new QAction(KisIconUtils::loadIcon("document-export-16"),
0040                                      i18n("Export current palette to file")));
0041     m_ui->setupUi(this);
0042     m_ui->bnAdd->setDefaultAction(m_d->actAdd.data());
0043     m_ui->bnRemove->setDefaultAction(m_d->actRemove.data());
0044     m_ui->bnImport->setDefaultAction(m_d->actImport.data());
0045     m_ui->bnExport->setDefaultAction(m_d->actExport.data());
0046 
0047     m_ui->bnAdd->setAutoRaise(true);
0048     m_ui->bnRemove->setAutoRaise(true);
0049     m_ui->bnImport->setAutoRaise(true);
0050     m_ui->bnExport->setAutoRaise(true);
0051 
0052     connect(m_d->actAdd.data(), SIGNAL(triggered()), SLOT(slotAdd()));
0053     connect(m_d->actRemove.data(), SIGNAL(triggered()), SLOT(slotRemove()));
0054     connect(m_d->actImport.data(), SIGNAL(triggered()), SLOT(slotImport()));
0055     connect(m_d->actExport.data(), SIGNAL(triggered()), SLOT(slotExport()));
0056 
0057     m_d->itemChooser->setItemDelegate(m_d->delegate.data());
0058     m_d->itemChooser->setRowHeight(40);
0059     m_d->itemChooser->itemView()->setViewMode(QListView::ListMode);
0060     m_d->itemChooser->showButtons(false);
0061     m_d->itemChooser->showTaggingBar(true);
0062     QHBoxLayout *paletteLayout = new QHBoxLayout(m_ui->viewPalette);
0063     paletteLayout->addWidget(m_d->itemChooser.data());
0064 
0065     m_d->itemChooser->setCurrentItem(0);
0066 
0067     connect(m_d->itemChooser.data(), SIGNAL(resourceSelected(KoResourceSP )), SLOT(paletteSelected(KoResourceSP )));
0068 }
0069 
0070 KisPaletteChooser::~KisPaletteChooser()
0071 { }
0072 
0073 void KisPaletteChooser::setCurrentItem(KoResourceSP currentResource)
0074 {
0075     m_d->itemChooser->setCurrentResource(currentResource);
0076 }
0077 
0078 void KisPaletteChooser::paletteSelected(KoResourceSP r)
0079 {
0080     KoColorSetSP g = r.staticCast<KoColorSet>();
0081     emit sigPaletteSelected(g);
0082     m_ui->bnRemove->setEnabled(true);
0083 }
0084 
0085 void KisPaletteChooser::slotAdd()
0086 {
0087     // Don't select any palette,
0088     //  because it doesn't need to be added at the end of the list.
0089     // The PaletteEditor will select the newly added palette.
0090     emit sigAddPalette();
0091 }
0092 
0093 void KisPaletteChooser::slotRemove()
0094 {
0095     if (m_d->itemChooser->currentResource()) {
0096         KoColorSetSP cs = m_d->itemChooser->currentResource().staticCast<KoColorSet>();
0097         emit sigRemovePalette(cs);
0098     }
0099     m_d->itemChooser->setCurrentItem(0);
0100 }
0101 
0102 void KisPaletteChooser::slotImport()
0103 {
0104     emit sigImportPalette();
0105 }
0106 
0107 void KisPaletteChooser::slotExport()
0108 {
0109     if (!m_d->itemChooser->currentResource()) {
0110         m_d->itemChooser->setCurrentItem(0);
0111     }
0112     KoColorSetSP palette = m_d->itemChooser->currentResource().dynamicCast<KoColorSet>();
0113     emit sigExportPalette(palette);
0114 }
0115 
0116 /************************* KisPaletteChooserPrivate **********************/
0117 
0118 KisPaletteChooserPrivate::KisPaletteChooserPrivate(KisPaletteChooser *a_c)
0119     : c(a_c)
0120     , itemChooser(new KisResourceItemChooser(ResourceType::Palettes, false, a_c))
0121     , delegate(new Delegate(a_c))
0122 {  }
0123 
0124 KisPaletteChooserPrivate::~KisPaletteChooserPrivate()
0125 { }
0126 
0127 /******************* KisPaletteChooserPrivate::Delegate ******************/
0128 
0129 KisPaletteChooserPrivate::Delegate::Delegate(QObject *parent)
0130     : QAbstractItemDelegate(parent)
0131 {  }
0132 
0133 KisPaletteChooserPrivate::Delegate::~Delegate()
0134 {  }
0135 
0136 void KisPaletteChooserPrivate::Delegate::paint(QPainter *painter,
0137                                                   const QStyleOptionViewItem &option,
0138                                                   const QModelIndex &index) const
0139 {
0140     painter->save();
0141     if (!index.isValid())
0142         return;
0143 
0144     QImage preview = index.data(Qt::UserRole + KisAbstractResourceModel::Thumbnail).value<QImage>();
0145     QString name = index.data(Qt::UserRole + KisAbstractResourceModel::Name).toString();
0146 
0147     QRect previewRect(option.rect.x() + 2,
0148                       option.rect.y() + 2,
0149                       option.rect.height() - 4,
0150                       option.rect.height() - 4);
0151 
0152     painter->drawImage(previewRect, preview);
0153 
0154     if (option.state & QStyle::State_Selected) {
0155         painter->fillRect(option.rect, option.palette.highlight());
0156         painter->drawImage(previewRect, preview);
0157         painter->setPen(option.palette.highlightedText().color());
0158     } else {
0159         painter->setPen(option.palette.text().color());
0160     }
0161 
0162     painter->drawText(option.rect.x() + previewRect.width() + 10,
0163                       option.rect.y() + painter->fontMetrics().ascent() + 5,
0164                       name);
0165 
0166     painter->restore();
0167 }
0168 
0169 inline QSize KisPaletteChooserPrivate::Delegate::sizeHint(const QStyleOptionViewItem & option,
0170                                                              const QModelIndex &) const
0171 {
0172     return option.decorationSize;
0173 }