]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/settings/viewmodes/viewsettingstab.cpp
Prevent crash in Windows
[dolphin.git] / src / settings / viewmodes / viewsettingstab.cpp
index 743f042caf5acdd40e58c2753973321b880cc8d5..3e3f96ffce66334dfa89a8cd69aabfa124cdf07d 100644 (file)
 
 #include "viewsettingstab.h"
 
-#include "dolphinfontrequester.h"
 #include "dolphin_compactmodesettings.h"
 #include "dolphin_detailsmodesettings.h"
 #include "dolphin_iconsmodesettings.h"
-
-#include <KComboBox>
-#include <KLocale>
-
-#include <QGroupBox>
+#include "dolphinfontrequester.h"
+#include "global.h"
+#include "views/zoomlevelinfo.h"
+
+#include <KLocalizedString>
+
+#include <QApplication>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QHelpEvent>
+#include <QFormLayout>
+#include <QSpinBox>
+#include <QRadioButton>
+#include <QButtonGroup>
 #include <QLabel>
-#include <QSlider>
-#include <QVBoxLayout>
-
-#include <views/zoomlevelinfo.h>
-
-template<class T>
-void apply(int iconSizeValue, int previewSizeValue, const QFont& font, bool useSystemFont)
-{
-    const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(iconSizeValue);
-    const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(previewSizeValue);
-    T::setIconSize(iconSize);
-    T::setPreviewSize(previewSize);
-
-    T::setUseSystemFont(useSystemFont);
-    T::setFontFamily(font.family());
-    T::setFontSize(font.pointSizeF());
-    T::setItalicFont(font.italic());
-    T::setFontWeight(font.weight());
-
-    T::self()->writeConfig();
-}
-
-template<class T>
-void load(int* iconSizeValue, int* previewSizeValue, QFont* font, bool* useSystemFont)
-{
-    const QSize iconSize(T::iconSize(), T::iconSize());
-    *iconSizeValue = ZoomLevelInfo::zoomLevelForIconSize(iconSize);
-
-    const QSize previewSize(T::previewSize(), T::previewSize());
-    *previewSizeValue = ZoomLevelInfo::zoomLevelForIconSize(previewSize);
-
-    *useSystemFont = T::useSystemFont();
-
-    *font = QFont(T::fontFamily(), qRound(T::fontSize()));
-    font->setItalic(T::italicFont());
-    font->setWeight(T::fontWeight());
-    font->setPointSizeF(T::fontSize());
-}
-
 
 ViewSettingsTab::ViewSettingsTab(Mode mode, QWidget* parent) :
     QWidget(parent),
     m_mode(mode),
-    m_defaultSizeSlider(0),
-    m_previewSizeSlider(0),
-    m_fontRequester(0),
-    m_textWidthBox(0)
+    m_defaultSizeSlider(nullptr),
+    m_previewSizeSlider(nullptr),
+    m_fontRequester(nullptr),
+    m_widthBox(nullptr),
+    m_maxLinesBox(nullptr),
+    m_expandableFolders(nullptr),
+    m_recursiveDirectorySizeLimit(nullptr)
 {
-    QVBoxLayout* topLayout = new QVBoxLayout(this);
-
-    // Create "Icon Size" group
-    QGroupBox* iconSizeGroup = new QGroupBox(this);
-    iconSizeGroup->setTitle(i18nc("@title:group", "Icon Size"));
+    QFormLayout* topLayout = new QFormLayout(this);
 
+    // Create "Icon Size" section
     const int minRange = ZoomLevelInfo::minimumLevel();
     const int maxRange = ZoomLevelInfo::maximumLevel();
 
-    QLabel* defaultLabel = new QLabel(i18nc("@label:listbox", "Default:"), this);
-    m_defaultSizeSlider = new QSlider(Qt::Horizontal, this);
+    m_defaultSizeSlider = new QSlider(Qt::Horizontal);
     m_defaultSizeSlider->setPageStep(1);
     m_defaultSizeSlider->setTickPosition(QSlider::TicksBelow);
     m_defaultSizeSlider->setRange(minRange, maxRange);
+    connect(m_defaultSizeSlider, &QSlider::valueChanged,
+            this, &ViewSettingsTab::slotDefaultSliderMoved);
+    topLayout->addRow(i18nc("@label:listbox", "Default icon size:"), m_defaultSizeSlider);
 
-    QLabel* previewLabel = new QLabel(i18nc("@label:listbox", "Preview:"), this);
-    m_previewSizeSlider = new QSlider(Qt::Horizontal, this);
+    m_previewSizeSlider = new QSlider(Qt::Horizontal);
     m_previewSizeSlider->setPageStep(1);
     m_previewSizeSlider->setTickPosition(QSlider::TicksBelow);
     m_previewSizeSlider->setRange(minRange, maxRange);
+    connect(m_previewSizeSlider, &QSlider::valueChanged,
+            this, &ViewSettingsTab::slotPreviewSliderMoved);
+    topLayout->addRow(i18nc("@label:listbox", "Preview icon size:"), m_previewSizeSlider);
 
-    QGridLayout* layout = new QGridLayout(iconSizeGroup);
-    layout->addWidget(defaultLabel, 0, 0, Qt::AlignRight);
-    layout->addWidget(m_defaultSizeSlider, 0, 1);
-    layout->addWidget(previewLabel, 1, 0, Qt::AlignRight);
-    layout->addWidget(m_previewSizeSlider, 1, 1);
 
-    // Create "Text" group
-    QGroupBox* textGroup = new QGroupBox(i18nc("@title:group", "Text"), this);
+    topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed));
 
