mirror of
https://github.com/YACReader/yacreader
synced 2025-05-28 03:10:27 -04:00
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).
247 lines
9.2 KiB
C++
247 lines
9.2 KiB
C++
#include "yacreader_comics_views_manager.h"
|
|
|
|
#include "library_window.h"
|
|
|
|
#include "classic_comics_view.h"
|
|
#include "grid_comics_view.h"
|
|
#include "info_comics_view.h"
|
|
#include "comics_view_transition.h"
|
|
#include "empty_folder_widget.h"
|
|
#include "empty_label_widget.h"
|
|
#include "empty_special_list.h"
|
|
#include "empty_reading_list_widget.h"
|
|
#include "no_search_results_widget.h"
|
|
|
|
#include "yacreader_sidebar.h"
|
|
|
|
//--
|
|
#include "yacreader_search_line_edit.h"
|
|
#include "options_dialog.h"
|
|
|
|
YACReaderComicsViewsManager::YACReaderComicsViewsManager(QSettings *settings, LibraryWindow *parent)
|
|
: QObject(parent), libraryWindow(parent), classicComicsView(nullptr), gridComicsView(nullptr), infoComicsView(nullptr)
|
|
{
|
|
comicsViewStack = new QStackedWidget();
|
|
|
|
switch ((YACReader::ComicsViewStatus)settings->value(COMICS_VIEW_STATUS).toInt()) {
|
|
case Flow:
|
|
comicsView = classicComicsView = new ClassicComicsView();
|
|
comicsViewStatus = Flow;
|
|
break;
|
|
|
|
case Grid:
|
|
comicsView = gridComicsView = new GridComicsView();
|
|
connect(libraryWindow->optionsDialog, SIGNAL(optionsChanged()), gridComicsView, SLOT(updateBackgroundConfig()));
|
|
comicsViewStatus = Grid;
|
|
break;
|
|
|
|
case Info:
|
|
comicsView = infoComicsView = new InfoComicsView();
|
|
comicsViewStatus = Info;
|
|
break;
|
|
|
|
default:
|
|
comicsView = classicComicsView = new ClassicComicsView();
|
|
comicsViewStatus = Flow;
|
|
}
|
|
|
|
doComicsViewConnections();
|
|
|
|
comicsViewStack->addWidget(comicsViewTransition = new ComicsViewTransition());
|
|
comicsViewStack->addWidget(emptyFolderWidget = new EmptyFolderWidget());
|
|
comicsViewStack->addWidget(emptyLabelWidget = new EmptyLabelWidget());
|
|
comicsViewStack->addWidget(emptySpecialList = new EmptySpecialListWidget());
|
|
comicsViewStack->addWidget(emptyReadingList = new EmptyReadingListWidget());
|
|
comicsViewStack->addWidget(noSearchResultsWidget = new NoSearchResultsWidget());
|
|
|
|
comicsViewStack->addWidget(comicsView);
|
|
|
|
comicsViewStack->setCurrentWidget(comicsView);
|
|
|
|
//connections
|
|
|
|
connect(emptyFolderWidget, SIGNAL(copyComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(copyAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
connect(emptyFolderWidget, SIGNAL(moveComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(moveAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
}
|
|
|
|
QWidget *YACReaderComicsViewsManager::containerWidget()
|
|
{
|
|
return comicsViewStack;
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::updateCurrentComicView()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
comicsView->updateCurrentComicView();
|
|
}
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showComicsView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(comicsView);
|
|
|
|
//BUG, ugly workaround for glitch when QOpenGLWidget (flow) is used just after any other widget in the views stack
|
|
//Somehow QOpenGLWidget is messing with the rendering of the side bar (wrong buffer swapping)
|
|
libraryWindow->sideBar->update();
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showEmptyFolderView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyFolderWidget);
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showEmptyLabelView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyLabelWidget);
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showEmptySpecialList()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptySpecialList);
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showEmptyReadingListWidget()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyReadingList);
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showNoSearchResultsView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(noSearchResultsWidget);
|
|
}
|
|
|
|
//TODO recover the current comics selection and restore it in the destination
|
|
void YACReaderComicsViewsManager::toggleComicsView()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
QTimer::singleShot(0, this, SLOT(showComicsViewTransition()));
|
|
QTimer::singleShot(100, this, SLOT(_toggleComicsView()));
|
|
} else {
|
|
_toggleComicsView();
|
|
}
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::focusComicsViewViaShortcut()
|
|
{
|
|
comicsView->focusComicsNavigation(Qt::ShortcutFocusReason);
|
|
}
|
|
|
|
//PROTECTED
|
|
|
|
void YACReaderComicsViewsManager::disconnectComicsViewConnections(ComicsView *widget)
|
|
{
|
|
disconnect(widget, SIGNAL(comicRated(int, QModelIndex)), libraryWindow->comicsModel, SLOT(updateRating(int, QModelIndex)));
|
|
disconnect(libraryWindow->showHideMarksAction, SIGNAL(toggled(bool)), widget, SLOT(setShowMarks(bool)));
|
|
disconnect(widget, SIGNAL(selected(unsigned int)), libraryWindow, SLOT(openComic()));
|
|
disconnect(widget, SIGNAL(openComic(ComicDB)), libraryWindow, SLOT(openComic(ComicDB)));
|
|
disconnect(libraryWindow->selectAllComicsAction, SIGNAL(triggered()), widget, SLOT(selectAll()));
|
|
disconnect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(copyAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
disconnect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(moveAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
disconnect(comicsView, SIGNAL(customContextMenuViewRequested(QPoint)), libraryWindow, SLOT(showComicsViewContextMenu(QPoint)));
|
|
disconnect(comicsView, SIGNAL(customContextMenuItemRequested(QPoint)), libraryWindow, SLOT(showComicsItemContextMenu(QPoint)));
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::doComicsViewConnections()
|
|
{
|
|
connect(comicsView, SIGNAL(comicRated(int, QModelIndex)), libraryWindow->comicsModel, SLOT(updateRating(int, QModelIndex)));
|
|
connect(libraryWindow->showHideMarksAction, SIGNAL(toggled(bool)), comicsView, SLOT(setShowMarks(bool)));
|
|
connect(comicsView, SIGNAL(selected(unsigned int)), libraryWindow, SLOT(openComic()));
|
|
connect(comicsView, SIGNAL(openComic(ComicDB)), libraryWindow, SLOT(openComic(ComicDB)));
|
|
|
|
connect(libraryWindow->selectAllComicsAction, SIGNAL(triggered()), comicsView, SLOT(selectAll()));
|
|
|
|
connect(comicsView, SIGNAL(customContextMenuViewRequested(QPoint)), libraryWindow, SLOT(showComicsViewContextMenu(QPoint)));
|
|
connect(comicsView, SIGNAL(customContextMenuItemRequested(QPoint)), libraryWindow, SLOT(showComicsItemContextMenu(QPoint)));
|
|
//Drops
|
|
connect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(copyAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
connect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList<QPair<QString, QString>>)), libraryWindow, SLOT(moveAndImportComicsToCurrentFolder(QList<QPair<QString, QString>>)));
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::switchToComicsView(ComicsView *from, ComicsView *to)
|
|
{
|
|
//setup views
|
|
disconnectComicsViewConnections(from);
|
|
from->close();
|
|
|
|
comicsView = to;
|
|
doComicsViewConnections();
|
|
|
|
comicsView->setToolBar(libraryWindow->editInfoToolBar);
|
|
|
|
comicsViewStack->removeWidget(from);
|
|
comicsViewStack->addWidget(comicsView);
|
|
|
|
//delete from; No need to delete the previews view, because all views are going to be kept in memory
|
|
|
|
//load content into current view
|
|
libraryWindow->loadCoversFromCurrentModel();
|
|
|
|
if (!libraryWindow->searchEdit->text().isEmpty()) {
|
|
comicsView->enableFilterMode(true);
|
|
}
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::showComicsViewTransition()
|
|
{
|
|
comicsViewStack->setCurrentWidget(comicsViewTransition);
|
|
}
|
|
|
|
void YACReaderComicsViewsManager::_toggleComicsView()
|
|
{
|
|
switch (comicsViewStatus) {
|
|
case Flow: {
|
|
QIcon icoViewsButton;
|
|
icoViewsButton.addFile(":/images/main_toolbar/info.png", QSize(), QIcon::Normal);
|
|
libraryWindow->toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Q_OS_MAC
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton);
|
|
#endif
|
|
if (gridComicsView == nullptr)
|
|
gridComicsView = new GridComicsView();
|
|
|
|
switchToComicsView(classicComicsView, gridComicsView);
|
|
connect(libraryWindow->optionsDialog, SIGNAL(optionsChanged()), gridComicsView, SLOT(updateBackgroundConfig()));
|
|
comicsViewStatus = Grid;
|
|
|
|
break;
|
|
}
|
|
|
|
case Grid: {
|
|
QIcon icoViewsButton;
|
|
icoViewsButton.addFile(":/images/main_toolbar/flow.png", QSize(), QIcon::Normal);
|
|
libraryWindow->toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Q_OS_MAC
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton);
|
|
#endif
|
|
if (infoComicsView == nullptr)
|
|
infoComicsView = new InfoComicsView();
|
|
|
|
switchToComicsView(gridComicsView, infoComicsView);
|
|
comicsViewStatus = Info;
|
|
|
|
break;
|
|
}
|
|
|
|
case Info: {
|
|
QIcon icoViewsButton;
|
|
icoViewsButton.addFile(":/images/main_toolbar/grid.png", QSize(), QIcon::Normal);
|
|
libraryWindow->toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Q_OS_MAC
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton);
|
|
#endif
|
|
if (classicComicsView == nullptr)
|
|
classicComicsView = new ClassicComicsView();
|
|
|
|
switchToComicsView(infoComicsView, classicComicsView);
|
|
comicsViewStatus = Flow;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
libraryWindow->settings->setValue(COMICS_VIEW_STATUS, comicsViewStatus);
|
|
|
|
if (comicsViewStack->currentWidget() == comicsViewTransition)
|
|
showComicsView();
|
|
}
|