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