Reader: make 12 keyboard shortcuts work with non-Latin layouts

Viewer::keyPressEvent()'s custom matching of these shortcuts is the same
as MainWindowViewer::keyPressEvent()'s before the recent commit
"Reader: make 3 keyboard shortcuts work with non-Latin layouts". That
commit's message details the issues with the custom code.

render->hasLoadedComic() condition in Viewer::keyPressEvent() becomes
true when Comic::_loaded is set to true. This always happens right after
Comic emits its numPages() signal. That is why the 12 fixed actions are
now enabled when Viewer emits its comicLoaded() signal, which is
connected to Render::numPages, which in turn is connected to
Comic::numPages signal.

The 12 fixed actions are now disabled when most other actions are
disabled: before a comic is opened and on comic opening error.
This commit is contained in:
Igor Kushnir 2021-03-06 18:48:25 +02:00
parent 0fad89dc03
commit a1bb7735d2
4 changed files with 73 additions and 78 deletions

View File

@ -24,6 +24,8 @@
#include <ctime> #include <ctime>
#include <algorithm> #include <algorithm>
#include <utility>
#include <QApplication> #include <QApplication>
#include <QCoreApplication> #include <QCoreApplication>
#include <QToolButton> #include <QToolButton>
@ -137,6 +139,7 @@ void MainWindowViewer::setupUI()
// setUnifiedTitleAndToolBarOnMac(true); // setUnifiedTitleAndToolBarOnMac(true);
viewer = new Viewer(this); viewer = new Viewer(this);
connect(viewer, &Viewer::comicLoaded, this, [this] { setLoadedComicActionsEnabled(true); });
connect(viewer, &Viewer::reset, this, &MainWindowViewer::processReset); connect(viewer, &Viewer::reset, this, &MainWindowViewer::processReset);
// detected end of comic // detected end of comic
connect(viewer, &Viewer::openNextComic, this, &MainWindowViewer::openNextComic); connect(viewer, &Viewer::openNextComic, this, &MainWindowViewer::openNextComic);
@ -958,6 +961,7 @@ void MainWindowViewer::enableActions()
void MainWindowViewer::disableActions() void MainWindowViewer::disableActions()
{ {
setActionsEnabled(false); setActionsEnabled(false);
setLoadedComicActionsEnabled(false);
setBookmarkAction->setEnabled(false); setBookmarkAction->setEnabled(false);
} }
@ -1236,50 +1240,76 @@ void MainWindowViewer::setUpShortcutsManagement()
auto autoScrollForwardAction = new QAction(tr("Autoscroll down"), orphanActions); auto autoScrollForwardAction = new QAction(tr("Autoscroll down"), orphanActions);
autoScrollForwardAction->setData(AUTO_SCROLL_FORWARD_ACTION_Y); autoScrollForwardAction->setData(AUTO_SCROLL_FORWARD_ACTION_Y);
autoScrollForwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_ACTION_Y)); autoScrollForwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_ACTION_Y));
connect(autoScrollForwardAction, &QAction::triggered, viewer, &Viewer::scrollForward);
auto autoScrollBackwardAction = new QAction(tr("Autoscroll up"), orphanActions); auto autoScrollBackwardAction = new QAction(tr("Autoscroll up"), orphanActions);
autoScrollBackwardAction->setData(AUTO_SCROLL_BACKWARD_ACTION_Y); autoScrollBackwardAction->setData(AUTO_SCROLL_BACKWARD_ACTION_Y);
autoScrollBackwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_ACTION_Y)); autoScrollBackwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_ACTION_Y));
connect(autoScrollBackwardAction, &QAction::triggered, viewer, &Viewer::scrollBackward);
auto autoScrollForwardHorizontalFirstAction = new QAction(tr("Autoscroll forward, horizontal first"), orphanActions); auto autoScrollForwardHorizontalFirstAction = new QAction(tr("Autoscroll forward, horizontal first"), orphanActions);
autoScrollForwardHorizontalFirstAction->setData(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y); autoScrollForwardHorizontalFirstAction->setData(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y);
autoScrollForwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y)); autoScrollForwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y));
connect(autoScrollForwardHorizontalFirstAction, &QAction::triggered, viewer, &Viewer::scrollForwardHorizontalFirst);
auto autoScrollBackwardHorizontalFirstAction = new QAction(tr("Autoscroll backward, horizontal first"), orphanActions); auto autoScrollBackwardHorizontalFirstAction = new QAction(tr("Autoscroll backward, horizontal first"), orphanActions);
autoScrollBackwardHorizontalFirstAction->setData(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y); autoScrollBackwardHorizontalFirstAction->setData(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y);
autoScrollBackwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y)); autoScrollBackwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y));
connect(autoScrollBackwardHorizontalFirstAction, &QAction::triggered, viewer, &Viewer::scrollBackwardHorizontalFirst);
auto autoScrollForwardVerticalFirstAction = new QAction(tr("Autoscroll forward, vertical first"), orphanActions); auto autoScrollForwardVerticalFirstAction = new QAction(tr("Autoscroll forward, vertical first"), orphanActions);
autoScrollForwardVerticalFirstAction->setData(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y); autoScrollForwardVerticalFirstAction->setData(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y);
autoScrollForwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y)); autoScrollForwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y));
connect(autoScrollForwardVerticalFirstAction, &QAction::triggered, viewer, &Viewer::scrollForwardVerticalFirst);
auto autoScrollBackwardVerticalFirstAction = new QAction(tr("Autoscroll backward, vertical first"), orphanActions); auto autoScrollBackwardVerticalFirstAction = new QAction(tr("Autoscroll backward, vertical first"), orphanActions);
autoScrollBackwardVerticalFirstAction->setData(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y); autoScrollBackwardVerticalFirstAction->setData(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y);
autoScrollBackwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y)); autoScrollBackwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y));
connect(autoScrollBackwardVerticalFirstAction, &QAction::triggered, viewer, &Viewer::scrollBackwardVerticalFirst);
auto moveDownAction = new QAction(tr("Move down"), orphanActions); auto moveDownAction = new QAction(tr("Move down"), orphanActions);
moveDownAction->setData(MOVE_DOWN_ACTION_Y); moveDownAction->setData(MOVE_DOWN_ACTION_Y);
moveDownAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y)); moveDownAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y));
connect(moveDownAction, &QAction::triggered, viewer, [this] { viewer->moveView(Qt::Key_Down); });
auto moveUpAction = new QAction(tr("Move up"), orphanActions); auto moveUpAction = new QAction(tr("Move up"), orphanActions);
moveUpAction->setData(MOVE_UP_ACTION_Y); moveUpAction->setData(MOVE_UP_ACTION_Y);
moveUpAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y)); moveUpAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y));
connect(moveUpAction, &QAction::triggered, viewer, [this] { viewer->moveView(Qt::Key_Up); });
auto moveLeftAction = new QAction(tr("Move left"), orphanActions); auto moveLeftAction = new QAction(tr("Move left"), orphanActions);
moveLeftAction->setData(MOVE_LEFT_ACTION_Y); moveLeftAction->setData(MOVE_LEFT_ACTION_Y);
moveLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y)); moveLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y));
connect(moveLeftAction, &QAction::triggered, viewer, [this] { viewer->moveView(Qt::Key_Left); });
auto moveRightAction = new QAction(tr("Move right"), orphanActions); auto moveRightAction = new QAction(tr("Move right"), orphanActions);
moveRightAction->setData(MOVE_RIGHT_ACTION_Y); moveRightAction->setData(MOVE_RIGHT_ACTION_Y);
moveRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_RIGHT_ACTION_Y)); moveRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_RIGHT_ACTION_Y));
connect(moveRightAction, &QAction::triggered, viewer, [this] { viewer->moveView(Qt::Key_Right); });
auto goToFirstPageAction = new QAction(tr("Go to the first page"), orphanActions); auto goToFirstPageAction = new QAction(tr("Go to the first page"), orphanActions);
goToFirstPageAction->setData(GO_TO_FIRST_PAGE_ACTION_Y); goToFirstPageAction->setData(GO_TO_FIRST_PAGE_ACTION_Y);
goToFirstPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_FIRST_PAGE_ACTION_Y)); goToFirstPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_FIRST_PAGE_ACTION_Y));
connect(goToFirstPageAction, &QAction::triggered, viewer, &Viewer::goToFirstPage);
auto goToLastPageAction = new QAction(tr("Go to the last page"), orphanActions); auto goToLastPageAction = new QAction(tr("Go to the last page"), orphanActions);
goToLastPageAction->setData(GO_TO_LAST_PAGE_ACTION_Y); goToLastPageAction->setData(GO_TO_LAST_PAGE_ACTION_Y);
goToLastPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_LAST_PAGE_ACTION_Y)); goToLastPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_LAST_PAGE_ACTION_Y));
connect(goToLastPageAction, &QAction::triggered, viewer, &Viewer::goToLastPage);
loadedComicActions = { autoScrollForwardAction,
autoScrollBackwardAction,
autoScrollForwardHorizontalFirstAction,
autoScrollBackwardHorizontalFirstAction,
autoScrollForwardVerticalFirstAction,
autoScrollBackwardVerticalFirstAction,
moveDownAction,
moveUpAction,
moveLeftAction,
moveRightAction,
goToFirstPageAction,
goToLastPageAction };
addActions(loadedComicActions);
editShortcutsDialog->addActionsGroup(tr("Reading"), QIcon(":/images/shortcuts_group_reading.png"), editShortcutsDialog->addActionsGroup(tr("Reading"), QIcon(":/images/shortcuts_group_reading.png"),
tmpList = QList<QAction *>() tmpList = QList<QAction *>()
@ -1287,18 +1317,7 @@ void MainWindowViewer::setUpShortcutsManagement()
<< goToPageOnTheLeftAction << goToPageOnTheLeftAction
<< setBookmarkAction << setBookmarkAction
<< showBookmarksAction << showBookmarksAction
<< autoScrollForwardAction << loadedComicActions
<< autoScrollBackwardAction
<< autoScrollForwardHorizontalFirstAction
<< autoScrollBackwardHorizontalFirstAction
<< autoScrollForwardVerticalFirstAction
<< autoScrollBackwardVerticalFirstAction
<< moveDownAction
<< moveUpAction
<< moveLeftAction
<< moveRightAction
<< goToFirstPageAction
<< goToLastPageAction
<< goToPageAction); << goToPageAction);
allActions << tmpList; allActions << tmpList;
@ -1523,6 +1542,12 @@ void MainWindowViewer::setActionsEnabled(bool enabled)
a->setEnabled(enabled); a->setEnabled(enabled);
} }
void MainWindowViewer::setLoadedComicActionsEnabled(bool enabled)
{
for (auto *a : std::as_const(loadedComicActions))
a->setEnabled(enabled);
}
void MainWindowViewer::dropEvent(QDropEvent *event) void MainWindowViewer::dropEvent(QDropEvent *event)
{ {
QList<QUrl> urlList; QList<QUrl> urlList;

View File

@ -148,6 +148,8 @@ private:
QAction *showEditShortcutsAction; QAction *showEditShortcutsAction;
QList<QAction *> loadedComicActions;
YACReaderSlider *zoomSliderAction; YACReaderSlider *zoomSliderAction;
HttpVersionChecker *versionChecker; HttpVersionChecker *versionChecker;
@ -161,6 +163,7 @@ private:
void clearRecentFiles(); void clearRecentFiles();
void getSiblingComics(QString path, QString currentComic); void getSiblingComics(QString path, QString currentComic);
void setActionsEnabled(bool enabled); void setActionsEnabled(bool enabled);
void setLoadedComicActionsEnabled(bool enabled);
//! Manejadores de evento: //! Manejadores de evento:
// void resizeEvent(QResizeEvent * event); // void resizeEvent(QResizeEvent * event);

View File

@ -178,6 +178,7 @@ void Viewer::createConnections()
connect(render, &Render::crcError, this, &Viewer::processCRCError); connect(render, &Render::crcError, this, &Viewer::processCRCError);
connect(render, QOverload<unsigned int>::of(&Render::numPages), goToFlow, &GoToFlowWidget::setNumSlides); connect(render, QOverload<unsigned int>::of(&Render::numPages), goToFlow, &GoToFlowWidget::setNumSlides);
connect(render, QOverload<unsigned int>::of(&Render::numPages), goToDialog, &GoToDialog::setNumPages); connect(render, QOverload<unsigned int>::of(&Render::numPages), goToDialog, &GoToDialog::setNumPages);
connect(render, qOverload<unsigned int>(&Render::numPages), this, &Viewer::comicLoaded);
connect(render, QOverload<int, const QByteArray &>::of(&Render::imageLoaded), goToFlow, &GoToFlowWidget::setImageReady); connect(render, QOverload<int, const QByteArray &>::of(&Render::imageLoaded), goToFlow, &GoToFlowWidget::setImageReady);
connect(render, &Render::currentPageReady, this, &Viewer::updatePage); connect(render, &Render::currentPageReady, this, &Viewer::updatePage);
connect(render, &Render::processingPage, this, &Viewer::setLoadingMessage); connect(render, &Render::processingPage, this, &Viewer::setLoadingMessage);
@ -284,6 +285,14 @@ void Viewer::showGoToDialog()
{ {
goToDialog->open(); goToDialog->open();
} }
void Viewer::goToFirstPage()
{
goTo(0);
}
void Viewer::goToLastPage()
{
goTo(this->render->numPages() - 1);
}
void Viewer::goTo(unsigned int page) void Viewer::goTo(unsigned int page)
{ {
direction = 1; // in "go to" direction is always fordward direction = 1; // in "go to" direction is always fordward
@ -456,6 +465,18 @@ void Viewer::scrollUp()
} }
} }
void Viewer::scrollForward()
{
nextPos = verticalScrollBar()->sliderPosition() + verticalScrollStep();
scrollDown();
}
void Viewer::scrollBackward()
{
nextPos = verticalScrollBar()->sliderPosition() - verticalScrollStep();
scrollUp();
}
void Viewer::scrollForwardHorizontalFirst() void Viewer::scrollForwardHorizontalFirst()
{ {
if (!doubleMangaPage) { if (!doubleMangaPage) {
@ -603,54 +624,8 @@ void Viewer::keyPressEvent(QKeyEvent *event)
_key |= Qt::ALT; _key |= Qt::ALT;
QKeySequence key(_key); QKeySequence key(_key);
/*if(goToFlow->isVisible() && event->key()!=Qt::Key_S)
QCoreApplication::sendEvent(goToFlow,event);
else*/
if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_ACTION_Y)) { QAbstractScrollArea::keyPressEvent(event);
nextPos = verticalScrollBar()->sliderPosition() + verticalScrollStep();
scrollDown();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_ACTION_Y)) {
nextPos = verticalScrollBar()->sliderPosition() - verticalScrollStep();
scrollUp();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y)) {
scrollForwardHorizontalFirst();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y)) {
scrollBackwardHorizontalFirst();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y)) {
scrollForwardVerticalFirst();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y)) {
scrollBackwardVerticalFirst();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y) ||
key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y) ||
key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y) ||
key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_RIGHT_ACTION_Y)) {
moveAction(key);
emit backgroundChanges();
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_FIRST_PAGE_ACTION_Y)) {
goTo(0);
}
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_LAST_PAGE_ACTION_Y)) {
goTo(this->render->numPages() - 1);
}
else
QAbstractScrollArea::keyPressEvent(event);
if (mglass->isVisible() && (key == ShortcutsManager::getShortcutsManager().getShortcut(SIZE_UP_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(SIZE_DOWN_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_IN_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_OUT_MGLASS_ACTION_Y))) { if (mglass->isVisible() && (key == ShortcutsManager::getShortcutsManager().getShortcut(SIZE_UP_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(SIZE_DOWN_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_IN_MGLASS_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_OUT_MGLASS_ACTION_Y))) {
QCoreApplication::sendEvent(mglass, event); QCoreApplication::sendEvent(mglass, event);
@ -660,24 +635,11 @@ void Viewer::keyPressEvent(QKeyEvent *event)
QAbstractScrollArea::keyPressEvent(event); QAbstractScrollArea::keyPressEvent(event);
} }
void Viewer::moveAction(const QKeySequence &key) void Viewer::moveView(Qt::Key directionKey)
{ {
int _key = 0; QKeyEvent event(QEvent::KeyPress, directionKey, Qt::NoModifier);
QAbstractScrollArea::keyPressEvent(&event);
if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y)) emit backgroundChanges();
_key = Qt::Key_Down;
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y))
_key = Qt::Key_Up;
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y))
_key = Qt::Key_Left;
else if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_RIGHT_ACTION_Y))
_key = Qt::Key_Right;
QKeyEvent _event = QKeyEvent(QEvent::KeyPress, _key, Qt::NoModifier);
QAbstractScrollArea::keyPressEvent(&_event);
} }
static void animateScroll(QPropertyAnimation &scroller, const QScrollBar &scrollBar, int delta) static void animateScroll(QPropertyAnimation &scroller, const QScrollBar &scrollBar, int delta)

