]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinitemlistcontainer.cpp
Allow to optionally limit the maximum number of text lines
[dolphin.git] / src / views / dolphinitemlistcontainer.cpp
index cd26ec8767a7a1aec54c5736847d368e98d96636..88e10d8a3a9b2d9bc4861ce7adce8dbbd0aab322 100644 (file)
@@ -31,7 +31,6 @@
 #include <kitemviews/kitemlistcontroller.h>
 #include <kitemviews/kitemliststyleoption.h>
 
-#include <KDirLister>
 #include <KGlobalSettings>
 
 #include <views/viewmodecontroller.h>
 #include "zoomlevelinfo.h"
 
 
-DolphinItemListContainer::DolphinItemListContainer(KDirLister* dirLister,
-                                                   QWidget* parent) :
+DolphinItemListContainer::DolphinItemListContainer(QWidget* parent) :
     KItemListContainer(parent),
     m_zoomLevel(0),
     m_fileItemListView(0)
 {
-    controller()->setModel(new KFileItemModel(dirLister, this));
+    controller()->setModel(new KFileItemModel(this));
 
     m_fileItemListView = new KFileItemListView();
-    m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator<DolphinFileItemListWidget>());    
-    m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
     controller()->setView(m_fileItemListView);
 
+    m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator<DolphinFileItemListWidget>());
+    m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
+    m_fileItemListView->setEnlargeSmallPreviews(GeneralSettings::enlargeSmallPreviews());
+
+    updateAutoActivationDelay();
+    updateFont();
     updateGridSize();
 }
 
 DolphinItemListContainer::~DolphinItemListContainer()
 {
-    IconsModeSettings::self()->writeConfig();
-    CompactModeSettings::self()->writeConfig();
-    DetailsModeSettings::self()->writeConfig();
+    writeSettings();
 
-    KItemListView* view = controller()->view();
     controller()->setView(0);
-    delete view;
+    delete m_fileItemListView;
+    m_fileItemListView = 0;
 }
 
 void DolphinItemListContainer::setPreviewsShown(bool show)
@@ -104,23 +104,13 @@ void DolphinItemListContainer::setZoomLevel(int level)
 
     m_zoomLevel = level;
 
+    ViewModeSettings settings(viewMode());
     if (previewsShown()) {
         const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
-
-        switch (itemLayout()) {
-        case KFileItemListView::IconsLayout:   IconsModeSettings::setPreviewSize(previewSize); break;
-        case KFileItemListView::CompactLayout: CompactModeSettings::setPreviewSize(previewSize); break;
-        case KFileItemListView::DetailsLayout: DetailsModeSettings::setPreviewSize(previewSize); break;
-        default: Q_ASSERT(false); break;
-        }
+        settings.setPreviewSize(previewSize);
     } else {
         const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
-        switch (itemLayout()) {
-        case KFileItemListView::IconsLayout:   IconsModeSettings::setIconSize(iconSize); break;
-        case KFileItemListView::CompactLayout: CompactModeSettings::setIconSize(iconSize); break;
-        case KFileItemListView::DetailsLayout: DetailsModeSettings::setIconSize(iconSize); break;
-        default: Q_ASSERT(false); break;
-        }
+        settings.setIconSize(iconSize);
     }
 
     updateGridSize();
@@ -143,21 +133,26 @@ void DolphinItemListContainer::setItemLayout(KFileItemListView::Layout layout)
     switch (layout) {
     case KFileItemListView::IconsLayout:
         m_fileItemListView->setScrollOrientation(Qt::Vertical);
-        m_fileItemListView->setHeaderShown(false);
+        m_fileItemListView->setHeaderVisible(false);
+        m_fileItemListView->setSupportsItemExpanding(false);
         break;
     case KFileItemListView::DetailsLayout:
         m_fileItemListView->setScrollOrientation(Qt::Vertical);
-        m_fileItemListView->setHeaderShown(true);
+        m_fileItemListView->setHeaderVisible(true);
+        m_fileItemListView->setSupportsItemExpanding(DetailsModeSettings::expandableFolders());
+
         break;
     case KFileItemListView::CompactLayout:
         m_fileItemListView->setScrollOrientation(Qt::Horizontal);
-        m_fileItemListView->setHeaderShown(false);
+        m_fileItemListView->setHeaderVisible(false);
+        m_fileItemListView->setSupportsItemExpanding(false);
         break;
     default:
         Q_ASSERT(false);
         break;
     }
 
