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"