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 "dufilelight.h"
0009 #include "radialMap/radialMap.h"
0010 
0011 // QtGui
0012 #include <QMouseEvent>
0013 #include <QPixmap>
0014 // QtWidgets
0015 #include <QInputDialog>
0016 #include <QMenu>
0017 
0018 #include <KI18n/KLocalizedString>
0019 
0020 #define SCHEME_POPUP_ID 6730
0021 
0022 DUFilelight::DUFilelight(DiskUsage *usage)
0023     : RadialMap::Widget(usage)
0024     , diskUsage(usage)
0025     , currentDir(nullptr)
0026     , refreshNeeded(true)
0027 {
0028     //     setFocusPolicy(Qt::StrongFocus);
0029 
0030     connect(diskUsage, &DiskUsage::enteringDirectory, this, &DUFilelight::slotDirChanged);
0031     connect(diskUsage, &DiskUsage::clearing, this, &DUFilelight::clear);
0032     connect(diskUsage, &DiskUsage::changed, this, &DUFilelight::slotChanged);
0033     connect(diskUsage, &DiskUsage::deleted, this, &DUFilelight::slotChanged);
0034     connect(diskUsage, &DiskUsage::changeFinished, this, &DUFilelight::slotRefresh);
0035     connect(diskUsage, &DiskUsage::deleteFinished, this, &DUFilelight::slotRefresh);
0036     connect(diskUsage, &DiskUsage::currentChanged, this, &DUFilelight::slotAboutToShow);
0037 }
0038 
0039 void DUFilelight::slotDirChanged(Directory *dir)
0040 {
0041     if (diskUsage->currentWidget() != this)
0042         return;
0043 
0044     if (currentDir != dir) {
0045         currentDir = dir;
0046 
0047         invalidate(false);
0048         create(dir);
0049         refreshNeeded = false;
0050     }
0051 }
0052 
0053 void DUFilelight::clear()
0054 {
0055     invalidate(false);
0056     currentDir = nullptr;
0057 }
0058 
0059 File *DUFilelight::getCurrentFile()
0060 {
0061     const RadialMap::Segment *focus = focusSegment();
0062 
0063     if (!focus || focus->isFake() || focus->file() == currentDir)
0064         return nullptr;
0065 
0066     return const_cast<File *>(focus->file());
0067 }
0068 
0069 void DUFilelight::mousePressEvent(QMouseEvent *event)
0070 {
0071     if (event->button() == Qt::RightButton) {
0072         File *file = nullptr;
0073 
0074         const RadialMap::Segment *focus = focusSegment();
0075 
0076         if (focus && !focus->isFake() && focus->file() != currentDir)
0077             file = const_cast<File *>(focus->file());
0078 
0079         QMenu filelightPopup;
0080         filelightPopup.addAction(i18n("Zoom In"), this, SLOT(zoomIn()), Qt::Key_Plus);
0081         filelightPopup.addAction(i18n("Zoom Out"), this, SLOT(zoomOut()), Qt::Key_Minus);
0082 
0083         QMenu schemePopup;
0084         schemePopup.addAction(i18n("Rainbow"), this, SLOT(schemeRainbow()));
0085         schemePopup.addAction(i18n("High Contrast"), this, SLOT(schemeHighContrast()));
0086         schemePopup.addAction(i18n("KDE"), this, SLOT(schemeKDE()));
0087 
0088         filelightPopup.addMenu(&schemePopup);
0089         schemePopup.setTitle(i18n("Scheme"));
0090 
0091         filelightPopup.addAction(i18n("Increase contrast"), this, SLOT(increaseContrast()));
0092         filelightPopup.addAction(i18n("Decrease contrast"), this, SLOT(decreaseContrast()));
0093 
0094         QAction *act = filelightPopup.addAction(i18n("Use anti-aliasing"), this, SLOT(changeAntiAlias()));
0095         act->setCheckable(true);
0096         act->setChecked(Filelight::Config::antiAliasFactor > 1);
0097 
0098         act = filelightPopup.addAction(i18n("Show small files"), this, SLOT(showSmallFiles()));
0099         act->setCheckable(true);
0100         act->setChecked(Filelight::Config::showSmallFiles);
0101 
0102         act = filelightPopup.addAction(i18n("Vary label font sizes"), this, SLOT(varyLabelFontSizes()));
0103         act->setCheckable(true);
0104         act->setChecked(Filelight::Config::varyLabelFontSizes);
0105 
0106         filelightPopup.addAction(i18n("Minimum font size"), this, SLOT(minFontSize()));
0107 
0108         diskUsage->rightClickMenu(event->globalPos(), file, &filelightPopup, i18n("Filelight"));
0109         return;
0110     } else if (event->button() == Qt::LeftButton) {
0111         const RadialMap::Segment *focus = focusSegment();
0112 
0113         if (focus && !focus->isFake() && focus->file() == currentDir) {
0114             diskUsage->dirUp();
0115             return;
0116         } else if (focus && !focus->isFake() && focus->file()->isDir()) {
0117             // NOTE: unsafe removable of constness here when casting
0118             diskUsage->changeDirectory(static_cast<Directory *>(const_cast<File *>(focus->file())));
0119             return;
0120         }
0121     }
0122 
0123     RadialMap::Widget::mousePressEvent(event);
0124 }
0125 
0126 void DUFilelight::setScheme(Filelight::MapScheme scheme)
0127 {
0128     Filelight::Config::scheme = scheme;
0129     Filelight::Config::write();
0130     slotRefresh();
0131 }
0132 
0133 void DUFilelight::increaseContrast()
0134 {
0135     if ((Filelight::Config::contrast += 10) > 100)
0136         Filelight::Config::contrast = 100;
0137 
0138     Filelight::Config::write();
0139     slotRefresh();
0140 }
0141 
0142 void DUFilelight::decreaseContrast()
0143 {
0144     if ((Filelight::Config::contrast -= 10) > 100)
0145         Filelight::Config::contrast = 0;
0146 
0147     Filelight::Config::write();
0148     slotRefresh();
0149 }
0150 
0151 void DUFilelight::changeAntiAlias()
0152 {
0153     Filelight::Config::antiAliasFactor = 1 + (Filelight::Config::antiAliasFactor == 1);
0154     Filelight::Config::write();
0155     slotRefresh();
0156 }
0157 
0158 void DUFilelight::showSmallFiles()
0159 {
0160     Filelight::Config::showSmallFiles = !Filelight::Config::showSmallFiles;
0161     Filelight::Config::write();
0162     slotRefresh();
0163 }
0164 
0165 void DUFilelight::varyLabelFontSizes()
0166 {
0167     Filelight::Config::varyLabelFontSizes = !Filelight::Config::varyLabelFontSizes;
0168     Filelight::Config::write();
0169     slotRefresh();
0170 }
0171 
0172 void DUFilelight::minFontSize()
0173 {
0174     bool ok = false;
0175 
0176     int result = QInputDialog::getInt(this, i18n("Krusader::Filelight"), i18n("Minimum font size"), (int)Filelight::Config::minFontPitch, 1, 100, 1, &ok);
0177 
0178     if (ok) {
0179         Filelight::Config::minFontPitch = (uint)result;
0180 
0181         Filelight::Config::write();
0182         slotRefresh();
0183     }
0184 }
0185 
0186 void DUFilelight::slotAboutToShow(int ndx)
0187 {
0188     QWidget *widget = diskUsage->widget(ndx);
0189     if (widget == this && (diskUsage->getCurrentDir() != currentDir || refreshNeeded)) {
0190         refreshNeeded = false;
0191         if ((currentDir = diskUsage->getCurrentDir()) != nullptr) {
0192             invalidate(false);
0193             create(currentDir);
0194         }
0195     }
0196 }
0197 
0198 void DUFilelight::slotRefresh()
0199 {
0200     if (diskUsage->currentWidget() != this)
0201         return;
0202 
0203     refreshNeeded = false;
0204     if (currentDir && currentDir == diskUsage->getCurrentDir()) {
0205         invalidate(false);
0206         create(currentDir);
0207     }
0208 }
0209 
0210 void DUFilelight::slotChanged(File *)
0211 {
0212     if (!refreshNeeded)
0213         refreshNeeded = true;
0214 }