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 }