X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f5dafdc48add734a3d3399d987556de2164d0a96..86d9c40ab71df5b8bd5063251337d5ca0c22380a:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 31b9de785..0bd24ecb3 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -44,6 +45,7 @@ #include #include #include +#include #include #include @@ -64,6 +66,15 @@ #include "viewproperties.h" #include "zoomlevelinfo.h" +/** + * Helper function for sorting items with qSort() in + * DolphinView::renameSelectedItems(). + */ +bool lessThan(const KFileItem& item1, const KFileItem& item2) +{ + return KStringHandler::naturalCompare(item1.name(), item2.name()) < 0; +} + DolphinView::DolphinView(QWidget* parent, const KUrl& url, KDirLister* dirLister, @@ -76,6 +87,7 @@ DolphinView::DolphinView(QWidget* parent, m_storedCategorizedSorting(false), m_tabsForFiles(false), m_isContextMenuOpen(false), + m_ignoreViewProperties(false), m_mode(DolphinView::IconsView), m_topLayout(0), m_controller(0), @@ -222,7 +234,7 @@ void DolphinView::setMode(Mode mode) } emit modeChanged(); - + updateZoomLevel(oldZoomLevel); if (m_showPreview) { loadDirectory(viewPropsUrl); @@ -378,7 +390,7 @@ void DolphinView::setZoomLevel(int level) } else if (level > ZoomLevelInfo::maximumLevel()) { level = ZoomLevelInfo::maximumLevel(); } - + if (level != zoomLevel()) { m_controller->setZoomLevel(level); m_previewGenerator->updatePreviews(); @@ -444,6 +456,8 @@ void DolphinView::reload() void DolphinView::refresh() { + m_ignoreViewProperties = false; + const bool oldActivationState = m_active; const int oldZoomLevel = m_controller->zoomLevel(); m_active = true; @@ -511,7 +525,7 @@ QString DolphinView::statusBarText() const int folderCount = 0; int fileCount = 0; KIO::filesize_t totalFileSize = 0; - + if (hasSelection()) { // give a summary of the status of the selected files const KFileItemList list = selectedItems(); @@ -533,13 +547,13 @@ QString DolphinView::statusBarText() const } ++it; } - + if (folderCount + fileCount == 1) { // if only one item is selected, show the filename const QString name = list.first().name(); text = (folderCount == 1) ? i18nc("@info:status", "%1 selected", name) : i18nc("@info:status", "%1 selected (%2)", - name, KIO::convertSize(totalFileSize)); + name, KIO::convertSize(totalFileSize)); } else { // at least 2 items are selected const QString foldersText = i18ncp("@info:status", "1 Folder selected", "%1 Folders selected", folderCount); @@ -594,12 +608,12 @@ void DolphinView::changeSelection(const KFileItemList& selection) void DolphinView::renameSelectedItems() { - const KFileItemList items = selectedItems(); + KFileItemList items = selectedItems(); 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. @@ -616,9 +630,13 @@ void DolphinView::renameSelectedItems() // as one operation instead of n rename operations like it is done now... Q_ASSERT(newName.contains('#')); + // currently the items are sorted by the selection order, resort + // them by the file name + qSort(items.begin(), items.end(), lessThan); + // iterate through all selected items and rename them... int index = 1; - foreach (const KFileItem &item, items) { + foreach (const KFileItem& item, items) { const KUrl& oldUrl = item.url(); QString number; number.setNum(index++); @@ -635,7 +653,7 @@ void DolphinView::renameSelectedItems() } } else if (DolphinSettings::instance().generalSettings()->renameInline()) { Q_ASSERT(itemCount == 1); - + if (isColumnViewActive()) { m_columnView->editItem(items.first()); } else { @@ -645,7 +663,7 @@ void DolphinView::renameSelectedItems() } } else { Q_ASSERT(itemCount == 1); - + RenameDialog dialog(this, items); if (dialog.exec() == QDialog::Rejected) { return; @@ -686,19 +704,14 @@ void DolphinView::deleteSelectedItems() void DolphinView::cutSelectedItems() { - QMimeData* mimeData = new QMimeData(); - const KUrl::List kdeUrls = simplifiedSelectedUrls(); - const KUrl::List mostLocalUrls; - KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true); + QMimeData* mimeData = selectionMimeData(); + KonqMimeData::addIsCutSelection(mimeData, true); QApplication::clipboard()->setMimeData(mimeData); } void DolphinView::copySelectedItems() { - QMimeData* mimeData = new QMimeData(); - const KUrl::List kdeUrls = selectedUrls(); - const KUrl::List mostLocalUrls; - KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, false); + QMimeData* mimeData = selectionMimeData(); QApplication::clipboard()->setMimeData(mimeData); } @@ -727,10 +740,10 @@ void DolphinView::setShowPreview(bool show) m_showPreview = show; m_previewGenerator->setPreviewShown(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: @@ -832,7 +845,7 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) m_controller->requestActivation(); } break; - + case QEvent::MouseButtonPress: if ((watched == itemView()->viewport()) && (m_expandedViews.count() > 0)) { // Listening to a mousebutton press event to delete expanded views is a @@ -843,13 +856,13 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) deleteExpandedViews(); } break; - + case QEvent::DragEnter: if (watched == itemView()->viewport()) { setActive(true); } break; - + default: break; } @@ -1037,6 +1050,11 @@ bool DolphinView::isTabsForFilesEnabled() const return m_tabsForFiles; } +bool DolphinView::itemsExpandable() const +{ + return (m_detailsView != 0) && m_detailsView->itemsExpandable(); +} + void DolphinView::emitContentsMoved() { // only emit the contents moved signal if: @@ -1138,6 +1156,10 @@ KUrl DolphinView::viewPropertiesUrl() const void DolphinView::applyViewProperties(const KUrl& url) { + if (m_ignoreViewProperties) { + return; + } + if (isColumnViewActive() && rootUrl().isParentOf(url)) { // The column view is active, hence don't apply the view properties // of sub directories (represented by columns) to the view. The @@ -1150,11 +1172,11 @@ void DolphinView::applyViewProperties(const KUrl& url) const Mode mode = props.viewMode(); if (m_mode != mode) { const int oldZoomLevel = m_controller->zoomLevel(); - + m_mode = mode; createView(); emit modeChanged(); - + updateZoomLevel(oldZoomLevel); } if (itemView() == 0) { @@ -1198,15 +1220,22 @@ void DolphinView::applyViewProperties(const KUrl& url) if (showPreview != m_showPreview) { m_showPreview = showPreview; m_previewGenerator->setPreviewShown(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); } + + if (DolphinSettings::instance().generalSettings()->globalViewProps()) { + // During the lifetime of a DolphinView instance the global view properties + // should not be changed. This allows e. g. to split a view and use different + // view properties for each view. + m_ignoreViewProperties = true; + } } void DolphinView::createView() @@ -1238,6 +1267,7 @@ void DolphinView::createView() Q_ASSERT(view != 0); view->installEventFilter(this); view->viewport()->installEventFilter(this); + setFocusProxy(view); if (m_mode != ColumnView) { // Give the view the ability to auto-expand its directories on hovering @@ -1300,15 +1330,16 @@ void DolphinView::deleteView() // 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()). + setFocusProxy(0); setFocus(); m_topLayout->removeWidget(view); view->close(); - + disconnect(view); m_controller->disconnect(view); view->disconnect(); - + bool deleteView = true; foreach (const QAbstractItemView* expandedView, m_expandedViews) { if (view == expandedView) { @@ -1322,7 +1353,7 @@ void DolphinView::deleteView() view->deleteLater(); } view = 0; - + m_iconsView = 0; m_detailsView = 0; m_columnView = 0; @@ -1388,7 +1419,7 @@ KUrl::List DolphinView::simplifiedSelectedUrls() const { KUrl::List list = selectedUrls(); if (itemsExpandable() ) { - list = KonqOperations::simplifiedUrlList(list); + list = KDirModel::simplifiedUrlList(list); } return list; } @@ -1404,9 +1435,16 @@ void DolphinView::deleteExpandedViews() m_expandedViews.clear(); } -bool DolphinView::itemsExpandable() const +QMimeData* DolphinView::selectionMimeData() const { - return (m_detailsView != 0) && m_detailsView->itemsExpandable(); + if (isColumnViewActive()) { + return m_columnView->selectionMimeData(); + } + + const QAbstractItemView* view = itemView(); + Q_ASSERT((view != 0) && (view->selectionModel() != 0)); + const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); + return m_dolphinModel->mimeData(selection.indexes()); } #include "dolphinview.moc"