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 }