mirror of
https://github.com/YACReader/yacreader
synced 2026-04-12 15:49:53 -04:00
Some checks failed
Build / Initialization (push) Has been cancelled
Build / Code Format Validation (push) Has been cancelled
Build / Linux (Qt6) (push) Has been cancelled
Build / Linux (Qt6 + 7zip) (push) Has been cancelled
Build / macOS (Qt6 Universal) (push) Has been cancelled
Build / Windows x64 (Qt6) (push) Has been cancelled
Build / Windows ARM64 (Qt6) (push) Has been cancelled
Build / Docker amd64 Image (push) Has been cancelled
Build / Docker arm64 Image (push) Has been cancelled
Build / Publish Dev Builds (push) Has been cancelled
Build / Publish Release (push) Has been cancelled
Build / Publish YACReader10 Pre-release Builds (push) Has been cancelled
Going from empty to content or content to empty was broken and the state was never updated until the folder was reselected.
326 lines
12 KiB
C++
326 lines
12 KiB
C++
#include "yacreader_content_views_manager.h"
|
|
|
|
#include "classic_comics_view.h"
|
|
#include "comics_view_transition.h"
|
|
#include "empty_folder_widget.h"
|
|
#include "empty_label_widget.h"
|
|
#include "empty_reading_list_widget.h"
|
|
#include "empty_special_list.h"
|
|
#include "folder_content_view.h"
|
|
#include "grid_comics_view.h"
|
|
#include "info_comics_view.h"
|
|
#include "library_window.h"
|
|
#include "no_search_results_widget.h"
|
|
#include "options_dialog.h"
|
|
#include "reading_list_model.h"
|
|
#include "yacreader_options_dialog.h"
|
|
#include "yacreader_reading_lists_view.h"
|
|
#include "yacreader_sidebar.h"
|
|
|
|
//--
|
|
#include "yacreader_search_line_edit.h"
|
|
|
|
YACReaderContentViewsManager::YACReaderContentViewsManager(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 Info:
|
|
comicsView = infoComicsView = new InfoComicsView();
|
|
comicsViewStatus = Info;
|
|
break;
|
|
|
|
case Grid:
|
|
default:
|
|
comicsView = gridComicsView = new GridComicsView();
|
|
connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::optionsChanged, gridComicsView, &GridComicsView::updateBackgroundConfig);
|
|
connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::finished, gridComicsView, &GridComicsView::updateSettings); // TODO: we can link constante changes to updateSettings because of bad performance
|
|
comicsViewStatus = Grid;
|
|
break;
|
|
}
|
|
|
|
doComicsViewConnections();
|
|
|
|
comicsViewStack->addWidget(comicsViewTransition = new ComicsViewTransition());
|
|
comicsViewStack->addWidget(folderContentView = new FolderContentView(parent->actions.toogleShowRecentIndicatorAction));
|
|
comicsViewStack->addWidget(emptyLabelWidget = new EmptyLabelWidget());
|
|
comicsViewStack->addWidget(emptySpecialList = new EmptySpecialListWidget());
|
|
comicsViewStack->addWidget(emptyReadingList = new EmptyReadingListWidget());
|
|
comicsViewStack->addWidget(emptyFolderWidget = new EmptyFolderWidget());
|
|
comicsViewStack->addWidget(noSearchResultsWidget = new NoSearchResultsWidget());
|
|
|
|
comicsViewStack->addWidget(comicsView);
|
|
|
|
comicsViewStack->setCurrentWidget(comicsView);
|
|
|
|
// connections
|
|
connect(folderContentView, &FolderContentView::copyComicsToCurrentFolder, libraryWindow, &LibraryWindow::copyAndImportComicsToCurrentFolder);
|
|
connect(folderContentView, &FolderContentView::moveComicsToCurrentFolder, libraryWindow, &LibraryWindow::moveAndImportComicsToCurrentFolder);
|
|
connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::optionsChanged, folderContentView, &FolderContentView::updateSettings);
|
|
|
|
initTheme(this);
|
|
}
|
|
|
|
QWidget *YACReaderContentViewsManager::containerWidget()
|
|
{
|
|
return comicsViewStack;
|
|
}
|
|
|
|
void YACReaderContentViewsManager::updateCurrentContentView()
|
|
{
|
|
if (libraryWindow->status == LibraryWindow::Searching) {
|
|
auto currentWidget = comicsViewStack->currentWidget();
|
|
|
|
libraryWindow->comicsModel->reload();
|
|
|
|
if (currentWidget == comicsView) {
|
|
comicsView->reloadContent();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!libraryWindow->listsView->selectionModel()->selectedRows().isEmpty()) {
|
|
auto currentListIndex = libraryWindow->listsModelProxy->mapToSource(libraryWindow->listsView->currentIndex());
|
|
libraryWindow->navigationController->loadListInfo(currentListIndex);
|
|
return;
|
|
}
|
|
|
|
libraryWindow->navigationController->loadFolderInfo(libraryWindow->getCurrentFolderIndex());
|
|
}
|
|
|
|
void YACReaderContentViewsManager::updateCurrentComicView()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
comicsView->updateCurrentComicView();
|
|
}
|
|
}
|
|
|
|
void YACReaderContentViewsManager::updateContinueReadingView()
|
|
{
|
|
if (comicsViewStack->currentWidget() == folderContentView) {
|
|
folderContentView->reloadContinueReadingModel();
|
|
}
|
|
}
|
|
|
|
void YACReaderContentViewsManager::toFullscreen()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
comicsView->toFullScreen();
|
|
return;
|
|
}
|
|
}
|
|
|
|
void YACReaderContentViewsManager::toNormal()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
comicsView->toNormal();
|
|
return;
|
|
}
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showComicsView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(comicsView);
|
|
|
|
// TODO: check if this is still needed in the rhi implementation
|
|
// 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 YACReaderContentViewsManager::showFolderContentView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(folderContentView);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showEmptyLabelView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyLabelWidget);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showEmptySpecialList()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptySpecialList);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showEmptyReadingListWidget()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyReadingList);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showEmptyFolderWidget()
|
|
{
|
|
comicsViewStack->setCurrentWidget(emptyFolderWidget);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::showNoSearchResultsView()
|
|
{
|
|
comicsViewStack->setCurrentWidget(noSearchResultsWidget);
|
|
}
|
|
|
|
// TODO recover the current comics selection and restore it in the destination
|
|
void YACReaderContentViewsManager::toggleComicsView()
|
|
{
|
|
if (comicsViewStack->currentWidget() == comicsView) {
|
|
QTimer::singleShot(0, this, &YACReaderContentViewsManager::showComicsViewTransition);
|
|
QTimer::singleShot(100, this, &YACReaderContentViewsManager::_toggleComicsView);
|
|
} else {
|
|
_toggleComicsView();
|
|
}
|
|
}
|
|
|
|
void YACReaderContentViewsManager::focusComicsViewViaShortcut()
|
|
{
|
|
comicsView->focusComicsNavigation(Qt::ShortcutFocusReason);
|
|
}
|
|
|
|
// PROTECTED
|
|
|
|
void YACReaderContentViewsManager::disconnectComicsViewConnections(ComicsView *widget)
|
|
{
|
|
disconnect(widget, &ComicsView::comicRated, libraryWindow->comicsModel, &ComicModel::updateRating);
|
|
disconnect(libraryWindow->actions.showHideMarksAction, &QAction::toggled, widget, &ComicsView::setShowMarks);
|
|
disconnect(widget, &ComicsView::selected, libraryWindow, QOverload<>::of(&LibraryWindow::openComic));
|
|
disconnect(widget, &ComicsView::openComic, libraryWindow, QOverload<const ComicDB &, const ComicModel::Mode>::of(&LibraryWindow::openComic));
|
|
disconnect(libraryWindow->actions.selectAllComicsAction, &QAction::triggered, widget, &ComicsView::selectAll);
|
|
disconnect(comicsView, &ComicsView::copyComicsToCurrentFolder, libraryWindow, &LibraryWindow::copyAndImportComicsToCurrentFolder);
|
|
disconnect(comicsView, &ComicsView::moveComicsToCurrentFolder, libraryWindow, &LibraryWindow::moveAndImportComicsToCurrentFolder);
|
|
disconnect(comicsView, &ComicsView::customContextMenuViewRequested, libraryWindow, &LibraryWindow::showComicsViewContextMenu);
|
|
disconnect(comicsView, &ComicsView::customContextMenuItemRequested, libraryWindow, &LibraryWindow::showComicsItemContextMenu);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::doComicsViewConnections()
|
|
{
|
|
connect(comicsView, &ComicsView::comicRated, libraryWindow->comicsModel, &ComicModel::updateRating);
|
|
connect(libraryWindow->actions.showHideMarksAction, &QAction::toggled, comicsView, &ComicsView::setShowMarks);
|
|
connect(comicsView, &ComicsView::selected, libraryWindow, QOverload<>::of(&LibraryWindow::openComic));
|
|
connect(comicsView, &ComicsView::openComic, libraryWindow, QOverload<const ComicDB &, const ComicModel::Mode>::of(&LibraryWindow::openComic));
|
|
|
|
connect(libraryWindow->actions.selectAllComicsAction, &QAction::triggered, comicsView, &ComicsView::selectAll);
|
|
|
|
connect(comicsView, &ComicsView::customContextMenuViewRequested, libraryWindow, &LibraryWindow::showComicsViewContextMenu);
|
|
connect(comicsView, &ComicsView::customContextMenuItemRequested, libraryWindow, &LibraryWindow::showComicsItemContextMenu);
|
|
// Drops
|
|
connect(comicsView, &ComicsView::copyComicsToCurrentFolder, libraryWindow, &LibraryWindow::copyAndImportComicsToCurrentFolder);
|
|
connect(comicsView, &ComicsView::moveComicsToCurrentFolder, libraryWindow, &LibraryWindow::moveAndImportComicsToCurrentFolder);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::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 YACReaderContentViewsManager::showComicsViewTransition()
|
|
{
|
|
comicsViewStack->setCurrentWidget(comicsViewTransition);
|
|
}
|
|
|
|
void YACReaderContentViewsManager::_toggleComicsView()
|
|
{
|
|
const auto &mainToolbar = theme.mainToolbar;
|
|
|
|
switch (comicsViewStatus) {
|
|
case Flow: {
|
|
QIcon icoViewsButton = mainToolbar.infoIcon;
|
|
libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Y_MAC_UI
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton);
|
|
#endif
|
|
if (gridComicsView == nullptr)
|
|
gridComicsView = new GridComicsView();
|
|
|
|
switchToComicsView(classicComicsView, gridComicsView);
|
|
connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::optionsChanged, gridComicsView, &GridComicsView::updateBackgroundConfig);
|
|
connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::finished, gridComicsView, &GridComicsView::updateSettings); // TODO: we can link constante changes to updateSettings because of bad performance
|
|
comicsViewStatus = Grid;
|
|
|
|
break;
|
|
}
|
|
|
|
case Grid: {
|
|
QIcon icoViewsButton = mainToolbar.flowIcon;
|
|
libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Y_MAC_UI
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton);
|
|
#endif
|
|
if (infoComicsView == nullptr)
|
|
infoComicsView = new InfoComicsView();
|
|
|
|
switchToComicsView(gridComicsView, infoComicsView);
|
|
comicsViewStatus = Info;
|
|
|
|
break;
|
|
}
|
|
|
|
case Info: {
|
|
QIcon icoViewsButton = mainToolbar.gridIcon;
|
|
libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton);
|
|
#ifdef Y_MAC_UI
|
|
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();
|
|
}
|
|
|
|
void YACReaderContentViewsManager::applyTheme(const Theme &theme)
|
|
{
|
|
const auto &mainToolbar = theme.mainToolbar;
|
|
|
|
// Update the toggle button icon based on current view status
|
|
// The icon shows what the NEXT view will be when clicked
|
|
QIcon icon;
|
|
switch (comicsViewStatus) {
|
|
case Flow:
|
|
icon = mainToolbar.gridIcon;
|
|
break;
|
|
case Grid:
|
|
icon = mainToolbar.infoIcon;
|
|
break;
|
|
case Info:
|
|
icon = mainToolbar.flowIcon;
|
|
break;
|
|
}
|
|
|
|
libraryWindow->actions.toggleComicsViewAction->setIcon(icon);
|
|
#ifdef Y_MAC_UI
|
|
libraryWindow->libraryToolBar->updateViewSelectorIcon(icon);
|
|
#endif
|
|
}
|