File indexing completed on 2024-05-19 04:29:05

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
0003  * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassyqweb.de>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "kis_paintop_options_model.h"
0009 
0010 #include <klocalizedstring.h>
0011 
0012 
0013 KisPaintOpOptionListModel::KisPaintOpOptionListModel(QObject *parent)
0014     : BaseOptionCategorizedListModel(parent)
0015 {
0016     connect(&m_stateSignalsMapper, qOverload<int>(&QSignalMapper::mapped),
0017             this, &KisPaintOpOptionListModel::slotCheckedEnabledStateChanged);
0018 }
0019 
0020 QString KisPaintOpOptionListModel::categoryName(KisPaintOpOption::PaintopCategory categoryType)
0021 {
0022     QString category;
0023     switch(categoryType) {
0024     case KisPaintOpOption::GENERAL:
0025         category = i18nc("option category", "General");
0026         break;
0027     case KisPaintOpOption::COLOR:
0028         category = i18nc("option category", "Color");
0029         break;
0030     case KisPaintOpOption::TEXTURE:
0031         category = i18nc("option category", "Texture");
0032         break;
0033     case KisPaintOpOption::FILTER:
0034         category = i18nc("option category", "Filter");
0035         break;
0036     case KisPaintOpOption::MASKING_BRUSH:
0037         category = i18nc("option category", "Masked Brush");
0038         break;
0039     };
0040     return category;
0041 }
0042 
0043 void KisPaintOpOptionListModel::addPaintOpOption(KisPaintOpOption *option, int widgetIndex, const QString &label, const QString &category) {
0044 
0045     DataItem *item = categoriesMapper()->addEntry(category, KisOptionInfo(option, widgetIndex, label));
0046 
0047     if (option->isCheckable()) {
0048         item->setCheckable(true);
0049         item->setChecked(option->isChecked());
0050         connect(option, &KisPaintOpOption::sigCheckedChanged,
0051                 &m_stateSignalsMapper, qOverload<>(&QSignalMapper::map));
0052     }
0053 
0054     item->setEnabled(option->isEnabled());
0055     connect(option, &KisPaintOpOption::sigEnabledChanged,
0056             &m_stateSignalsMapper, qOverload<>(&QSignalMapper::map));
0057     m_stateSignalsMapper.setMapping(option, categoriesMapper()->rowFromItem(item));
0058 
0059     categoriesMapper()->expandAllCategories();
0060 }
0061 
0062 QVariant KisPaintOpOptionListModel::data(const QModelIndex& idx, int role) const
0063 {
0064     return BaseOptionCategorizedListModel::data(idx, role);
0065 }
0066 
0067 bool KisPaintOpOptionListModel::setData(const QModelIndex& idx, const QVariant& value, int role)
0068 {
0069     if (!idx.isValid()) return false;
0070 
0071     DataItem *item = categoriesMapper()->itemFromRow(idx.row());
0072     Q_ASSERT(item);
0073 
0074     if (role == Qt::CheckStateRole && item->isCheckable()) {
0075         item->data()->option->setChecked(value.toInt() == Qt::Checked);
0076     }
0077 
0078     return BaseOptionCategorizedListModel::setData(idx, value, role);
0079 }
0080 
0081 bool operator==(const KisOptionInfo& a, const KisOptionInfo& b)
0082 {
0083     if (a.index != b.index) return false;
0084     if (a.option->objectName() == b.option->objectName())
0085     if (a.option->category() != b.option->category()) return false;
0086     if (a.option->isCheckable() != b.option->isCheckable()) return false;
0087     if (a.option->isChecked() != b.option->isChecked()) return false;
0088     return true;
0089 }
0090 void KisPaintOpOptionListModel::signalDataChanged(const QModelIndex& index)
0091 {
0092     emit dataChanged(index,index);
0093 }
0094 
0095 void KisPaintOpOptionListModel::slotCheckedEnabledStateChanged(int row)
0096 {
0097     QModelIndex idx(index(row));
0098 
0099     DataItem *item = categoriesMapper()->itemFromRow(row);
0100     KIS_SAFE_ASSERT_RECOVER_RETURN(item);
0101 
0102     if (item->data()->option->isEnabled() != item->isEnabled()) {
0103         item->setEnabled(item->data()->option->isEnabled());
0104     }
0105 
0106     if (item->data()->option->isChecked() != item->isChecked()) {
0107         item->setChecked(item->data()->option->isChecked());
0108     }
0109 
0110     emit dataChanged(idx, idx);
0111 }