File indexing completed on 2024-05-19 11:21:40
0001 /* 0002 SPDX-License-Identifier: GPL-2.0-or-later 0003 SPDX-FileCopyrightText: 2020 Sirgienko Nikita <warquark@gmail.com> 0004 */ 0005 0006 #include "tocpanelplugin.h" 0007 0008 #include <cassert> 0009 #include <QListView> 0010 #include <QDebug> 0011 #include <QWidget> 0012 0013 #include <KPluginFactory> 0014 0015 TableOfContentPanelPlugin::TableOfContentPanelPlugin(QObject* parent, const QList<QVariant>& args): Cantor::PanelPlugin(parent), 0016 m_mainWidget(nullptr) 0017 { 0018 Q_UNUSED(args); 0019 } 0020 0021 TableOfContentPanelPlugin::~TableOfContentPanelPlugin() 0022 { 0023 if (m_mainWidget) 0024 { 0025 m_mainWidget->deleteLater(); 0026 } 0027 } 0028 0029 QWidget* TableOfContentPanelPlugin::widget() 0030 { 0031 if (!m_mainWidget) 0032 constructMainWidget(); 0033 0034 return m_mainWidget; 0035 } 0036 0037 void TableOfContentPanelPlugin::connectToShell(QObject* cantorShell) 0038 { 0039 connect(cantorShell, SIGNAL(hierarchyChanged(QStringList, QStringList, QList<int>)), this, SLOT(handleHierarchyChanges(QStringList, QStringList, QList<int>))); 0040 connect(this, SIGNAL(requestScrollToHierarchyEntry(QString)), cantorShell, SIGNAL(requestScrollToHierarchyEntry(QString))); 0041 connect(cantorShell, SIGNAL(hierarhyEntryNameChange(QString, QString, int)), this, SLOT(handleHierarhyEntryNameChange(QString, QString, int))); 0042 } 0043 0044 bool TableOfContentPanelPlugin::showOnStartup() 0045 { 0046 return false; 0047 } 0048 0049 void TableOfContentPanelPlugin::handleDoubleClicked(const QModelIndex& index) 0050 { 0051 qDebug() << "TableOfContentPanelPlugin::handleDoubleClicked"; 0052 const QString& searchStringIndex = m_hierarchyPositionStringList[index.row()]; 0053 emit requestScrollToHierarchyEntry(searchStringIndex); 0054 } 0055 0056 void TableOfContentPanelPlugin::constructMainWidget() 0057 { 0058 QListView* view = new QListView(m_mainWidget); 0059 view->setEditTriggers(QAbstractItemView::NoEditTriggers); 0060 view->setSelectionBehavior(QAbstractItemView::SelectItems); 0061 view->setModel(&m_model); 0062 0063 connect(view, &QListView::doubleClicked, this, &TableOfContentPanelPlugin::handleDoubleClicked); 0064 0065 m_mainWidget = view; 0066 } 0067 0068 void TableOfContentPanelPlugin::restoreState(const Cantor::PanelPlugin::State& state) 0069 { 0070 if (state.inners.size() == 2) 0071 { 0072 m_model.setStringList(state.inners[0].toStringList()); 0073 m_hierarchyPositionStringList = state.inners[1].toStringList(); 0074 } 0075 } 0076 0077 Cantor::PanelPlugin::State TableOfContentPanelPlugin::saveState() 0078 { 0079 Cantor::PanelPlugin::State state; 0080 0081 state.inners.append(m_model.stringList()); 0082 state.inners.append(m_hierarchyPositionStringList); 0083 0084 return state; 0085 } 0086 0087 void TableOfContentPanelPlugin::handleHierarchyChanges(QStringList names, QStringList searchStrings, QList<int> depths) 0088 { 0089 QStringList fullNames; 0090 0091 assert(names.size() == searchStrings.size() && names.size() == depths.size()); 0092 0093 int size = names.size(); 0094 for (int i = 0; i < size; i++) 0095 fullNames.append(QString::fromLatin1(" ").repeated(depths[i]) + searchStrings[i] + QLatin1String(" ") + names[i]); 0096 0097 m_model.setStringList(fullNames); 0098 m_hierarchyPositionStringList = searchStrings; 0099 } 0100 0101 void TableOfContentPanelPlugin::handleHierarhyEntryNameChange(QString name, QString searchString, int deapth) 0102 { 0103 int size = m_hierarchyPositionStringList.size(); 0104 for (int i = 0; i < size; i++) 0105 { 0106 if (m_hierarchyPositionStringList[i] == searchString) 0107 { 0108 QModelIndex index = m_model.index(i); 0109 const QString& fullName = QString::fromLatin1(" ").repeated(deapth) + searchString + QLatin1String(" ") + name; 0110 m_model.setData(index, fullName); 0111 } 0112 } 0113 } 0114 0115 K_PLUGIN_FACTORY_WITH_JSON(tocpanelplugin, "tocpanelplugin.json", registerPlugin<TableOfContentPanelPlugin>();) 0116 #include "tocpanelplugin.moc"