From c645fe4c665d35bb70edb169ca4844982ea5e95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 29 Nov 2014 19:52:25 +0100 Subject: [PATCH] fixed comic view context menus --- YACReaderLibrary/classic_comics_view.cpp | 32 +++--- YACReaderLibrary/classic_comics_view.h | 6 +- YACReaderLibrary/comics_view.h | 8 +- YACReaderLibrary/grid_comics_view.cpp | 60 ++--------- YACReaderLibrary/grid_comics_view.h | 4 +- YACReaderLibrary/library_window.cpp | 127 +++++++++++++---------- YACReaderLibrary/library_window.h | 6 +- YACReaderLibrary/qml/GridComicsView.qml | 59 ++++------- 8 files changed, 128 insertions(+), 174 deletions(-) diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index 390ffe72..193f5597 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -29,13 +29,7 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) comicFlow->setFocus(Qt::OtherFocusReason); - comicFlow->setContextMenuPolicy(Qt::ActionsContextMenu); - - //TODO!!! set actions.... - //comicFlow->addAction(toggleFullScreenAction); - //comicFlow->addAction(openComicAction); - - //END FLOW---- + comicFlow->setContextMenuPolicy(Qt::CustomContextMenu); //layout----------------------------------------------- @@ -61,6 +55,8 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) comics->setLayout(comicsLayout); sVertical->addWidget(comics); + tableView->setContextMenuPolicy(Qt::CustomContextMenu); + //config-------------------------------------------------- if(settings->contains(COMICS_VIEW_HEADERS)) tableView->horizontalHeader()->restoreState(settings->value(COMICS_VIEW_HEADERS).toByteArray()); @@ -72,6 +68,8 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) connect(tableView, SIGNAL(comicRated(int,QModelIndex)), this, SIGNAL(comicRated(int,QModelIndex))); connect(comicFlow, SIGNAL(selected(uint)), this, SIGNAL(selected(uint))); connect(tableView->horizontalHeader(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(saveTableHeadersStatus())); + connect(comicFlow, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(requestedViewContextMenu(QPoint))); + connect(tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(requestedItemContextMenu(QPoint))); layout->addWidget(sVertical); setLayout(layout); @@ -194,16 +192,6 @@ void ClassicComicsView::updateConfig(QSettings *settings) comicFlow->updateConfig(settings); } -void ClassicComicsView::setItemActions(const QList &actions) -{ - tableView->addActions(actions); -} - -void ClassicComicsView::setViewActions(const QList &actions) -{ - comicFlow->addActions(actions); -} - void ClassicComicsView::enableFilterMode(bool enabled) { if(enabled) @@ -239,6 +227,16 @@ void ClassicComicsView::selectedComicForOpening(const QModelIndex &mi) emit selected(mi.row()); } +void ClassicComicsView::requestedViewContextMenu(const QPoint &point) +{ + emit customContextMenuViewRequested(comicFlow->mapTo(this, point)); +} + +void ClassicComicsView::requestedItemContextMenu(const QPoint &point) +{ + emit customContextMenuItemRequested(tableView->mapTo(this, point)); +} + void ClassicComicsView::setShowMarks(bool show) { comicFlow->setShowMarks(show); diff --git a/YACReaderLibrary/classic_comics_view.h b/YACReaderLibrary/classic_comics_view.h index 600f2e22..161027eb 100644 --- a/YACReaderLibrary/classic_comics_view.h +++ b/YACReaderLibrary/classic_comics_view.h @@ -27,8 +27,6 @@ public: void toFullScreen(); void toNormal(); void updateConfig(QSettings * settings); - void setItemActions(const QList & actions); - void setViewActions(const QList & actions); void enableFilterMode(bool enabled); void selectIndex(int index); @@ -44,6 +42,10 @@ public slots: void selectAll(); void selectedComicForOpening(const QModelIndex & mi); +protected slots: + void requestedViewContextMenu(const QPoint & point); + void requestedItemContextMenu(const QPoint & point); + private: YACReaderTableView * tableView; QWidget *comics; diff --git a/YACReaderLibrary/comics_view.h b/YACReaderLibrary/comics_view.h index d3cff85a..2d4f1940 100644 --- a/YACReaderLibrary/comics_view.h +++ b/YACReaderLibrary/comics_view.h @@ -24,10 +24,6 @@ public: virtual void toFullScreen() = 0; virtual void toNormal() = 0; virtual void updateConfig(QSettings * settings) = 0; - //Actions for tableviews - virtual void setItemActions(const QList & actions) = 0; - //actions for visual-oriented views - virtual void setViewActions(const QList & actions) = 0; virtual void enableFilterMode(bool enabled) = 0; virtual void selectIndex(int index) = 0; @@ -35,6 +31,10 @@ signals: void selected(unsigned int); void comicRated(int,QModelIndex); + //Context menus + void customContextMenuViewRequested(QPoint); + void customContextMenuItemRequested(QPoint); + //Drops void copyComicsToCurrentFolder(QList >); void moveComicsToCurrentFolder(QList >); diff --git a/YACReaderLibrary/grid_comics_view.cpp b/YACReaderLibrary/grid_comics_view.cpp index 354ef2e9..6c004617 100644 --- a/YACReaderLibrary/grid_comics_view.cpp +++ b/YACReaderLibrary/grid_comics_view.cpp @@ -59,6 +59,7 @@ void GridComicsView::setModel(ComicModel *model) ctxt->setContextProperty("comicsList", this->model); ctxt->setContextProperty("comicsSelection", _selectionModel); + ctxt->setContextProperty("contextMenuHelper",this); ctxt->setContextProperty("comicsSelectionHelper", this); ctxt->setContextProperty("comicRatingHelper", this); ctxt->setContextProperty("dummyValue", true); @@ -76,9 +77,9 @@ void GridComicsView::setModel(ComicModel *model) ctxt->setContextProperty("titleColor", "#121212"); ctxt->setContextProperty("textColor", "#636363"); //fonts settings - ctxt->setContextProperty("fontSize", "11"); + ctxt->setContextProperty("fontSize", 11); ctxt->setContextProperty("fontFamily", "none"); - ctxt->setContextProperty("fontSpacing", "0.5"); + ctxt->setContextProperty("fontSpacing", 0.5); #else ctxt->setContextProperty("backgroundColor", "#2A2A2A"); @@ -92,7 +93,7 @@ void GridComicsView::setModel(ComicModel *model) //fonts settings ctxt->setContextProperty("fontSize", "none"); ctxt->setContextProperty("fontFamily", "none"); - ctxt->setContextProperty("fontSpacing", "0.5"); + ctxt->setContextProperty("fontSpacing", 0.5); #endif @@ -144,54 +145,6 @@ void GridComicsView::updateConfig(QSettings *settings) QLOG_INFO() << "updateConfig"; } -void GridComicsView::setItemActions(const QList &actions) -{ - QLOG_INFO() << "setItemActions"; -} - -void GridComicsView::setViewActions(const QList &actions) -{ - //TODO generate QML Menu from actions - QLOG_INFO() << "setViewActions"; - this->addActions(actions); - - //TODO this is completely unsafe, but QActions can't be used directly in QML - if(actions.length()>=19) - { - QQmlContext *ctxt = view->rootContext(); - - ctxt->setContextProperty("openComicAction",actions[0]); - - ctxt->setContextProperty("openContainingFolderComicAction",actions[2]); - ctxt->setContextProperty("updateCurrentFolderAction",actions[3]); - - ctxt->setContextProperty("resetComicRatingAction",actions[5]); - - ctxt->setContextProperty("editSelectedComicsAction",actions[7]); - ctxt->setContextProperty("getInfoAction",actions[8]); - ctxt->setContextProperty("asignOrderAction",actions[9]); - - ctxt->setContextProperty("selectAllComicsAction",actions[11]); - - ctxt->setContextProperty("setAsReadAction",actions[13]); - ctxt->setContextProperty("setAsNonReadAction",actions[14]); - ctxt->setContextProperty("showHideMarksAction",actions[15]); - - ctxt->setContextProperty("deleteComicsAction",actions[17]); - - QAction * tmpAction = actions[19]; - QMenu * menu = tmpAction->menu(); - if(menu) - { - ctxt->setContextProperty("addToFavoritesAction",menu->actions().at(0)); - } - - ctxt->setContextProperty("toggleFullScreenAction",actions[21]); - } - else - QLOG_ERROR() << "setViewActions invoked with the wrong number of actions"; -} - void GridComicsView::enableFilterMode(bool enabled) { @@ -208,6 +161,11 @@ void GridComicsView::rate(int index, int rating) model->updateRating(rating,model->index(index,0)); } +void GridComicsView::requestedContextMenu(const QPoint &point) +{ + emit customContextMenuViewRequested(point); +} + QSize GridComicsView::sizeHint() { QLOG_INFO() << "sizeHint"; diff --git a/YACReaderLibrary/grid_comics_view.h b/YACReaderLibrary/grid_comics_view.h index a8008e74..ec6a9f49 100644 --- a/YACReaderLibrary/grid_comics_view.h +++ b/YACReaderLibrary/grid_comics_view.h @@ -26,8 +26,6 @@ public: void toFullScreen(); void toNormal(); void updateConfig(QSettings * settings); - void setItemActions(const QList & actions); - void setViewActions(const QList & actions); void enableFilterMode(bool enabled); QSize sizeHint(); @@ -50,6 +48,8 @@ public slots: //rating void rate(int index, int rating); +protected slots: + void requestedContextMenu(const QPoint & point); private: QItemSelectionModel * _selectionModel; diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 65c7c2ba..b40ab31d 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -440,6 +440,8 @@ void LibraryWindow::disconnectComicsViewConnections(ComicsView * widget) disconnect(selectAllComicsAction,SIGNAL(triggered()),widget,SLOT(selectAll())); disconnect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList >)), this, SLOT(copyAndImportComicsToCurrentFolder(QList >))); disconnect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList >)), this, SLOT(moveAndImportComicsToCurrentFolder(QList >))); + disconnect(comicsView,SIGNAL(customContextMenuViewRequested(QPoint)),this,SLOT(showComicsViewContextMenu(QPoint))); + disconnect(comicsView,SIGNAL(customContextMenuItemRequested(QPoint)),this,SLOT(showComicsItemContextMenu(QPoint))); } void LibraryWindow::doComicsViewConnections() @@ -449,6 +451,9 @@ void LibraryWindow::doComicsViewConnections() connect(comicsView,SIGNAL(selected(unsigned int)),this,SLOT(openComic())); connect(comicsView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic())); connect(selectAllComicsAction,SIGNAL(triggered()),comicsView,SLOT(selectAll())); + + connect(comicsView,SIGNAL(customContextMenuViewRequested(QPoint)),this,SLOT(showComicsViewContextMenu(QPoint))); + connect(comicsView,SIGNAL(customContextMenuItemRequested(QPoint)),this,SLOT(showComicsItemContextMenu(QPoint))); //Drops connect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList >)), this, SLOT(copyAndImportComicsToCurrentFolder(QList >))); connect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList >)), this, SLOT(moveAndImportComicsToCurrentFolder(QList >))); @@ -766,9 +771,6 @@ void LibraryWindow::createActions() addToFavoritesAction->setToolTip(tr("Add selected comics to favorites list")); addToFavoritesAction->setIcon(QIcon(":/images/lists/default_1.png")); - QMenu * menu = new QMenu(this); - menu->addAction(addToFavoritesAction); - addToMenuAction->setMenu(menu); //disable actions disableAllActions(); } @@ -913,56 +915,6 @@ void LibraryWindow::createToolBars() void LibraryWindow::createMenus() { - itemActions << openComicAction - << YACReader::createSeparator() - << openContainingFolderComicAction - << updateCurrentFolderAction - << YACReader::createSeparator() - << resetComicRatingAction - << YACReader::createSeparator() - << editSelectedComicsAction - << getInfoAction - << asignOrderAction - << YACReader::createSeparator() - << setAsReadAction - << setAsNonReadAction - << YACReader::createSeparator() - << deleteComicsAction - << YACReader::createSeparator() - << addToMenuAction; - - viewActions << openComicAction - << YACReader::createSeparator() - << openContainingFolderComicAction - << updateCurrentFolderAction - << YACReader::createSeparator() - << resetComicRatingAction - << YACReader::createSeparator() - << editSelectedComicsAction - << getInfoAction - << asignOrderAction - << YACReader::createSeparator() - << selectAllComicsAction - << YACReader::createSeparator() - << setAsReadAction - << setAsNonReadAction - << showHideMarksAction - << YACReader::createSeparator() - << deleteComicsAction - << YACReader::createSeparator() - << addToMenuAction - -#ifndef Q_OS_MAC - << YACReader::createSeparator() - << toggleFullScreenAction; -#else - ; -#endif - - - comicsView->setItemActions(itemActions); - comicsView->setViewActions(viewActions); - foldersView->addAction(addFolderAction); foldersView->addAction(deleteFolderAction); YACReader::addSperator(foldersView); @@ -1681,6 +1633,73 @@ void LibraryWindow::addSelectedComicsToFavorites() comicsModel->addComicsToFavorites(indexList); } +void LibraryWindow::showComicsViewContextMenu(const QPoint &point) +{ + QMenu menu; + + menu.addAction(openComicAction); + menu.addSeparator(); + menu.addAction(openContainingFolderComicAction); + menu.addAction(updateCurrentFolderAction); + menu.addSeparator(); + menu.addAction(resetComicRatingAction); + menu.addSeparator(); + menu.addAction(editSelectedComicsAction); + menu.addAction(getInfoAction); + menu.addAction(asignOrderAction); + menu.addSeparator(); + menu.addAction(selectAllComicsAction); + menu.addSeparator(); + menu.addAction(setAsReadAction); + menu.addAction(setAsNonReadAction); + menu.addSeparator(); + menu.addAction(deleteComicsAction); + menu.addSeparator(); + menu.addAction(addToMenuAction); + QMenu subMenu; + setupAddToSubmenu(subMenu); + +#ifndef Q_OS_MAC + menu.addSeparator(); + menu.addAction(toggleFullScreenAction); +#endif + + menu.exec(comicsView->mapToGlobal(point)); +} + +void LibraryWindow::showComicsItemContextMenu(const QPoint &point) +{ + QMenu menu; + + menu.addAction(openComicAction); + menu.addSeparator(); + menu.addAction(openContainingFolderComicAction); + menu.addAction(updateCurrentFolderAction); + menu.addSeparator(); + menu.addAction(resetComicRatingAction); + menu.addSeparator(); + menu.addAction(editSelectedComicsAction); + menu.addAction(getInfoAction); + menu.addAction(asignOrderAction); + menu.addSeparator(); + menu.addAction(setAsReadAction); + menu.addAction(setAsNonReadAction); + menu.addSeparator(); + menu.addAction(deleteComicsAction); + menu.addSeparator(); + menu.addAction(addToMenuAction); + QMenu subMenu; + setupAddToSubmenu(subMenu); + + menu.exec(comicsView->mapToGlobal(point)); +} + +void LibraryWindow::setupAddToSubmenu(QMenu &menu) +{ + menu.addAction(addToFavoritesAction); + addToMenuAction->setMenu(&menu); +} + void LibraryWindow::selectSubfolder(const QModelIndex &mi, int child) { QModelIndex dest = foldersModel->index(child,0,mi); @@ -2119,8 +2138,6 @@ void LibraryWindow::switchToComicsView(ComicsView * from, ComicsView * to) comicsView = to; doComicsViewConnections(); - to->setItemActions(itemActions); - to->setViewActions(viewActions); comicsView->setToolBar(editInfoToolBar); diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 1e03a4e0..43db505e 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -220,9 +220,6 @@ private: QAction * addToMenuAction; QAction * addToFavoritesAction; - QList itemActions; - QList viewActions; - #ifdef Q_OS_MAC YACReaderMacOSXToolbar * libraryToolBar; #else @@ -391,6 +388,9 @@ public slots: void showAddNewLabelDialog(); void showRenameCurrentList(); void addSelectedComicsToFavorites(); + void showComicsViewContextMenu(const QPoint & point); + void showComicsItemContextMenu(const QPoint & point); + void setupAddToSubmenu(QMenu & menu); }; diff --git a/YACReaderLibrary/qml/GridComicsView.qml b/YACReaderLibrary/qml/GridComicsView.qml index fbc0616b..6dda52e0 100644 --- a/YACReaderLibrary/qml/GridComicsView.qml +++ b/YACReaderLibrary/qml/GridComicsView.qml @@ -78,14 +78,11 @@ Rectangle { //grid.currentIndex = index //comicsSelection.setCurrentIndex(index,0x0002) var ci = grid.currentIndex; - if(mouse.button == Qt.RightButton || !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) + if(mouse.button != Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) { comicsSelectionHelper.clear(); } - if(mouse.button == Qt.RightButton) - myContextMenu.popup(); - if(mouse.modifiers & Qt.ShiftModifier) if(index < ci) selectAll(index,ci); @@ -94,46 +91,28 @@ Rectangle { mouse.accepted = true; - comicsSelectionHelper.selectIndex(index) - grid.currentIndex = index; + if(mouse.button == Qt.RightButton) + { + + if(!comicsSelectionHelper.isSelectedIndex(index)) + { + comicsSelectionHelper.selectIndex(index) + grid.currentIndex = index; + } + + var coordinates = main.mapFromItem(realCell,mouseX,mouseY) + contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); + + } else + { + comicsSelectionHelper.selectIndex(index) + grid.currentIndex = index; + } + } } - //Menu emits the 'main' signals - Menu { - id: myContextMenu - MenuItem { text: "Open comic"; enabled: true; iconSource:"qrc:///images/openInYACReader.png"; onTriggered: openComicAction.trigger() } - MenuSeparator{} - MenuItem { text: "Open containing folder..."; enabled: true; iconSource: "qrc:///images/open.png"; onTriggered: openContainingFolderComicAction.trigger() } - MenuItem { text: "Update current folder"; enabled: true; iconSource: "qrc:///images/updateLibraryIcon.png"; onTriggered: updateCurrentFolderAction.trigger() } - MenuSeparator{} - MenuItem { text: "Reset comic rating"; onTriggered: resetComicRatingAction.trigger() } - MenuSeparator{} - MenuItem { text: "Edit"; enabled: true; iconSource:"qrc:///images/editComic.png"; onTriggered: editSelectedComicsAction.trigger() } - MenuItem { text: "Download tags from Comic Vine"; enabled: true; iconSource:"qrc:///images/getInfo.png"; onTriggered: getInfoAction.trigger() } - MenuItem { text: "Asign current order to comics"; enabled: true; iconSource:"qrc:///images/asignNumber.png"; onTriggered: asignOrderAction.trigger() } - MenuSeparator{} - MenuItem { text: "Select all comics"; enabled: true; iconSource:"qrc:///images/selectAll.png"; onTriggered: selectAllComicsAction.trigger() } - MenuSeparator{} - MenuItem { text: "Set as read"; enabled: true; iconSource:"qrc:///images/setReadButton.png"; onTriggered: setAsReadAction.trigger() } - MenuItem { text: "Set as unread"; enabled: true; iconSource:"qrc:///images/setUnread.png"; onTriggered: setAsNonReadAction.trigger() } - MenuItem { text: "Show or hide read marks"; enabled: true; iconSource:"qrc:///images/showMarks.png"; onTriggered: showHideMarksAction.trigger() } - MenuSeparator{} - MenuItem { text: "Delete selected comics"; enabled: true; iconSource:"qrc:///images/trash.png"; onTriggered: deleteComicsAction.trigger() } - MenuSeparator{} - Menu { - id: addToMenu - title: "Add to..." - MenuItem { text: "Favorites"; enabled: true; iconSource:"qrc:///images/lists/default_1.png"; onTriggered: addToFavoritesAction.trigger() } - } - - MenuSeparator{} - MenuItem { text: "Fullscreen mode on/off"; onTriggered: toggleFullScreenAction.trigger() } - //MenuItem { text: "Show details"; onTriggered: cell.state = 'Details'; - } - - } /**/