File indexing completed on 2024-05-05 16:45:57
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"