From: Peter Penz Date: Fri, 16 Feb 2007 17:03:02 +0000 (+0000) Subject: Reanimated drag & drop support again after introducing the DolphinController. It... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/546384562ae872614cd0c8fa568bd65ae41885da Reanimated drag & drop support again after introducing the DolphinController. It is now also possible to move the items inside an icon view like discussed on kde-devel/kde-usability. svn path=/trunk/KDE/kdebase/apps/; revision=634228 --- diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 8cc79e955..f40b47878 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -46,11 +46,9 @@ #include DolphinContextMenu::DolphinContextMenu(DolphinView* parent, - KFileItem* fileInfo, - const QPoint& pos) : + KFileItem* fileInfo) : m_dolphinView(parent), - m_fileInfo(fileInfo), - m_pos(pos) + m_fileInfo(fileInfo) { } @@ -104,7 +102,7 @@ void DolphinContextMenu::openViewportContextMenu() QAction* propertiesAction = popup->addAction(i18n("Properties...")); - QAction* activatedAction = popup->exec(m_pos); + QAction* activatedAction = popup->exec(QCursor::pos()); if (activatedAction == propertiesAction) { new KPropertiesDialog(dolphin->activeView()->url()); } @@ -185,7 +183,7 @@ void DolphinContextMenu::openItemContextMenu() QAction* propertiesAction = dolphin->actionCollection()->action("properties"); popup->addAction(propertiesAction); - QAction* activatedAction = popup->exec(m_pos); + QAction* activatedAction = popup->exec(QCursor::pos()); if ((bookmarkAction!= 0) && (activatedAction == bookmarkAction)) { const KUrl selectedUrl(m_fileInfo->url()); diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h index 69554b01f..82bc9f24d 100644 --- a/src/dolphincontextmenu.h +++ b/src/dolphincontextmenu.h @@ -57,11 +57,9 @@ public: * @fileInfo Pointer to the file item the context menu * is applied. If 0 is passed, the context menu * is above the viewport. - * @pos Position of the upper left edge of the context menu. */ DolphinContextMenu(DolphinView* parent, - KFileItem* fileInfo, - const QPoint& pos); + KFileItem* fileInfo); virtual ~DolphinContextMenu(); @@ -104,7 +102,6 @@ private: DolphinView* m_dolphinView; KFileItem* m_fileInfo; - QPoint m_pos; struct Entry { int type; diff --git a/src/dolphincontroller.cpp b/src/dolphincontroller.cpp index c39776349..8089cfd2b 100644 --- a/src/dolphincontroller.cpp +++ b/src/dolphincontroller.cpp @@ -28,11 +28,10 @@ DolphinController::~DolphinController() { } -void DolphinController::triggerContextMenuRequest(const QPoint& pos, - const QPoint& globalPos) +void DolphinController::triggerContextMenuRequest(const QPoint& pos) { emit activated(); - emit requestContextMenu(pos, globalPos); + emit requestContextMenu(pos); } void DolphinController::triggerActivation() @@ -40,6 +39,13 @@ void DolphinController::triggerActivation() emit activated(); } +void DolphinController::indicateDroppedUrls(const KUrl::List& urls, + const QPoint& pos) +{ + emit urlsDropped(urls, pos); +} + + void DolphinController::indicateSortingChange(DolphinView::Sorting sorting) { emit sortingChanged(sorting); diff --git a/src/dolphincontroller.h b/src/dolphincontroller.h index 8229ade1e..bde01c28e 100644 --- a/src/dolphincontroller.h +++ b/src/dolphincontroller.h @@ -56,11 +56,13 @@ public: void setUrl(const KUrl& url) { m_url = url; } const KUrl& url() const { return m_url; } - void triggerContextMenuRequest(const QPoint& pos, - const QPoint& globalPos); + void triggerContextMenuRequest(const QPoint& pos); void triggerActivation(); + void indicateDroppedUrls(const KUrl::List& urls, + const QPoint& pos); + void indicateSortingChange(DolphinView::Sorting sorting); void indicateSortOrderChange(Qt::SortOrder order); @@ -76,17 +78,24 @@ signals: * context menu should be opened. It is recommended * to get the corresponding model index from * this position. - * @param globalPos Global position where the context menu should - * be opened. */ - void requestContextMenu(const QPoint& pos, - const QPoint& globalPos); + void requestContextMenu(const QPoint& pos); /** * Is emitted if the view has been activated by e. g. a mouse click. */ void activated(); + /** + * Is emitted if the URLs \a urls have been dropped. + * @param pos Position relative to the view widget where the + * dropping has been done. It is recommended + * to get the corresponding model index from + * this position to find out the destination. + */ + void urlsDropped(const KUrl::List& urls, + const QPoint& pos); + /** Is emitted if the sorting has been changed to \a sorting. */ void sortingChanged(DolphinView::Sorting sorting); diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 411a410d3..0b350f8b2 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -91,8 +91,7 @@ QStyleOptionViewItem DolphinDetailsView::viewOptions() const void DolphinDetailsView::contextMenuEvent(QContextMenuEvent* event) { QTreeView::contextMenuEvent(event); - m_controller->triggerContextMenuRequest(event->pos(), - event->globalPos()); + m_controller->triggerContextMenuRequest(event->pos()); } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) @@ -110,18 +109,14 @@ void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) void DolphinDetailsView::dropEvent(QDropEvent* event) { - QTreeView::dropEvent(event); - // TODO: temporary deactivated until DolphinController will support this - - /*const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); - if (!urls.isEmpty()) { + const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); + if (urls.isEmpty() || (event->source() == this)) { + QTreeView::dropEvent(event); + } + else { event->acceptProposedAction(); - - // TODO: handle dropping above a directory - - const KUrl& destination = m_controller->url(); - m_controller->emitDropUrlsSignal(urls, destination); - }*/ + m_controller->indicateDroppedUrls(urls, event->pos()); + } } void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp index 7c32715db..3f9df0316 100644 --- a/src/dolphiniconsview.cpp +++ b/src/dolphiniconsview.cpp @@ -65,8 +65,7 @@ QStyleOptionViewItem DolphinIconsView::viewOptions() const void DolphinIconsView::contextMenuEvent(QContextMenuEvent* event) { QListView::contextMenuEvent(event); - m_controller->triggerContextMenuRequest(event->pos(), - event->globalPos()); + m_controller->triggerContextMenuRequest(event->pos()); } void DolphinIconsView::mouseReleaseEvent(QMouseEvent* event) @@ -84,31 +83,14 @@ void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event) void DolphinIconsView::dropEvent(QDropEvent* event) { - QListView::dropEvent(event); - // TODO: temporary deactivated until DolphinController will support this - - /* KFileItem* directory = 0; - bool dropIntoDirectory = false; - const QModelIndex index = indexAt(event->pos()); - if (index.isValid()) { - KFileItem* item = m_dolphinView->fileItem(index); - assert(item != 0); - dropIntoDirectory = item->isDir(); - if (dropIntoDirectory) { - directory = item; - } - } - const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); - if (urls.isEmpty() || (event->source() == this) && !dropIntoDirectory) { + if (urls.isEmpty() || (event->source() == this)) { QListView::dropEvent(event); } else { event->acceptProposedAction(); - const KUrl& destination = (directory == 0) ? m_dolphinView->url() : - directory->url(); - m_dolphinView->mainWindow()->dropUrls(urls, destination); - }*/ + m_controller->indicateDroppedUrls(urls, event->pos()); + } } #include "dolphiniconsview.moc" diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index d1416c40a..920224583 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -112,8 +112,10 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, m_proxyModel->setSourceModel(m_dirModel); m_controller = new DolphinController(this); - connect(m_controller, SIGNAL(requestContextMenu(const QPoint&, const QPoint&)), - this, SLOT(openContextMenu(const QPoint&, const QPoint&))); + connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)), + this, SLOT(openContextMenu(const QPoint&))); + connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const QPoint&)), + this, SLOT(dropUrls(const KUrl::List&, const QPoint&))); connect(m_controller, SIGNAL(sortingChanged(DolphinView::Sorting)), this, SLOT(updateSorting(DolphinView::Sorting))); connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)), @@ -855,7 +857,7 @@ void DolphinView::changeNameFilter(const QString& nameFilter) #endif } -void DolphinView::openContextMenu(const QPoint& pos, const QPoint& globalPos) +void DolphinView::openContextMenu(const QPoint& pos) { KFileItem* item = 0; @@ -864,10 +866,29 @@ void DolphinView::openContextMenu(const QPoint& pos, const QPoint& globalPos) item = fileItem(index); } - DolphinContextMenu contextMenu(this, item, globalPos); + DolphinContextMenu contextMenu(this, item); contextMenu.open(); } +void DolphinView::dropUrls(const KUrl::List& urls, + const QPoint& pos) +{ + KFileItem* directory = 0; + const QModelIndex index = itemView()->indexAt(pos); + if (index.isValid()) { + KFileItem* item = fileItem(index); + assert(item != 0); + if (item->isDir()) { + // the URLs are dropped above a directory + directory = item; + } + } + + const KUrl& destination = (directory == 0) ? url() : + directory->url(); + m_mainWindow->dropUrls(urls, destination); +} + void DolphinView::updateSorting(DolphinView::Sorting sorting) { ViewProperties props(url()); diff --git a/src/dolphinview.h b/src/dolphinview.h index 875b6b114..5b820fe8e 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -430,7 +430,20 @@ private slots: */ void changeNameFilter(const QString& nameFilter); - void openContextMenu(const QPoint& pos, const QPoint& globalPos); + /** + * Opens the context menu on position \a pos. The position + * is used to check whether the context menu is related to an + * item or to the viewport. + */ + void openContextMenu(const QPoint& pos); + + /** + * Drops the URLs \a urls at the position \a pos. + * The position is used to check whether the dropping + * is done above an item or above the viewport. + */ + void dropUrls(const KUrl::List& urls, + const QPoint& pos); /** * Updates the view properties of the current URL to the