Merge pull request #258 from YACReader/develop

9.8.1 release
This commit is contained in:
Luis Ángel San Martín 2021-06-02 22:07:51 +02:00 committed by GitHub
commit 52eebd1e81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 458 additions and 259 deletions

View File

@ -4,6 +4,12 @@ Version counting is based on semantic versioning (Major.Feature.Patch)
## WIP
## 9.8.1
### YACReaderLibrary
* Fix "reading lists" reading order on YACReader. Now YACReader is able to open the right comics in the right order.
### Server
* Fix "reading lists" reading order on YACReader for iOS. Now YACReader for iOS is able to open the right comics in the right order (ios app 3.15.0 or newer is needed).
## 9.8.0
### YACReader
* Add support for full manga mode.

View File

@ -118,18 +118,22 @@ int main(int argc, char *argv[])
parser.addPositionalArgument("[File|Directory]", "File or directory to open.");
QCommandLineOption comicId("comicId", "", "comicId");
QCommandLineOption libraryId("libraryId", "", "libraryId");
QCommandLineOption readingListId("readingListId", "", "readingListId");
// hide comicId and libraryId from help
#if QT_VERSION >= 0x050800
comicId.setFlags(QCommandLineOption::HiddenFromHelp);
libraryId.setFlags(QCommandLineOption::HiddenFromHelp);
readingListId.setFlags(QCommandLineOption::HiddenFromHelp);
#else
comicId.setHidden(true);
libraryId.setHidden(true);
readingListId.setHidden(true);
#endif
// process
parser.addOption(comicId);
parser.addOption(libraryId);
parser.addOption(readingListId);
parser.process(app);
QString destLog = YACReader::getSettingsPath() + "/yacreader.log";
@ -173,7 +177,15 @@ int main(int argc, char *argv[])
// some arguments need to be parsed after MainWindowViewer creation
QStringList arglist = parser.positionalArguments();
if (parser.isSet(comicId) && parser.isSet(libraryId) && arglist.count() >= 1) {
mwv->open(arglist.at(0), parser.value(comicId).toULongLong(), parser.value(libraryId).toULongLong());
OpenComicSource source;
if (parser.isSet(readingListId)) {
source = OpenComicSource { OpenComicSource::ReadingList, parser.value(readingListId).toULongLong() };
} else {
source = OpenComicSource { OpenComicSource::Folder, 33 }; //Folder is not needed to get the comic information, the comid id points to a unique comic
}
mwv->open(arglist.at(0), parser.value(comicId).toULongLong(), parser.value(libraryId).toULongLong(), source);
} else if (arglist.count() >= 1) {
mwv->openComicFromPath(arglist.at(0));
}

View File

@ -851,11 +851,12 @@ void MainWindowViewer::open(QString path, ComicDB &comic, QList<ComicDB> &siblin
optionsDialog->setFilters(currentComicDB.info.brightness, currentComicDB.info.contrast, currentComicDB.info.gamma);
}
void MainWindowViewer::open(QString path, qint64 comicId, qint64 libraryId)
void MainWindowViewer::open(QString path, qint64 comicId, qint64 libraryId, OpenComicSource source)
{
currentDirectory = path;
this->libraryId = libraryId;
this->source = source;
enableActions();
@ -863,7 +864,7 @@ void MainWindowViewer::open(QString path, qint64 comicId, qint64 libraryId)
YACReaderLocalClient client;
int tries = 1;
bool success = false;
while (!(success = client.requestComicInfo(libraryId, currentComicDB, siblingComics)) && tries != 0)
while (!(success = client.requestComicInfo(libraryId, currentComicDB, siblingComics, source)) && tries != 0)
tries--;
if (success) {

View File

@ -14,6 +14,7 @@
#endif
#include "comic_db.h"
#include "yacreader_global.h"
class Comic;
class Viewer;
@ -25,6 +26,8 @@ class YACReaderSliderAction;
class YACReaderSlider;
class EditShortcutsDialog;
namespace YACReader {
class MainWindowViewer : public QMainWindow
{
Q_OBJECT
@ -32,7 +35,7 @@ class MainWindowViewer : public QMainWindow
public slots:
void open();
void open(QString path, ComicDB &comic, QList<ComicDB> &siblings);
void open(QString path, qint64 comicId, qint64 libraryId);
void open(QString path, qint64 comicId, qint64 libraryId, OpenComicSource source);
void openFolder();
void openRecent();
void openLatestComic();
@ -175,6 +178,7 @@ private:
bool isClient;
QString startComicPath;
quint64 libraryId;
OpenComicSource source;
//fullscreen mode in Windows for preventing this bug: QTBUG-41309 https://bugreports.qt.io/browse/QTBUG-41309
Qt::WindowFlags previousWindowFlags;
@ -191,4 +195,7 @@ public:
MainWindowViewer();
~MainWindowViewer() override;
};
}
#endif

View File

@ -28,7 +28,7 @@ void YACReaderLocalClient::readMessage()
}
#include <QMessageBox>
bool YACReaderLocalClient::requestComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &siblings)
bool YACReaderLocalClient::requestComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &siblings, OpenComicSource source)
{
localSocket->connectToServer(YACREADERLIBRARY_GUID);
if (localSocket->isOpen()) {
@ -38,6 +38,7 @@ bool YACReaderLocalClient::requestComicInfo(quint64 libraryId, ComicDB &comic, Q
out << (quint32)0;
out << (quint8)YACReader::RequestComicInfo;
out << libraryId;
out << source;
out << comic;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));

View File

@ -1,6 +1,8 @@
#ifndef YACREADER_LOCAL_CLIENT_H
#define YACREADER_LOCAL_CLIENT_H
#include "yacreader_global.h"
#include <QObject>
class QLocalSocket;
@ -16,7 +18,7 @@ signals:
void finished();
public slots:
void readMessage();
bool requestComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &siblings);
bool requestComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &siblings, YACReader::OpenComicSource source);
bool sendComicInfo(quint64 libraryId, ComicDB &comic);
bool sendComicInfo(quint64 libraryId, ComicDB &comic, qulonglong nextComicId);

