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 }