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"