mirror of
https://github.com/YACReader/yacreader
synced 2025-06-04 01:28:55 -04:00
Added drop support for copying/moving comics in the current folder
This commit is contained in:
parent
a25818a0ca
commit
28d8bd2940
@ -1281,7 +1281,7 @@ void MainWindowViewer::dropEvent(QDropEvent *event)
|
|||||||
if (info.isFile())
|
if (info.isFile())
|
||||||
{
|
{
|
||||||
QStringList imageSuffixs = Comic::getSupportedImageLiteralFormats();
|
QStringList imageSuffixs = Comic::getSupportedImageLiteralFormats();
|
||||||
if(imageSuffixs.contains("."+info.suffix())) //image dropped
|
if(imageSuffixs.contains(info.suffix())) //image dropped
|
||||||
openFolderFromPath(info.absoluteDir().absolutePath(),info.fileName());
|
openFolderFromPath(info.absoluteDir().absolutePath(),info.fileName());
|
||||||
else
|
else
|
||||||
openComicFromPath(fName); // if is file, setText
|
openComicFromPath(fName); // if is file, setText
|
||||||
|
@ -119,7 +119,8 @@ HEADERS += comic_flow.h \
|
|||||||
comics_view.h \
|
comics_view.h \
|
||||||
classic_comics_view.h \
|
classic_comics_view.h \
|
||||||
empty_folder_widget.h \
|
empty_folder_widget.h \
|
||||||
no_search_results_widget.h
|
no_search_results_widget.h \
|
||||||
|
comic_files_manager.h
|
||||||
|
|
||||||
|
|
||||||
SOURCES += comic_flow.cpp \
|
SOURCES += comic_flow.cpp \
|
||||||
@ -167,7 +168,8 @@ SOURCES += comic_flow.cpp \
|
|||||||
comics_view.cpp \
|
comics_view.cpp \
|
||||||
classic_comics_view.cpp \
|
classic_comics_view.cpp \
|
||||||
empty_folder_widget.cpp \
|
empty_folder_widget.cpp \
|
||||||
no_search_results_widget.cpp
|
no_search_results_widget.cpp \
|
||||||
|
comic_files_manager.cpp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
50
YACReaderLibrary/comic_files_manager.cpp
Normal file
50
YACReaderLibrary/comic_files_manager.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#include "comic_files_manager.h"
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
ComicFilesManager::ComicFilesManager(QObject *parent) :
|
||||||
|
QObject(parent), canceled(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComicFilesManager::copyComicsTo(const QList<QString> &sourceComics, const QString &folderDest)
|
||||||
|
{
|
||||||
|
comics = sourceComics;
|
||||||
|
folder = folderDest;
|
||||||
|
move = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComicFilesManager::moveComicsTo(const QList<QString> &sourceComics, const QString &folderDest)
|
||||||
|
{
|
||||||
|
comics = sourceComics;
|
||||||
|
folder = folderDest;
|
||||||
|
move = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComicFilesManager::process()
|
||||||
|
{
|
||||||
|
int i=0;
|
||||||
|
bool successProcesingFiles = false;
|
||||||
|
foreach (QString source, comics) {
|
||||||
|
QFileInfo info(source);
|
||||||
|
if(QFile::copy(source, QDir::cleanPath(folder+'/'+info.fileName())))
|
||||||
|
{
|
||||||
|
successProcesingFiles = true;
|
||||||
|
if(move)
|
||||||
|
QFile::remove(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
emit progress(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(successProcesingFiles)
|
||||||
|
emit success();
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComicFilesManager::cancel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
32
YACReaderLibrary/comic_files_manager.h
Normal file
32
YACReaderLibrary/comic_files_manager.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef COMIC_FILES_MANAGER_H
|
||||||
|
#define COMIC_FILES_MANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
//this class is intended to work in background, just use moveToThread and process to start working
|
||||||
|
class ComicFilesManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit ComicFilesManager(QObject *parent = 0);
|
||||||
|
void copyComicsTo(const QList<QString> & sourceComics, const QString & folderDest);
|
||||||
|
void moveComicsTo(const QList<QString> & comics, const QString & folderDest);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void currentComic(QString);
|
||||||
|
void progress(int);
|
||||||
|
void finished();
|
||||||
|
void success(); //at least one comics has been copied or moved
|
||||||
|
public slots:
|
||||||
|
void process();
|
||||||
|
void cancel();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool move;
|
||||||
|
bool canceled;
|
||||||
|
QList<QString> comics;
|
||||||
|
QString folder;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COMIC_FILES_MANAGER_H
|
@ -1,11 +1,64 @@
|
|||||||
#include "comics_view.h"
|
#include "comics_view.h"
|
||||||
|
#include "comic.h"
|
||||||
|
|
||||||
|
#include "QsLog.h"
|
||||||
|
|
||||||
ComicsView::ComicsView(QWidget *parent) :
|
ComicsView::ComicsView(QWidget *parent) :
|
||||||
QWidget(parent),model(NULL)
|
QWidget(parent),model(NULL)
|
||||||
{
|
{
|
||||||
|
setAcceptDrops(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ComicsView::setModel(TableModel *m)
|
void ComicsView::setModel(TableModel *m)
|
||||||
{
|
{
|
||||||
model = m;
|
model = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ComicsView::dragEnterEvent(QDragEnterEvent *event)
|
||||||
|
{
|
||||||
|
QList<QUrl> urlList;
|
||||||
|
|
||||||
|
if (event->mimeData()->hasUrls())
|
||||||
|
{
|
||||||
|
urlList = event->mimeData()->urls();
|
||||||
|
foreach (QUrl url, urlList)
|
||||||
|
{
|
||||||
|
if(Comic::fileIsComic(url))
|
||||||
|
{
|
||||||
|
event->acceptProposedAction();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComicsView::dropEvent(QDropEvent *event)
|
||||||
|
{
|
||||||
|
bool accepted = false;
|
||||||
|
QLOG_DEBUG() << "drop" << event->dropAction();
|
||||||
|
if(event->dropAction() == Qt::CopyAction)
|
||||||
|
{
|
||||||
|
QLOG_DEBUG() << "copy";
|
||||||
|
emit copyComicsToCurrentFolder(filterInvalidComicFiles(event->mimeData()->urls()));
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(event->dropAction() & Qt::MoveAction)
|
||||||
|
{
|
||||||
|
QLOG_DEBUG() << "move";
|
||||||
|
emit moveComicsToCurrentFolder(filterInvalidComicFiles(event->mimeData()->urls()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(accepted)
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QString> ComicsView::filterInvalidComicFiles(const QList<QUrl> &list)
|
||||||
|
{
|
||||||
|
QList<QString> validComicFiles;
|
||||||
|
foreach (QUrl url, list) {
|
||||||
|
if(Comic::fileIsComic(url))
|
||||||
|
validComicFiles << url.toLocalFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
return validComicFiles;
|
||||||
|
}
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
#ifndef COMICS_VIEW_H
|
#ifndef COMICS_VIEW_H
|
||||||
#define COMICS_VIEW_H
|
#define COMICS_VIEW_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QtWidgets>
|
||||||
|
|
||||||
#include "tablemodel.h"
|
#include "tablemodel.h"
|
||||||
#include <QAbstractItemView>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QModelIndex>
|
|
||||||
#include <QModelIndexList>
|
|
||||||
|
|
||||||
class YACReaderTableView;
|
class YACReaderTableView;
|
||||||
class QSplitter;
|
class QSplitter;
|
||||||
@ -37,12 +33,23 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void selected(unsigned int);
|
void selected(unsigned int);
|
||||||
void comicRated(int,QModelIndex);
|
void comicRated(int,QModelIndex);
|
||||||
|
|
||||||
|
//Drops
|
||||||
|
void copyComicsToCurrentFolder(QList<QString>);
|
||||||
|
void moveComicsToCurrentFolder(QList<QString>);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void setShowMarks(bool show) = 0;
|
virtual void setShowMarks(bool show) = 0;
|
||||||
virtual void selectAll() = 0;
|
virtual void selectAll() = 0;
|
||||||
protected:
|
protected:
|
||||||
TableModel * model;
|
TableModel * model;
|
||||||
|
|
||||||
|
//Drop to import
|
||||||
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
|
void dropEvent(QDropEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<QString> filterInvalidComicFiles(const QList<QUrl> & list);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // COMICS_VIEW_H
|
#endif // COMICS_VIEW_H
|
||||||
|
@ -449,6 +449,8 @@ QString TreeModel::getDatabase()
|
|||||||
|
|
||||||
QString TreeModel::getFolderPath(const QModelIndex &folder)
|
QString TreeModel::getFolderPath(const QModelIndex &folder)
|
||||||
{
|
{
|
||||||
|
if(!folder.isValid()) //root folder
|
||||||
|
return "/";
|
||||||
return static_cast<TreeItem*>(folder.internalPointer())->data(TreeModel::Path).toString();
|
return static_cast<TreeItem*>(folder.internalPointer())->data(TreeModel::Path).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -564,12 +564,42 @@ Folder DBHelper::loadFolder(qulonglong id, QSqlDatabase & db)
|
|||||||
folder.parentId = record.value("parentId").toULongLong();
|
folder.parentId = record.value("parentId").toULongLong();
|
||||||
folder.name = record.value("name").toString();
|
folder.name = record.value("name").toString();
|
||||||
folder.path = record.value("path").toString();
|
folder.path = record.value("path").toString();
|
||||||
|
folder.knownId = true;
|
||||||
//new 7.1
|
//new 7.1
|
||||||
folder.setFinished(record.value("finished").toBool());
|
folder.setFinished(record.value("finished").toBool());
|
||||||
folder.setCompleted(record.value("completed").toBool());
|
folder.setCompleted(record.value("completed").toBool());
|
||||||
}
|
}
|
||||||
|
|
||||||
return folder;
|
return folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
Folder DBHelper::loadFolder(const QString &folderName, qulonglong parentId, QSqlDatabase &db)
|
||||||
|
{
|
||||||
|
Folder folder;
|
||||||
|
|
||||||
|
QLOG_DEBUG() << "Looking for folder with name = " << folderName << " and parent " << parentId;
|
||||||
|
|
||||||
|
QSqlQuery query(db);
|
||||||
|
query.prepare("SELECT * FROM folder WHERE parentId = :parentId AND name = :folderName");
|
||||||
|
query.bindValue(":parentId",parentId);
|
||||||
|
query.bindValue(":folderName", folderName);
|
||||||
|
query.exec();
|
||||||
|
|
||||||
|
folder.parentId = parentId;
|
||||||
|
if(query.next())
|
||||||
|
{
|
||||||
|
QSqlRecord record = query.record();
|
||||||
|
folder.id = record.value("id").toULongLong();
|
||||||
|
folder.name = record.value("name").toString();
|
||||||
|
folder.path = record.value("path").toString();
|
||||||
|
folder.knownId = true;
|
||||||
|
//new 7.1
|
||||||
|
folder.setFinished(record.value("finished").toBool());
|
||||||
|
folder.setCompleted(record.value("completed").toBool());
|
||||||
|
QLOG_DEBUG() << "FOUND!!";
|
||||||
|
}
|
||||||
|
|
||||||
|
return folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComicDB DBHelper::loadComic(qulonglong id, QSqlDatabase & db)
|
ComicDB DBHelper::loadComic(qulonglong id, QSqlDatabase & db)
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
static QList<LibraryItem *> getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true);
|
static QList<LibraryItem *> getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true);
|
||||||
//load
|
//load
|
||||||
static Folder loadFolder(qulonglong id, QSqlDatabase & db);
|
static Folder loadFolder(qulonglong id, QSqlDatabase & db);
|
||||||
|
static Folder loadFolder(const QString & folderName, qulonglong parentId, QSqlDatabase & db);
|
||||||
static ComicDB loadComic(qulonglong id, QSqlDatabase & db);
|
static ComicDB loadComic(qulonglong id, QSqlDatabase & db);
|
||||||
static ComicDB loadComic(QString cname, QString cpath, QString chash, QSqlDatabase & database);
|
static ComicDB loadComic(QString cname, QString cpath, QString chash, QSqlDatabase & database);
|
||||||
static ComicInfo loadComicInfo(QString hash, QSqlDatabase & db);
|
static ComicInfo loadComicInfo(QString hash, QSqlDatabase & db);
|
||||||
|
@ -36,7 +36,7 @@ using namespace std;
|
|||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
LibraryCreator::LibraryCreator()
|
LibraryCreator::LibraryCreator()
|
||||||
:creation(false)
|
:creation(false), partialUpdate(false)
|
||||||
{
|
{
|
||||||
_nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf" << "*.7z" << "*.cb7" << "*.arj" << "*.cbt";
|
_nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf" << "*.7z" << "*.cb7" << "*.arj" << "*.cbt";
|
||||||
}
|
}
|
||||||
@ -44,12 +44,45 @@ LibraryCreator::LibraryCreator()
|
|||||||
void LibraryCreator::createLibrary(const QString &source, const QString &target)
|
void LibraryCreator::createLibrary(const QString &source, const QString &target)
|
||||||
{
|
{
|
||||||
creation = true;
|
creation = true;
|
||||||
processLibrary(source,target);
|
processLibrary(source, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryCreator::updateLibrary(const QString &source, const QString &target)
|
void LibraryCreator::updateLibrary(const QString &source, const QString &target)
|
||||||
{
|
{
|
||||||
processLibrary(source,target);
|
partialUpdate = false;
|
||||||
|
processLibrary(source, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LibraryCreator::updateFolder(const QString &source, const QString &target, const QString &sourceFolder)
|
||||||
|
{
|
||||||
|
partialUpdate = true;
|
||||||
|
|
||||||
|
_currentPathFolders.clear();
|
||||||
|
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||||
|
|
||||||
|
QString relativeFolderPath = sourceFolder;
|
||||||
|
relativeFolderPath = relativeFolderPath.remove(QDir::cleanPath(source));
|
||||||
|
|
||||||
|
if(relativeFolderPath.startsWith("/"))
|
||||||
|
relativeFolderPath = relativeFolderPath.remove(0,1);//remove firts '/'
|
||||||
|
|
||||||
|
QStringList folders = relativeFolderPath.split('/');
|
||||||
|
|
||||||
|
QSqlDatabase db = DataBaseManagement::loadDatabase(target);
|
||||||
|
|
||||||
|
foreach (QString folderName, folders) {
|
||||||
|
qulonglong parentId = _currentPathFolders.last().id;
|
||||||
|
_currentPathFolders.append(DBHelper::loadFolder(folderName, parentId, db));
|
||||||
|
QLOG_DEBUG() << "Folder appended : " << _currentPathFolders.last().id << " " << _currentPathFolders.last().name << " with parent" << _currentPathFolders.last().parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSqlDatabase::removeDatabase(_database.connectionName());
|
||||||
|
|
||||||
|
QLOG_DEBUG() << "Relative path : " << relativeFolderPath;
|
||||||
|
|
||||||
|
_sourceFolder = sourceFolder;
|
||||||
|
|
||||||
|
processLibrary(source, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryCreator::processLibrary(const QString & source, const QString & target)
|
void LibraryCreator::processLibrary(const QString & source, const QString & target)
|
||||||
@ -108,7 +141,7 @@ void LibraryCreator::run()
|
|||||||
|
|
||||||
/*QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);*/
|
/*QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);*/
|
||||||
_database.transaction();
|
_database.transaction();
|
||||||
//se crea la librería
|
//se crea la librería
|
||||||
create(QDir(_source));
|
create(QDir(_source));
|
||||||
_database.commit();
|
_database.commit();
|
||||||
_database.close();
|
_database.close();
|
||||||
@ -118,9 +151,14 @@ void LibraryCreator::run()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QLOG_INFO() << "Starting to update library ( " << _source << "," << _target << ")";
|
QLOG_INFO() << "Starting to update folder" << _sourceFolder << "in library ( " << _source << "," << _target << ")";
|
||||||
_currentPathFolders.clear();
|
if(!partialUpdate)
|
||||||
_currentPathFolders.append(Folder(1,1,"root","/"));
|
{
|
||||||
|
_currentPathFolders.clear();
|
||||||
|
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||||
|
QLOG_DEBUG() << "update whole library";
|
||||||
|
}
|
||||||
|
|
||||||
_database = DataBaseManagement::loadDatabase(_target);
|
_database = DataBaseManagement::loadDatabase(_target);
|
||||||
//_database.setDatabaseName(_target+"/library.ydb");
|
//_database.setDatabaseName(_target+"/library.ydb");
|
||||||
if(!_database.open())
|
if(!_database.open())
|
||||||
@ -133,19 +171,28 @@ void LibraryCreator::run()
|
|||||||
}
|
}
|
||||||
QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);
|
QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);
|
||||||
_database.transaction();
|
_database.transaction();
|
||||||
update(QDir(_source));
|
if(partialUpdate)
|
||||||
|
update(QDir(_sourceFolder));
|
||||||
|
else
|
||||||
|
update(QDir(_source));
|
||||||
_database.commit();
|
_database.commit();
|
||||||
_database.close();
|
_database.close();
|
||||||
QSqlDatabase::removeDatabase(_target);
|
QSqlDatabase::removeDatabase(_target);
|
||||||
//si estabamos en modo creación, se está añadiendo una librería que ya existía y se ha actualizado antes de añadirse.
|
//si estabamos en modo creación, se está añadiendo una librería que ya existía y se ha actualizado antes de añadirse.
|
||||||
if(!creation)
|
if(!partialUpdate)
|
||||||
emit(updated());
|
{
|
||||||
else
|
if(!creation)
|
||||||
emit(created());
|
emit(updated());
|
||||||
|
else
|
||||||
|
emit(created());
|
||||||
|
}
|
||||||
QLOG_INFO() << "Update library END";
|
QLOG_INFO() << "Update library END";
|
||||||
}
|
}
|
||||||
msleep(100);//TODO try to solve the problem with the udpate dialog (ya no se usa más...)
|
//msleep(100);//TODO try to solve the problem with the udpate dialog (ya no se usa más...)
|
||||||
emit(finished());
|
if(partialUpdate)
|
||||||
|
emit updatedCurrentFolder();
|
||||||
|
else
|
||||||
|
emit finished();
|
||||||
creation = false;
|
creation = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,10 +248,10 @@ void LibraryCreator::create(QDir dir)
|
|||||||
#endif
|
#endif
|
||||||
if(fileInfo.isDir())
|
if(fileInfo.isDir())
|
||||||
{
|
{
|
||||||
//se añade al path actual el folder, aún no se sabe si habrá que añadirlo a la base de datos
|
//se añade al path actual el folder, aún no se sabe si habrá que añadirlo a la base de datos
|
||||||
_currentPathFolders.append(Folder(fileInfo.fileName(),relativePath));
|
_currentPathFolders.append(Folder(fileInfo.fileName(),relativePath));
|
||||||
create(QDir(fileInfo.absoluteFilePath()));
|
create(QDir(fileInfo.absoluteFilePath()));
|
||||||
//una vez importada la información del folder, se retira del path actual ya que no volverá a ser visitado
|
//una vez importada la información del folder, se retira del path actual ya que no volverá a ser visitado
|
||||||
_currentPathFolders.pop_back();
|
_currentPathFolders.pop_back();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -221,7 +268,7 @@ bool LibraryCreator::checkCover(const QString & hash)
|
|||||||
|
|
||||||
void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo & fileInfo)
|
void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo & fileInfo)
|
||||||
{
|
{
|
||||||
//Se calcula el hash del cómic
|
//Se calcula el hash del cómic
|
||||||
|
|
||||||
QCryptographicHash crypto(QCryptographicHash::Sha1);
|
QCryptographicHash crypto(QCryptographicHash::Sha1);
|
||||||
QFile file(fileInfo.absoluteFilePath());
|
QFile file(fileInfo.absoluteFilePath());
|
||||||
@ -244,7 +291,7 @@ void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo &
|
|||||||
|
|
||||||
if (numPages > 0 || exists)
|
if (numPages > 0 || exists)
|
||||||
{
|
{
|
||||||
//en este punto sabemos que todos los folders que hay en _currentPath, deberían estar añadidos a la base de datos
|
//en este punto sabemos que todos los folders que hay en _currentPath, deberían estar añadidos a la base de datos
|
||||||
insertFolders();
|
insertFolders();
|
||||||
comic.info.numPages = numPages;
|
comic.info.numPages = numPages;
|
||||||
comic.parentId = _currentPathFolders.last().id;
|
comic.parentId = _currentPathFolders.last().id;
|
||||||
@ -337,7 +384,7 @@ void LibraryCreator::update(QDir dirS)
|
|||||||
#else
|
#else
|
||||||
QString path = QDir::cleanPath(fileInfoS.absoluteFilePath()).remove(_source);
|
QString path = QDir::cleanPath(fileInfoS.absoluteFilePath()).remove(_source);
|
||||||
#endif
|
#endif
|
||||||
_currentPathFolders.append(Folder(fileInfoS.fileName(),path)); //folder actual no está en la BD
|
_currentPathFolders.append(Folder(fileInfoS.fileName(),path)); //folder actual no está en la BD
|
||||||
create(QDir(fileInfoS.absoluteFilePath()));
|
create(QDir(fileInfoS.absoluteFilePath()));
|
||||||
_currentPathFolders.pop_back();
|
_currentPathFolders.pop_back();
|
||||||
}
|
}
|
||||||
@ -476,7 +523,7 @@ void LibraryCreator::update(QDir dirS)
|
|||||||
{
|
{
|
||||||
if(fileInfoS.isFile() && !fileInfoD->isDir())
|
if(fileInfoS.isFile() && !fileInfoD->isDir())
|
||||||
{
|
{
|
||||||
//TODO comprobar fechas + tamaño
|
//TODO comprobar fechas + tamaño
|
||||||
//if(fileInfoS.lastModified()>fileInfoD.lastModified())
|
//if(fileInfoS.lastModified()>fileInfoD.lastModified())
|
||||||
//{
|
//{
|
||||||
// dirD.mkpath(_target+(QDir::cleanPath(fileInfoS.absolutePath()).remove(_source)));
|
// dirD.mkpath(_target+(QDir::cleanPath(fileInfoS.absolutePath()).remove(_source)));
|
||||||
@ -585,7 +632,7 @@ void ThumbnailCreator::create()
|
|||||||
}
|
}
|
||||||
if(!archive.isValid())
|
if(!archive.isValid())
|
||||||
QLOG_WARN() << "Extracting cover: file format not supported " << _fileSource;
|
QLOG_WARN() << "Extracting cover: file format not supported " << _fileSource;
|
||||||
//se filtran para obtener sólo los formatos soportados
|
//se filtran para obtener sólo los formatos soportados
|
||||||
QList<QString> order = archive.getFileNames();
|
QList<QString> order = archive.getFileNames();
|
||||||
QList<QString> fileNames = FileComic::filter(order);
|
QList<QString> fileNames = FileComic::filter(order);
|
||||||
_numPages = fileNames.size();
|
_numPages = fileNames.size();
|
||||||
|
@ -22,32 +22,37 @@
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
LibraryCreator();
|
LibraryCreator();
|
||||||
void createLibrary(const QString & source, const QString & target);
|
void createLibrary(const QString & source, const QString & target);
|
||||||
void updateLibrary(const QString & source, const QString & target);
|
void updateLibrary(const QString & source, const QString & target);
|
||||||
void stop();
|
void updateFolder(const QString & source, const QString & target, const QString & folder);
|
||||||
|
void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processLibrary(const QString & source, const QString & target);
|
void processLibrary(const QString & source, const QString & target);
|
||||||
enum Mode {CREATOR,UPDATER};
|
enum Mode {CREATOR,UPDATER};
|
||||||
//atributos "globales" durante el proceso de creación y actualización
|
//atributos "globales" durante el proceso de creación y actualización
|
||||||
enum Mode _mode;
|
enum Mode _mode;
|
||||||
QString _source;
|
QString _source;
|
||||||
QString _target;
|
QString _target;
|
||||||
|
QString _sourceFolder; //used for partial updates
|
||||||
QStringList _nameFilter;
|
QStringList _nameFilter;
|
||||||
QSqlDatabase _database;
|
QSqlDatabase _database;
|
||||||
QList<Folder> _currentPathFolders; //lista de folders en el orden en el que están siendo explorados, el último es el folder actual
|
QList<Folder> _currentPathFolders; //lista de folders en el orden en el que están siendo explorados, el último es el folder actual
|
||||||
//recursive method
|
//recursive method
|
||||||
void create(QDir currentDirectory);
|
void create(QDir currentDirectory);
|
||||||
void update(QDir currentDirectory);
|
void update(QDir currentDirectory);
|
||||||
void run();
|
void run();
|
||||||
qulonglong insertFolders();//devuelve el id del último folder añadido (último en la ruta)
|
qulonglong insertFolders();//devuelve el id del último folder añadido (último en la ruta)
|
||||||
bool checkCover(const QString & hash);
|
bool checkCover(const QString & hash);
|
||||||
void insertComic(const QString & relativePath,const QFileInfo & fileInfo);
|
void insertComic(const QString & relativePath,const QFileInfo & fileInfo);
|
||||||
//qulonglong insertFolder(qulonglong parentId,const Folder & folder);
|
//qulonglong insertFolder(qulonglong parentId,const Folder & folder);
|
||||||
//qulonglong insertComic(const Comic & comic);
|
//qulonglong insertComic(const Comic & comic);
|
||||||
bool stopRunning;
|
bool stopRunning;
|
||||||
//LibraryCreator está en modo creación si creation == true;
|
//LibraryCreator está en modo creación si creation == true;
|
||||||
bool creation;
|
bool creation;
|
||||||
|
bool partialUpdate;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished();
|
void finished();
|
||||||
void coverExtracted(QString);
|
void coverExtracted(QString);
|
||||||
@ -57,6 +62,7 @@
|
|||||||
void created();
|
void created();
|
||||||
void failedCreatingDB(QString);
|
void failedCreatingDB(QString);
|
||||||
void failedOpeningDB(QString);
|
void failedOpeningDB(QString);
|
||||||
|
void updatedCurrentFolder();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ThumbnailCreator : public QObject
|
class ThumbnailCreator : public QObject
|
||||||
|
@ -71,6 +71,8 @@
|
|||||||
|
|
||||||
#include "no_search_results_widget.h"
|
#include "no_search_results_widget.h"
|
||||||
|
|
||||||
|
#include "comic_files_manager.h"
|
||||||
|
|
||||||
#include "QsLog.h"
|
#include "QsLog.h"
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
@ -389,6 +391,8 @@ void LibraryWindow::disconnectComicsViewConnections(ComicsView * widget)
|
|||||||
disconnect(widget,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
|
disconnect(widget,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
|
||||||
disconnect(widget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
disconnect(widget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
||||||
disconnect(selectAllComicsAction,SIGNAL(triggered()),widget,SLOT(selectAll()));
|
disconnect(selectAllComicsAction,SIGNAL(triggered()),widget,SLOT(selectAll()));
|
||||||
|
disconnect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList<QString>)), this, SLOT(copyAndImportComicsToCurrentFolder(QList<QString>)));
|
||||||
|
disconnect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList<QString>)), this, SLOT(moveAndImportComicsToCurrentFolder(QList<QString>)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryWindow::doComicsViewConnections()
|
void LibraryWindow::doComicsViewConnections()
|
||||||
@ -398,6 +402,9 @@ void LibraryWindow::doComicsViewConnections()
|
|||||||
connect(comicsView,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
|
connect(comicsView,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
|
||||||
connect(comicsView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
connect(comicsView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
||||||
connect(selectAllComicsAction,SIGNAL(triggered()),comicsView,SLOT(selectAll()));
|
connect(selectAllComicsAction,SIGNAL(triggered()),comicsView,SLOT(selectAll()));
|
||||||
|
//Drops
|
||||||
|
connect(comicsView, SIGNAL(copyComicsToCurrentFolder(QList<QString>)), this, SLOT(copyAndImportComicsToCurrentFolder(QList<QString>)));
|
||||||
|
connect(comicsView, SIGNAL(moveComicsToCurrentFolder(QList<QString>)), this, SLOT(moveAndImportComicsToCurrentFolder(QList<QString>)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryWindow::createActions()
|
void LibraryWindow::createActions()
|
||||||
@ -925,6 +932,8 @@ void LibraryWindow::createConnections()
|
|||||||
connect(libraryCreator,SIGNAL(finished()),this,SLOT(showRootWidget()));
|
connect(libraryCreator,SIGNAL(finished()),this,SLOT(showRootWidget()));
|
||||||
connect(libraryCreator,SIGNAL(updated()),this,SLOT(reloadCurrentLibrary()));
|
connect(libraryCreator,SIGNAL(updated()),this,SLOT(reloadCurrentLibrary()));
|
||||||
connect(libraryCreator,SIGNAL(created()),this,SLOT(openLastCreated()));
|
connect(libraryCreator,SIGNAL(created()),this,SLOT(openLastCreated()));
|
||||||
|
connect(libraryCreator,SIGNAL(updatedCurrentFolder()), this, SLOT(showRootWidget()));
|
||||||
|
connect(libraryCreator,SIGNAL(updatedCurrentFolder()), this, SLOT(reloadCovers()));
|
||||||
connect(libraryCreator,SIGNAL(comicAdded(QString,QString)),importWidget,SLOT(newComic(QString,QString)));
|
connect(libraryCreator,SIGNAL(comicAdded(QString,QString)),importWidget,SLOT(newComic(QString,QString)));
|
||||||
//libraryCreator errors
|
//libraryCreator errors
|
||||||
connect(libraryCreator,SIGNAL(failedCreatingDB(QString)),this,SLOT(manageCreatingError(QString)));
|
connect(libraryCreator,SIGNAL(failedCreatingDB(QString)),this,SLOT(manageCreatingError(QString)));
|
||||||
@ -1244,6 +1253,73 @@ void LibraryWindow::loadCoversFromCurrentModel()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LibraryWindow::copyAndImportComicsToCurrentFolder(const QList<QString> &comics)
|
||||||
|
{
|
||||||
|
QString destFolderPath = currentFolderPath();
|
||||||
|
|
||||||
|
QProgressDialog * progressDialog = newProgressDialog(tr("Copying comics..."),comics.size());
|
||||||
|
|
||||||
|
ComicFilesManager * comicFilesManager = new ComicFilesManager();
|
||||||
|
comicFilesManager->copyComicsTo(comics,destFolderPath);
|
||||||
|
|
||||||
|
processComicFiles(comicFilesManager, progressDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LibraryWindow::moveAndImportComicsToCurrentFolder(const QList<QString> &comics)
|
||||||
|
{
|
||||||
|
QString destFolderPath = currentFolderPath();
|
||||||
|
|
||||||
|
QProgressDialog * progressDialog = newProgressDialog(tr("Moving comics..."),comics.size());
|
||||||
|
|
||||||
|
ComicFilesManager * comicFilesManager = new ComicFilesManager();
|
||||||
|
comicFilesManager->moveComicsTo(comics,destFolderPath);
|
||||||
|
|
||||||
|
processComicFiles(comicFilesManager, progressDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LibraryWindow::processComicFiles(ComicFilesManager * comicFilesManager, QProgressDialog * progressDialog)
|
||||||
|
{
|
||||||
|
connect(comicFilesManager,SIGNAL(progress(int)), progressDialog, SLOT(setValue(int)));
|
||||||
|
|
||||||
|
QThread * thread = NULL;
|
||||||
|
|
||||||
|
thread = new QThread();
|
||||||
|
|
||||||
|
comicFilesManager->moveToThread(thread);
|
||||||
|
|
||||||
|
connect(thread, SIGNAL(started()), comicFilesManager, SLOT(process()));
|
||||||
|
connect(comicFilesManager, SIGNAL(success()), this, SLOT(updateCurrentFolder()));
|
||||||
|
connect(comicFilesManager, SIGNAL(finished()), thread, SLOT(quit()));
|
||||||
|
connect(comicFilesManager, SIGNAL(finished()), comicFilesManager, SLOT(deleteLater()));
|
||||||
|
connect(comicFilesManager, SIGNAL(finished()), progressDialog, SLOT(close()));
|
||||||
|
connect(comicFilesManager, SIGNAL(finished()), progressDialog, SLOT(deleteLater()));
|
||||||
|
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
|
||||||
|
|
||||||
|
if(thread != NULL)
|
||||||
|
thread->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LibraryWindow::updateCurrentFolder()
|
||||||
|
{
|
||||||
|
importWidget->setUpdateLook();
|
||||||
|
showImportingWidget();
|
||||||
|
|
||||||
|
QString currentLibrary = selectedLibrary->currentText();
|
||||||
|
QString path = libraries.getPath(currentLibrary);
|
||||||
|
_lastAdded = currentLibrary;
|
||||||
|
libraryCreator->updateFolder(QDir::cleanPath(path),QDir::cleanPath(path+"/.yacreaderlibrary"),currentFolderPath());
|
||||||
|
libraryCreator->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
QProgressDialog *LibraryWindow::newProgressDialog(const QString &label, int maxValue)
|
||||||
|
{
|
||||||
|
QProgressDialog * progressDialog = new QProgressDialog(label,"Cancel",0,maxValue,this);
|
||||||
|
progressDialog->setWindowModality(Qt::WindowModal);
|
||||||
|
progressDialog->setMinimumWidth(350);
|
||||||
|
progressDialog->show();
|
||||||
|
return progressDialog;
|
||||||
|
}
|
||||||
|
|
||||||
void LibraryWindow::selectSubfolder(const QModelIndex &mi, int child)
|
void LibraryWindow::selectSubfolder(const QModelIndex &mi, int child)
|
||||||
{
|
{
|
||||||
QModelIndex dest = foldersModel->index(child,0,mi);
|
QModelIndex dest = foldersModel->index(child,0,mi);
|
||||||
@ -1885,7 +1961,21 @@ void LibraryWindow::reloadOptions()
|
|||||||
|
|
||||||
QString LibraryWindow::currentPath()
|
QString LibraryWindow::currentPath()
|
||||||
{
|
{
|
||||||
return libraries.getPath(selectedLibrary->currentText());
|
return libraries.getPath(selectedLibrary->currentText());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LibraryWindow::currentFolderPath()
|
||||||
|
{
|
||||||
|
QString path;
|
||||||
|
|
||||||
|
if(foldersView->selectionModel()->selectedRows().length()>0)
|
||||||
|
path = foldersModel->getFolderPath(foldersView->currentIndex());
|
||||||
|
else
|
||||||
|
path = foldersModel->getFolderPath(QModelIndex());
|
||||||
|
|
||||||
|
QLOG_DEBUG() << "current folder path : " << QDir::cleanPath(currentPath()+path);
|
||||||
|
|
||||||
|
return QDir::cleanPath(currentPath()+path);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO ComicsView: some actions in the comics toolbar can be relative to a certain view
|
//TODO ComicsView: some actions in the comics toolbar can be relative to a certain view
|
||||||
|
@ -56,6 +56,8 @@ class ComicsViewTransition;
|
|||||||
class EmptyFolderWidget;
|
class EmptyFolderWidget;
|
||||||
class NoSearchResultsWidget;
|
class NoSearchResultsWidget;
|
||||||
class EditShortcutsDialog;
|
class EditShortcutsDialog;
|
||||||
|
class ComicFilesManager;
|
||||||
|
class QProgressDialog;
|
||||||
|
|
||||||
#include "comic_db.h"
|
#include "comic_db.h"
|
||||||
|
|
||||||
@ -227,6 +229,7 @@ private:
|
|||||||
//void enableLibraryActions();
|
//void enableLibraryActions();
|
||||||
|
|
||||||
QString currentPath();
|
QString currentPath();
|
||||||
|
QString currentFolderPath();
|
||||||
|
|
||||||
//settings
|
//settings
|
||||||
QSettings * settings;
|
QSettings * settings;
|
||||||
@ -319,6 +322,11 @@ public slots:
|
|||||||
void toggleComicsView();
|
void toggleComicsView();
|
||||||
void checkSearchNumResults(int numResults);
|
void checkSearchNumResults(int numResults);
|
||||||
void loadCoversFromCurrentModel();
|
void loadCoversFromCurrentModel();
|
||||||
|
void copyAndImportComicsToCurrentFolder(const QList<QString> & comics);
|
||||||
|
void moveAndImportComicsToCurrentFolder(const QList<QString> &comics);
|
||||||
|
void processComicFiles(ComicFilesManager * comicFilesManager, QProgressDialog * progressDialog);
|
||||||
|
void updateCurrentFolder(); //imports new comics from the current folder
|
||||||
|
QProgressDialog * newProgressDialog(const QString & label, int maxValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,8 +13,11 @@
|
|||||||
#include "compressed_archive.h"
|
#include "compressed_archive.h"
|
||||||
#include "comic_db.h"
|
#include "comic_db.h"
|
||||||
|
|
||||||
QStringList Comic::extensions = QStringList() << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp";
|
QStringList Comic::imageExtensions = QStringList() << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp";
|
||||||
QStringList Comic::literalExtensions = QStringList() << ".jpg" << ".jpeg" << ".png" << ".gif" << ".tiff" << ".tif" << ".bmp";
|
QStringList Comic::literalImageExtensions = QStringList() << "jpg" << "jpeg" << "png" << "gif" << "tiff" << "tif" << "bmp";
|
||||||
|
|
||||||
|
QStringList Comic::comicExtensions = QStringList() << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf" << "*.7z" << "*.cb7" << "*.arj" << "*.cbt";
|
||||||
|
QStringList Comic::literalComicExtensions = QStringList() << "cbr" << "cbz" << "rar" << "zip" << "tar" << "pdf" << "7z" << "cb7" << "arj" << "cbt";
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
Comic::Comic()
|
Comic::Comic()
|
||||||
@ -177,7 +180,13 @@ bool Comic::pageIsLoaded(int page)
|
|||||||
{
|
{
|
||||||
if(page < 0 || page >= _pages.size())
|
if(page < 0 || page >= _pages.size())
|
||||||
return false;
|
return false;
|
||||||
return _loadedPages[page];
|
return _loadedPages[page];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Comic::fileIsComic(QUrl &path)
|
||||||
|
{
|
||||||
|
QFileInfo info(path.toLocalFile());
|
||||||
|
return literalComicExtensions.contains(info.suffix());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -302,7 +311,7 @@ void FileComic::crcError(int index)
|
|||||||
emit crcErrorFound(tr("CRC error on page (%1): some of the pages will not be displayed correctly").arg(index+1));
|
emit crcErrorFound(tr("CRC error on page (%1): some of the pages will not be displayed correctly").arg(index+1));
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: comprobar que si se produce uno de estos errores, la carga del cómic es irrecuperable
|
//TODO: comprobar que si se produce uno de estos errores, la carga del c<EFBFBD>mic es irrecuperable
|
||||||
void FileComic::unknownError(int index)
|
void FileComic::unknownError(int index)
|
||||||
{
|
{
|
||||||
Q_UNUSED(index)
|
Q_UNUSED(index)
|
||||||
@ -425,7 +434,7 @@ void FileComic::process()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//se filtran para obtener sólo los formatos soportados
|
//se filtran para obtener s<EFBFBD>lo los formatos soportados
|
||||||
_order = archive.getFileNames();
|
_order = archive.getFileNames();
|
||||||
_fileNames = filter(_order);
|
_fileNames = filter(_order);
|
||||||
|
|
||||||
@ -472,7 +481,7 @@ void FileComic::process()
|
|||||||
emit imageLoaded(sortedIndex,_pages[sortedIndex]);
|
emit imageLoaded(sortedIndex,_pages[sortedIndex]);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
emit imagesLoaded();
|
emit imagesLoaded();
|
||||||
//moveToThread(QApplication::instance()->thread());
|
//moveToThread(QApplication::instance()->thread());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,8 +49,11 @@ class ComicDB;
|
|||||||
|
|
||||||
bool _isPDF;
|
bool _isPDF;
|
||||||
|
|
||||||
static QStringList extensions;
|
static QStringList imageExtensions;
|
||||||
static QStringList literalExtensions;
|
static QStringList literalImageExtensions;
|
||||||
|
static QStringList comicExtensions;
|
||||||
|
static QStringList literalComicExtensions;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bookmarks * bm;
|
Bookmarks * bm;
|
||||||
|
|
||||||
@ -74,12 +77,14 @@ class ComicDB;
|
|||||||
//QPixmap * currentPage();
|
//QPixmap * currentPage();
|
||||||
bool loaded();
|
bool loaded();
|
||||||
//QPixmap * operator[](unsigned int index);
|
//QPixmap * operator[](unsigned int index);
|
||||||
QVector<QByteArray> * getRawData(){return &_pages;};
|
QVector<QByteArray> * getRawData(){return &_pages;}
|
||||||
QByteArray getRawPage(int page);
|
QByteArray getRawPage(int page);
|
||||||
bool pageIsLoaded(int page);
|
bool pageIsLoaded(int page);
|
||||||
|
|
||||||
inline static QStringList getSupportedImageFormats() { return extensions;};
|
inline static QStringList getSupportedImageFormats() { return imageExtensions;}
|
||||||
inline static QStringList getSupportedImageLiteralFormats() { return literalExtensions;};
|
inline static QStringList getSupportedImageLiteralFormats() { return literalImageExtensions;}
|
||||||
|
|
||||||
|
static bool fileIsComic(QUrl & path);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void loadFinished();
|
void loadFinished();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user