File indexing completed on 2024-04-28 05:46:36
0001 /* 0002 SPDX-FileCopyrightText: 2009-2010 Volker Lanz <vl@fidra.de> 0003 SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu> 0004 0005 SPDX-License-Identifier: GPL-3.0-or-later 0006 */ 0007 0008 #include "gui/treelog.h" 0009 #include "gui/partitionmanagerwidget.h" 0010 #include "util/guihelpers.h" 0011 #include "config.h" 0012 0013 #include <util/globallog.h> 0014 0015 #include <QDateTime> 0016 #include <QDebug> 0017 #include <QFile> 0018 #include <QFileDialog> 0019 #include <QTemporaryFile> 0020 #include <QTextStream> 0021 #include <QTreeWidget> 0022 #include <QTreeWidgetItem> 0023 0024 #include <KIO/CopyJob> 0025 #include <KJobUiDelegate> 0026 #include <KLocalizedString> 0027 #include <KMessageBox> 0028 0029 /** Creates a new TreeLog instance. 0030 @param parent the parent widget 0031 */ 0032 TreeLog::TreeLog(QWidget* parent) : 0033 QWidget(parent), 0034 Ui::TreeLogBase() 0035 { 0036 setupUi(this); 0037 0038 treeLog().header()->setContextMenuPolicy(Qt::CustomContextMenu); 0039 connect(treeLog().header(), &QHeaderView::customContextMenuRequested, this, &TreeLog::onHeaderContextMenu); 0040 0041 } 0042 0043 TreeLog::~TreeLog() 0044 { 0045 saveConfig(); 0046 } 0047 0048 void TreeLog::init() 0049 { 0050 loadConfig(); 0051 } 0052 0053 void TreeLog::loadConfig() 0054 { 0055 QList<int> colWidths = Config::treeLogColumnWidths(); 0056 QList<int> colPositions = Config::treeLogColumnPositions(); 0057 QList<int> colVisible = Config::treeLogColumnVisible(); 0058 QHeaderView* header = treeLog().header(); 0059 0060 for (int i = 0; i < treeLog().columnCount(); i++) { 0061 if (colPositions[0] != -1 && colPositions.size() > i) 0062 header->moveSection(header->visualIndex(i), colPositions[i]); 0063 0064 if (colVisible[0] != -1 && colVisible.size() > i) 0065 treeLog().setColumnHidden(i, colVisible[i] == 0); 0066 0067 if (colWidths[0] != -1 && colWidths.size() > i) 0068 treeLog().setColumnWidth(i, colWidths[i]); 0069 } 0070 } 0071 0072 void TreeLog::saveConfig() const 0073 { 0074 QList<int> colWidths; 0075 QList<int> colPositions; 0076 QList<int> colVisible; 0077 0078 for (int i = 0; i < treeLog().columnCount(); i++) { 0079 colPositions.append(treeLog().header()->visualIndex(i)); 0080 colVisible.append(treeLog().isColumnHidden(i) ? 0 : 1); 0081 colWidths.append(treeLog().columnWidth(i)); 0082 } 0083 0084 Config::setTreeLogColumnPositions(colPositions); 0085 Config::setTreeLogColumnVisible(colVisible); 0086 Config::setTreeLogColumnWidths(colWidths); 0087 0088 Config::self()->save(); 0089 } 0090 0091 void TreeLog::onHeaderContextMenu(const QPoint& pos) 0092 { 0093 showColumnsContextMenu(pos, treeLog()); 0094 } 0095 0096 void TreeLog::onClearLog() 0097 { 0098 while (QTreeWidgetItem* item = treeLog().takeTopLevelItem(0)) 0099 delete item; 0100 } 0101 0102 void TreeLog::onSaveLog() 0103 { 0104 const QUrl url = QFileDialog::getSaveFileUrl(); 0105 0106 if (!url.isEmpty()) { 0107 QTemporaryFile tempFile; 0108 0109 if (!tempFile.open()) { 0110 KMessageBox::error(this, xi18nc("@info", "Could not create temporary output file to save <filename>%1</filename>.", url.fileName()), xi18nc("@title:window", "Error Saving Log File")); 0111 return; 0112 } 0113 0114 QTextStream stream(&tempFile); 0115 0116 for (qint32 idx = 0; idx < treeLog().topLevelItemCount(); idx++) { 0117 QTreeWidgetItem* item = treeLog().topLevelItem(idx); 0118 stream << item->text(1) << ": " << item->text(2) << "\n"; 0119 } 0120 0121 tempFile.close(); 0122 0123 KIO::CopyJob* job = KIO::move(QUrl::fromLocalFile(tempFile.fileName()), url, KIO::HideProgressInfo); 0124 job->exec(); 0125 if (job->error()) 0126 job->uiDelegate()->showErrorMessage(); 0127 } 0128 } 0129 0130 void TreeLog::onNewLogMessage(Log::Level logLevel, const QString& s) 0131 { 0132 static const QString icons[] = { 0133 QStringLiteral("tools-report-bug"), 0134 QStringLiteral("dialog-information"), 0135 QStringLiteral("dialog-warning"), 0136 QStringLiteral("dialog-error") 0137 }; 0138 0139 qDebug() << s; 0140 0141 if (static_cast<int>(logLevel) >= Config::minLogLevel()) { 0142 QTreeWidgetItem* item = new QTreeWidgetItem(); 0143 0144 item->setIcon(0, QIcon::fromTheme(icons[static_cast<int>(logLevel)])); 0145 item->setText(1, QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd hh:mm:ss"))); 0146 item->setText(2, s); 0147 0148 treeLog().addTopLevelItem(item); 0149 treeLog().scrollToBottom(); 0150 } 0151 }