From 13d09847842feac33df0cb75761b8741b957545f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Tue, 5 Nov 2024 19:23:46 +0100 Subject: [PATCH] Enable dropping content on the FolderContentView --- YACReaderLibrary/folder_content_view.cpp | 28 ++++++- YACReaderLibrary/folder_content_view.h | 7 +- YACReaderLibrary/qml/FolderContentView.qml | 80 +++++++++---------- YACReaderLibrary/qml/FolderContentView6.qml | 80 +++++++++---------- .../yacreader_content_views_manager.cpp | 14 ++++ 5 files changed, 123 insertions(+), 86 deletions(-) diff --git a/YACReaderLibrary/folder_content_view.cpp b/YACReaderLibrary/folder_content_view.cpp index 82247059..356f9237 100644 --- a/YACReaderLibrary/folder_content_view.cpp +++ b/YACReaderLibrary/folder_content_view.cpp @@ -5,6 +5,8 @@ #include "yacreader_global.h" #include "yacreader_global_gui.h" #include "yacreader_tool_bar_stretch.h" +#include "comic.h" +#include "comic_files_manager.h" #include "QsLog.h" @@ -164,6 +166,7 @@ FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWid ctxt->setContextProperty("showCurrentComic", QVariant(false)); ctxt->setContextProperty("openHelper", this); + ctxt->setContextProperty("dropManager", this); ctxt->setContextProperty("contextMenuHelper", this); view->setSource(QUrl("qrc:/qml/FolderContentView.qml")); @@ -290,10 +293,31 @@ void FolderContentView::showEvent(QShowEvent *event) setCoversSize(coverSize); } -void FolderContentView::dragEnterEvent(QDragEnterEvent *event) +bool FolderContentView::canDropUrls(const QList &urls, Qt::DropAction action) { + if (action == Qt::CopyAction) { + QString currentPath; + foreach (QUrl url, urls) { + // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) + currentPath = url.toLocalFile(); + if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) + return true; + } + } + return false; } -void FolderContentView::dropEvent(QDropEvent *event) +bool FolderContentView::canDropFormats(const QString &formats) { + return true; +} + +void FolderContentView::droppedFiles(const QList &urls, Qt::DropAction action) +{ + bool validAction = action == Qt::CopyAction; // TODO add move + + if (validAction) { + QList> droppedFiles = ComicFilesManager::getDroppedFiles(urls); + emit copyComicsToCurrentFolder(droppedFiles); + } } diff --git a/YACReaderLibrary/folder_content_view.h b/YACReaderLibrary/folder_content_view.h index d0f07e6a..842ea045 100644 --- a/YACReaderLibrary/folder_content_view.h +++ b/YACReaderLibrary/folder_content_view.h @@ -48,6 +48,9 @@ protected slots: void openComicFromContinueReadingList(int index); void requestedFolderContextMenu(QPoint point, int index); void requestedContinueReadingComicContextMenu(QPoint point, int index); + bool canDropUrls(const QList &urls, Qt::DropAction action); + bool canDropFormats(const QString &formats); + void droppedFiles(const QList &urls, Qt::DropAction action); protected: QQuickWidget *view; @@ -56,10 +59,6 @@ protected: std::unique_ptr comicModel; FolderModel *folderModel; - // Drop to import - void dragEnterEvent(QDragEnterEvent *event) override; - void dropEvent(QDropEvent *event) override; - private: QSettings *settings; QToolBar *toolbar; diff --git a/YACReaderLibrary/qml/FolderContentView.qml b/YACReaderLibrary/qml/FolderContentView.qml index f73352e4..27139f05 100644 --- a/YACReaderLibrary/qml/FolderContentView.qml +++ b/YACReaderLibrary/qml/FolderContentView.qml @@ -185,46 +185,6 @@ Rectangle { grid.contentX = grid.originX } - DropArea { - anchors.fill: parent - - onEntered: { - if(drag.hasUrls) - { - if(dropManager.canDropUrls(drag.urls, drag.action)) - { - drag.accepted = true; - }else - drag.accepted = false; - } - else if (dropManager.canDropFormats(drag.formats)) { - drag.accepted = true; - } else - drag.accepted = false; - } - - onDropped: { - if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) - { - dropManager.droppedFiles(drop.urls, drop.action); - } - else{ - if (dropManager.canDropFormats(drop.formats)) - { - var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); - var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x - var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); - - if(realIndex === -1) - realIndex = grid.count - 1; - - var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; - dropManager.droppedComicsForResortingAt(drop.getDataAsString(), destIndex); - } - } - } - } - property Component continueReadingView: Component { id: continueReadingView Rectangle { @@ -462,6 +422,46 @@ Rectangle { } } } + + DropArea { + anchors.fill: parent + + onEntered: drag => { + if(drag.hasUrls) + { + if(dropManager.canDropUrls(drag.urls, drag.action)) + { + drag.accepted = true; + }else + drag.accepted = false; + } + else if (dropManager.canDropFormats(drag.formats)) { + drag.accepted = true; + } else + drag.accepted = false; + } + + onDropped: drop => { + if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) + { + dropManager.droppedFiles(drop.urls, drop.action); + } + else{ + if (dropManager.canDropFormats(drop.formats)) + { + var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); + var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x + var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); + + if(realIndex === -1) + realIndex = grid.count - 1; + + var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; + dropManager.droppedComicsForResortingAt("", destIndex); + } + } + } + } } } } diff --git a/YACReaderLibrary/qml/FolderContentView6.qml b/YACReaderLibrary/qml/FolderContentView6.qml index 89a88b08..18471fa2 100644 --- a/YACReaderLibrary/qml/FolderContentView6.qml +++ b/YACReaderLibrary/qml/FolderContentView6.qml @@ -187,46 +187,6 @@ Rectangle { grid.contentX = grid.originX } - DropArea { - anchors.fill: parent - - onEntered: { - if(drag.hasUrls) - { - if(dropManager.canDropUrls(drag.urls, drag.action)) - { - drag.accepted = true; - }else - drag.accepted = false; - } - else if (dropManager.canDropFormats(drag.formats)) { - drag.accepted = true; - } else - drag.accepted = false; - } - - onDropped: { - if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) - { - dropManager.droppedFiles(drop.urls, drop.action); - } - else{ - if (dropManager.canDropFormats(drop.formats)) - { - var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); - var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x - var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); - - if(realIndex === -1) - realIndex = grid.count - 1; - - var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; - dropManager.droppedComicsForResortingAt(drop.getDataAsString(), destIndex); - } - } - } - } - property Component continueReadingView: Component { id: continueReadingView Rectangle { @@ -472,6 +432,46 @@ Rectangle { } } } + + DropArea { + anchors.fill: parent + + onEntered: drag => { + if(drag.hasUrls) + { + if(dropManager.canDropUrls(drag.urls, drag.action)) + { + drag.accepted = true; + }else + drag.accepted = false; + } + else if (dropManager.canDropFormats(drag.formats)) { + drag.accepted = true; + } else + drag.accepted = false; + } + + onDropped: drop => { + if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) + { + dropManager.droppedFiles(drop.urls, drop.action); + } + else{ + if (dropManager.canDropFormats(drop.formats)) + { + var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); + var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x + var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); + + if(realIndex === -1) + realIndex = grid.count - 1; + + var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; + dropManager.droppedComicsForResortingAt("", destIndex); + } + } + } + } } } } diff --git a/YACReaderLibrary/yacreader_content_views_manager.cpp b/YACReaderLibrary/yacreader_content_views_manager.cpp index 036f4be3..a82462e7 100644 --- a/YACReaderLibrary/yacreader_content_views_manager.cpp +++ b/YACReaderLibrary/yacreader_content_views_manager.cpp @@ -67,6 +67,20 @@ QWidget *YACReaderContentViewsManager::containerWidget() void YACReaderContentViewsManager::updateCurrentContentView() { + libraryWindow->comicsModel->reload(); + + if (comicsViewStack->currentWidget() == folderContentView && libraryWindow->comicsModel->rowCount() > 0) { + comicsView->reloadContent(); + showComicsView(); + return; + } + + if (comicsViewStack->currentWidget() == comicsView && libraryWindow->comicsModel->rowCount() == 0) { + showFolderContentView(); + folderContentView->reloadContent(); + return; + } + if (comicsViewStack->currentWidget() == comicsView) { comicsView->reloadContent(); }