From 8a541008042ab0b21cb18bc3382918d3dee2df0e Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Wed, 22 May 2019 14:12:31 +0300 Subject: [PATCH] Library: allow configuring a shortcut to focus comics view Focusing the current comics view allows to use keyboard arrow keys to choose among the visible comics. The shortcut for this new action should not be a single character without modifiers because it won't work when the search line has focus. The Qt::FocusReason parameter in ComicsView::focusComicsNavigation() allows to reuse this function for other keyboard navigation features. For instance the search line can transfer focus to comics navigation when the user presses Return or Enter key. In this case Qt::OtherFocusReason can be used (an application-specific reason). --- YACReaderLibrary/classic_comics_view.cpp | 9 +++++++++ YACReaderLibrary/classic_comics_view.h | 1 + YACReaderLibrary/comics_view.h | 1 + YACReaderLibrary/grid_comics_view.cpp | 5 +++++ YACReaderLibrary/grid_comics_view.h | 1 + YACReaderLibrary/info_comics_view.cpp | 5 +++++ YACReaderLibrary/info_comics_view.h | 1 + YACReaderLibrary/library_window.cpp | 8 ++++++++ YACReaderLibrary/library_window.h | 2 ++ YACReaderLibrary/yacreader_comics_views_manager.cpp | 5 +++++ YACReaderLibrary/yacreader_comics_views_manager.h | 1 + shortcuts_management/shortcuts_manager.h | 1 + 12 files changed, 40 insertions(+) diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index 56d35fc1..113a6381 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -258,6 +258,15 @@ void ClassicComicsView::updateCurrentComicView() { } +void ClassicComicsView::focusComicsNavigation(Qt::FocusReason reason) +{ + const bool comicFlowVisible = stack->currentWidget() == comicFlow && sVertical->sizes().constFirst() != 0; + if (comicFlowVisible) + comicFlow->setFocus(reason); + else // Let the user navigate the table. + tableView->setFocus(reason); +} + void ClassicComicsView::selectAll() { tableView->selectAll(); diff --git a/YACReaderLibrary/classic_comics_view.h b/YACReaderLibrary/classic_comics_view.h index a5d51f14..4b09ca96 100644 --- a/YACReaderLibrary/classic_comics_view.h +++ b/YACReaderLibrary/classic_comics_view.h @@ -32,6 +32,7 @@ public: void enableFilterMode(bool enabled) override; void selectIndex(int index) override; void updateCurrentComicView() override; + void focusComicsNavigation(Qt::FocusReason reason) override; public slots: void setCurrentIndex(const QModelIndex &index) override; diff --git a/YACReaderLibrary/comics_view.h b/YACReaderLibrary/comics_view.h index 54e49ee6..9b98eee7 100644 --- a/YACReaderLibrary/comics_view.h +++ b/YACReaderLibrary/comics_view.h @@ -29,6 +29,7 @@ public: virtual void enableFilterMode(bool enabled) = 0; virtual void selectIndex(int index) = 0; virtual void updateCurrentComicView() = 0; + virtual void focusComicsNavigation(Qt::FocusReason reason) = 0; public slots: virtual void updateInfoForIndex(int index); diff --git a/YACReaderLibrary/grid_comics_view.cpp b/YACReaderLibrary/grid_comics_view.cpp index cfeadb85..feb24ae2 100644 --- a/YACReaderLibrary/grid_comics_view.cpp +++ b/YACReaderLibrary/grid_comics_view.cpp @@ -491,6 +491,11 @@ void GridComicsView::updateCurrentComicView() setCurrentComicIfNeeded(); } +void GridComicsView::focusComicsNavigation(Qt::FocusReason reason) +{ + view->setFocus(reason); +} + void GridComicsView::startDrag() { auto drag = new QDrag(this); diff --git a/YACReaderLibrary/grid_comics_view.h b/YACReaderLibrary/grid_comics_view.h index 73e0e2b6..1d7ca65e 100644 --- a/YACReaderLibrary/grid_comics_view.h +++ b/YACReaderLibrary/grid_comics_view.h @@ -34,6 +34,7 @@ public: QSize sizeHint(); QByteArray getMimeDataFromSelection(); void updateCurrentComicView() override; + void focusComicsNavigation(Qt::FocusReason reason) override; public slots: //ComicsView diff --git a/YACReaderLibrary/info_comics_view.cpp b/YACReaderLibrary/info_comics_view.cpp index f4d0c87e..5aa5191c 100644 --- a/YACReaderLibrary/info_comics_view.cpp +++ b/YACReaderLibrary/info_comics_view.cpp @@ -208,6 +208,11 @@ void InfoComicsView::updateCurrentComicView() { } +void InfoComicsView::focusComicsNavigation(Qt::FocusReason reason) +{ + view->setFocus(reason); +} + void InfoComicsView::setShowMarks(bool show) { QQmlContext *ctxt = view->rootContext(); diff --git a/YACReaderLibrary/info_comics_view.h b/YACReaderLibrary/info_comics_view.h index a3f8c288..d4fe38d6 100644 --- a/YACReaderLibrary/info_comics_view.h +++ b/YACReaderLibrary/info_comics_view.h @@ -26,6 +26,7 @@ public: void enableFilterMode(bool enabled) override; void selectIndex(int index) override; void updateCurrentComicView() override; + void focusComicsNavigation(Qt::FocusReason reason) override; public slots: void setShowMarks(bool show); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 3a5b67f4..c13df18b 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -378,6 +378,7 @@ void LibraryWindow::setUpShortcutsManagement() << backAction << forwardAction << focusSearchLineAction + << focusComicsViewAction << helpAboutAction << optionsAction << serverConfigAction @@ -726,6 +727,11 @@ void LibraryWindow::createActions() focusSearchLineAction->setIcon(QIcon(":/images/iconSearch.png")); addAction(focusSearchLineAction); + focusComicsViewAction = new QAction(tr("Focus comics view"), this); + focusComicsViewAction->setData(FOCUS_COMICS_VIEW_ACTION_YL); + focusComicsViewAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(FOCUS_COMICS_VIEW_ACTION_YL)); + addAction(focusComicsViewAction); + showEditShortcutsAction = new QAction(tr("Edit shortcuts"), this); showEditShortcutsAction->setData(SHOW_EDIT_SHORTCUTS_ACTION_YL); showEditShortcutsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_EDIT_SHORTCUTS_ACTION_YL)); @@ -1155,6 +1161,8 @@ void LibraryWindow::createConnections() //connect(emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); connect(focusSearchLineAction, &QAction::triggered, searchEdit, [this] { searchEdit->setFocus(Qt::ShortcutFocusReason); }); + connect(focusComicsViewAction, &QAction::triggered, comicsViewsManager, &YACReaderComicsViewsManager::focusComicsViewViaShortcut); + connect(showEditShortcutsAction, SIGNAL(triggered()), editShortcutsDialog, SLOT(show())); //update folders (partial updates) diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 8a88f1f0..7a433004 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -214,6 +214,8 @@ public: QAction *deleteComicsAction; QAction *focusSearchLineAction; + QAction *focusComicsViewAction; + QAction *showEditShortcutsAction; QAction *updateFolderAction; diff --git a/YACReaderLibrary/yacreader_comics_views_manager.cpp b/YACReaderLibrary/yacreader_comics_views_manager.cpp index 63ff90db..45301831 100644 --- a/YACReaderLibrary/yacreader_comics_views_manager.cpp +++ b/YACReaderLibrary/yacreader_comics_views_manager.cpp @@ -121,6 +121,11 @@ void YACReaderComicsViewsManager::toggleComicsView() } } +void YACReaderComicsViewsManager::focusComicsViewViaShortcut() +{ + comicsView->focusComicsNavigation(Qt::ShortcutFocusReason); +} + //PROTECTED void YACReaderComicsViewsManager::disconnectComicsViewConnections(ComicsView *widget) diff --git a/YACReaderLibrary/yacreader_comics_views_manager.h b/YACReaderLibrary/yacreader_comics_views_manager.h index b93fed05..4e79dd25 100644 --- a/YACReaderLibrary/yacreader_comics_views_manager.h +++ b/YACReaderLibrary/yacreader_comics_views_manager.h @@ -55,6 +55,7 @@ signals: public slots: void toggleComicsView(); + void focusComicsViewViaShortcut(); void showComicsView(); void showEmptyFolderView(); diff --git a/shortcuts_management/shortcuts_manager.h b/shortcuts_management/shortcuts_manager.h index dbcd8eb0..787eee2a 100644 --- a/shortcuts_management/shortcuts_manager.h +++ b/shortcuts_management/shortcuts_manager.h @@ -76,6 +76,7 @@ public: #define HIDE_COMIC_VIEW_ACTION_YL "HIDE_COMIC_VIEW_ACTION_YL" #define GET_INFO_ACTION_YL "GET_INFO_ACTION_YL" #define FOCUS_SEARCH_LINE_ACTION_YL "FOCUS_SEARCH_LINE_ACTION_YL" +#define FOCUS_COMICS_VIEW_ACTION_YL "FOCUS_COMICS_VIEW_ACTION_YL" #define SHOW_EDIT_SHORTCUTS_ACTION_YL "SHOW_EDIT_SHORTCUTS_ACTION_YL" #define UPDATE_CURRENT_FOLDER_ACTION_YL "UPDATE_CURRENT_FOLDER_ACTION_YL" #define ADD_FOLDER_ACTION_YL "ADD_FOLDER_ACTION_YL"