File indexing completed on 2024-05-12 05:54:33

0001 /*
0002     SPDX-FileCopyrightText: 2005 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2005-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "diskusageviewer.h"
0009 
0010 // QtWidgets
0011 #include <QGridLayout>
0012 #include <QLabel>
0013 
0014 #include <KConfigCore/KSharedConfig>
0015 #include <utility>
0016 
0017 #include "../FileSystem/filesystem.h"
0018 #include "../Panel/krpanel.h"
0019 #include "../Panel/panelfunc.h"
0020 #include "../krglobal.h"
0021 
0022 DiskUsageViewer::DiskUsageViewer(QWidget *parent)
0023     : QWidget(parent)
0024     , diskUsage(nullptr)
0025     , statusLabel(nullptr)
0026 {
0027     layout = new QGridLayout(this);
0028     layout->setContentsMargins(0, 0, 0, 0);
0029 }
0030 
0031 DiskUsageViewer::~DiskUsageViewer()
0032 {
0033     if (diskUsage) {
0034         KConfigGroup group(krConfig, "DiskUsageViewer");
0035         group.writeEntry("View", diskUsage->getActiveView());
0036         delete diskUsage;
0037     }
0038 }
0039 
0040 void DiskUsageViewer::openUrl(QUrl url)
0041 {
0042     if (diskUsage == nullptr) {
0043         diskUsage = new DiskUsage("DiskUsageViewer", this);
0044 
0045         connect(diskUsage, &DiskUsage::enteringDirectory, this, [=]() {
0046             slotUpdateStatus();
0047         });
0048         connect(diskUsage, &DiskUsage::status, this, &DiskUsageViewer::slotUpdateStatus);
0049         connect(diskUsage, &DiskUsage::newSearch, this, &DiskUsageViewer::slotNewSearch);
0050         layout->addWidget(diskUsage, 0, 0);
0051         this->show();
0052         diskUsage->show();
0053 
0054         KConfigGroup group(krConfig, "DiskUsageViewer");
0055         int view = group.readEntry("View", VIEW_FILELIGHT);
0056         if (view < VIEW_LINES || view > VIEW_FILELIGHT)
0057             view = VIEW_FILELIGHT;
0058         diskUsage->setView(view);
0059     }
0060 
0061     url.setPath(url.adjusted(QUrl::StripTrailingSlash).path());
0062 
0063     QUrl baseURL = diskUsage->getBaseURL();
0064     if (!diskUsage->isLoading() && !baseURL.isEmpty()) {
0065         if (url.scheme() == baseURL.scheme() && (url.host().isEmpty() || url.host() == baseURL.host())) {
0066             QString baseStr = FileSystem::ensureTrailingSlash(baseURL).path();
0067             QString urlStr = FileSystem::ensureTrailingSlash(url).path();
0068 
0069             if (urlStr.startsWith(baseStr)) {
0070                 QString relURL = urlStr.mid(baseStr.length());
0071                 if (relURL.endsWith('/'))
0072                     relURL.truncate(relURL.length() - 1);
0073 
0074                 Directory *dir = diskUsage->getDirectory(relURL);
0075                 if (dir) {
0076                     diskUsage->changeDirectory(dir);
0077                     return;
0078                 }
0079             }
0080         }
0081     }
0082     diskUsage->load(url);
0083 }
0084 
0085 void DiskUsageViewer::closeUrl()
0086 {
0087     if (diskUsage)
0088         diskUsage->close();
0089 }
0090 
0091 void DiskUsageViewer::setStatusLabel(QLabel *statLabel, QString pref)
0092 {
0093     statusLabel = statLabel;
0094     prefix = std::move(pref);
0095 }
0096 
0097 void DiskUsageViewer::slotUpdateStatus(QString status)
0098 {
0099     if (statusLabel) {
0100         if (status.isEmpty()) {
0101             Directory *dir = diskUsage->getCurrentDir();
0102             if (dir)
0103                 status = prefix + dir->name() + "  [" + KIO::convertSize(dir->size()) + ']';
0104         }
0105         statusLabel->setText(status);
0106     }
0107 }
0108 
0109 void DiskUsageViewer::slotNewSearch()
0110 {
0111     diskUsage->load(ACTIVE_PANEL->virtualPath());
0112 }