-    QLabel* fontLabel = new QLabel(i18nc("@label:listbox", "Font:"), textGroup);
-    m_fontRequester = new DolphinFontRequester(textGroup);
 
-    QGridLayout* textGroupLayout = new QGridLayout(textGroup);
-    textGroupLayout->addWidget(fontLabel, 0, 0, Qt::AlignRight);
-    textGroupLayout->addWidget(m_fontRequester, 0, 1);
+    // Create "Label" section
+    m_fontRequester = new DolphinFontRequester(this);
+    topLayout->addRow(i18nc("@label:listbox", "Label font:"), m_fontRequester);
 
-    if (m_mode == IconsMode) {
-        QLabel* textWidthLabel = new QLabel(i18nc("@label:listbox", "Text width:"), textGroup);
-        m_textWidthBox = new KComboBox(textGroup);
-        m_textWidthBox->addItem(i18nc("@item:inlistbox Text width", "Small"));
-        m_textWidthBox->addItem(i18nc("@item:inlistbox Text width", "Medium"));
-        m_textWidthBox->addItem(i18nc("@item:inlistbox Text width", "Large"));
-        m_textWidthBox->addItem(i18nc("@item:inlistbox Text width", "Huge"));
-
-        textGroupLayout->addWidget(textWidthLabel, 2, 0, Qt::AlignRight);
-        textGroupLayout->addWidget(m_textWidthBox, 2, 1);
+    switch (m_mode) {
+    case IconsMode: {
+        m_widthBox = new QComboBox();
+        m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Small"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Medium"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Large"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Label width", "Huge"));
+        topLayout->addRow(i18nc("@label:listbox", "Label width:"), m_widthBox);
+
+        m_maxLinesBox = new QComboBox();
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "Unlimited"));
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "1"));
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "2"));
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "3"));
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "4"));
+        m_maxLinesBox->addItem(i18nc("@item:inlistbox Maximum lines", "5"));
+        topLayout->addRow(i18nc("@label:listbox", "Maximum lines:"), m_maxLinesBox);
+        break;
+    }
+    case CompactMode: {
+        m_widthBox = new QComboBox();
+        m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Unlimited"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Small"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Medium"));
+        m_widthBox->addItem(i18nc("@item:inlistbox Maximum width", "Large"));
+        topLayout->addRow(i18nc("@label:listbox", "Maximum width:"), m_widthBox);
+        break;
+    }
+    case DetailsMode:
+        m_expandableFolders = new QCheckBox(i18nc("@option:check", "Expandable"));
+        topLayout->addRow(i18nc("@label:checkbox", "Folders:"), m_expandableFolders);
+
+#ifndef Q_OS_WIN
+        // Sorting properties
+        m_numberOfItems = new QRadioButton(i18nc("option:radio", "Number of items"));
+        m_sizeOfContents = new QRadioButton(i18nc("option:radio", "Size of contents, up to "));
+
+        QButtonGroup* sortingModeGroup = new QButtonGroup(this);
+        sortingModeGroup->addButton(m_numberOfItems);
+        sortingModeGroup->addButton(m_sizeOfContents);
+
+        m_recursiveDirectorySizeLimit = new QSpinBox();
+        connect(m_recursiveDirectorySizeLimit, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int value) {
+            m_recursiveDirectorySizeLimit->setSuffix(i18np(" level deep", " levels deep", value));
+        });
+        m_recursiveDirectorySizeLimit->setRange(1, 20);
+        m_recursiveDirectorySizeLimit->setSingleStep(1);
+
+        QHBoxLayout *contentsSizeLayout = new QHBoxLayout();
+        contentsSizeLayout->addWidget(m_sizeOfContents);
+        contentsSizeLayout->addWidget(m_recursiveDirectorySizeLimit);
+
+        topLayout->addRow(i18nc("@title:group", "Folder size displays:"), m_numberOfItems);
+        topLayout->addRow(QString(), contentsSizeLayout);
+#endif
+        break;
     }
