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

0001 /*
0002     SPDX-FileCopyrightText: 2009, 2010 Stefan Majewsky <majewsky@gmx.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "slicerselector.h"
0008 #include <Pala/Slicer>
0009 #include <Pala/SlicerJob>
0010 #include <Pala/SlicerMode>
0011 
0012 #include <KPluginFactory>
0013 #include <KPluginMetaData>
0014 
0015 Palapeli::SlicerSelector::SlicerSelector(QWidget* parent)
0016     : QTreeWidget(parent)
0017 {
0018     qRegisterMetaType<Palapeli::SlicerSelection>();
0019     setHeaderHidden(true);
0020     setSelectionBehavior(QAbstractItemView::SelectItems);
0021     setSelectionMode(QAbstractItemView::SingleSelection);
0022     connect(this, &SlicerSelector::itemSelectionChanged, this, &SlicerSelector::slotSelectionChanged);
0023     //load slicer plugins
0024     const QList<KPluginMetaData> offers = KPluginMetaData::findPlugins(QStringLiteral("palapelislicers"));
0025 
0026     for (const KPluginMetaData &offer : offers)
0027     {
0028         const QString pluginName = offer.pluginId();
0029         const QString slicerName = offer.name();
0030         Pala::Slicer* slicer = nullptr;
0031         if (auto plugin = KPluginFactory::instantiatePlugin<Pala::Slicer>(offer, nullptr).plugin) {
0032             slicer = plugin;
0033         } else {
0034             continue;
0035         }
0036         m_slicerInstances << slicer;
0037         //create item for this slicer
0038         QTreeWidgetItem* slicerItem = new QTreeWidgetItem(this);
0039         slicerItem->setData(0, Qt::DisplayRole, slicerName);
0040         //scan mode list
0041         const QList<const Pala::SlicerMode*> modes = slicer->modes();
0042         if (modes.isEmpty())
0043         {
0044             //no modes - make slicer item selectable (i.e. fallback to list-like behavior)
0045             slicerItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
0046             Palapeli::SlicerSelection sel(pluginName, slicer);
0047             m_knownSelections << sel;
0048             //the index in m_knownSelections is recorded in Qt::UserRole to map selected items to SlicerSelections
0049             slicerItem->setData(0, Qt::UserRole, m_knownSelections.count() - 1);
0050         }
0051         else
0052         {
0053             //slicer has modes - require to select a specific mode
0054             slicerItem->setFlags(Qt::ItemIsEnabled);
0055             for (const Pala::SlicerMode* mode : modes)
0056             {
0057                 QTreeWidgetItem* modeItem = new QTreeWidgetItem(slicerItem);
0058                 modeItem->setData(0, Qt::DisplayRole, mode->name());
0059                 Palapeli::SlicerSelection sel(pluginName, slicer, mode);
0060                 m_knownSelections << sel;
0061                 //the index in m_knownSelections is recorded in Qt::UserRole to map selected items to SlicerSelections
0062                 modeItem->setData(0, Qt::UserRole, m_knownSelections.count() - 1);
0063             }
0064         }
0065     }
0066     //always show everything
0067     setItemsExpandable(false);
0068     expandAll();
0069 }
0070 
0071 Palapeli::SlicerSelector::~SlicerSelector()
0072 {
0073     qDeleteAll(m_slicerInstances);
0074 }
0075 
0076 QList<const Pala::Slicer*> Palapeli::SlicerSelector::slicers() const
0077 {
0078     QList<const Pala::Slicer*> result;
0079     for (Pala::Slicer* slicer : m_slicerInstances)
0080         result << slicer;
0081     return result;
0082 }
0083 
0084 Palapeli::SlicerSelection Palapeli::SlicerSelector::currentSelection() const
0085 {
0086     QTreeWidgetItem* item = selectedItems().value(0);
0087     if (item)
0088     {
0089         const QVariant selIndex = item->data(0, Qt::UserRole);
0090         if (selIndex.metaType().id() == QMetaType::Int)
0091             return m_knownSelections.value(selIndex.toInt());
0092     }
0093     //empty or invalid selection
0094     return Palapeli::SlicerSelection();
0095 }
0096 
0097 void Palapeli::SlicerSelector::slotSelectionChanged()
0098 {
0099     Q_EMIT currentSelectionChanged(currentSelection());
0100 }
0101 
0102 #include "moc_slicerselector.cpp"