File indexing completed on 2024-05-05 17:56:53

0001 /*
0002     SPDX-FileCopyrightText: 2004 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "diskusagegui.h"
0009 
0010 // QtCore
0011 #include <QTimer>
0012 // QtGui
0013 #include <QResizeEvent>
0014 // QtWidgets
0015 #include <QDialogButtonBox>
0016 #include <QGridLayout>
0017 #include <QHBoxLayout>
0018 #include <QLabel>
0019 
0020 #include <KConfigCore/KSharedConfig>
0021 #include <KI18n/KLocalizedString>
0022 
0023 #include "../Dialogs/krdialogs.h"
0024 #include "../FileSystem/filesystem.h"
0025 #include "../compat.h"
0026 #include "../icon.h"
0027 #include "../krglobal.h"
0028 
0029 DiskUsageGUI::DiskUsageGUI(const QUrl &openDir)
0030     : QDialog(nullptr)
0031     , exitAtFailure(true)
0032 {
0033     setWindowTitle(i18n("Krusader::Disk Usage"));
0034     setAttribute(Qt::WA_DeleteOnClose);
0035 
0036     baseDirectory = openDir;
0037 
0038     auto *mainLayout = new QVBoxLayout;
0039     setLayout(mainLayout);
0040 
0041     auto *duGrid = new QGridLayout();
0042     duGrid->setSpacing(6);
0043     duGrid->setContentsMargins(11, 11, 11, 11);
0044 
0045     QWidget *duTools = new QWidget(this);
0046     auto *duHBox = new QHBoxLayout(duTools);
0047     duHBox->setContentsMargins(0, 0, 0, 0);
0048     duTools->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
0049 
0050     btnNewSearch = new QToolButton(duTools);
0051     btnNewSearch->setIcon(Icon("document-open"));
0052     duHBox->addWidget(btnNewSearch);
0053     btnNewSearch->setToolTip(i18n("Start new disk usage search"));
0054 
0055     btnRefresh = new QToolButton(duTools);
0056     btnRefresh->setIcon(Icon("view-refresh"));
0057     duHBox->addWidget(btnRefresh);
0058     btnRefresh->setToolTip(i18n("Refresh"));
0059 
0060     btnDirUp = new QToolButton(duTools);
0061     btnDirUp->setIcon(Icon("go-up"));
0062     duHBox->addWidget(btnDirUp);
0063     btnDirUp->setToolTip(i18n("Parent folder"));
0064 
0065     QWidget *separatorWidget = new QWidget(duTools);
0066     separatorWidget->setMinimumWidth(10);
0067     duHBox->addWidget(separatorWidget);
0068 
0069     btnLines = new QToolButton(duTools);
0070     btnLines->setIcon(Icon("view-list-details"));
0071     btnLines->setCheckable(true);
0072     duHBox->addWidget(btnLines);
0073     btnLines->setToolTip(i18n("Line view"));
0074 
0075     btnDetailed = new QToolButton(duTools);
0076     btnDetailed->setIcon(Icon("view-list-tree"));
0077     btnDetailed->setCheckable(true);
0078     duHBox->addWidget(btnDetailed);
0079     btnDetailed->setToolTip(i18n("Detailed view"));
0080 
0081     btnFilelight = new QToolButton(duTools);
0082     btnFilelight->setIcon(Icon("kr_diskusage"));
0083     btnFilelight->setCheckable(true);
0084     duHBox->addWidget(btnFilelight);
0085     btnFilelight->setToolTip(i18n("Filelight view"));
0086 
0087     QWidget *spacerWidget = new QWidget(duTools);
0088     duHBox->addWidget(spacerWidget);
0089     auto *hboxlayout = new QHBoxLayout(spacerWidget);
0090     auto *spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
0091     hboxlayout->addItem(spacer);
0092 
0093     duGrid->addWidget(duTools, 0, 0);
0094 
0095     diskUsage = new DiskUsage("DiskUsage", this);
0096     duGrid->addWidget(diskUsage, 1, 0);
0097 
0098     status = new KSqueezedTextLabel(this);
0099     duGrid->addWidget(status, 2, 0);
0100 
0101     mainLayout->addLayout(duGrid);
0102 
0103     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
0104     mainLayout->addWidget(buttonBox);
0105 
0106     connect(buttonBox, &QDialogButtonBox::rejected, this, &DiskUsageGUI::close);
0107     connect(diskUsage, &DiskUsage::status, this, &DiskUsageGUI::slotStatus);
0108     connect(diskUsage, &DiskUsage::viewChanged, this, &DiskUsageGUI::slotViewChanged);
0109     connect(diskUsage, &DiskUsage::newSearch, this, &DiskUsageGUI::askDir);
0110     connect(diskUsage, &DiskUsage::loadFinished, this, &DiskUsageGUI::slotLoadFinished);
0111     connect(btnNewSearch, &QToolButton::clicked, this, &DiskUsageGUI::askDir);
0112     connect(btnRefresh, &QToolButton::clicked, this, &DiskUsageGUI::slotLoadUsageInfo);
0113     connect(btnDirUp, &QToolButton::clicked, diskUsage, &DiskUsage::dirUp);
0114     connect(btnLines, &QToolButton::clicked, this, &DiskUsageGUI::slotSelectLinesView);
0115     connect(btnDetailed, &QToolButton::clicked, this, &DiskUsageGUI::slotSelectListView);
0116     connect(btnFilelight, &QToolButton::clicked, this, &DiskUsageGUI::slotSelectFilelightView);
0117 
0118     KConfigGroup group(krConfig, "DiskUsage");
0119 
0120     int view = group.readEntry("View", VIEW_LINES);
0121     if (view < VIEW_LINES || view > VIEW_FILELIGHT)
0122         view = VIEW_LINES;
0123 
0124     diskUsage->setView(view);
0125 
0126     sizeX = group.readEntry("Window Width", QFontMetrics(font()).horizontalAdvance("W") * 70);
0127     sizeY = group.readEntry("Window Height", QFontMetrics(font()).height() * 25);
0128     resize(sizeX, sizeY);
0129 
0130     if (group.readEntry("Window Maximized", false)) {
0131         setWindowState(windowState() | Qt::WindowMaximized);
0132     }
0133 }
0134 
0135 void DiskUsageGUI::askDirAndShow()
0136 {
0137     if (askDir()) {
0138         show();
0139     }
0140 }
0141 
0142 void DiskUsageGUI::slotLoadFinished(bool result)
0143 {
0144     if (exitAtFailure && !result) {
0145         close();
0146     } else {
0147         exitAtFailure = false;
0148     }
0149 }
0150 
0151 void DiskUsageGUI::enableButtons(bool isOn)
0152 {
0153     btnNewSearch->setEnabled(isOn);
0154     btnRefresh->setEnabled(isOn);
0155     btnDirUp->setEnabled(isOn);
0156     btnLines->setEnabled(isOn);
0157     btnDetailed->setEnabled(isOn);
0158     btnFilelight->setEnabled(isOn);
0159 }
0160 
0161 void DiskUsageGUI::resizeEvent(QResizeEvent *e)
0162 {
0163     if (!isMaximized()) {
0164         sizeX = e->size().width();
0165         sizeY = e->size().height();
0166     }
0167     QDialog::resizeEvent(e);
0168 }
0169 
0170 void DiskUsageGUI::closeEvent(QCloseEvent *event)
0171 {
0172     KConfigGroup group(krConfig, "DiskUsage");
0173     group.writeEntry("Window Width", sizeX);
0174     group.writeEntry("Window Height", sizeY);
0175     group.writeEntry("Window Maximized", isMaximized());
0176     group.writeEntry("View", diskUsage->getActiveView());
0177 
0178     event->accept();
0179 }
0180 
0181 void DiskUsageGUI::slotLoadUsageInfo()
0182 {
0183     diskUsage->load(baseDirectory);
0184 }
0185 
0186 void DiskUsageGUI::slotStatus(const QString &stat)
0187 {
0188     status->setText(stat);
0189 }
0190 
0191 void DiskUsageGUI::slotViewChanged(int view)
0192 {
0193     if (view == VIEW_LOADER) {
0194         enableButtons(false);
0195         return;
0196     }
0197     enableButtons(true);
0198 
0199     btnLines->setChecked(false);
0200     btnDetailed->setChecked(false);
0201     btnFilelight->setChecked(false);
0202 
0203     switch (view) {
0204     case VIEW_LINES:
0205         btnLines->setChecked(true);
0206         break;
0207     case VIEW_DETAILED:
0208         btnDetailed->setChecked(true);
0209         break;
0210     case VIEW_FILELIGHT:
0211         btnFilelight->setChecked(true);
0212         break;
0213     case VIEW_LOADER:
0214         break;
0215     }
0216 }
0217 
0218 bool DiskUsageGUI::askDir()
0219 {
0220     // ask the user for the copy destX
0221     const QUrl newDir = KChooseDir::getDir(i18n("Viewing the usage of folder:"), baseDirectory, baseDirectory);
0222 
0223     if (newDir.isEmpty())
0224         return false;
0225 
0226     baseDirectory = newDir;
0227 
0228     QTimer::singleShot(0, this, &DiskUsageGUI::slotLoadUsageInfo);
0229     return true;
0230 }