-
-    topLayout->addWidget(iconSizeGroup);
-    topLayout->addWidget(textGroup);
-    topLayout->addStretch(1);
 
     loadSettings();
 
-    connect(m_defaultSizeSlider, SIGNAL(valueChanged(int)), this, SIGNAL(changed()));
-    connect(m_previewSizeSlider, SIGNAL(valueChanged(int)), this, SIGNAL(changed()));
-    connect(m_fontRequester, SIGNAL(changed()), this, SIGNAL(changed()));
-    if (m_mode == IconsMode) {
-        connect(m_textWidthBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(changed()));
+    connect(m_defaultSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::changed);
+    connect(m_previewSizeSlider, &QSlider::valueChanged, this, &ViewSettingsTab::changed);
+    connect(m_fontRequester, &DolphinFontRequester::changed, this, &ViewSettingsTab::changed);
+
+    switch (m_mode) {
+    case IconsMode:
+        connect(m_widthBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ViewSettingsTab::changed);
+        connect(m_maxLinesBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ViewSettingsTab::changed);
+        break;
+    case CompactMode:
+        connect(m_widthBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ViewSettingsTab::changed);
+        break;
+    case DetailsMode:
+        connect(m_expandableFolders, &QCheckBox::toggled, this, &ViewSettingsTab::changed);
+#ifndef Q_OS_WIN
+        connect(m_recursiveDirectorySizeLimit, QOverload<int>::of(&QSpinBox::valueChanged), this, &ViewSettingsTab::changed);
+        connect(m_numberOfItems, &QRadioButton::toggled, this, &ViewSettingsTab::changed);
+        connect(m_sizeOfContents, &QRadioButton::toggled, this, [=]() {
+            m_recursiveDirectorySizeLimit->setEnabled(m_sizeOfContents->isChecked());
+        });
+#endif
+        break;
+    default:
+        break;
     }
 }
 
