File indexing completed on 2024-05-05 05:48:58

0001 /*
0002     SPDX-FileCopyrightText: 2007 Nicolas Ternisien <nicolas.ternisien@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "view.h"
0008 
0009 #include <QDragEnterEvent>
0010 #include <QDropEvent>
0011 #include <QFileInfo>
0012 #include <QMimeData>
0013 
0014 #include <QPushButton>
0015 
0016 #include <QVBoxLayout>
0017 
0018 #include "ksystemlog_debug.h"
0019 
0020 #include "logViewWidget.h"
0021 
0022 #include "logViewFilterWidget.h"
0023 #include "logViewSearchWidget.h"
0024 
0025 #include "logLine.h"
0026 
0027 #include "ksystemlogConfig.h"
0028 
0029 #include "loadingBar.h"
0030 
0031 View::View(QWidget *parent)
0032     : QWidget(parent)
0033 {
0034     auto topLayout = new QVBoxLayout(this);
0035     topLayout->setContentsMargins(2, 2, 2, 2);
0036     topLayout->setSpacing(2);
0037 
0038     mLogViewFilterWidget = new LogViewFilterWidget(this);
0039     connect(mLogViewFilterWidget->filterLine(), &LogViewWidgetSearchLine::treeWidgetUpdated, this, &View::searchFilterChanged);
0040     connect(mLogViewFilterWidget->filterLine(), &LogViewWidgetSearchLine::treeWidgetUpdated, this, &View::unselectHiddenItems);
0041 
0042     mLogViewFilterWidget->setVisible(KSystemLogConfig::toggleFilterBar());
0043 
0044     topLayout->addWidget(mLogViewFilterWidget);
0045 
0046     mLogViewWidget = new LogViewWidget(this);
0047     connect(mLogViewWidget, &LogViewWidget::columnsChanged, mLogViewFilterWidget, &LogViewFilterWidget::updateFilterColumns);
0048 
0049     mLogViewFilterWidget->filterLine()->setTreeWidget(mLogViewWidget);
0050     topLayout->addWidget(mLogViewWidget);
0051 
0052     mLogViewSearchWidget = new LogViewSearchWidget();
0053     mLogViewSearchWidget->setTreeWidget(mLogViewWidget);
0054 
0055     // The search line is hidden by default
0056     mLogViewSearchWidget->hide();
0057 
0058     topLayout->addWidget(mLogViewSearchWidget);
0059 
0060     mLoadingBar = new LoadingBar(this);
0061     connect(mLoadingBar, &LoadingBar::displayed, this, &View::displayLoadingBar);
0062 
0063     topLayout->addWidget(mLoadingBar);
0064     mLoadingBar->hide();
0065 
0066     // Accept Drag and Drop
0067     setAcceptDrops(true);
0068 }
0069 
0070 View::~View()
0071 {
0072 }
0073 
0074 LogViewWidget *View::logViewWidget() const
0075 {
0076     return mLogViewWidget;
0077 }
0078 
0079 LoadingBar *View::loadingBar() const
0080 {
0081     return mLoadingBar;
0082 }
0083 
0084 void View::displayLoadingBar(bool display)
0085 {
0086     if (display) {
0087         mLogViewWidget->hide();
0088         mLogViewSearchWidget->hide();
0089         mLogViewFilterWidget->hide();
0090 
0091         mLoadingBar->show();
0092     } else {
0093         mLogViewWidget->show();
0094         mLogViewFilterWidget->setVisible(KSystemLogConfig::toggleFilterBar());
0095         mLogViewFilterWidget->filterLine()->updateSearch();
0096         // No need to redisplay the search bar
0097 
0098         mLoadingBar->hide();
0099     }
0100 }
0101 
0102 void View::toggleLogViewFilter(bool display)
0103 {
0104     if (display) {
0105         mLogViewFilterWidget->show();
0106     } else {
0107         mLogViewFilterWidget->filterLine()->clear();
0108         mLogViewFilterWidget->hide();
0109     }
0110 }
0111 
0112 void View::toggleLogViewSearch(bool display)
0113 {
0114     if (display) {
0115         mLogViewSearchWidget->displaySearch();
0116     } else {
0117         mLogViewSearchWidget->hide();
0118     }
0119 }
0120 
0121 LogViewSearchWidget *View::logViewSearch() const
0122 {
0123     return mLogViewSearchWidget;
0124 }
0125 
0126 void View::unselectHiddenItems()
0127 {
0128     QTreeWidgetItemIterator it(mLogViewWidget, QTreeWidgetItemIterator::Selected);
0129 
0130     while (*it) {
0131         QTreeWidgetItem *item = *it;
0132 
0133         if (item->isHidden()) {
0134             item->setSelected(false);
0135         }
0136 
0137         ++it;
0138     }
0139 }
0140 
0141 QSize View::sizeHint() const
0142 {
0143     return {500, 500};
0144 }
0145 
0146 void View::dropEvent(QDropEvent *event)
0147 {
0148     const QList<QUrl> urls = event->mimeData()->urls();
0149 
0150     // If URLs have been dropped
0151     if (!urls.isEmpty()) {
0152         Q_EMIT droppedUrls(urls);
0153     }
0154 }
0155 
0156 void View::dragEnterEvent(QDragEnterEvent *event)
0157 {
0158     const QList<QUrl> urls = event->mimeData()->urls();
0159 
0160     // If URLs have been dropped
0161     if (urls.isEmpty()) {
0162         qCWarning(KSYSTEMLOG) << "Empty drag and drop";
0163         return;
0164     }
0165 
0166     for (const QUrl &url : urls) {
0167         const QFileInfo fileInfo(url.toLocalFile());
0168 
0169         // TODO Add a recognition of binary files (using the Url mimetype) and refuse them
0170 
0171         if (!fileInfo.isReadable()) {
0172             qCWarning(KSYSTEMLOG) << "The drag and dropped file is not readable " << url.path();
0173             return;
0174         }
0175 
0176         if (fileInfo.isDir()) {
0177             qCWarning(KSYSTEMLOG) << "Tried to drag and drop a directory " << url.path();
0178             return;
0179         }
0180     }
0181 
0182     // Accept those urls
0183     event->acceptProposedAction();
0184 }
0185 
0186 #include "moc_view.cpp"