X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/53d65e6392d3b03d7709385df5006d5d34c22852..c34873b22a64c98027256957981adb7edcad174e:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 590a813a8..7418997d9 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -35,13 +35,17 @@ #include #include #include +#include #include #include +#include +#include #include #include #include #include +#include "dolphindropcontroller.h" #include "dolphinmodel.h" #include "dolphincolumnview.h" #include "dolphincontroller.h" @@ -70,9 +74,11 @@ DolphinView::DolphinView(QWidget* parent, m_detailsView(0), m_columnView(0), m_fileItemDelegate(0), + m_selectionModel(0), m_dolphinModel(dolphinModel), m_dirLister(dirLister), - m_proxyModel(proxyModel) + m_proxyModel(proxyModel), + m_previewJob(0) { setFocusPolicy(Qt::StrongFocus); m_topLayout = new QVBoxLayout(this); @@ -125,6 +131,10 @@ DolphinView::DolphinView(QWidget* parent, DolphinView::~DolphinView() { + if (m_previewJob != 0) { + m_previewJob->kill(); + m_previewJob = 0; + } } const KUrl& DolphinView::url() const @@ -144,6 +154,7 @@ void DolphinView::setActive(bool active) } m_active = active; + m_selectionModel->clearSelection(); QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); if (active) { @@ -201,7 +212,6 @@ void DolphinView::setMode(Mode mode) const KUrl viewPropsUrl = viewPropertiesUrl(); ViewProperties props(viewPropsUrl); props.setViewMode(m_mode); - createView(); // the file item delegate has been recreated, apply the current @@ -220,8 +230,6 @@ void DolphinView::setMode(Mode mode) emit categorizedSortingChanged(); } - loadDirectory(viewPropsUrl); - emit modeChanged(); } @@ -312,7 +320,13 @@ bool DolphinView::supportsCategorizedSorting() const void DolphinView::selectAll() { - itemView()->selectAll(); + QAbstractItemView* view = itemView(); + // TODO: there seems to be a bug in QAbstractItemView::selectAll(); if + // the Ctrl-key is pressed (e. g. for Ctrl+A), selectAll() inverts the + // selection instead of selecting all items. This is bypassed for KDE 4.0 + // by invoking clearSelection() first. + view->clearSelection(); + view->selectAll(); } void DolphinView::invertSelection() @@ -567,17 +581,25 @@ void DolphinView::triggerItem(const KFileItem& item) void DolphinView::generatePreviews(const KFileItemList& items) { if (m_controller->dolphinView()->showPreview()) { - KIO::PreviewJob* job = KIO::filePreview(items, 128); - connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), - this, SLOT(showPreview(const KFileItem&, const QPixmap&))); + if (m_previewJob != 0) { + m_previewJob->kill(); + m_previewJob = 0; + } + + m_previewJob = KIO::filePreview(items, 128); + connect(m_previewJob, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), + this, SLOT(replaceIcon(const KFileItem&, const QPixmap&))); + connect(m_previewJob, SIGNAL(finished(KJob*)), + this, SLOT(slotPreviewJobFinished(KJob*))); } } -void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap) +void DolphinView::replaceIcon(const KFileItem& item, const QPixmap& pixmap) { Q_ASSERT(!item.isNull()); - if (item.url().directory() != m_dirLister->url().path()) { - // the preview job is still working on items of an older URL, hence + if (!m_showPreview || (item.url().directory() != m_dirLister->url().path())) { + // the preview has been deactivated in the meanwhile or the preview + // job is still working on items of an older URL, hence // the item is not part of the directory model anymore return; } @@ -736,6 +758,7 @@ void DolphinView::dropUrls(const KUrl::List& urls, const KUrl& destPath, const KFileItem& destItem) { + Q_ASSERT(!urls.isEmpty()); const KUrl& destination = !destItem.isNull() && destItem.isDir() ? destItem.url() : destPath; const KUrl sourceDir = KUrl(urls.first().directory()); @@ -747,7 +770,11 @@ void DolphinView::dropUrls(const KUrl::List& urls, void DolphinView::dropUrls(const KUrl::List& urls, const KUrl& destination) { - emit urlsDropped(urls, destination); + DolphinDropController dropController(this); + // forward doingOperation signal up to the mainwindow + connect(&dropController, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)), + this, SIGNAL(doingOperation(KonqFileUndoManager::CommandType))); + dropController.dropUrls(urls, destination); } void DolphinView::updateSorting(DolphinView::Sorting sorting) @@ -816,7 +843,7 @@ void DolphinView::updateCutItems() void DolphinView::showHoverInformation(const KFileItem& item) { - if (hasSelection()) { + if (hasSelection() || !m_active) { return; } @@ -825,7 +852,9 @@ void DolphinView::showHoverInformation(const KFileItem& item) void DolphinView::clearHoverInformation() { - emit requestItemInfo(KFileItem()); + if (m_active) { + emit requestItemInfo(KFileItem()); + } } @@ -861,6 +890,16 @@ void DolphinView::createView() view->setItemDelegate(m_fileItemDelegate); view->setModel(m_proxyModel); + if (m_selectionModel != 0) { + view->setSelectionModel(m_selectionModel); + } else { + m_selectionModel = view->selectionModel(); + } + + // reparent the selection model, as it should not be deleted + // when deleting the model + m_selectionModel->setParent(this); + view->setSelectionMode(QAbstractItemView::ExtendedSelection); new KMimeTypeResolver(view, m_dolphinModel); @@ -959,7 +998,7 @@ KToggleAction* DolphinView::iconsModeAction(KActionCollection* actionCollection) KToggleAction* iconsView = actionCollection->add("icons"); iconsView->setText(i18nc("@action:inmenu View Mode", "Icons")); iconsView->setShortcut(Qt::CTRL | Qt::Key_1); - iconsView->setIcon(KIcon("fileview-icon")); + iconsView->setIcon(KIcon("view-list-icons")); iconsView->setData(QVariant::fromValue(IconsView)); return iconsView; } @@ -969,7 +1008,7 @@ KToggleAction* DolphinView::detailsModeAction(KActionCollection* actionCollectio KToggleAction* detailsView = actionCollection->add("details"); detailsView->setText(i18nc("@action:inmenu View Mode", "Details")); detailsView->setShortcut(Qt::CTRL | Qt::Key_2); - detailsView->setIcon(KIcon("fileview-detailed")); + detailsView->setIcon(KIcon("view-list-details")); detailsView->setData(QVariant::fromValue(DetailsView)); return detailsView; } @@ -979,7 +1018,7 @@ KToggleAction* DolphinView::columnsModeAction(KActionCollection* actionCollectio KToggleAction* columnView = actionCollection->add("columns"); columnView->setText(i18nc("@action:inmenu View Mode", "Columns")); columnView->setShortcut(Qt::CTRL | Qt::Key_3); - columnView->setIcon(KIcon("fileview-column")); + columnView->setIcon(KIcon("view-file-columns")); columnView->setData(QVariant::fromValue(ColumnView)); return columnView; } @@ -1035,7 +1074,7 @@ void DolphinView::renameSelectedItems() KUrl newUrl = oldUrl; newUrl.setFileName(name); KonqOperations::rename(this, oldUrl, newUrl); - emit renaming(); + emit doingOperation(KonqFileUndoManager::RENAME); } ++it; } @@ -1061,9 +1100,154 @@ void DolphinView::renameSelectedItems() KUrl newUrl = oldUrl; newUrl.setFileName(newName); KonqOperations::rename(this, oldUrl, newUrl); - emit renaming(); + emit doingOperation(KonqFileUndoManager::RENAME); } } } +void DolphinView::trashSelectedItems() +{ + emit doingOperation(KonqFileUndoManager::TRASH); + KonqOperations::del(this, KonqOperations::TRASH, selectedUrls()); +} + +void DolphinView::deleteSelectedItems() +{ + const KUrl::List list = selectedUrls(); + const bool del = KonqOperations::askDeleteConfirmation(list, + KonqOperations::DEL, + KonqOperations::DEFAULT_CONFIRMATION, + this); + + if (del) { + KIO::Job* job = KIO::del(list); + connect(job, SIGNAL(result(KJob*)), + this, SLOT(slotDeleteFileFinished(KJob*))); + } +} + +void DolphinView::slotDeleteFileFinished(KJob* job) +{ + if (job->error() == 0) { + emit operationCompletedMessage(i18nc("@info:status", "Delete operation completed.")); + } else { + emit errorMessage(job->errorString()); + } +} + +void DolphinView::slotPreviewJobFinished(KJob* job) +{ + Q_ASSERT(job == m_previewJob); + m_previewJob = 0; +} + +void DolphinView::cutSelectedItems() +{ + QMimeData* mimeData = new QMimeData(); + const KUrl::List kdeUrls = selectedUrls(); + const KUrl::List mostLocalUrls; + KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, 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); + QApplication::clipboard()->setMimeData(mimeData); +} + +void DolphinView::paste() +{ + QClipboard* clipboard = QApplication::clipboard(); + const QMimeData* mimeData = clipboard->mimeData(); + + const KUrl::List sourceUrls = KUrl::List::fromMimeData(mimeData); + + // per default the pasting is done into the current Url of the view + KUrl destUrl(url()); + + // check whether the pasting should be done into a selected directory + const KUrl::List selectedUrls = this->selectedUrls(); + if (selectedUrls.count() == 1) { + const KFileItem fileItem(S_IFDIR, + KFileItem::Unknown, + selectedUrls.first(), + true); + if (fileItem.isDir()) { + // only one item is selected which is a directory, hence paste + // into this directory + destUrl = selectedUrls.first(); + } + } + + if (KonqMimeData::decodeIsCutSelection(mimeData)) { + KonqOperations::copy(this, KonqOperations::MOVE, sourceUrls, destUrl); + emit doingOperation(KonqFileUndoManager::MOVE); + clipboard->clear(); + } else { + KonqOperations::copy(this, KonqOperations::COPY, sourceUrls, destUrl); + emit doingOperation(KonqFileUndoManager::COPY); + } +} + +QPair DolphinView::pasteInfo() const +{ + QPair ret; + QClipboard* clipboard = QApplication::clipboard(); + const QMimeData* mimeData = clipboard->mimeData(); + + KUrl::List urls = KUrl::List::fromMimeData(mimeData); + if (!urls.isEmpty()) { + ret.first = true; + ret.second = i18ncp("@action:inmenu", "Paste One File", "Paste %1 Files", urls.count()); + } else { + ret.first = false; + ret.second = i18nc("@action:inmenu", "Paste"); + } + + if (ret.first) { + const KFileItemList items = selectedItems(); + const uint count = items.count(); + if (count > 1) { + // pasting should not be allowed when more than one file + // is selected + ret.first = false; + } else if (count == 1) { + // Only one file is selected. Pasting is only allowed if this + // file is a directory. + ret.first = items.first().isDir(); + } + } + return ret; +} + +KAction* DolphinView::createRenameAction(KActionCollection* collection) +{ + KAction* rename = collection->addAction("rename"); + rename->setText(i18nc("@action:inmenu File", "Rename...")); + rename->setShortcut(Qt::Key_F2); + return rename; +} + +KAction* DolphinView::createMoveToTrashAction(KActionCollection* collection) +{ + KAction* moveToTrash = collection->addAction("move_to_trash"); + moveToTrash->setText(i18nc("@action:inmenu File", "Move to Trash")); + moveToTrash->setIcon(KIcon("user-trash")); + moveToTrash->setShortcut(QKeySequence::Delete); + return moveToTrash; +} + +KAction* DolphinView::createDeleteAction(KActionCollection* collection) +{ + KAction* deleteAction = collection->addAction("delete"); + deleteAction->setIcon(KIcon("edit-delete")); + deleteAction->setText(i18nc("@action:inmenu File", "Delete")); + deleteAction->setShortcut(Qt::SHIFT | Qt::Key_Delete); + return deleteAction; +} + #include "dolphinview.moc"