File indexing completed on 2024-05-05 04:40:04

0001 /*
0002     SPDX-FileCopyrightText: 2010 Benjamin Port <port.benjamin@gmail.com>
0003     SPDX-FileCopyrightText: 2010 Yannick Motta <yannick.motta@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "manpagedocumentationwidget.h"
0009 #include "manpagedocumentation.h"
0010 #include "manpageplugin.h"
0011 #include <QProgressBar>
0012 #include <QLabel>
0013 #include <QVBoxLayout>
0014 #include <KLocalizedString>
0015 #include <QEvent>
0016 #include <QHeaderView>
0017 #include <QTreeView>
0018 
0019 ManPageDocumentationWidget::ManPageDocumentationWidget(QWidget *parent)
0020     : QStackedWidget(parent)
0021     , m_loadingWidget(nullptr)
0022 {
0023     ManPageModel* model = ManPageDocumentation::s_provider->model();
0024     m_treeView = new QTreeView(this);
0025     m_treeView->viewport()->installEventFilter(this);
0026     m_treeView->header()->setVisible(false);
0027     connect(m_treeView, &QTreeView::clicked, model, &ManPageModel::showItem);
0028     addWidget(m_treeView);
0029     if(!model->isLoaded()){
0030         m_loadingWidget = new QWidget(this);
0031         m_progressBar = new QProgressBar(m_loadingWidget);
0032         m_statusLabel = new QLabel(i18n("Loading man pages..."));
0033         if(model->sectionCount() == 0){
0034             connect(model, &ManPageModel::sectionListUpdated, this, &ManPageDocumentationWidget::sectionListUpdated );
0035         } else {
0036             sectionListUpdated();
0037         }
0038         connect(model, &ManPageModel::sectionParsed, this, &ManPageDocumentationWidget::sectionParsed );
0039         connect(model, &ManPageModel::manPagesLoaded, this, &ManPageDocumentationWidget::manIndexLoaded);
0040         connect(model, &ManPageModel::error, this, &ManPageDocumentationWidget::handleError);
0041         m_statusLabel->setAlignment(Qt::AlignHCenter);
0042         auto* layout = new QVBoxLayout();
0043         layout->addWidget(m_statusLabel);
0044         layout->addWidget(m_progressBar);
0045         layout->addStretch();
0046         m_loadingWidget->setLayout(layout);
0047         addWidget(m_loadingWidget);
0048         setCurrentWidget(m_loadingWidget);
0049         if(model->hasError())
0050             handleError(model->errorString());
0051     } else {
0052         manIndexLoaded();
0053     }
0054 
0055 }
0056 
0057 void ManPageDocumentationWidget::manIndexLoaded()
0058 {
0059     ManPageModel* model = ManPageDocumentation::s_provider->model();
0060     m_treeView->setModel(model);
0061     setCurrentWidget(m_treeView);
0062     if(m_loadingWidget){
0063         removeWidget(m_loadingWidget);
0064         delete m_loadingWidget;
0065         m_loadingWidget = nullptr;
0066     }
0067 }
0068 
0069 void ManPageDocumentationWidget::sectionListUpdated()
0070 {
0071     ManPageModel* model = ManPageDocumentation::s_provider->model();
0072     m_progressBar->setRange(0, model->sectionCount());
0073 }
0074 
0075 void ManPageDocumentationWidget::sectionParsed()
0076 {
0077     ManPageModel* model = ManPageDocumentation::s_provider->model();
0078     m_progressBar->setValue(model->nbSectionLoaded());
0079 }
0080 
0081 void ManPageDocumentationWidget::handleError(const QString& errorString)
0082 {
0083     delete m_progressBar;
0084     m_progressBar = nullptr;
0085     m_statusLabel->setWordWrap(true);
0086     m_statusLabel->setText(i18n("Error while loading man pages:\n%1", errorString));
0087 }
0088 
0089 bool ManPageDocumentationWidget::eventFilter(QObject* watched, QEvent* event)
0090 {
0091     if (event->type() == QEvent::MouseButtonPress)
0092         event->ignore(); // Propagate to DocumentationView
0093     return QStackedWidget::eventFilter(watched, event);
0094 }
0095 
0096 #include "moc_manpagedocumentationwidget.cpp"