+    updateFont();
     updateGridSize();
     endTransaction();
 }
@@ -177,63 +172,164 @@ void DolphinItemListContainer::endTransaction()
     m_fileItemListView->endTransaction();
 }
 
+void DolphinItemListContainer::readSettings()
+{
+    ViewModeSettings settings(viewMode());
+    settings.readConfig();
+
+    beginTransaction();
+
+    m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
+
+    const bool expandableFolders = (itemLayout() && KFileItemListView::DetailsLayout) &&
+                                   DetailsModeSettings::expandableFolders();
+    m_fileItemListView->setSupportsItemExpanding(expandableFolders);
+
+    updateAutoActivationDelay();
+    updateFont();
+    updateGridSize();
+
+    const KConfigGroup globalConfig(KGlobal::config(), "PreviewSettings");
+    const QStringList plugins = globalConfig.readEntry("Plugins", QStringList()
+                                                       << "directorythumbnail"
+                                                       << "imagethumbnail"
+                                                       << "jpegthumbnail");
+    m_fileItemListView->setEnabledPlugins(plugins);
+
+    endTransaction();
+}
+
+void DolphinItemListContainer::writeSettings()
+{
+    IconsModeSettings::self()->writeConfig();
+    CompactModeSettings::self()->writeConfig();
+    DetailsModeSettings::self()->writeConfig();
+}
+
 void DolphinItemListContainer::updateGridSize()
 {
-    // Calculate the size of the icon
-    int iconSize;
-    if (previewsShown()) {
-        switch (itemLayout()) {
-        case KFileItemListView::IconsLayout:   iconSize = IconsModeSettings::previewSize(); break;
-        case KFileItemListView::CompactLayout: iconSize = CompactModeSettings::previewSize(); break;
-        case KFileItemListView::DetailsLayout: iconSize = DetailsModeSettings::previewSize(); break;
-        default: Q_ASSERT(false); break;
-        }
-    } else {
-        switch (itemLayout()) {
-        case KFileItemListView::IconsLayout:   iconSize = IconsModeSettings::iconSize(); break;
-        case KFileItemListView::CompactLayout: iconSize = CompactModeSettings::iconSize(); break;
-        case KFileItemListView::DetailsLayout: iconSize = DetailsModeSettings::iconSize(); break;
-        default: Q_ASSERT(false); break;
-        }
-    }
+    const ViewModeSettings settings(viewMode());
 
+    // Calculate the size of the icon
+    const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
     m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
     KItemListStyleOption styleOption = m_fileItemListView->styleOption();
 
-    const int innerMargin = (iconSize >= KIconLoader::SizeSmallMedium) ? 4 : 2;
+    const int padding = 2;
+    int horizontalMargin = 0;
+    int verticalMargin = 0;
 
     // Calculate the item-width and item-height
     int itemWidth;
     int itemHeight;
+    QSize maxTextSize;
+
     switch (itemLayout()) {
     case KFileItemListView::IconsLayout: {
-        const int minItemWidth = 64;
-        itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64; // TODO:
-        if (itemWidth < iconSize + innerMargin * 2) {
-            itemWidth = iconSize + innerMargin * 2;
+        const int minItemWidth = 48;
+        itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64;
+
+        if (previewsShown()) {
+            // Optimize the width for previews with a 3:2 aspect ratio instead
+            // of a 1:1 ratio to avoid wasting too much vertical space when
+            // photos.
+            const int minWidth = iconSize * 3 / 2;
+            itemWidth = qMax(itemWidth, minWidth);
         }
-        itemHeight = innerMargin * 2 + iconSize + styleOption.fontMetrics.height();
+
+        if (itemWidth < iconSize + padding * 2) {
+            itemWidth = iconSize + padding * 2;
+        }
+
+        itemHeight = padding * 3 + iconSize + styleOption.fontMetrics.lineSpacing();
+        if (IconsModeSettings::maximumTextLines() > 0) {
+            // A restriction is given for the maximum number of textlines (0 means
+            // having no restriction)
+            const int additionalInfoCount = m_fileItemListView->visibleRoles().count() - 1;
+            const int maxAdditionalLines = additionalInfoCount + IconsModeSettings::maximumTextLines();
+            maxTextSize.rheight() = styleOption.fontMetrics.lineSpacing() * maxAdditionalLines;
+        }
+
+        horizontalMargin = 4;
+        verticalMargin = 8;
         break;
     }
     case KFileItemListView::CompactLayout: {
-        itemWidth = innerMargin * 2;
+        itemWidth = padding * 4 + iconSize + styleOption.fontMetrics.height() * 5;
         const int textLinesCount = m_fileItemListView->visibleRoles().count();
-        itemHeight = innerMargin * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.height());
+        itemHeight = padding * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.lineSpacing());
+
+        if (CompactModeSettings::maximumTextWidthIndex() > 0) {
+            // A restriction is given for the maximum width of the text (0 means
+            // having no restriction)
+            maxTextSize.rwidth() = styleOption.fontMetrics.height() * 10 *
+                                   CompactModeSettings::maximumTextWidthIndex();
+        }
+
+        horizontalMargin = 8;
         break;
     }
     case KFileItemListView::DetailsLayout: {
         itemWidth = -1;
-        itemHeight = innerMargin * 2 + qMax(iconSize, styleOption.fontMetrics.height());
+        itemHeight = padding * 2 + qMax(iconSize, styleOption.fontMetrics.lineSpacing());
         break;
     }
-    default: Q_ASSERT(false); break;
+    default:
+        itemWidth = -1;
+        itemHeight = -1;
+        Q_ASSERT(false);
+        break;
     }
 
     // Apply the calculated values