View File

@ -51,6 +51,8 @@ public slots:
void left(); void left();
void right(); void right();
void showGoToDialog(); void showGoToDialog();
void goToFirstPage();
void goToLastPage();
void goTo(unsigned int page); void goTo(unsigned int page);
void updatePage(); void updatePage();
void updateContentSize(); void updateContentSize();
@ -58,6 +60,8 @@ public slots:
void updateOptions(); void updateOptions();
void scrollDown(); void scrollDown();
void scrollUp(); void scrollUp();
void scrollForward();
void scrollBackward();
void scrollForwardHorizontalFirst(); void scrollForwardHorizontalFirst();
void scrollBackwardHorizontalFirst(); void scrollBackwardHorizontalFirst();
void scrollForwardVerticalFirst(); void scrollForwardVerticalFirst();
@ -162,8 +166,6 @@ private:
void wheelEvent(QWheelEvent *event) override; void wheelEvent(QWheelEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
void moveAction(const QKeySequence &key);
int verticalScrollStep() const; int verticalScrollStep() const;
int horizontalScrollStep() const; int horizontalScrollStep() const;
@ -185,10 +187,13 @@ public:
// returns the current index starting in 1 [1,nPages] // returns the current index starting in 1 [1,nPages]
unsigned int getIndex(); unsigned int getIndex();
void updateComic(ComicDB &comic); void updateComic(ComicDB &comic);
void moveView(Qt::Key directionKey);
signals: signals:
void backgroundChanges(); void backgroundChanges();
void pageAvailable(bool); void pageAvailable(bool);
void pageIsBookmark(bool); void pageIsBookmark(bool);
void comicLoaded();
void reset(); void reset();
void openNextComic(); void openNextComic();
void openPreviousComic(); void openPreviousComic();