File indexing completed on 2024-05-12 17:18:55

0001 /*
0002  * SPDX-FileCopyrightText: 2008-2011 Peter Penz <peter.penz19@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "viewsettingstab.h"
0008 
0009 #include "dolphin_compactmodesettings.h"
0010 #include "dolphin_detailsmodesettings.h"
0011 #include "dolphin_iconsmodesettings.h"
0012 #include "dolphinfontrequester.h"
0013 #include "global.h"
0014 #include "settings/viewmodes/viewmodesettings.h"
0015 #include "views/zoomlevelinfo.h"
0016 
0017 #include <KLocalizedString>
0018 
0019 #include <QApplication>
0020 #include <QButtonGroup>
0021 #include <QCheckBox>
0022 #include <QComboBox>
0023 #include <QFormLayout>
0024 #include <QHelpEvent>
0025 #include <QRadioButton>
0026 #include <QSpinBox>
0027 
0028 ViewSettingsTab::ViewSettingsTab(Mode mode, QWidget *parent)
0029     : SettingsPageBase(parent)
0030     , m_mode(mode)
0031     , m_defaultSizeSlider(nullptr)
0032     , m_previewSizeSlider(nullptr)
0033     , m_fontRequester(nullptr)
0034     , m_widthBox(nullptr)
0035     , m_maxLinesBox(nullptr)
0036     , m_expandableFolders(nullptr)
0037 {
0038     QFormLayout *topLayout = new QFormLayout(this);
0039 
0040     // Create "Icon Size" section
0041     const int minRange = ZoomLevelInfo::minimumLevel();
0042     const int maxRange = ZoomLevelInfo::maximumLevel();
0043 
0044     m_defaultSizeSlider = new QSlider(Qt::Horizontal);
0045     m_defaultSizeSlider->setPageStep(1);
0046     m_defaultSizeSlider->setTickPosition(QSlider::TicksBelow);
0047     m_defaultSizeSlider->setRange(minRange, maxRange);
0048     connect(m_defaultSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::slotDefaultSliderMoved);
0049     topLayout->addRow(i18nc("@label:listbox", "Default icon size:"), m_defaultSizeSlider);
0050 
0051     m_previewSizeSlider = new QSlider(Qt::Horizontal);
0052     m_previewSizeSlider->setPageStep(1);
0053     m_previewSizeSlider->setTickPosition(QSlider::TicksBelow);
0054     m_previewSizeSlider->setRange(minRange, maxRange);
0055     connect(m_previewSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::slotPreviewSliderMoved);
0056     topLayout->addRow(i18nc("@label:listbox", "Preview icon size:"), m_previewSizeSlider);
0057 
0058     topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed));
0059 
0060     // Create "Label" section
0061     m_fontRequester = new DolphinFontRequester(this);
0062     topLayout->addRow(i18nc("@label:listbox", "Label font:"), m_fontRequester);
0063 
0064     switch (m_mode) {
0065     case IconsMode: {
0066         m_widthBox = new QComboBox();
0067         m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Small"));
0068         m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Medium"));
0069         m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Large"));
0070         m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Huge"));
0071         topLayout->addRow(i18nc("@label:listbox", "Label width:"), m_widthBox);
0072 
0073         m_maxLinesBox = new QComboBox();
0074         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "Unlimited"));
0075         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "1"));
0076         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "2"));
0077         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "3"));
0078         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "4"));
0079         m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "5"));
0080         topLayout->addRow(i18nc("@label:listbox", "Maximum lines:"), m_maxLinesBox);
0081         break;
0082     }
0083     case CompactMode: {
0084         m_widthBox = new QComboBox();
0085         m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Unlimited"));
0086         m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Small"));
0087         m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Medium"));
0088         m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Large"));
0089         topLayout->addRow(i18nc("@label:listbox", "Maximum width:"), m_widthBox);
0090         break;
0091     }
0092     case DetailsMode:
0093         m_expandableFolders = new QCheckBox(i18nc("@option:check", "Expandable"));
0094         topLayout->addRow(i18nc("@label:checkbox", "Folders:"), m_expandableFolders);
0095 
0096         // Item activation area
0097         m_entireRow = new QRadioButton(i18nc("@option:radio how files/folders are opened", "By clicking anywhere on the row"));
0098         m_iconAndNameOnly = new QRadioButton(i18nc("@option:radio how files/folders are opened", "By clicking on icon or name"));
0099 
0100         auto itemActivationAreaGroup = new QButtonGroup(this);
0101         itemActivationAreaGroup->addButton(m_entireRow);
0102         itemActivationAreaGroup->addButton(m_iconAndNameOnly);
0103 
0104         // clang-format off
0105         // i18n: Users can choose here if items are opened by clicking on their name/icon or by clicking in the row.
0106         topLayout->addRow(i18nc("@title:group", "Open files and folders:"), m_entireRow);
0107         // clang-format on
0108         topLayout->addRow(QString(), m_iconAndNameOnly);
0109         break;
0110     }
0111 
0112     loadSettings();
0113 
0114     connect(m_defaultSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::changed);
0115     connect(m_previewSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::changed);
0116     connect(m_fontRequester, &DolphinFontRequester::changed, this, &ViewSettingsTab::changed);
0117 
0118     switch (m_mode) {
0119     case IconsMode:
0120         connect(m_widthBox, &QComboBox::currentIndexChanged, this, &ViewSettingsTab::changed);
0121         connect(m_maxLinesBox, &QComboBox::currentIndexChanged, this, &ViewSettingsTab::changed);
0122         break;
0123     case CompactMode:
0124         connect(m_widthBox, &QComboBox::currentIndexChanged, this, &ViewSettingsTab::changed);
0125         break;
0126     case DetailsMode:
0127         connect(m_entireRow, &QCheckBox::toggled, this, &ViewSettingsTab::changed);
0128         connect(m_expandableFolders, &QCheckBox::toggled, this, &ViewSettingsTab::changed);
0129         break;
0130     default:
0131         break;
0132     }
0133 }
0134 
0135 ViewSettingsTab::~ViewSettingsTab()
0136 {
0137 }
0138 
0139 void ViewSettingsTab::applySettings()
0140 {
0141     switch (m_mode) {
0142     case IconsMode:
0143         IconsModeSettings::setTextWidthIndex(m_widthBox->currentIndex());
0144         IconsModeSettings::setMaximumTextLines(m_maxLinesBox->currentIndex());
0145         IconsModeSettings::self()->save();
0146         break;
0147     case CompactMode:
0148         CompactModeSettings::setMaximumTextWidthIndex(m_widthBox->currentIndex());
0149         CompactModeSettings::self()->save();
0150         break;
0151     case DetailsMode:
0152         auto detailsModeSettings = DetailsModeSettings::self();
0153         // We need side-padding when the full row is a click target to still be able to not click items.
0154         // So here the default padding is enabled when the full row highlight is enabled.
0155         if (m_entireRow->isChecked() && !detailsModeSettings->highlightEntireRow()) {
0156             const bool usedDefaults = detailsModeSettings->useDefaults(true);
0157             const uint defaultSidePadding = detailsModeSettings->sidePadding();
0158             detailsModeSettings->useDefaults(usedDefaults);
0159             if (detailsModeSettings->sidePadding() < defaultSidePadding) {
0160                 detailsModeSettings->setSidePadding(defaultSidePadding);
0161             }
0162         } else if (!m_entireRow->isChecked() && detailsModeSettings->highlightEntireRow()) {
0163             // The full row click target is disabled so now most of the view area can be used to interact
0164             // with the view background. Having an extra side padding has no usability benefit in this case.
0165             detailsModeSettings->setSidePadding(0);
0166         }
0167         detailsModeSettings->setHighlightEntireRow(m_entireRow->isChecked());
0168         detailsModeSettings->setExpandableFolders(m_expandableFolders->isChecked());
0169         detailsModeSettings->save();
0170         break;
0171     }
0172 
0173     ViewModeSettings settings(m_mode);
0174 
0175     const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(m_defaultSizeSlider->value());
0176     const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(m_previewSizeSlider->value());
0177     settings.setIconSize(iconSize);
0178     settings.setPreviewSize(previewSize);
0179 
0180     const QFont font = m_fontRequester->currentFont();
0181     const bool useSystemFont = (m_fontRequester->mode() == DolphinFontRequester::SystemFont);
0182 
0183     settings.setUseSystemFont(useSystemFont);
0184     settings.setViewFont(font);
0185 
0186     settings.save();
0187 }
0188 
0189 void ViewSettingsTab::restoreDefaults()
0190 {
0191     ViewModeSettings settings(m_mode);
0192     settings.useDefaults(true);
0193     loadSettings();
0194     settings.useDefaults(false);
0195 }
0196 
0197 void ViewSettingsTab::loadSettings()
0198 {
0199     switch (m_mode) {
0200     case IconsMode:
0201         m_widthBox->setCurrentIndex(IconsModeSettings::textWidthIndex());
0202         m_maxLinesBox->setCurrentIndex(IconsModeSettings::maximumTextLines());
0203         break;
0204     case CompactMode:
0205         m_widthBox->setCurrentIndex(CompactModeSettings::maximumTextWidthIndex());
0206         break;
0207     case DetailsMode:
0208         m_entireRow->setChecked(DetailsModeSettings::highlightEntireRow());
0209         m_iconAndNameOnly->setChecked(!m_entireRow->isChecked());
0210         m_expandableFolders->setChecked(DetailsModeSettings::expandableFolders());
0211         break;
0212     default:
0213         break;
0214     }
0215 
0216     const ViewModeSettings settings(m_mode);
0217 
0218     const QSize iconSize(settings.iconSize(), settings.iconSize());
0219     m_defaultSizeSlider->setValue(ZoomLevelInfo::zoomLevelForIconSize(iconSize));
0220 
0221     const QSize previewSize(settings.previewSize(), settings.previewSize());
0222     m_previewSizeSlider->setValue(ZoomLevelInfo::zoomLevelForIconSize(previewSize));
0223 
0224     m_fontRequester->setMode(settings.useSystemFont() ? DolphinFontRequester::SystemFont : DolphinFontRequester::CustomFont);
0225 
0226     QFont font(settings.viewFont());
0227     m_fontRequester->setCustomFont(font);
0228 }
0229 
0230 void ViewSettingsTab::slotDefaultSliderMoved(int value)
0231 {
0232     showToolTip(m_defaultSizeSlider, value);
0233 }
0234 
0235 void ViewSettingsTab::slotPreviewSliderMoved(int value)
0236 {
0237     showToolTip(m_previewSizeSlider, value);
0238 }
0239 
0240 void ViewSettingsTab::showToolTip(QSlider *slider, int value)
0241 {
0242     const int size = ZoomLevelInfo::iconSizeForZoomLevel(value);
0243     slider->setToolTip(i18ncp("@info:tooltip", "Size: 1 pixel", "Size: %1 pixels", size));
0244     if (!slider->isVisible()) {
0245         return;
0246     }
0247     QPoint global = slider->rect().topLeft();
0248     global.ry() += slider->height() / 2;
0249     QHelpEvent toolTipEvent(QEvent::ToolTip, QPoint(0, 0), slider->mapToGlobal(global));
0250     QApplication::sendEvent(slider, &toolTipEvent);
0251 }
0252 
0253 #include "moc_viewsettingstab.cpp"