X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ffe9f62839d5bc908dfd3d6b2c237464c907a78c..02e2ef207d60098708de5ef77847e4cd1ca08397:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 6fe4709ff..c26d3d5b5 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -28,6 +28,10 @@ #include "dolphin_detailsmodesettings.h" +#include +#include + +#include #include #include #include @@ -52,8 +56,6 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); setAlternatingRowColors(true); - setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); setMouseTracking(true); viewport()->setAttribute(Qt::WA_Hover); @@ -62,8 +64,12 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr setSortIndicatorSection(props.sorting()); setSortIndicatorOrder(props.sortOrder()); - connect(header(), SIGNAL(sectionClicked(int)), + QHeaderView* headerView = header(); + connect(headerView, SIGNAL(sectionClicked(int)), this, SLOT(synchronizeSortingState(int))); + headerView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(configureColumns(const QPoint&))); connect(parent, SIGNAL(sortingChanged(DolphinView::Sorting)), this, SLOT(setSortIndicatorSection(DolphinView::Sorting))); @@ -100,6 +106,16 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr font.setItalic(settings->italicFont()); font.setBold(settings->boldFont()); m_viewOptions.font = font; + m_viewOptions.showDecorationSelected = true; + +// TODO: Remove this check when 4.3.2 is released and KDE requires it... this +// check avoids a division by zero happening on versions before 4.3.1. +// Right now KDE in theory can be shipped with Qt 4.3.0 and above. +// ereslibre +#if (QT_VERSION >= QT_VERSION_CHECK(4, 3, 2)) + setVerticalScrollMode(QTreeView::ScrollPerPixel); + setHorizontalScrollMode(QTreeView::ScrollPerPixel); +#endif updateDecorationSize(); } @@ -118,6 +134,7 @@ bool DolphinDetailsView::event(QEvent* event) headerView->setStretchLastSection(false); headerView->setResizeMode(QHeaderView::ResizeToContents); headerView->setResizeMode(0, QHeaderView::Stretch); + headerView->setMovable(false); // hide columns if this is indicated by the settings const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -141,7 +158,22 @@ bool DolphinDetailsView::event(QEvent* event) if (!settings->showType()) { hideColumn(DolphinModel::Type); } + + hideColumn(DolphinModel::Rating); + hideColumn(DolphinModel::Tags); + } +// TODO: Remove this check when 4.3.2 is released and KDE requires it... this +// check avoids a division by zero happening on versions before 4.3.1. +// Right now KDE in theory can be shipped with Qt 4.3.0 and above. +// ereslibre +#if (QT_VERSION >= QT_VERSION_CHECK(4, 3, 2)) + else if (event->type() == QEvent::UpdateRequest) { + // a wheel movement will scroll 4 items + if (model()->rowCount() > 0) { + verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4); + } } +#endif return QTreeView::event(event); } @@ -291,6 +323,39 @@ void DolphinDetailsView::keyPressEvent(QKeyEvent* event) } } +void DolphinDetailsView::resizeEvent(QResizeEvent* event) +{ + QTreeView::resizeEvent(event); + + // assure that the width of the name-column does not get too small + const int minWidth = 120; + QHeaderView* headerView = header(); + bool useFixedWidth = (headerView->sectionSize(KDirModel::Name) <= minWidth) + && (headerView->resizeMode(0) != QHeaderView::Fixed); + if (useFixedWidth) { + // the current width of the name-column is too small, hence + // use a fixed size + headerView->setResizeMode(QHeaderView::Fixed); + headerView->setResizeMode(0, QHeaderView::Fixed); + headerView->resizeSection(KDirModel::Name, minWidth); + } else if (headerView->resizeMode(0) != QHeaderView::Stretch) { + // check whether there is enough available viewport width + // to automatically resize the columns + const int availableWidth = viewport()->width(); + + int headerWidth = 0; + const int count = headerView->count(); + for (int i = 0; i < count; ++i) { + headerWidth += headerView->sectionSize(i); + } + + if (headerWidth < availableWidth) { + headerView->setResizeMode(QHeaderView::ResizeToContents); + headerView->setResizeMode(0, QHeaderView::Stretch); + } + } +} + void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) { QHeaderView* headerView = header(); @@ -338,10 +403,9 @@ void DolphinDetailsView::zoomIn() { if (isZoomInPossible()) { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - // TODO: get rid of K3Icon sizes switch (settings->iconSize()) { - case K3Icon::SizeSmall: settings->setIconSize(K3Icon::SizeMedium); break; - case K3Icon::SizeMedium: settings->setIconSize(K3Icon::SizeLarge); break; + case KIconLoader::SizeSmall: settings->setIconSize(KIconLoader::SizeMedium); break; + case KIconLoader::SizeMedium: settings->setIconSize(KIconLoader::SizeLarge); break; default: Q_ASSERT(false); break; } updateDecorationSize(); @@ -352,26 +416,76 @@ void DolphinDetailsView::zoomOut() { if (isZoomOutPossible()) { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - // TODO: get rid of K3Icon sizes switch (settings->iconSize()) { - case K3Icon::SizeLarge: settings->setIconSize(K3Icon::SizeMedium); break; - case K3Icon::SizeMedium: settings->setIconSize(K3Icon::SizeSmall); break; + case KIconLoader::SizeLarge: settings->setIconSize(KIconLoader::SizeMedium); break; + case KIconLoader::SizeMedium: settings->setIconSize(KIconLoader::SizeSmall); break; default: Q_ASSERT(false); break; } updateDecorationSize(); } } +void DolphinDetailsView::slotItemActivated(const QModelIndex& index) +{ + if (index.isValid() && (index.column() == KDirModel::Name)) { + m_controller->triggerItem(index); + } else { + clearSelection(); + m_controller->emitItemEntered(index); + } +} + +void DolphinDetailsView::configureColumns(const QPoint& pos) +{ + KMenu popup(this); + popup.addTitle(i18nc("@title:menu", "Columns")); + + QHeaderView* headerView = header(); + for (int i = DolphinModel::ModifiedTime; i <= DolphinModel::Type; ++i) { + const int logicalIndex = headerView->logicalIndex(i); + const QString text = model()->headerData(i, Qt::Horizontal).toString(); + QAction* action = popup.addAction(text); + action->setCheckable(true); + action->setChecked(!headerView->isSectionHidden(logicalIndex)); + action->setData(i); + } + + QAction* activatedAction = popup.exec(header()->mapToGlobal(pos)); + if (activatedAction != 0) { + const bool show = activatedAction->isChecked(); + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + Q_ASSERT(settings != 0); + + // remember the changed column visibility in the settings + const int columnIndex = activatedAction->data().toInt(); + switch (columnIndex) { + case DolphinModel::ModifiedTime: settings->setShowDate(show); break; + case DolphinModel::Permissions: settings->setShowPermissions(show); break; + case DolphinModel::Owner: settings->setShowOwner(show); break; + case DolphinModel::Group: settings->setShowGroup(show); break; + case DolphinModel::Type: settings->setShowType(show); break; + default: break; + } + + // apply the changed column visibility + if (show) { + showColumn(columnIndex); + } else { + hideColumn(columnIndex); + } + } +} + bool DolphinDetailsView::isZoomInPossible() const { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - return settings->iconSize() < K3Icon::SizeLarge; + return settings->iconSize() < KIconLoader::SizeLarge; } bool DolphinDetailsView::isZoomOutPossible() const { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - return settings->iconSize() > K3Icon::SizeSmall; + return settings->iconSize() > KIconLoader::SizeSmall; } void DolphinDetailsView::updateDecorationSize() @@ -416,14 +530,4 @@ static bool isValidNameIndex(const QModelIndex& index) return index.isValid() && (index.column() == KDirModel::Name); } -void DolphinDetailsView::slotItemActivated(const QModelIndex& index) -{ - if (!isValidNameIndex(index)) { - clearSelection(); - m_controller->emitItemEntered(index); - } else { - m_controller->triggerItem(index); - } -} - #include "dolphindetailsview.moc"