File indexing completed on 2024-05-12 04:06:22

0001 /*
0002     SPDX-FileCopyrightText: 2010 Stefan Majewsky <majewsky@gmx.net>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "triggerlistview.h"
0008 #include "triggerlistview_p.h"
0009 #include <KCategoryDrawer>
0010 #include <KLocalizedString>
0011 #include <QStandardItemModel>
0012 static QString categoryToString(Palapeli::Interactor::Category category)
0013 {
0014     switch (category)
0015     {
0016         case Palapeli::Interactor::PieceInteraction:
0017             return i18n("Interaction with pieces");
0018         case Palapeli::Interactor::TableInteraction:
0019             return i18n("Interaction with the puzzle table");
0020         case Palapeli::Interactor::ViewportInteraction:
0021             return i18n("Interaction with the viewport");
0022         case Palapeli::Interactor::NoCategory: default:
0023             return QString();
0024     }
0025 }
0026 
0027 Palapeli::TriggerListView::TriggerListView(const QMap<QByteArray, Palapeli::Interactor*>& interactors, Palapeli::InteractorType interactorType, QWidget* parent)
0028     : KCategorizedView(parent)
0029     , m_categoryDrawer(new KCategoryDrawer(this))
0030     , m_baseModel(new QStandardItemModel(this))
0031     , m_proxyModel(new Palapeli::TriggerListProxyModel(this))
0032     , m_delegate(new Palapeli::TriggerListDelegate(this))
0033 {
0034     //fill base model with interactors
0035     QMap<QByteArray, Palapeli::Interactor*>::const_iterator it1 = interactors.begin(), it2 = interactors.end();
0036     for (; it1 != it2; ++it1)
0037     {
0038         //filter interactor
0039         Palapeli::Interactor* interactor = it1.value();
0040         if (interactor->interactorType() != interactorType)
0041             continue;
0042         //create item for interactor
0043         QStandardItem* item = new QStandardItem;
0044         item->setData(interactor->description(), Qt::DisplayRole);
0045         item->setData(interactor->icon(), Qt::DecorationRole);
0046         item->setData(interactorType, Palapeli::InteractorTypeRole);
0047         item->setData(it1.key(), Palapeli::InteractorRole);
0048         item->setData(QVariant::fromValue(Palapeli::Trigger()), Palapeli::TriggerRole);
0049         item->setData(categoryToString(interactor->category()), KCategorizedSortFilterProxyModel::CategoryDisplayRole);
0050         item->setData(interactor->category(), KCategorizedSortFilterProxyModel::CategorySortRole);
0051         m_baseModel->appendRow(item);
0052     }
0053     //setup model/view
0054     m_proxyModel->setSourceModel(m_baseModel);
0055     setModel(m_proxyModel);
0056     setItemDelegate(m_delegate);
0057     connect(m_delegate, &Palapeli::TriggerListDelegate::triggerChanged, this, &TriggerListView::associationsChanged);
0058 //  setCategoryDrawer(m_categoryDrawer); //FIXME: Why do I crash?
0059 }
0060 
0061 Palapeli::TriggerListView::~TriggerListView()
0062 {
0063     delete m_categoryDrawer;
0064 }
0065 
0066 void Palapeli::TriggerListView::getAssociations(QMap<QByteArray, Palapeli::Trigger>& associations)
0067 {
0068     for (int i = 0; i < m_baseModel->rowCount(); ++i)
0069     {
0070         QStandardItem* item = m_baseModel->item(i);
0071         const QByteArray interactor = item->data(Palapeli::InteractorRole).value<QByteArray>();
0072         const Palapeli::Trigger trigger = item->data(Palapeli::TriggerRole).value<Palapeli::Trigger>();
0073         if (trigger.isValid())
0074             associations.insert(interactor, trigger);
0075     }
0076 }
0077 
0078 void Palapeli::TriggerListView::setAssociations(const QMap<QByteArray, Palapeli::Trigger>& associations)
0079 {
0080     for (int i = 0; i < m_baseModel->rowCount(); ++i)
0081     {
0082         QStandardItem* item = m_baseModel->item(i);
0083         const QByteArray interactor = item->data(Palapeli::InteractorRole).value<QByteArray>();
0084         item->setData(QVariant::fromValue(associations.value(interactor)), Palapeli::TriggerRole);
0085     }
0086 }
0087 
0088 
0089 //
0090 
0091 #include "moc_triggerlistview.cpp"
0092 #include "moc_triggerlistview_p.cpp"