-    styleOption.margin = innerMargin;
+    styleOption.padding = padding;
+    styleOption.horizontalMargin = horizontalMargin;
+    styleOption.verticalMargin = verticalMargin;
     styleOption.iconSize = iconSize;
+    styleOption.maxTextSize = maxTextSize;
+    m_fileItemListView->beginTransaction();
     m_fileItemListView->setStyleOption(styleOption);
     m_fileItemListView->setItemSize(QSizeF(itemWidth, itemHeight));
+    m_fileItemListView->endTransaction();
+}
+
+void DolphinItemListContainer::updateFont()
+{
+    KItemListStyleOption styleOption = m_fileItemListView->styleOption();
+
+    const ViewModeSettings settings(viewMode());
+
+    QFont font(settings.fontFamily(), qRound(settings.fontSize()));
+    font.setItalic(settings.italicFont());
+    font.setWeight(settings.fontWeight());
+    font.setPointSizeF(settings.fontSize());
+
+    styleOption.font = font;
+    styleOption.fontMetrics = QFontMetrics(font);
+
+    m_fileItemListView->setStyleOption(styleOption);
+}
+
+void DolphinItemListContainer::updateAutoActivationDelay()
+{
+    const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
+    controller()->setAutoActivationDelay(delay);
+}
+
+ViewModeSettings::ViewMode DolphinItemListContainer::viewMode() const
+{
+    ViewModeSettings::ViewMode mode;
+
+    switch (itemLayout()) {
+    case KFileItemListView::IconsLayout:   mode = ViewModeSettings::IconsMode; break;
+    case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break;
+    case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break;
+    default:                               mode = ViewModeSettings::IconsMode;
+                                           Q_ASSERT(false);
+                                           break;
+    }
+
+    return mode;
 }
 
 #include "dolphinitemlistcontainer.moc"