X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/46483d7c082bf6ec0044b08469757de8a0c08360..ed0df8dc1fc9576e36c920882e7f4b00a2811113:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 9ccb75b8e..dd58e5842 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -23,7 +23,7 @@ #include "dolphinmodel.h" #include "dolphincontroller.h" #include "dolphinfileitemdelegate.h" -#include "dolphinsettings.h" +#include "settings/dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" #include "dolphinviewautoscroller.h" #include "draganddrophelper.h" @@ -56,6 +56,7 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr m_controller(controller), m_selectionManager(0), m_autoScroller(0), + m_expandableFoldersAction(0), m_font(), m_decorationSize(), m_band() @@ -88,7 +89,7 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr this, SLOT(synchronizeSortingState(int))); headerView->setContextMenuPolicy(Qt::CustomContextMenu); connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)), - this, SLOT(configureColumns(const QPoint&))); + this, SLOT(configureSettings(const QPoint&))); connect(headerView, SIGNAL(sectionResized(int, int, int)), this, SLOT(slotHeaderSectionResized(int, int, int))); connect(headerView, SIGNAL(sectionHandleDoubleClicked(int)), @@ -149,10 +150,15 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr setFocus(); viewport()->installEventFilter(this); - connect(KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), - this, SLOT(updateFont())); + connect(KGlobalSettings::self(), SIGNAL(settingsChanged(int)), + this, SLOT(slotGlobalSettingsChanged(int))); m_useDefaultIndexAt = false; + + m_expandableFoldersAction = new QAction(i18nc("@option:check", "Expandable Folders"), this); + m_expandableFoldersAction->setCheckable(true); + connect(m_expandableFoldersAction, SIGNAL(toggled(bool)), + this, SLOT(setFoldersExpandable(bool))); } DolphinDetailsView::~DolphinDetailsView() @@ -187,7 +193,11 @@ QStyleOptionViewItem DolphinDetailsView::viewOptions() const void DolphinDetailsView::contextMenuEvent(QContextMenuEvent* event) { QTreeView::contextMenuEvent(event); - m_controller->triggerContextMenuRequest(event->pos()); + + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + m_expandableFoldersAction->setChecked(settings->expandableFolders()); + m_controller->triggerContextMenuRequest(event->pos(), + QList() << m_expandableFoldersAction); } void DolphinDetailsView::mousePressEvent(QMouseEvent* event) @@ -236,9 +246,8 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) m_band.show = true; // Incremental update data will not be useful - start from scratch. m_band.ignoreOldInfo = true; - const QPoint pos = contentsPos(); const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value()); - m_band.origin = event->pos() + pos + scrollPos; + m_band.origin = event->pos() + scrollPos; m_band.destination = m_band.origin; m_band.originalSelection = selectionModel()->selection(); } @@ -456,7 +465,7 @@ QModelIndex DolphinDetailsView::indexAt(const QPoint& point) const return isAboveEmptySpace ? QModelIndex() : index; } -void DolphinDetailsView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) +void DolphinDetailsView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command) { // We must override setSelection() as Qt calls it internally and when this happens // we must ensure that the default indexAt() is used. @@ -479,14 +488,12 @@ void DolphinDetailsView::scrollTo(const QModelIndex & index, ScrollHint hint) void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) { - QHeaderView* headerView = header(); - headerView->setSortIndicator(sorting, headerView->sortIndicatorOrder()); + header()->setSortIndicator(sorting, header()->sortIndicatorOrder()); } void DolphinDetailsView::setSortIndicatorOrder(Qt::SortOrder sortOrder) { - QHeaderView* headerView = header(); - headerView->setSortIndicator(headerView->sortIndicatorSection(), sortOrder); + header()->setSortIndicator(header()->sortIndicatorSection(), sortOrder); } void DolphinDetailsView::synchronizeSortingState(int column) @@ -522,7 +529,6 @@ void DolphinDetailsView::updateElasticBand() if (m_band.destination.x() < 0) { m_band.destination.setX(0); } - dirtyRegion = dirtyRegion.united(elasticBandRect()); setDirtyRegion(dirtyRegion); } @@ -530,11 +536,10 @@ void DolphinDetailsView::updateElasticBand() QRect DolphinDetailsView::elasticBandRect() const { - const QPoint pos(contentsPos()); const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value()); - const QPoint topLeft = m_band.origin - pos - scrollPos; - const QPoint bottomRight = m_band.destination - pos - scrollPos; + const QPoint topLeft = m_band.origin - scrollPos; + const QPoint bottomRight = m_band.destination - scrollPos; return QRect(topLeft, bottomRight).normalized(); } @@ -560,11 +565,12 @@ void DolphinDetailsView::slotShowPreviewChanged() updateDecorationSize(view->showPreview()); } -void DolphinDetailsView::configureColumns(const QPoint& pos) +void DolphinDetailsView::configureSettings(const QPoint& pos) { KMenu popup(this); popup.addTitle(i18nc("@title:menu", "Columns")); + // add checkbox items for each column QHeaderView* headerView = header(); for (int i = DolphinModel::Size; i <= DolphinModel::Type; ++i) { const int logicalIndex = headerView->logicalIndex(i); @@ -574,6 +580,7 @@ void DolphinDetailsView::configureColumns(const QPoint& pos) action->setChecked(!headerView->isSectionHidden(logicalIndex)); action->setData(i); } + popup.addSeparator(); QAction* activatedAction = popup.exec(header()->mapToGlobal(pos)); if (activatedAction != 0) { @@ -618,8 +625,10 @@ void DolphinDetailsView::slotHeaderSectionResized(int logicalIndex, int oldSize, Q_UNUSED(newSize); // If the user changes the size of the headers, the autoresize feature should be // turned off. As there is no dedicated interface to find out whether the header - // section has been resized by the user or by a resize event, the following approach is used: - if ((QApplication::mouseButtons() & Qt::LeftButton) && isVisible()) { + // section has been resized by the user or by a resize event, another approach is used. + // Attention: Take care when changing the if-condition to verify that there is no + // regression in combination with bug 178630 (see fix in comment #8). + if ((QApplication::mouseButtons() & Qt::LeftButton) && header()->underMouse()) { disableAutoResizing(); } } @@ -639,14 +648,23 @@ void DolphinDetailsView::requestActivation() m_controller->requestActivation(); } -void DolphinDetailsView::updateFont() +void DolphinDetailsView::slotGlobalSettingsChanged(int category) { + Q_UNUSED(category); + const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); Q_ASSERT(settings != 0); - if (settings->useSystemFont()) { m_font = KGlobalSettings::generalFont(); } + //Disconnect then reconnect, since the settings have been changed, the connection requirements may have also. + disconnect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + disconnect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + if (KGlobalSettings::singleClick()) { + connect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + } else { + connect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + } } void DolphinDetailsView::updateElasticBandSelection() @@ -832,6 +850,22 @@ void DolphinDetailsView::updateElasticBandSelection() m_band.ignoreOldInfo = false; } +void DolphinDetailsView::setFoldersExpandable(bool expandable) +{ + if (!expandable) { + // collapse all expanded folders, as QTreeView::setItemsExpandable(false) + // does not do this task + const int rowCount = model()->rowCount(); + for (int row = 0; row < rowCount; ++row) { + setExpanded(model()->index(row, 0), false); + } + } + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + settings->setExpandableFolders(expandable); + setRootIsDecorated(expandable); + setItemsExpandable(expandable); +} + void DolphinDetailsView::updateDecorationSize(bool showPreview) { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -846,24 +880,6 @@ void DolphinDetailsView::updateDecorationSize(bool showPreview) doItemsLayout(); } -QPoint DolphinDetailsView::contentsPos() const -{ - // implementation note: the horizonal position is ignored currently, as no - // horizontal scrolling is done anyway during a selection - const QScrollBar* scrollbar = verticalScrollBar(); - Q_ASSERT(scrollbar != 0); - - const int maxHeight = maximumViewportSize().height(); - const int height = scrollbar->maximum() - scrollbar->minimum() + 1; - const int visibleHeight = model()->rowCount() + 1 - height; - if (visibleHeight <= 0) { - return QPoint(0, 0); - } - - const int y = scrollbar->sliderPosition() * maxHeight / visibleHeight; - return QPoint(0, y); -} - KFileItemDelegate::Information DolphinDetailsView::infoForColumn(int columnIndex) const { KFileItemDelegate::Information info = KFileItemDelegate::NoInformation; @@ -921,7 +937,7 @@ void DolphinDetailsView::resizeColumns() // reasons the exact necessary width for full visible names is // only checked for up to 200 items: const int rowCount = model()->rowCount(); - if (rowCount < 200) { + if (rowCount > 0 && rowCount < 200) { const int nameWidth = sizeHintForColumn(DolphinModel::Name); if (nameWidth + requiredWidth <= viewport()->width()) { columnWidth[KDirModel::Name] = viewport()->width() - requiredWidth;