View File

@ -78,6 +78,7 @@ HEADERS += comic_flow.h \
db/comic_query_result_processor.h \
db/folder_query_result_processor.h \
db/query_lexer.h \
library_comic_opener.h \
library_creator.h \
library_window.h \
add_library_dialog.h \
@ -156,6 +157,7 @@ SOURCES += comic_flow.cpp \
db/comic_query_result_processor.cpp \
db/folder_query_result_processor.cpp \
db/query_lexer.cpp \
library_comic_opener.cpp \
library_creator.cpp \
library_window.cpp \
main.cpp \

View File

@ -546,6 +546,7 @@ void ComicModel::setupFavoritesModelData(const QString &databasePath)
{
enableResorting = true;
mode = Favorites;
sourceId = -1;
beginResetModel();
qDeleteAll(_data);
@ -574,6 +575,7 @@ void ComicModel::setupReadingModelData(const QString &databasePath)
{
enableResorting = false;
mode = Reading;
sourceId = -1;
beginResetModel();
qDeleteAll(_data);

View File

@ -129,6 +129,7 @@ public:
bool isFavorite(const QModelIndex &index);
ComicModel::Mode getMode() { return mode; }
unsigned long long int getSourceId() { return sourceId; }
QHash<int, QByteArray> roleNames() const override;

View File

@ -359,7 +359,7 @@ QList<ReadingList> DBHelper::getReadingLists(qulonglong libraryId)
return list;
}
QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulonglong readingListId)
QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulonglong readingListId, bool getFullComicInfoFields)
{
QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QList<ComicDB> list;
@ -382,26 +382,52 @@ QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulongl
foreach (qulonglong id, ids) {
QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
"INNER JOIN comic_reading_list crl ON (c.id == crl.comic_id) "
"WHERE crl.reading_list_id = :parentReadingList "
"ORDER BY crl.ordering");
QString params;
if (getFullComicInfoFields) {
params = "*";
} else {
params = "c.id,c.parentId,c.fileName,c.path,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio";
}
selectQuery.prepare("SELECT " + params + " "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
"INNER JOIN comic_reading_list crl ON (c.id == crl.comic_id) "
"WHERE crl.reading_list_id = :parentReadingList "
"ORDER BY crl.ordering");
selectQuery.bindValue(":parentReadingList", id);
selectQuery.exec();
auto record = selectQuery.record();
int idComicIndex = record.indexOf("id");
int parentIdIndex = record.indexOf("parentId");
int fileName = record.indexOf("fileName");
int path = record.indexOf("path");
while (selectQuery.next()) {
ComicDB comic;
comic.id = selectQuery.value(0).toULongLong();
comic.parentId = selectQuery.value(1).toULongLong();
comic.name = selectQuery.value(2).toString();
comic.info.title = selectQuery.value(3).toString();
comic.info.currentPage = selectQuery.value(4).toInt();
comic.info.numPages = selectQuery.value(5).toInt();
comic.info.hash = selectQuery.value(6).toString();
comic.info.read = selectQuery.value(7).toBool();
comic.info.coverSizeRatio = selectQuery.value(8).toFloat();
if (getFullComicInfoFields) {
comic.id = selectQuery.value(idComicIndex).toULongLong();
comic.parentId = selectQuery.value(parentIdIndex).toULongLong();
comic.name = selectQuery.value(fileName).toString();
comic.path = selectQuery.value(path).toString();
comic.info = getComicInfoFromQuery(selectQuery, "comicInfoId");
} else {
comic.id = selectQuery.value(0).toULongLong();
comic.parentId = selectQuery.value(1).toULongLong();
comic.name = selectQuery.value(2).toString();
comic.path = selectQuery.value(3).toString();
comic.info.title = selectQuery.value(4).toString();
comic.info.currentPage = selectQuery.value(5).toInt();
comic.info.numPages = selectQuery.value(6).toInt();
comic.info.hash = selectQuery.value(7).toString();
comic.info.read = selectQuery.value(8).toBool();
comic.info.coverSizeRatio = selectQuery.value(9).toFloat();
}
list.append(comic);
}
@ -1333,64 +1359,6 @@ QList<ComicDB> DBHelper::getSortedComicsFromParent(qulonglong parentId, QSqlData
int fileName = record.indexOf("fileName");
int path = record.indexOf("path");
int hash = record.indexOf("hash");
int comicInfoId = record.indexOf("comicInfoId");
int read = record.indexOf("read");
int edited = record.indexOf("edited");
//new 7.0 fields
int hasBeenOpened = record.indexOf("hasBeenOpened");
int currentPage = record.indexOf("currentPage");
int bookmark1 = record.indexOf("bookmark1");
int bookmark2 = record.indexOf("bookmark2");
int bookmark3 = record.indexOf("bookmark3");
int brightness = record.indexOf("brightness");
int contrast = record.indexOf("contrast");
int gamma = record.indexOf("gamma");
int rating = record.indexOf("rating");
//--
int title = record.indexOf("title");
int numPages = record.indexOf("numPages");
int coverPage = record.indexOf("coverPage");
int number = record.indexOf("number");
int isBis = record.indexOf("isBis");
int count = record.indexOf("count");
int volume = record.indexOf("volume");
int storyArc = record.indexOf("storyArc");
int arcNumber = record.indexOf("arcNumber");
int arcCount = record.indexOf("arcCount");
int genere = record.indexOf("genere");
int writer = record.indexOf("writer");
int penciller = record.indexOf("penciller");
int inker = record.indexOf("inker");
int colorist = record.indexOf("colorist");
int letterer = record.indexOf("letterer");
int coverArtist = record.indexOf("coverArtist");
int date = record.indexOf("date");
int publisher = record.indexOf("publisher");
int format = record.indexOf("format");
int color = record.indexOf("color");
int ageRating = record.indexOf("ageRating");
int manga = record.indexOf("manga");
int synopsis = record.indexOf("synopsis");
int characters = record.indexOf("characters");
int notes = record.indexOf("notes");
int comicVineID = record.indexOf("comicVineID");
int lastTimeOpened = record.indexOf("lastTimeOpened");
int coverSizeRatio = record.indexOf("coverSizeRatio");
int originalCoverSize = record.indexOf("originalCoverSize");
ComicDB currentItem;
while (selectQuery.next()) {
currentItem.id = selectQuery.value(id).toULongLong();
@ -1398,65 +1366,7 @@ QList<ComicDB> DBHelper::getSortedComicsFromParent(qulonglong parentId, QSqlData
currentItem.name = selectQuery.value(fileName).toString();
currentItem.path = selectQuery.value(path).toString();
currentItem.info.hash = selectQuery.value(hash).toString();
currentItem.info.id = selectQuery.value(comicInfoId).toULongLong();
currentItem.info.read = selectQuery.value(read).toBool();
currentItem.info.edited = selectQuery.value(edited).toBool();
//new 7.0 fields
currentItem.info.hasBeenOpened = selectQuery.value(hasBeenOpened).toBool();
currentItem.info.currentPage = selectQuery.value(currentPage).toInt();
currentItem.info.bookmark1 = selectQuery.value(bookmark1).toInt();
currentItem.info.bookmark2 = selectQuery.value(bookmark2).toInt();
currentItem.info.bookmark3 = selectQuery.value(bookmark3).toInt();
currentItem.info.brightness = selectQuery.value(brightness).toInt();
currentItem.info.contrast = selectQuery.value(contrast).toInt();
currentItem.info.gamma = selectQuery.value(gamma).toInt();
currentItem.info.rating = selectQuery.value(rating).toInt();
//--
currentItem.info.title = selectQuery.value(title);
currentItem.info.numPages = selectQuery.value(numPages);
currentItem.info.coverPage = selectQuery.value(coverPage);
currentItem.info.number = selectQuery.value(number);
currentItem.info.isBis = selectQuery.value(isBis);
currentItem.info.count = selectQuery.value(count);
currentItem.info.volume = selectQuery.value(volume);
currentItem.info.storyArc = selectQuery.value(storyArc);
currentItem.info.arcNumber = selectQuery.value(arcNumber);
currentItem.info.arcCount = selectQuery.value(arcCount);
currentItem.info.genere = selectQuery.value(genere);
currentItem.info.writer = selectQuery.value(writer);
currentItem.info.penciller = selectQuery.value(penciller);
currentItem.info.inker = selectQuery.value(inker);
currentItem.info.colorist = selectQuery.value(colorist);
currentItem.info.letterer = selectQuery.value(letterer);
currentItem.info.coverArtist = selectQuery.value(coverArtist);
currentItem.info.date = selectQuery.value(date);
currentItem.info.publisher = selectQuery.value(publisher);
currentItem.info.format = selectQuery.value(format);
currentItem.info.color = selectQuery.value(color);
currentItem.info.ageRating = selectQuery.value(ageRating);
currentItem.info.manga = selectQuery.value(manga);
currentItem.info.synopsis = selectQuery.value(synopsis);
currentItem.info.characters = selectQuery.value(characters);
currentItem.info.notes = selectQuery.value(notes);
currentItem.info.comicVineID = selectQuery.value(comicVineID);
currentItem.info.lastTimeOpened = selectQuery.value(lastTimeOpened);
currentItem.info.coverSizeRatio = selectQuery.value(coverSizeRatio);
currentItem.info.originalCoverSize = selectQuery.value(originalCoverSize);
currentItem.info.existOnDb = true;
currentItem.info = getComicInfoFromQuery(selectQuery, "comicInfoId");
list.append(currentItem);
}
@ -1738,9 +1648,20 @@ ComicInfo DBHelper::loadComicInfo(QString hash, QSqlDatabase &db)
findComicInfo.bindValue(":hash", hash);
findComicInfo.exec();
QSqlRecord record = findComicInfo.record();
if (findComicInfo.next()) {
comicInfo = getComicInfoFromQuery(findComicInfo);
} else
comicInfo.existOnDb = false;
int id = record.indexOf("id");
return comicInfo;
}
ComicInfo DBHelper::getComicInfoFromQuery(QSqlQuery &query, const QString &idKey)
{
QSqlRecord record = query.record();
int hash = record.indexOf("hash");
int id = record.indexOf(idKey);
int read = record.indexOf("read");
int edited = record.indexOf("edited");
@ -1797,72 +1718,71 @@ ComicInfo DBHelper::loadComicInfo(QString hash, QSqlDatabase &db)
int coverSizeRatio = record.indexOf("coverSizeRatio");
int originalCoverSize = record.indexOf("originalCoverSize");
if (findComicInfo.next()) {
comicInfo.hash = hash;
comicInfo.id = findComicInfo.value(id).toULongLong();
comicInfo.read = findComicInfo.value(read).toBool();
comicInfo.edited = findComicInfo.value(edited).toBool();
ComicInfo comicInfo;
//new 7.0 fields
comicInfo.hasBeenOpened = findComicInfo.value(hasBeenOpened).toBool();
comicInfo.currentPage = findComicInfo.value(currentPage).toInt();
comicInfo.bookmark1 = findComicInfo.value(bookmark1).toInt();
comicInfo.bookmark2 = findComicInfo.value(bookmark2).toInt();
comicInfo.bookmark3 = findComicInfo.value(bookmark3).toInt();
comicInfo.brightness = findComicInfo.value(brightness).toInt();
comicInfo.contrast = findComicInfo.value(contrast).toInt();
comicInfo.gamma = findComicInfo.value(gamma).toInt();
comicInfo.rating = findComicInfo.value(rating).toInt();
//--
comicInfo.title = findComicInfo.value(title);
comicInfo.numPages = findComicInfo.value(numPages);
comicInfo.hash = query.value(hash).toString();
comicInfo.id = query.value(id).toULongLong();
comicInfo.read = query.value(read).toBool();
comicInfo.edited = query.value(edited).toBool();
comicInfo.coverPage = findComicInfo.value(coverPage);
//new 7.0 fields
comicInfo.hasBeenOpened = query.value(hasBeenOpened).toBool();
comicInfo.currentPage = query.value(currentPage).toInt();
comicInfo.bookmark1 = query.value(bookmark1).toInt();
comicInfo.bookmark2 = query.value(bookmark2).toInt();
comicInfo.bookmark3 = query.value(bookmark3).toInt();
comicInfo.brightness = query.value(brightness).toInt();
comicInfo.contrast = query.value(contrast).toInt();
comicInfo.gamma = query.value(gamma).toInt();
comicInfo.rating = query.value(rating).toInt();
//--
comicInfo.title = query.value(title);
comicInfo.numPages = query.value(numPages);
comicInfo.number = findComicInfo.value(number);
comicInfo.isBis = findComicInfo.value(isBis);
comicInfo.count = findComicInfo.value(count);
comicInfo.coverPage = query.value(coverPage);
comicInfo.volume = findComicInfo.value(volume);
comicInfo.storyArc = findComicInfo.value(storyArc);
comicInfo.arcNumber = findComicInfo.value(arcNumber);
comicInfo.arcCount = findComicInfo.value(arcCount);
comicInfo.number = query.value(number);
comicInfo.isBis = query.value(isBis);
comicInfo.count = query.value(count);
comicInfo.genere = findComicInfo.value(genere);
comicInfo.volume = query.value(volume);
comicInfo.storyArc = query.value(storyArc);
comicInfo.arcNumber = query.value(arcNumber);
comicInfo.arcCount = query.value(arcCount);
comicInfo.writer = findComicInfo.value(writer);
comicInfo.penciller = findComicInfo.value(penciller);
comicInfo.inker = findComicInfo.value(inker);
comicInfo.colorist = findComicInfo.value(colorist);
comicInfo.letterer = findComicInfo.value(letterer);
comicInfo.coverArtist = findComicInfo.value(coverArtist);
comicInfo.genere = query.value(genere);
comicInfo.date = findComicInfo.value(date);
comicInfo.publisher = findComicInfo.value(publisher);
comicInfo.format = findComicInfo.value(format);
comicInfo.color = findComicInfo.value(color);
comicInfo.ageRating = findComicInfo.value(ageRating);
comicInfo.writer = query.value(writer);
comicInfo.penciller = query.value(penciller);
comicInfo.inker = query.value(inker);
comicInfo.colorist = query.value(colorist);
comicInfo.letterer = query.value(letterer);
comicInfo.coverArtist = query.value(coverArtist);
comicInfo.synopsis = findComicInfo.value(synopsis);
comicInfo.characters = findComicInfo.value(characters);
comicInfo.notes = findComicInfo.value(notes);
comicInfo.date = query.value(date);
comicInfo.publisher = query.value(publisher);
comicInfo.format = query.value(format);
comicInfo.color = query.value(color);
comicInfo.ageRating = query.value(ageRating);
comicInfo.comicVineID = findComicInfo.value(comicVineID);
comicInfo.synopsis = query.value(synopsis);
comicInfo.characters = query.value(characters);
comicInfo.notes = query.value(notes);
//new 9.5 fields
comicInfo.lastTimeOpened = findComicInfo.value(lastTimeOpened);
comicInfo.comicVineID = query.value(comicVineID);
comicInfo.coverSizeRatio = findComicInfo.value(coverSizeRatio);
comicInfo.originalCoverSize = findComicInfo.value(originalCoverSize);
//--
//new 9.5 fields
comicInfo.lastTimeOpened = query.value(lastTimeOpened);
//new 9.8 fields
comicInfo.manga = findComicInfo.value(manga);
//--
comicInfo.coverSizeRatio = query.value(coverSizeRatio);
comicInfo.originalCoverSize = query.value(originalCoverSize);
//--
comicInfo.existOnDb = true;
} else
comicInfo.existOnDb = false;
//new 9.8 fields
comicInfo.manga = query.value(manga);
//--
comicInfo.existOnDb = true;
return comicInfo;
}

View File

@ -37,7 +37,7 @@ public:
static QList<ComicDB> getFavorites(qulonglong libraryId);
static QList<ComicDB> getReading(qulonglong libraryId);
static QList<ReadingList> getReadingLists(qulonglong libraryId);
static QList<ComicDB> getReadingListFullContent(qulonglong libraryId, qulonglong readingListId);
static QList<ComicDB> getReadingListFullContent(qulonglong libraryId, qulonglong readingListId, bool getFullComicInfoFields = false);
//objects management
//deletes
@ -96,6 +96,7 @@ public:
static ComicDB loadComic(qulonglong id, QSqlDatabase &db);
static ComicDB loadComic(QString cname, QString cpath, QString chash, QSqlDatabase &database);
static ComicInfo loadComicInfo(QString hash, QSqlDatabase &db);
static ComicInfo getComicInfoFromQuery(QSqlQuery &query, const QString &idKey = "id");
static QList<QString> loadSubfoldersNames(qulonglong folderId, QSqlDatabase &db);
//queries
static bool isFavoriteComic(qulonglong id, QSqlDatabase &db);

View File

@ -71,6 +71,8 @@
<file alias="images/sidebar/delete_sidebar@2x.png">../images/sidebar/delete_sidebar_osx@2x.png</file>
<file alias="images/sidebar/addLabelIcon@2x.png">../images/sidebar/addLabelIcon_osx@2x.png</file>
<file alias="images/sidebar/renameListIcon@2x.png">../images/sidebar/renameListIcon_osx@2x.png</file>
<file alias="images/viewer_toolbar/close.png">../images/viewer_toolbar/close_osx.png</file>
<file alias="images/viewer_toolbar/close@2x.png">../images/viewer_toolbar/close_osx@2x.png</file>
<file>macostrayicon.svg</file>
</qresource>
</RCC>

View File

@ -41,6 +41,7 @@
<file>../images/lists/label_yellow.png</file>
<file>../images/lists/list.png</file>
<file>../images/empty_reading_list.png</file>
<file>../images/viewer_toolbar/close.png</file>
<file>icon.ico</file>
</qresource>
</RCC>

View File

@ -0,0 +1,47 @@
#include "library_comic_opener.h"
#include "comic_db.h"
#include <QtCore>
#include <QtWidgets>
bool YACReader::openComic(const ComicDB &comic,
unsigned long long libraryId,
const QString &path,
OpenComicSource source)
{
bool yacreaderFound = false;
QString labelParam;
if (source.source == OpenComicSource::ReadingList) {
labelParam = QString("--readingListId=%1").arg(source.sourceId);
}
#ifdef Q_OS_MACOS
QStringList possiblePaths { QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../../../") };
possiblePaths += QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
for (auto &&ypath : possiblePaths) {
QString yacreaderPath = QDir::cleanPath(ypath + "/YACReader.app");
if (QFileInfo(yacreaderPath).exists()) {
yacreaderFound = true;
QStringList parameters { "-n", yacreaderPath, "--args", path, QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId), labelParam };
QProcess::startDetached("open", parameters);
break;
}
}
#endif
#ifdef Q_OS_WIN
QStringList parameters { path, QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId), labelParam };
yacreaderFound = QProcess::startDetached(QDir::cleanPath(QCoreApplication::applicationDirPath() + "/YACReader.exe"), parameters);
#endif
#if defined Q_OS_UNIX && !defined Q_OS_MAC
QStringList parameters { path, QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId), labelParam };
yacreaderFound = QProcess::startDetached(QStringLiteral("YACReader"), parameters);
#endif
return yacreaderFound;
}

