X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b8a4e0fac2820ec8fc442c2abeea700ae4947e01..817f3952e2bed820ea3b50dfdfe91ccb99dcb748:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 221d20376..610a6d1ff 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -53,9 +53,11 @@ #include "dolphincontroller.h" #include "dolphinsortfilterproxymodel.h" #include "dolphindetailsview.h" +#include "dolphin_detailsmodesettings.h" #include "dolphiniconsview.h" #include "dolphinsettings.h" #include "dolphin_generalsettings.h" +#include "folderexpander.h" #include "iconmanager.h" #include "renamedialog.h" #include "tooltipmanager.h" @@ -329,6 +331,17 @@ KUrl::List DolphinView::selectedUrls() const return urls; } +int DolphinView::selectedItemsCount() const +{ + if (isColumnViewActive()) { + // TODO: get rid of this special case by adjusting the dir lister + // to the current column + return m_columnView->selectedItems().count(); + } + + return itemView()->selectionModel()->selection().count(); +} + void DolphinView::setContentsPosition(int x, int y) { QAbstractItemView* view = itemView(); @@ -349,26 +362,34 @@ QPoint DolphinView::contentsPosition() const return QPoint(x, y); } -void DolphinView::zoomIn() +void DolphinView::setZoomLevel(int level) { - m_controller->triggerZoomIn(); - m_iconManager->updatePreviews(); + if (level < zoomLevelMinimum()) { + level = zoomLevelMinimum(); + } else if (level > zoomLevelMaximum()) { + level = zoomLevelMaximum(); + } + + if (level != zoomLevel()) { + m_controller->setZoomLevel(level); + m_iconManager->updatePreviews(); + emit zoomLevelChanged(level); + } } -void DolphinView::zoomOut() +int DolphinView::zoomLevel() const { - m_controller->triggerZoomOut(); - m_iconManager->updatePreviews(); + return m_controller->zoomLevel(); } -bool DolphinView::isZoomInPossible() const +int DolphinView::zoomLevelMinimum() const { - return m_controller->isZoomInPossible(); + return m_controller->zoomLevelMinimum(); } -bool DolphinView::isZoomOutPossible() const +int DolphinView::zoomLevelMaximum() const { - return m_controller->isZoomOutPossible(); + return m_controller->zoomLevelMaximum(); } void DolphinView::setSorting(Sorting sorting) @@ -511,7 +532,12 @@ void DolphinView::changeSelection(const KFileItemList& selection) void DolphinView::renameSelectedItems() { const KFileItemList items = selectedItems(); - if (items.count() > 1) { + const int itemCount = items.count(); + if (itemCount < 1) { + return; + } + + if (itemCount > 1) { // More than one item has been selected for renaming. Open // a rename dialog and rename all items afterwards. RenameDialog dialog(this, items); @@ -546,8 +572,8 @@ void DolphinView::renameSelectedItems() } } } else if (DolphinSettings::instance().generalSettings()->renameInline()) { - Q_ASSERT(items.count() == 1); - + Q_ASSERT(itemCount == 1); + if (isColumnViewActive()) { m_columnView->editItem(items.first()); } else { @@ -556,8 +582,8 @@ void DolphinView::renameSelectedItems() itemView()->edit(proxyIndex); } } else { - Q_ASSERT(items.count() == 1); - + Q_ASSERT(itemCount == 1); + RenameDialog dialog(this, items); if (dialog.exec() == QDialog::Rejected) { return; @@ -640,7 +666,14 @@ void DolphinView::setShowPreview(bool show) m_showPreview = show; m_iconManager->setShowPreview(show); + + const int oldZoomLevel = m_controller->zoomLevel(); emit showPreviewChanged(); + + // Enabling or disabling the preview might change the icon size of the view. + // As the view does not emit a signal when the icon size has been changed, + // the used zoom level of the controller must be adjusted manually: + updateZoomLevel(oldZoomLevel); loadDirectory(viewPropsUrl); } @@ -710,7 +743,6 @@ void DolphinView::toggleAdditionalInfo(QAction* action) } } - void DolphinView::mouseReleaseEvent(QMouseEvent* event) { QWidget::mouseReleaseEvent(event); @@ -721,10 +753,11 @@ void DolphinView::wheelEvent(QWheelEvent* event) { if (event->modifiers() & Qt::ControlModifier) { const int delta = event->delta(); - if ((delta > 0) && isZoomInPossible()) { - zoomIn(); - } else if ((delta < 0) && isZoomOutPossible()) { - zoomOut(); + const int level = zoomLevel(); + if (delta > 0) { + setZoomLevel(level + 1); + } else if (delta < 0) { + setZoomLevel(level - 1); } event->accept(); } @@ -796,24 +829,18 @@ void DolphinView::dropUrls(const KUrl::List& urls, const KFileItem& destItem) { Q_ASSERT(!urls.isEmpty()); - const KUrl& destination = !destItem.isNull() && destItem.isDir() ? - destItem.url() : destPath; + const KUrl destination = !destItem.isNull() && destItem.isDir() ? + destItem.url() : destPath; const KUrl sourceDir = KUrl(urls.first().directory()); if (sourceDir != destination) { - dropUrls(urls, destination); + DolphinDropController dropController(this); + // forward doingOperation signal up to the mainwindow + connect(&dropController, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)), + this, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType))); + dropController.dropUrls(urls, destination); } } -void DolphinView::dropUrls(const KUrl::List& urls, - const KUrl& destination) -{ - DolphinDropController dropController(this); - // forward doingOperation signal up to the mainwindow - connect(&dropController, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)), - this, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType))); - dropController.dropUrls(urls, destination); -} - void DolphinView::updateSorting(DolphinView::Sorting sorting) { ViewProperties props(viewPropertiesUrl()); @@ -967,6 +994,18 @@ void DolphinView::slotDeleteFileFinished(KJob* job) } } +void DolphinView::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl) +{ + if (oldUrl == m_controller->url()) { + m_controller->setUrl(newUrl); + } +} + +void DolphinView::slotRequestUrlChange(const KUrl& url) +{ + emit requestUrlChange(url); + m_controller->setUrl(url); +} void DolphinView::restoreCurrentItem() { @@ -1077,7 +1116,14 @@ void DolphinView::applyViewProperties(const KUrl& url) if (showPreview != m_showPreview) { m_showPreview = showPreview; m_iconManager->setShowPreview(showPreview); + + const int oldZoomLevel = m_controller->zoomLevel(); emit showPreviewChanged(); + + // Enabling or disabling the preview might change the icon size of the view. + // As the view does not emit a signal when the icon size has been changed, + // the used zoom level of the controller must be adjusted manually: + updateZoomLevel(oldZoomLevel); } } @@ -1110,6 +1156,20 @@ void DolphinView::createView() Q_ASSERT(view != 0); view->installEventFilter(this); + if (m_mode != ColumnView) { + // Give the view the ability to auto-expand its directories on hovering + // (the column view takes care about this itself). If the details view + // uses expandable folders, the auto-expanding should be used always. + DolphinSettings& settings = DolphinSettings::instance(); + const bool enabled = settings.generalSettings()->autoExpandFolders() || + ((m_detailsView != 0) && settings.detailsModeSettings()->expandableFolders()); + + FolderExpander* folderExpander = new FolderExpander(view, m_proxyModel); + folderExpander->setEnabled(enabled); + connect(folderExpander, SIGNAL(enterDir(const QModelIndex&)), + m_controller, SLOT(triggerItem(const QModelIndex&))); + } + m_controller->setItemView(view); m_fileItemDelegate = new KFileItemDelegate(view); @@ -1149,6 +1209,12 @@ void DolphinView::deleteView() { QAbstractItemView* view = itemView(); if (view != 0) { + // It's important to set the keyboard focus to the parent + // before deleting the view: Otherwise when having a split + // view the other view will get the focus and will request + // an activation (see DolphinView::eventFilter()). + setFocus(); + m_topLayout->removeWidget(view); view->close(); view->deleteLater(); @@ -1207,16 +1273,12 @@ void DolphinView::pasteToUrl(const KUrl& url) } } -void DolphinView::slotRequestUrlChange(const KUrl& url) -{ - emit requestUrlChange(url); - m_controller->setUrl(url); -} - -void DolphinView::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl) -{ - if (oldUrl == m_controller->url()) { - m_controller->setUrl(newUrl); +void DolphinView::updateZoomLevel(int oldZoomLevel) +{ + const int newZoomLevel = DolphinController::zoomLevelForIconSize(itemView()->iconSize()); + if (oldZoomLevel != newZoomLevel) { + m_controller->setZoomLevel(newZoomLevel); + emit zoomLevelChanged(newZoomLevel); } }