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 }