View File

@ -0,0 +1,18 @@
#ifndef LIBRARYCOMICOPENER_H
#define LIBRARYCOMICOPENER_H
#include "yacreader_global.h"
class ComicDB;
class QString;
namespace YACReader {
bool openComic(const ComicDB &comic,
unsigned long long libraryId,
const QString &path,
OpenComicSource source);
}
#endif // LIBRARYCOMICOPENER_H

View File

@ -86,6 +86,8 @@
#include "whats_new_controller.h"
#include "library_comic_opener.h"
#include "QsLog.h"
#ifdef Q_OS_WIN
@ -394,7 +396,8 @@ void LibraryWindow::setUpShortcutsManagement()
<< helpAboutAction
<< optionsAction
<< serverConfigAction
<< showEditShortcutsAction);
<< showEditShortcutsAction
<< quitAction);
allActions << tmpList;
@ -750,6 +753,13 @@ void LibraryWindow::createActions()
showEditShortcutsAction->setShortcutContext(Qt::ApplicationShortcut);
addAction(showEditShortcutsAction);
quitAction = new QAction(tr("&Quit"), this);
quitAction->setIcon(QIcon(":/images/viewer_toolbar/close.png"));
quitAction->setData(QUIT_ACTION_YL);
quitAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(QUIT_ACTION_YL));
// TODO: is `quitAction->setMenuRole(QAction::QuitRole);` useful on macOS?
addAction(quitAction);
updateFolderAction = new QAction(tr("Update folder"), this);
updateFolderAction->setIcon(QIcon(":/images/menus_icons/updateLibraryIcon.png"));
@ -1177,6 +1187,8 @@ void LibraryWindow::createConnections()
connect(showEditShortcutsAction, SIGNAL(triggered()), editShortcutsDialog, SLOT(show()));
connect(quitAction, &QAction::triggered, this, &LibraryWindow::closeApp);
//update folders (partial updates)
connect(updateCurrentFolderAction, SIGNAL(triggered()), this, SLOT(updateCurrentFolder()));
connect(updateFolderAction, SIGNAL(triggered()), this, SLOT(updateCurrentFolder()));
@ -1825,37 +1837,27 @@ void LibraryWindow::checkEmptyFolder()
}
}
void LibraryWindow::openComic(const ComicDB &comic)
void LibraryWindow::openComic()
{
if (!importedCovers) {
//TODO generate IDS for libraries...
quint64 libraryId = libraries.getId(selectedLibrary->currentText());
bool yacreaderFound = false;
auto libraryId = libraries.getId(selectedLibrary->currentText());
#ifdef Q_OS_MACOS
QStringList possiblePaths { QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../../../") };
possiblePaths += QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
auto comic = comicsModel->getComic(comicsViewsManager->comicsView->currentIndex());
auto mode = comicsModel->getMode();
for (auto &&ypath : possiblePaths) {
QString yacreaderPath = QDir::cleanPath(ypath + "/YACReader.app");
if (QFileInfo(yacreaderPath).exists()) {
yacreaderFound = true;
QStringList parameters { "-n", yacreaderPath, "--args", currentPath(), QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId) };
QProcess::startDetached("open", parameters);
break;
}
OpenComicSource::Source source;
if (mode == ComicModel::ReadingList) {
source = OpenComicSource::Source::ReadingList;
} else if (mode == ComicModel::Reading) {
//TODO check where the comic was opened from the last time it was read
source = OpenComicSource::Source::Folder;
} else {
source = OpenComicSource::Source::Folder;
}
#endif
#ifdef Q_OS_WIN
QStringList parameters { currentPath(), QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId) };
yacreaderFound = QProcess::startDetached(QDir::cleanPath(QCoreApplication::applicationDirPath() + "/YACReader.exe"), parameters);
#endif
auto yacreaderFound = YACReader::openComic(comic, libraryId, currentPath(), OpenComicSource { source, comicsModel->getSourceId() });
#if defined Q_OS_UNIX && !defined Q_OS_MAC
QStringList parameters { currentPath(), QString("--comicId=%1").arg(comic.id), QString("--libraryId=%1").arg(libraryId) };
yacreaderFound = QProcess::startDetached(QStringLiteral("YACReader"), parameters);
#endif
if (!yacreaderFound) {
#ifdef Q_OS_WIN
QMessageBox::critical(this, tr("YACReader not found"), tr("YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary."));
@ -1866,14 +1868,6 @@ void LibraryWindow::openComic(const ComicDB &comic)
}
}
void LibraryWindow::openComic()
{
if (!importedCovers) {
ComicDB comic = comicsModel->getComic(comicsViewsManager->comicsView->currentIndex());
openComic(comic);
}
}
void LibraryWindow::setCurrentComicsStatusReaded(YACReaderComicReadStatus readStatus)
{
comicsModel->setComicsRead(getSelectedComics(), readStatus);

View File

@ -218,6 +218,8 @@ public:
QAction *showEditShortcutsAction;
QAction *quitAction;
QAction *updateFolderAction;
QAction *updateCurrentFolderAction;
@ -313,7 +315,6 @@ public slots:
void selectSubfolder(const QModelIndex &mi, int child);
void checkEmptyFolder();
void openComic();
void openComic(const ComicDB &comic);
void createLibrary();
void create(QString source, QString dest, QString name);
void showAddLibrary();

View File

@ -806,6 +806,8 @@ Rectangle {
}
else if (event.key === Qt.Key_Down) {
ci = Math.min(grid.currentIndex+numCells,grid.count - 1);
} else {
return;
}
event.accepted = true;

View File

@ -23,6 +23,7 @@ ComicControllerV2::ComicControllerV2() { }
void ComicControllerV2::service(HttpRequest &request, HttpResponse &response)
{
QByteArray token = request.getHeader("x-request-id");
YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(token);

View File

@ -5,10 +5,6 @@
#include "httpresponse.h"
#include "httprequesthandler.h"
#include <QThread>
class Comic;
class QString;
class ComicControllerV2 : public stefanfrings::HttpRequestHandler
{
Q_OBJECT

View File

@ -0,0 +1,101 @@
#include "comiccontrollerinreadinglist_v2.h"
#include "db_helper.h"
#include "yacreader_libraries.h"
#include "yacreader_http_session.h"
#include "template.h"
#include "../static.h"
#include "comic_db.h"
#include "comic.h"
#include "qnaturalsorting.h"
#include "QsLog.h"
#include <typeinfo>
using stefanfrings::HttpRequest;
using stefanfrings::HttpResponse;
ComicControllerInReadingListV2::ComicControllerInReadingListV2() { }
void ComicControllerInReadingListV2::service(HttpRequest &request, HttpResponse &response)
{
QByteArray token = request.getHeader("x-request-id");
YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(token);
if (ySession == nullptr) {
response.setStatus(404, "not found");
response.write("404 not found", true);
return;
}
QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8();
QStringList pathElements = path.split('/');
qulonglong libraryId = pathElements.at(3).toLongLong();
QString libraryName = DBHelper::getLibraryName(libraryId);
qulonglong readingListId = pathElements.at(5).toULongLong();
qulonglong comicId = pathElements.at(7).toULongLong();
YACReaderLibraries libraries = DBHelper::getLibraries();
ComicDB comic = DBHelper::getComicInfo(libraryId, comicId);
Comic *comicFile = FactoryComic::newComic(libraries.getPath(libraryId) + comic.path);
if (comicFile != nullptr) {
QThread *thread = nullptr;
thread = new QThread();
comicFile->moveToThread(thread);
connect(comicFile, SIGNAL(errorOpening()), thread, SLOT(quit()));
connect(comicFile, SIGNAL(errorOpening(QString)), thread, SLOT(quit()));
connect(comicFile, SIGNAL(imagesLoaded()), thread, SLOT(quit()));
connect(thread, SIGNAL(started()), comicFile, SLOT(process()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
comicFile->load(libraries.getPath(libraryId) + comic.path);
if (thread != nullptr)
thread->start();
QLOG_TRACE() << "remote comic requested";
ySession->setCurrentRemoteComic(comic.id, comicFile);
response.setHeader("Content-Type", "text/plain; charset=utf-8");
//TODO this field is not used by the client!
response.write(QString("library:%1\r\n").arg(libraryName).toUtf8());
response.write(QString("libraryId:%1\r\n").arg(libraryId).toUtf8());
QList<ComicDB> siblings = DBHelper::getReadingListFullContent(libraryId, readingListId);
bool found = false;
int i;
for (i = 0; i < siblings.length(); i++) {
if (siblings.at(i).id == comic.id) {
found = true;
break;
}
}
if (found) {
if (i > 0)
response.write(QString("previousComic:%1\r\n").arg(siblings.at(i - 1).id).toUtf8());
if (i < siblings.length() - 1)
response.write(QString("nextComic:%1\r\n").arg(siblings.at(i + 1).id).toUtf8());
} else {
//ERROR
}
response.write(comic.toTXT().toUtf8(), true);
} else {
//delete comicFile;
response.setStatus(404, "not found");
response.write("404 not found", true);
}
//response.write(t.toLatin1(),true);
}

View File

@ -0,0 +1,18 @@
#ifndef COMICCONTROLLERINREADINGLISTV2_H
#define COMICCONTROLLERINREADINGLISTV2_H
#include "httprequest.h"
#include "httpresponse.h"
#include "httprequesthandler.h"
class ComicControllerInReadingListV2 : public stefanfrings::HttpRequestHandler
{
Q_OBJECT
Q_DISABLE_COPY(ComicControllerInReadingListV2)
public:
ComicControllerInReadingListV2();
void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override;
};
#endif // COMICCONTROLLERINREADINGLISTV2_H

View File

@ -46,6 +46,12 @@ void PageControllerV2::service(HttpRequest &request, HttpResponse &response)
currentComicId = ySession->getCurrentComicId();
}
if (comicFile == nullptr) {
response.setStatus(404, "not found");
response.write("404 not found", true);
return;
}
if (comicFile->hasBeenAnErrorOpening()) {
//delete comicFile;
if (remote)

View File

@ -39,6 +39,7 @@
#include "controllers/v2/readinglistcontentcontroller_v2.h"
#include "controllers/v2/readinglistinfocontroller_v2.h"
#include "controllers/v2/comicfullinfocontroller_v2.h"
#include "controllers/v2/comiccontrollerinreadinglist_v2.h"
#include "db_helper.h"
#include "yacreader_libraries.h"
@ -234,6 +235,7 @@ void RequestMapper::serviceV2(HttpRequest &request, HttpResponse &response)
QRegExp comicDownloadInfo("/v2/library/.+/comic/[0-9]+/info/?"); //get comic info (full download info)
QRegExp comicOpenForDownloading("/v2/library/.+/comic/[0-9]+/?"); //get comic info (full info + opening)
QRegExp comicOpenForRemoteReading("/v2/library/.+/comic/[0-9]+/remote/?"); //the server will open for reading the comic
QRegExp comicOpenForRemoteReadingInAReadingList("/v2/library/.+/reading_list/[0-9]+/comic/[0-9]+/remote/?"); //the server will open for reading the comic
QRegExp comicFullInfo("/v2/library/.+/comic/[0-9]+/fullinfo/?"); //get comic info
QRegExp comicUpdate("/v2/library/.+/comic/[0-9]+/update/?"); //get comic info
QRegExp comicClose("/v2/library/.+/comic/[0-9]+/close/?"); //the server will close the comic and free memory
@ -277,8 +279,9 @@ void RequestMapper::serviceV2(HttpRequest &request, HttpResponse &response)
CoverControllerV2().service(request, response);
} else if (comicDownloadInfo.exactMatch(path)) {
ComicDownloadInfoControllerV2().service(request, response);
} else if (comicOpenForDownloading.exactMatch(path) || comicOpenForRemoteReading.exactMatch(path)) //start download or start remote reading
{
} else if (comicOpenForRemoteReadingInAReadingList.exactMatch(path)) {
ComicControllerInReadingListV2().service(request, response);
} else if (comicOpenForDownloading.exactMatch(path) || comicOpenForRemoteReading.exactMatch(path)) { //start download or start remote reading
ComicControllerV2().service(request, response);
} else if (comicFullInfo.exactMatch(path)) {
ComicFullinfoController_v2().service(request, response);

View File

@ -46,7 +46,8 @@ HEADERS += \
$$PWD/controllers/v2/readinglistcontentcontroller_v2.h \
$$PWD/controllers/v2/comicfullinfocontroller_v2.h \
$$PWD/controllers/v2/readinglistinfocontroller_v2.h \
$$PWD/controllers/v2/taginfocontroller_v2.h
$$PWD/controllers/v2/taginfocontroller_v2.h \
$$PWD/controllers/v2/comiccontrollerinreadinglist_v2.h
SOURCES += \
@ -87,7 +88,8 @@ SOURCES += \
$$PWD/controllers/v2/readinglistcontentcontroller_v2.cpp \
$$PWD/controllers/v2/comicfullinfocontroller_v2.cpp \
$$PWD/controllers/v2/readinglistinfocontroller_v2.cpp \
$$PWD/controllers/v2/taginfocontroller_v2.cpp
$$PWD/controllers/v2/taginfocontroller_v2.cpp \
$$PWD/controllers/v2/comiccontrollerinreadinglist_v2.cpp
include(../../third_party/QtWebApp/httpserver/httpserver.pri)
include(../../third_party/QtWebApp/templateengine/templateengine.pri)

View File

@ -54,8 +54,7 @@ void Startup::start(quint16 port)
templatePath = QFileInfo(QCoreApplication::applicationDirPath(), baseTemplatePath).absoluteFilePath();
#endif
if (templateSettings->value("path").isNull())
templateSettings->setValue("path", templatePath);
templateSettings->setValue("path", templatePath);
Static::templateLoader = new TemplateCache(templateSettings, app);
@ -85,8 +84,7 @@ void Startup::start(quint16 port)
docroot = QFileInfo(QCoreApplication::applicationDirPath(), basedocroot).absoluteFilePath();
#endif
if (fileSettings->value("path").isNull())
fileSettings->setValue("path", docroot);
fileSettings->setValue("path", docroot);
Static::staticFileController = new StaticFileController(fileSettings, app);

View File

@ -52,13 +52,10 @@ TrayIconController::TrayIconController(QSettings *settings, LibraryWindow *windo
auto restoreAction = new QAction(tr("&Restore"), this);
connect(restoreAction, &QAction::triggered, this, &TrayIconController::showWindow);
auto quitAction = new QAction(tr("&Quit"), this);
connect(quitAction, &QAction::triggered, window, &LibraryWindow::closeApp);
trayIconMenu = new QMenu(this->window);
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIconMenu->addAction(this->window->quitAction);
trayIcon.setContextMenu(trayIconMenu);

View File

@ -95,6 +95,7 @@ void YACReaderClientConnectionWorker::run()
quint64 libraryId;
ComicDB comic;
OpenComicSource source = { OpenComicSource::ReadingList, 0 };
qulonglong nextComicId;
int tries = 0;
int dataAvailable = 0;
@ -136,22 +137,20 @@ void YACReaderClientConnectionWorker::run()
QDataStream dataStream(data);
quint8 msgType;
dataStream >> msgType;
dataStream >> libraryId;
dataStream >> comic;
bool nextComicInfoAvailable;
if (dataStream.atEnd()) {
nextComicInfoAvailable = false;
} else {
nextComicInfoAvailable = true;
dataStream >> nextComicId;
}
switch (msgType) {
case YACReader::RequestComicInfo: {
dataStream >> libraryId;
dataStream >> source;
dataStream >> comic;
QList<ComicDB> siblings;
getComicInfo(libraryId, comic, siblings);
if (source.source == OpenComicSource::ReadingList) {
getComicInfoFromReadingList(libraryId, source.sourceId, comic, siblings);
} else {
getComicInfo(libraryId, comic, siblings);
}
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
@ -179,6 +178,18 @@ void YACReaderClientConnectionWorker::run()
break;
}
case YACReader::SendComicInfo: {
bool nextComicInfoAvailable;
dataStream >> libraryId;
dataStream >> comic;
if (dataStream.atEnd()) {
nextComicInfoAvailable = false;
} else {
nextComicInfoAvailable = true;
dataStream >> nextComicId;
}
if (nextComicInfoAvailable) {
updateComic(libraryId, comic, nextComicId);
} else {
@ -208,6 +219,13 @@ void YACReaderClientConnectionWorker::getComicInfo(quint64 libraryId, ComicDB &c
siblings = DBHelper::getSiblings(libraryId, comic.parentId);
}
void YACReaderClientConnectionWorker::getComicInfoFromReadingList(quint64 libraryId, unsigned long long readingListId, ComicDB &comic, QList<ComicDB> &siblings)
{
QMutexLocker locker(&dbMutex);
comic = DBHelper::getComicInfo(libraryId, comic.id);
siblings = DBHelper::getReadingListFullContent(libraryId, readingListId, true);
}
void YACReaderClientConnectionWorker::updateComic(quint64 libraryId, ComicDB &comic)
{
QMutexLocker locker(&dbMutex);

View File

@ -42,7 +42,8 @@ private:
//static int count;
void run();
void getComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &sibling);
void getComicInfo(quint64 libraryId, ComicDB &comic, QList<ComicDB> &siblings);
void getComicInfoFromReadingList(quint64 libraryId, unsigned long long readingListId, ComicDB &comic, QList<ComicDB> &siblings);
void updateComic(quint64 libraryId, ComicDB &comic);
void updateComic(quint64 libraryId, ComicDB &comic, qulonglong nextComicId);

View File

@ -88,3 +88,19 @@ QString YACReader::labelColorToRGBString(LabelColors color)
return "";
}
QDataStream &YACReader::operator<<(QDataStream &stream, const OpenComicSource &source)
{
stream << (quint8)source.source;
stream << source.sourceId;
return stream;
}
QDataStream &YACReader::operator>>(QDataStream &stream, OpenComicSource &source)
{
quint8 sourceRaw;
stream >> sourceRaw;
source.source = (OpenComicSource::Source)sourceRaw;
stream >> source.sourceId;
return stream;
}

View File

@ -2,8 +2,9 @@
#define __YACREADER_GLOBAL_H
#include <QStandardPaths>
#include <QDataStream>
#define VERSION "9.8.0"
#define VERSION "9.8.1"
#define REMOTE_BROWSE_PERFORMANCE_WORKAROUND "REMOTE_BROWSE_PERFORMANCE_WORKAROUND"
@ -54,9 +55,26 @@ enum LabelColors {
YDark
};
struct OpenComicSource {
enum Source {
Folder = 0,
ReadingList
};
Source source;
qulonglong sourceId;
};
QDataStream &operator<<(QDataStream &stream, const OpenComicSource &source);
QDataStream &operator>>(QDataStream &stream, OpenComicSource &source);
QString getSettingsPath();
QString colorToName(LabelColors colors);
QString labelColorToRGBString(LabelColors color);
}
Q_DECLARE_METATYPE(YACReader::OpenComicSource::Source)
Q_DECLARE_METATYPE(YACReader::OpenComicSource)
#endif

View File

@ -58,11 +58,13 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent)
" &#8226; New `manga` field added to comics and folders to tag content as manga, any content added to a manga folder will become manga automatically.<br/>"
" &#8226; Support for HTML in comic synopsis, this fixes the synopsis when it comes from Comic Vine with HTML tags.<br/>"
" &#8226; Improve keyboard navigation in Comic Vine dialog. Enter will trigger next or search and Backspace will go back to the previous section.<br/>"
" &#8226; Fixed opening comics from readings lists, now YACReader will follow the right order and it will open the right comics in the list. (new in 9.8.1)<br/>"
"<br/>"
"<span style=\"font-weight:600\">Server</span><br/>"
" &#8226; New `manga` field is sent to YACReader for iOS, so comics tagged as manga will be recognized as such when reading remotely or importing comics.<br/>"
" &#8226; Fixed opening comics from readings lists, now YACReader for iOS will follow the right order and it will open the right comics in the list, it needs YACReader for iOS 3.15.0 or newer. (new in 9.8.1).<br/>"
"<br/>"
"I hope you enjoy the new update. Please, if you like YACReader consider to become a patron in <a href=\"https://www.patreon.com/yacreader\" style=\"color:#E8B800;\">Patreon</a> or donate some money using <a href=\"https://www.paypal.com/donate/?token=xi5MT7fEzaKBbx1-CKNgRHKr3vPp7zjaCc8Ic4VUIxHln58eHfDqdO2K0wlubfxNeFK9IWUKSaB54RhB&locale.x=US\" style=\"color:#E8B800;\">Pay-Pal</a> and help keeping the project alive. Remember that there is an iOS version available in the <a href=\"https://apps.apple.com/app/id635717885\" style=\"color:#E8B800;\">Apple App Store</a>.");
"I hope you enjoy the new update. Please, if you like YACReader consider to become a patron in <a href=\"https://www.patreon.com/yacreader\" style=\"color:#E8B800;\">Patreon</a> or donate some money using <a href=\"https://www.paypal.com/donate?business=5TAMNQCDDMVP8&item_name=Support+YACReader\" style=\"color:#E8B800;\">Pay-Pal</a> and help keeping the project alive. Remember that there is an iOS version available in the <a href=\"https://apps.apple.com/app/id635717885\" style=\"color:#E8B800;\">Apple App Store</a>.");
QFont textLabelFont("Arial", 15, QFont::Light);
text->setFont(textLabelFont);
text->setStyleSheet("padding:51px;"

View File

@ -27,6 +27,7 @@ void ShortcutsManager::initDefaultShorcuts()
defaultShorcuts.insert(COLAPSE_ALL_NODES_ACTION_YL, Qt::Key_Minus);
defaultShorcuts.insert(OPTIONS_ACTION_YL, Qt::Key_C);
defaultShorcuts.insert(SERVER_CONFIG_ACTION_YL, Qt::Key_S);
defaultShorcuts.insert(QUIT_ACTION_YL, Qt::CTRL | Qt::Key_Q);
defaultShorcuts.insert(TOGGLE_COMICS_VIEW_ACTION_YL, Qt::Key_V);
//COMMANDS (used in keypressevent)

View File

@ -78,6 +78,7 @@ public:
#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 QUIT_ACTION_YL "QUIT_ACTION_YL"
#define UPDATE_CURRENT_FOLDER_ACTION_YL "UPDATE_CURRENT_FOLDER_ACTION_YL"
#define ADD_FOLDER_ACTION_YL "ADD_FOLDER_ACTION_YL"
#define REMOVE_FOLDER_ACTION_YL "REMOVE_FOLDER_ACTION_YL"