X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/172ee368c91db403ca319a87e7b82e9c0da873ff..f63daef339dde16c7ef598f6fdaa5d2191da4685:/src/views/dolphinview.cpp diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index fe45541e3..961651b69 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -164,13 +164,16 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_container = new DolphinItemListContainer(m_dirLister, this); m_container->setVisibleRoles(QList() << "name"); + m_container->installEventFilter(this); KItemListController* controller = m_container->controller(); controller->setSelectionBehavior(KItemListController::MultiSelection); connect(controller, SIGNAL(itemActivated(int)), this, SLOT(slotItemActivated(int))); connect(controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int))); - connect(controller, SIGNAL(contextMenuRequested(int,QPointF)), this, SLOT(slotContextMenuRequested(int,QPointF))); + connect(controller, SIGNAL(itemContextMenuRequested(int,QPointF)), this, SLOT(slotItemContextMenuRequested(int,QPointF))); + connect(controller, SIGNAL(viewContextMenuRequested(QPointF)), this, SLOT(slotViewContextMenuRequested(QPointF))); + connect(controller, SIGNAL(headerContextMenuRequested(QPointF)), this, SLOT(slotHeaderContextMenuRequested(QPointF))); connect(controller, SIGNAL(itemExpansionToggleClicked(int)), this, SLOT(slotItemExpansionToggleClicked(int))); connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int))); connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int))); @@ -264,19 +267,65 @@ DolphinView::Mode DolphinView::mode() const return m_mode; } +void DolphinView::setPreviewsShown(bool show) +{ + if (previewsShown() == show) { + return; + } + + ViewProperties props(url()); + props.setPreviewsShown(show); + + m_container->setPreviewsShown(show); + emit previewsShownChanged(show); +} + bool DolphinView::previewsShown() const { return m_container->previewsShown(); } +void DolphinView::setHiddenFilesShown(bool show) +{ + if (m_dirLister->showingDotFiles() == show) { + return; + } + + const KFileItemList itemList = selectedItems(); + m_selectedUrls.clear(); + m_selectedUrls = itemList.urlList(); + + ViewProperties props(url()); + props.setHiddenFilesShown(show); + + m_dirLister->setShowingDotFiles(show); + m_dirLister->emitChanges(); + emit hiddenFilesShownChanged(show); +} + bool DolphinView::hiddenFilesShown() const { return m_dirLister->showingDotFiles(); } -bool DolphinView::categorizedSorting() const +void DolphinView::setGroupedSorting(bool grouped) { - return false; //m_storedCategorizedSorting; + if (grouped == groupedSorting()) { + return; + } + + ViewProperties props(url()); + props.setGroupedSorting(grouped); + props.save(); + + m_container->controller()->model()->setGroupedSorting(grouped); + + emit groupedSortingChanged(grouped); +} + +bool DolphinView::groupedSorting() const +{ + return fileItemModel()->groupedSorting(); } KFileItemList DolphinView::items() const @@ -290,8 +339,11 @@ KFileItemList DolphinView::selectedItems() const const KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); const QSet selectedIndexes = selectionManager->selectedItems(); + QList sortedIndexes = selectedIndexes.toList(); + qSort(sortedIndexes); + KFileItemList selectedItems; - QSetIterator it(selectedIndexes); + QListIterator it(sortedIndexes); while (it.hasNext()) { const int index = it.next(); selectedItems.append(model->fileItem(index)); @@ -647,69 +699,20 @@ void DolphinView::pasteIntoFolder() } } -void DolphinView::setPreviewsShown(bool show) -{ - if (previewsShown() == show) { - return; - } - - ViewProperties props(url()); - props.setPreviewsShown(show); - - m_container->setPreviewsShown(show); - emit previewsShownChanged(show); -} - -void DolphinView::setHiddenFilesShown(bool show) +bool DolphinView::eventFilter(QObject* watched, QEvent* event) { - if (m_dirLister->showingDotFiles() == show) { - return; - } - - const KFileItemList itemList = selectedItems(); - m_selectedUrls.clear(); - m_selectedUrls = itemList.urlList(); - - ViewProperties props(url()); - props.setHiddenFilesShown(show); - - m_dirLister->setShowingDotFiles(show); - m_dirLister->emitChanges(); - emit hiddenFilesShownChanged(show); -} + switch (event->type()) { + case QEvent::FocusIn: + if (watched == m_container) { + setActive(true); + } + break; -void DolphinView::setCategorizedSorting(bool categorized) -{ - if (categorized == categorizedSorting()) { - return; + default: + break; } - ViewProperties props(url()); - props.setCategorizedSorting(categorized); - props.save(); - - //m_viewAccessor.proxyModel()->setCategorizedModel(categorized); - - emit categorizedSortingChanged(categorized); -} - -void DolphinView::mouseReleaseEvent(QMouseEvent* event) -{ - QWidget::mouseReleaseEvent(event); - setActive(true); -} - -void DolphinView::contextMenuEvent(QContextMenuEvent* event) -{ - Q_UNUSED(event); - - const QPoint pos = m_container->mapFromGlobal(QCursor::pos()); - const KItemListView* view = m_container->controller()->view(); - if (view->itemAt(pos) < 0) { - // Only open the context-menu if the cursor is above the viewport - // (the context-menu for items is handled in slotContextMenuRequested()) - requestContextMenu(KFileItem(), url(), QList()); - } + return QWidget::eventFilter(watched, event); } void DolphinView::wheelEvent(QWheelEvent* event) @@ -719,8 +722,10 @@ void DolphinView::wheelEvent(QWheelEvent* event) const int numSteps = numDegrees / 15; setZoomLevel(zoomLevel() + numSteps); + event->accept(); + } else { + event->ignore(); } - event->accept(); } void DolphinView::activate() @@ -758,14 +763,71 @@ void DolphinView::slotItemMiddleClicked(int index) } } -void DolphinView::slotContextMenuRequested(int index, const QPointF& pos) +void DolphinView::slotItemContextMenuRequested(int index, const QPointF& pos) { - Q_UNUSED(pos); if (GeneralSettings::showToolTips()) { m_toolTipManager->hideToolTip(); } const KFileItem item = fileItemModel()->fileItem(index); - emit requestContextMenu(item, url(), QList()); + emit requestContextMenu(pos.toPoint(), item, url(), QList()); +} + +void DolphinView::slotViewContextMenuRequested(const QPointF& pos) +{ + if (GeneralSettings::showToolTips()) { + m_toolTipManager->hideToolTip(); + } + emit requestContextMenu(pos.toPoint(), KFileItem(), url(), QList()); +} + +void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) +{ + QWeakPointer menu = new KMenu(QApplication::activeWindow()); + + KItemListView* view = m_container->controller()->view(); + const QSet visibleRolesSet = view->visibleRoles().toSet(); + + // Add all roles to the menu that can be shown or hidden by the user + const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); + const QList keys = infoAccessor.keys(); + foreach (const DolphinView::AdditionalInfo info, keys) { + const QByteArray& role = infoAccessor.role(info); + if (role != "name") { + const QString text = fileItemModel()->roleDescription(role); + + QAction* action = menu.data()->addAction(text); + action->setCheckable(true); + action->setChecked(visibleRolesSet.contains(role)); + action->setData(info); + } + } + + QAction* action = menu.data()->exec(pos.toPoint()); + if (action) { + // Show or hide the selected role + const DolphinView::AdditionalInfo info = + static_cast(action->data().toInt()); + + ViewProperties props(url()); + QList infoList = props.additionalInfoList(); + + const QByteArray selectedRole = infoAccessor.role(info); + QList visibleRoles = view->visibleRoles(); + + if (action->isChecked()) { + const int index = keys.indexOf(info) + 1; + visibleRoles.insert(index, selectedRole); + infoList.insert(index, info); + } else { + visibleRoles.removeOne(selectedRole); + infoList.removeOne(info); + } + + view->setVisibleRoles(visibleRoles); + props.setAdditionalInfoList(infoList); + } + + delete menu.data(); } void DolphinView::slotItemExpansionToggleClicked(int index) @@ -784,7 +846,7 @@ void DolphinView::slotItemHovered(int index) const KFileItem item = fileItemModel()->fileItem(index); if (GeneralSettings::showToolTips()) { - QRectF itemRect = m_container->controller()->view()->itemBoundingRect(index); + QRectF itemRect = m_container->controller()->view()->itemRect(index); const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint()); itemRect.moveTo(pos); @@ -849,18 +911,6 @@ void DolphinView::emitSelectionChangedSignal() emit selectionChanged(selectedItems()); } -void DolphinView::openContextMenu(const QPoint& pos, - const QList& customActions) -{ - KFileItem item; - const int index = m_container->controller()->view()->itemAt(pos); - if (index >= 0) { - item = fileItemModel()->fileItem(index); - } - - emit requestContextMenu(item, url(), customActions); -} - void DolphinView::dropUrls(const KFileItem& destItem, const KUrl& destPath, QDropEvent* event) @@ -1151,15 +1201,15 @@ void DolphinView::applyViewProperties() emit hiddenFilesShownChanged(hiddenFilesShown); } -/* m_storedCategorizedSorting = props.categorizedSorting(); - const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting(); - if (categorized != m_viewAccessor.proxyModel()->isCategorizedModel()) { - m_viewAccessor.proxyModel()->setCategorizedModel(categorized); - emit categorizedSortingChanged(); - }*/ + KFileItemModel* model = fileItemModel(); + + const bool groupedSorting = props.groupedSorting(); + if (groupedSorting != model->groupedSorting()) { + model->setGroupedSorting(groupedSorting); + emit groupedSortingChanged(groupedSorting); + } const DolphinView::Sorting sorting = props.sorting(); - KFileItemModel* model = fileItemModel(); const QByteArray newSortRole = sortRoleForSorting(sorting); if (newSortRole != model->sortRole()) { model->setSortRole(newSortRole);