@@ -146,31 +172,47 @@ ViewSettingsTab::~ViewSettingsTab()
 
 void ViewSettingsTab::applySettings()
 {
-    const int defaultSize = m_defaultSizeSlider->value();
-    const int previewSize = m_previewSizeSlider->value();
     const QFont font = m_fontRequester->currentFont();
     const bool useSystemFont = (m_fontRequester->mode() == DolphinFontRequester::SystemFont);
 
     switch (m_mode) {
     case IconsMode:
-        IconsModeSettings::setTextWidthIndex(m_textWidthBox->currentIndex());
-        apply<IconsModeSettings>(defaultSize, previewSize, font, useSystemFont);
+        IconsModeSettings::setTextWidthIndex(m_widthBox->currentIndex());
+        IconsModeSettings::setMaximumTextLines(m_maxLinesBox->currentIndex());
         break;
     case CompactMode:
-        apply<CompactModeSettings>(defaultSize, previewSize, font, useSystemFont);
+        CompactModeSettings::setMaximumTextWidthIndex(m_widthBox->currentIndex());
         break;
     case DetailsMode:
-        apply<DetailsModeSettings>(defaultSize, previewSize, font, useSystemFont);
+        DetailsModeSettings::setExpandableFolders(m_expandableFolders->isChecked());
+#ifndef Q_OS_WIN
+        DetailsModeSettings::setDirectorySizeCount(m_numberOfItems->isChecked());
+        DetailsModeSettings::setRecursiveDirectorySizeLimit(m_recursiveDirectorySizeLimit->value());
+#endif
         break;
     default:
-        Q_ASSERT(false);
         break;
     }
+
+    ViewModeSettings settings(viewMode());
+
+    const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(m_defaultSizeSlider->value());
+    const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(m_previewSizeSlider->value());
+    settings.setIconSize(iconSize);
+    settings.setPreviewSize(previewSize);
+
+    settings.setUseSystemFont(useSystemFont);
+    settings.setFontFamily(font.family());
+    settings.setFontSize(font.pointSizeF());
+    settings.setItalicFont(font.italic());
+    settings.setFontWeight(font.weight());
+
+    settings.save();
 }
 
 void ViewSettingsTab::restoreDefaultSettings()
 {
-    KConfigSkeleton* settings = 0;
+    KConfigSkeleton* settings = nullptr;
     switch (m_mode) {
     case IconsMode:   settings = IconsModeSettings::self(); break;
     case CompactMode: settings = CompactModeSettings::self(); break;
@@ -185,31 +227,85 @@ void ViewSettingsTab::restoreDefaultSettings()
 
 void ViewSettingsTab::loadSettings()
 {
-    int iconSizeValue = 0;
-    int previewSizeValue = 0;
-    QFont font;
-    bool useSystemFont = false;
-
     switch (m_mode) {
     case IconsMode:
-        m_textWidthBox->setCurrentIndex(IconsModeSettings::textWidthIndex());
-        load<IconsModeSettings>(&iconSizeValue, &previewSizeValue, &font, &useSystemFont);
+        m_widthBox->setCurrentIndex(IconsModeSettings::textWidthIndex());
+        m_maxLinesBox->setCurrentIndex(IconsModeSettings::maximumTextLines());
         break;
     case CompactMode:
-        load<CompactModeSettings>(&iconSizeValue, &previewSizeValue, &font, &useSystemFont);
+        m_widthBox->setCurrentIndex(CompactModeSettings::maximumTextWidthIndex());
         break;
     case DetailsMode:
-        load<DetailsModeSettings>(&iconSizeValue, &previewSizeValue, &font, &useSystemFont);
+        m_expandableFolders->setChecked(DetailsModeSettings::expandableFolders());
+        if (DetailsModeSettings::directorySizeCount()) {
+            m_numberOfItems->setChecked(true);
+            m_recursiveDirectorySizeLimit->setEnabled(false);
+        } else {
+            m_sizeOfContents->setChecked(true);
+            m_recursiveDirectorySizeLimit->setEnabled(true);
+        }
+        m_recursiveDirectorySizeLimit->setValue(DetailsModeSettings::recursiveDirectorySizeLimit());
         break;
     default:
-        Q_ASSERT(false);
         break;
     }
 
-    m_defaultSizeSlider->setValue(iconSizeValue);
-    m_previewSizeSlider->setValue(previewSizeValue);
-    m_fontRequester->setMode(useSystemFont ? DolphinFontRequester::SystemFont : DolphinFontRequester::CustomFont);
+    const ViewModeSettings settings(viewMode());
+
+    const QSize iconSize(settings.iconSize(), settings.iconSize());
+    m_defaultSizeSlider->setValue(ZoomLevelInfo::zoomLevelForIconSize(iconSize));
+
+    const QSize previewSize(settings.previewSize(), settings.previewSize());
+    m_previewSizeSlider->setValue(ZoomLevelInfo::zoomLevelForIconSize(previewSize));
+
+    m_fontRequester->setMode(settings.useSystemFont()
+                             ? DolphinFontRequester::SystemFont
+                             : DolphinFontRequester::CustomFont);
+
+    QFont font(settings.fontFamily(), qRound(settings.fontSize()));
+    font.setItalic(settings.italicFont());
+    font.setWeight(settings.fontWeight());
+    font.setPointSizeF(settings.fontSize());
     m_fontRequester->setCustomFont(font);
 }
 
-#include "viewsettingstab.moc"
+ViewModeSettings::ViewMode ViewSettingsTab::viewMode() const
+{
+    ViewModeSettings::ViewMode mode;
+
+    switch (m_mode) {
+    case ViewSettingsTab::IconsMode:   mode = ViewModeSettings::IconsMode; break;
+    case ViewSettingsTab::CompactMode: mode = ViewModeSettings::CompactMode; break;
+    case ViewSettingsTab::DetailsMode: mode = ViewModeSettings::DetailsMode; break;
+    default:                           mode = ViewModeSettings::IconsMode;
+                                       Q_ASSERT(false);
+                                       break;
+    }
+
+    return mode;
+}
+
+
+void ViewSettingsTab::slotDefaultSliderMoved(int value)
+{
+    showToolTip(m_defaultSizeSlider, value);
+}
+
+void ViewSettingsTab::slotPreviewSliderMoved(int value)
+{
+    showToolTip(m_previewSizeSlider, value);
+}
+
+void ViewSettingsTab::showToolTip(QSlider* slider, int value)
+{
+    const int size = ZoomLevelInfo::iconSizeForZoomLevel(value);
+    slider->setToolTip(i18ncp("@info:tooltip", "Size: 1 pixel", "Size: %1 pixels", size));
+    if (!slider->isVisible()) {
+        return;
+    }
+    QPoint global = slider->rect().topLeft();
+    global.ry() += slider->height() / 2;
+    QHelpEvent toolTipEvent(QEvent::ToolTip, QPoint(0, 0), slider->mapToGlobal(global));
+    QApplication::sendEvent(slider, &toolTipEvent);
+}
+