From a7838db28e24e9618a39954524f055dc3335f7a9 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sat, 8 Nov 2008 16:22:30 +0000 Subject: [PATCH] * implement the DragAndDropHelper as singleton derived from QObject, so that emitting of signals is possible * show an information message in the statusbar, if items are dragged into the same directory TODO: although the signal seems to get connected correctly, the slot DolphinMainWindow::showInformationMessage() is not invoked when the signal is emitted -> will debug this later, it is important that the new string is added before the message freeze svn path=/trunk/KDE/kdebase/apps/; revision=881627 --- src/dolphincolumnwidget.cpp | 6 +++--- src/dolphindetailsview.cpp | 6 +++--- src/dolphinfileplacesview.cpp | 2 +- src/dolphiniconsview.cpp | 6 +++--- src/dolphinmainwindow.cpp | 17 ++++++++++++---- src/dolphinmainwindow.h | 10 +++++----- src/dolphinview.cpp | 2 +- src/dolphinviewcontainer.cpp | 2 +- src/draganddrophelper.cpp | 37 ++++++++++++++++++++++++++++------- src/draganddrophelper.h | 30 ++++++++++++++++++---------- src/sidebartreeview.cpp | 2 +- src/treeviewsidebarpage.cpp | 2 +- 12 files changed, 82 insertions(+), 40 deletions(-) diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index 8b0b26734..93c9cc235 100644 --- a/src/dolphincolumnwidget.cpp +++ b/src/dolphincolumnwidget.cpp @@ -288,12 +288,12 @@ QStyleOptionViewItem DolphinColumnWidget::viewOptions() const void DolphinColumnWidget::startDrag(Qt::DropActions supportedActions) { - DragAndDropHelper::startDrag(this, supportedActions, m_view->m_controller); + DragAndDropHelper::instance().startDrag(this, supportedActions, m_view->m_controller); } void DolphinColumnWidget::dragEnterEvent(QDragEnterEvent* event) { - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { event->acceptProposedAction(); } } @@ -322,7 +322,7 @@ void DolphinColumnWidget::dragMoveEvent(QDragMoveEvent* event) } setDirtyRegion(m_dropRect); - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { // accept url drops, independently from the destination item event->acceptProposedAction(); } diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 3fa7ae196..f8379a7da 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -307,13 +307,13 @@ void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) void DolphinDetailsView::startDrag(Qt::DropActions supportedActions) { - DragAndDropHelper::startDrag(this, supportedActions, m_controller); + DragAndDropHelper::instance().startDrag(this, supportedActions, m_controller); m_band.show = false; } void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) { - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { event->acceptProposedAction(); } @@ -346,7 +346,7 @@ void DolphinDetailsView::dragMoveEvent(QDragMoveEvent* event) setDirtyRegion(m_dropRect); } - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { // accept url drops, independently from the destination item event->acceptProposedAction(); } diff --git a/src/dolphinfileplacesview.cpp b/src/dolphinfileplacesview.cpp index c36820ef5..df3e6fd87 100644 --- a/src/dolphinfileplacesview.cpp +++ b/src/dolphinfileplacesview.cpp @@ -45,7 +45,7 @@ void DolphinFilePlacesView::mousePressEvent(QMouseEvent* event) void DolphinFilePlacesView::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent) { - DragAndDropHelper::dropUrls(KFileItem(), dest, event, parent); + DragAndDropHelper::instance().dropUrls(KFileItem(), dest, event, parent); } void DolphinFilePlacesView::emitExtendedUrlChangedSignal(const KUrl& url) diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp index e5578df32..0dd7dd719 100644 --- a/src/dolphiniconsview.cpp +++ b/src/dolphiniconsview.cpp @@ -209,12 +209,12 @@ void DolphinIconsView::startDrag(Qt::DropActions supportedActions) // TODO: invoking KCategorizedView::startDrag() should not be necessary, we'll // fix this in KDE 4.1 KCategorizedView::startDrag(supportedActions); - DragAndDropHelper::startDrag(this, supportedActions, m_controller); + DragAndDropHelper::instance().startDrag(this, supportedActions, m_controller); } void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event) { - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { event->acceptProposedAction(); } } @@ -242,7 +242,7 @@ void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event) m_dropRect.setSize(QSize()); // set as invalid } } - if (DragAndDropHelper::isMimeDataSupported(event->mimeData())) { + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { // accept url drops, independently from the destination item event->acceptProposedAction(); } diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 0dc2ecb57..3f0b215cc 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -43,6 +43,7 @@ #include "dolphin_generalsettings.h" #include "dolphin_iconsmodesettings.h" +#include "draganddrophelper.h" #include #include @@ -82,8 +83,6 @@ #include #include -#include - DolphinMainWindow::DolphinMainWindow(int id) : KXmlGuiWindow(0), m_newMenu(0), @@ -115,7 +114,9 @@ DolphinMainWindow::DolphinMainWindow(int id) : connect(undoManager, SIGNAL(jobRecordingFinished(CommandType)), this, SLOT(showCommand(CommandType))); connect(DolphinSettings::instance().placesModel(), SIGNAL(errorMessage(const QString&)), - this, SLOT(slotHandlePlacesError(const QString&))); + this, SLOT(showErrorMessage(const QString&))); + connect(&DragAndDropHelper::instance(), SIGNAL(informationMessage(const QString&)), + this, SLOT(showInformationMessage(const QString&))); } DolphinMainWindow::~DolphinMainWindow() @@ -441,7 +442,7 @@ void DolphinMainWindow::quit() close(); } -void DolphinMainWindow::slotHandlePlacesError(const QString &message) +void DolphinMainWindow::showErrorMessage(const QString& message) { if (!message.isEmpty()) { DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); @@ -449,6 +450,14 @@ void DolphinMainWindow::slotHandlePlacesError(const QString &message) } } +void DolphinMainWindow::showInformationMessage(const QString& message) +{ + if (!message.isEmpty()) { + DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); + statusBar->setMessage(message, DolphinStatusBar::Information); + } +} + void DolphinMainWindow::slotUndoAvailable(bool available) { QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo)); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index c98d2386a..8cfdda34a 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -168,11 +168,11 @@ private slots: /** Updates the 'Create New...' sub menu. */ void updateNewMenu(); - /** - * Shows the error information from the places model - * in the status bar. - */ - void slotHandlePlacesError(const QString &message); + /** Shows the error message in the status bar of the active view. */ + void showErrorMessage(const QString& message); + + /** Shows the information message in the status bar of the active view. */ + void showInformationMessage(const QString& message); /** * Updates the state of the 'Undo' menu action dependent diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index b74cbea53..8da926936 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -900,7 +900,7 @@ void DolphinView::dropUrls(const KFileItem& destItem, const KUrl& destPath, QDropEvent* event) { - DragAndDropHelper::dropUrls(destItem, destPath, event, this); + DragAndDropHelper::instance().dropUrls(destItem, destPath, event, this); } void DolphinView::updateSorting(DolphinView::Sorting sorting) diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index ad79d6bb1..82ed40d41 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -369,7 +369,7 @@ void DolphinViewContainer::saveRootUrl(const KUrl& url) void DolphinViewContainer::dropUrls(const KUrl& destination, QDropEvent* event) { - DragAndDropHelper::dropUrls(KFileItem(), destination, event, this); + DragAndDropHelper::instance().dropUrls(KFileItem(), destination, event, this); } void DolphinViewContainer::redirect(const KUrl& oldUrl, const KUrl& newUrl) diff --git a/src/draganddrophelper.cpp b/src/draganddrophelper.cpp index ded92bf04..a4971a62c 100644 --- a/src/draganddrophelper.cpp +++ b/src/draganddrophelper.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -31,7 +32,19 @@ #include #include -bool DragAndDropHelper::isMimeDataSupported(const QMimeData* mimeData) +class DragAndDropHelperSingleton +{ +public: + DragAndDropHelper instance; +}; +K_GLOBAL_STATIC(DragAndDropHelperSingleton, s_dragAndDropHelper) + +DragAndDropHelper& DragAndDropHelper::instance() +{ + return s_dragAndDropHelper->instance; +} + +bool DragAndDropHelper::isMimeDataSupported(const QMimeData* mimeData) const { return mimeData->hasUrls() || mimeData->hasFormat("application/x-kde-dndextract"); } @@ -87,12 +100,22 @@ void DragAndDropHelper::dropUrls(const KFileItem& destItem, } else { const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); const KUrl sourceDir = KUrl(urls.first().directory()); - if (sourceDir != destination) { - if (dropToItem) { - KonqOperations::doDrop(destItem, destination, event, widget); - } else { - KonqOperations::doDrop(KFileItem(), destination, event, widget); - } + if (sourceDir == destination) { + const QString msg = i18ncp("@info:status", + "The dropped item is already inside the folder %2", + "The dropped items are already inside the folder %2", + urls.count(), destination.fileName()); + emit informationMessage(msg); + } else if (dropToItem) { + KonqOperations::doDrop(destItem, destination, event, widget); + } else { + KonqOperations::doDrop(KFileItem(), destination, event, widget); } } } + +DragAndDropHelper::DragAndDropHelper() +{ +} + +#include "draganddrophelper.moc" diff --git a/src/draganddrophelper.h b/src/draganddrophelper.h index 920ff5135..c6abd46c3 100644 --- a/src/draganddrophelper.h +++ b/src/draganddrophelper.h @@ -20,7 +20,7 @@ #ifndef DRAGANDDROPHELPER_H #define DRAGANDDROPHELPER_H -#include +#include class DolphinController; class KFileItem; @@ -39,22 +39,25 @@ class QWidget; * DolphinColumnView and SidebarTreeView to have a consistent * drag and drop behavior between all views. */ -class DragAndDropHelper +class DragAndDropHelper : public QObject { + Q_OBJECT public: + static DragAndDropHelper& instance(); + /** * Returns true, if Dolphin supports the dragging of * the given mime data. */ - static bool isMimeDataSupported(const QMimeData* mimeData); + bool isMimeDataSupported(const QMimeData* mimeData) const; /** * Creates a drag object for the view \a itemView for all selected items. */ - static void startDrag(QAbstractItemView* itemView, - Qt::DropActions supportedActions, - DolphinController* controller = 0); + void startDrag(QAbstractItemView* itemView, + Qt::DropActions supportedActions, + DolphinController* controller = 0); /** * Handles the dropping of URLs to the given @@ -66,10 +69,17 @@ public: * @param event Drop event. * @param widget Source widget where the dragging has been started. */ - static void dropUrls(const KFileItem& destItem, - const KUrl& destPath, - QDropEvent* event, - QWidget* widget); + void dropUrls(const KFileItem& destItem, + const KUrl& destPath, + QDropEvent* event, + QWidget* widget); +signals: + void informationMessage(const QString& msg); + +private: + DragAndDropHelper(); + + friend class DragAndDropHelperSingleton; }; #endif diff --git a/src/sidebartreeview.cpp b/src/sidebartreeview.cpp index 00c98f6e7..3b1b13bb1 100644 --- a/src/sidebartreeview.cpp +++ b/src/sidebartreeview.cpp @@ -90,7 +90,7 @@ bool SidebarTreeView::event(QEvent* event) void SidebarTreeView::startDrag(Qt::DropActions supportedActions) { - DragAndDropHelper::startDrag(this, supportedActions); + DragAndDropHelper::instance().startDrag(this, supportedActions); } void SidebarTreeView::dragEnterEvent(QDragEnterEvent* event) diff --git a/src/treeviewsidebarpage.cpp b/src/treeviewsidebarpage.cpp index 32779ffce..04cef91ae 100644 --- a/src/treeviewsidebarpage.cpp +++ b/src/treeviewsidebarpage.cpp @@ -207,7 +207,7 @@ void TreeViewSidebarPage::dropUrls(const QModelIndex& index, QDropEvent* event) KFileItem item = m_dolphinModel->itemForIndex(dirIndex); Q_ASSERT(!item.isNull()); if (item.isDir()) { - DragAndDropHelper::dropUrls(item, item.url(), event, this); + DragAndDropHelper::instance().dropUrls(item, item.url(), event, this); } } } -- 2.47.3