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())
|
||||
{
|
||||
QStringList imageSuffixs = Comic::getSupportedImageLiteralFormats();
|
||||
if(imageSuffixs.contains("."+info.suffix())) //image dropped
|
||||
if(imageSuffixs.contains(info.suffix())) //image dropped
|
||||
openFolderFromPath(info.absoluteDir().absolutePath(),info.fileName());
|
||||
else
|
||||
openComicFromPath(fName); // if is file, setText
|
||||
|
@ -119,7 +119,8 @@ HEADERS += comic_flow.h \
|
||||
comics_view.h \
|
||||
classic_comics_view.h \
|
||||
empty_folder_widget.h \
|
||||
no_search_results_widget.h
|
||||
no_search_results_widget.h \
|
||||
comic_files_manager.h
|
||||
|
||||
|
||||
SOURCES += comic_flow.cpp \
|
||||
@ -167,7 +168,8 @@ SOURCES += comic_flow.cpp \
|
||||
comics_view.cpp \
|
||||
classic_comics_view.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 "comic.h"
|
||||
|
||||
#include "QsLog.h"
|
||||
|
||||
ComicsView::ComicsView(QWidget *parent) :
|
||||
QWidget(parent),model(NULL)
|
||||
{
|
||||
setAcceptDrops(true);
|
||||
}
|
||||
|
||||
void ComicsView::setModel(TableModel *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
|
||||
#define COMICS_VIEW_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QtWidgets>
|
||||
|
||||
#include "tablemodel.h"
|
||||
#include <QAbstractItemView>
|
||||
#include <QSettings>
|
||||
#include <QModelIndex>
|
||||
#include <QModelIndexList>
|
||||
|
||||
class YACReaderTableView;
|
||||
class QSplitter;
|
||||
@ -37,12 +33,23 @@ public:
|
||||
signals:
|
||||
void selected(unsigned int);
|
||||
void comicRated(int,QModelIndex);
|
||||
|
||||
//Drops
|
||||
void copyComicsToCurrentFolder(QList<QString>);
|
||||
void moveComicsToCurrentFolder(QList<QString>);
|
||||
|
||||
public slots:
|
||||
virtual void setShowMarks(bool show) = 0;
|
||||
virtual void selectAll() = 0;
|
||||
protected:
|
||||
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
|
||||
|
@ -449,6 +449,8 @@ QString TreeModel::getDatabase()
|
||||
|
||||
QString TreeModel::getFolderPath(const QModelIndex &folder)
|
||||
{
|
||||
if(!folder.isValid()) //root folder
|
||||
return "/";
|
||||
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.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());
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -49,6 +49,7 @@ public:
|
||||
static QList<LibraryItem *> getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true);
|
||||
//load
|
||||
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(QString cname, QString cpath, QString chash, QSqlDatabase & database);
|
||||
static ComicInfo loadComicInfo(QString hash, QSqlDatabase & db);
|
||||
|
@ -36,7 +36,7 @@ using namespace std;
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
LibraryCreator::LibraryCreator()
|
||||
:creation(false)
|
||||
:creation(false), partialUpdate(false)
|
||||
{
|
||||
_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)
|
||||
{
|
||||
creation = true;
|
||||
processLibrary(source,target);
|
||||
processLibrary(source, 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)
|
||||
@ -108,7 +141,7 @@ void LibraryCreator::run()
|
||||
|
||||
/*QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);*/
|
||||
_database.transaction();
|
||||
//se crea la librería
|
||||
//se crea la librería
|
||||
create(QDir(_source));
|
||||
_database.commit();
|
||||
_database.close();
|
||||
@ -118,9 +151,14 @@ void LibraryCreator::run()
|
||||
}
|
||||
else
|
||||
{
|
||||
QLOG_INFO() << "Starting to update library ( " << _source << "," << _target << ")";
|
||||
_currentPathFolders.clear();
|
||||
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||
QLOG_INFO() << "Starting to update folder" << _sourceFolder << "in library ( " << _source << "," << _target << ")";
|
||||
if(!partialUpdate)
|
||||
{
|
||||
_currentPathFolders.clear();
|
||||
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||
QLOG_DEBUG() << "update whole library";
|
||||
}
|
||||
|
||||
_database = DataBaseManagement::loadDatabase(_target);
|
||||
//_database.setDatabaseName(_target+"/library.ydb");
|
||||
if(!_database.open())
|
||||
@ -133,19 +171,28 @@ void LibraryCreator::run()
|
||||
}
|
||||
QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);
|
||||
_database.transaction();
|
||||
update(QDir(_source));
|
||||
if(partialUpdate)
|
||||
update(QDir(_sourceFolder));
|
||||
else
|
||||
update(QDir(_source));
|
||||
_database.commit();
|
||||
_database.close();
|
||||
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.
|
||||
if(!creation)
|
||||
emit(updated());
|
||||
else
|
||||
emit(created());
|
||||
//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(!partialUpdate)
|
||||
{
|
||||
if(!creation)
|
||||
emit(updated());
|
||||
else
|
||||
emit(created());
|
||||
}
|
||||
QLOG_INFO() << "Update library END";
|
||||
}
|
||||
msleep(100);//TODO try to solve the problem with the udpate dialog (ya no se usa más...)
|
||||
emit(finished());
|
||||
//msleep(100);//TODO try to solve the problem with the udpate dialog (ya no se usa más...)
|
||||
if(partialUpdate)
|
||||
emit updatedCurrentFolder();
|
||||
else
|
||||
emit finished();
|
||||
creation = false;
|
||||
}
|
||||
|
||||
@ -201,10 +248,10 @@ void LibraryCreator::create(QDir dir)
|
||||
#endif
|
||||
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));
|
||||
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();
|
||||
}
|
||||
else
|
||||
@ -221,7 +268,7 @@ bool LibraryCreator::checkCover(const QString & hash)
|
||||
|
||||
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);
|
||||
QFile file(fileInfo.absoluteFilePath());
|
||||
@ -244,7 +291,7 @@ void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo &
|
||||
|
||||
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();
|
||||
comic.info.numPages = numPages;
|
||||
comic.parentId = _currentPathFolders.last().id;
|
||||
@ -337,7 +384,7 @@ void LibraryCreator::update(QDir dirS)
|
||||
#else
|
||||
QString path = QDir::cleanPath(fileInfoS.absoluteFilePath()).remove(_source);
|
||||
#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()));
|
||||
_currentPathFolders.pop_back();
|
||||
}
|
||||
@ -476,7 +523,7 @@ void LibraryCreator::update(QDir dirS)
|
||||
{
|
||||
if(fileInfoS.isFile() && !fileInfoD->isDir())
|
||||
{
|
||||
//TODO comprobar fechas + tamaño
|
||||
//TODO comprobar fechas + tamaño
|
||||
//if(fileInfoS.lastModified()>fileInfoD.lastModified())
|
||||
//{
|
||||
// dirD.mkpath(_target+(QDir::cleanPath(fileInfoS.absolutePath()).remove(_source)));
|
||||
@ -585,7 +632,7 @@ void ThumbnailCreator::create()
|
||||
}
|
||||
if(!archive.isValid())
|
||||
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> fileNames = FileComic::filter(order);
|
||||
_numPages = fileNames.size();
|
||||
|
@ -22,32 +22,37 @@
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
LibraryCreator();
|
||||
void createLibrary(const QString & source, const QString & target);
|
||||
void updateLibrary(const QString & source, const QString & target);
|
||||
void stop();
|
||||
LibraryCreator();
|
||||
void createLibrary(const QString & source, const QString & target);
|
||||
void updateLibrary(const QString & source, const QString & target);
|
||||
void updateFolder(const QString & source, const QString & target, const QString & folder);
|
||||
void stop();
|
||||
|
||||
private:
|
||||
void processLibrary(const QString & source, const QString & target);
|
||||
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;
|
||||
QString _source;
|
||||
QString _target;
|
||||
QString _sourceFolder; //used for partial updates
|
||||
QStringList _nameFilter;
|
||||
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
|
||||
void create(QDir currentDirectory);
|
||||
void update(QDir currentDirectory);
|
||||
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);
|
||||
void insertComic(const QString & relativePath,const QFileInfo & fileInfo);
|
||||
//qulonglong insertFolder(qulonglong parentId,const Folder & folder);
|
||||
//qulonglong insertComic(const Comic & comic);
|
||||
bool stopRunning;
|
||||
//LibraryCreator está en modo creación si creation == true;
|
||||
//LibraryCreator está en modo creación si creation == true;
|
||||
bool creation;
|
||||
bool partialUpdate;
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
void coverExtracted(QString);
|
||||
@ -57,6 +62,7 @@
|
||||
void created();
|
||||
void failedCreatingDB(QString);
|
||||
void failedOpeningDB(QString);
|
||||
void updatedCurrentFolder();
|
||||
};
|
||||
|
||||
class ThumbnailCreator : public QObject
|
||||
|
@ -71,6 +71,8 @@
|
||||
|
||||
#include "no_search_results_widget.h"
|
||||
|
||||
#include "comic_files_manager.h"
|
||||
|
||||
#include "QsLog.h"
|
||||
|
||||
#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(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
||||
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()
|
||||
@ -398,6 +402,9 @@ void LibraryWindow::doComicsViewConnections()
|
||||
connect(comicsView,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
|
||||
connect(comicsView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openComic()));
|
||||
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()
|
||||
@ -925,6 +932,8 @@ void LibraryWindow::createConnections()
|
||||
connect(libraryCreator,SIGNAL(finished()),this,SLOT(showRootWidget()));
|
||||
connect(libraryCreator,SIGNAL(updated()),this,SLOT(reloadCurrentLibrary()));
|
||||
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)));
|
||||
//libraryCreator errors
|
||||
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)
|
||||
{
|
||||
QModelIndex dest = foldersModel->index(child,0,mi);
|
||||
@ -1885,7 +1961,21 @@ void LibraryWindow::reloadOptions()
|
||||
|
||||
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
|
||||
|
@ -56,6 +56,8 @@ class ComicsViewTransition;
|
||||
class EmptyFolderWidget;
|
||||
class NoSearchResultsWidget;
|
||||
class EditShortcutsDialog;
|
||||
class ComicFilesManager;
|
||||
class QProgressDialog;
|
||||
|
||||
#include "comic_db.h"
|
||||
|
||||
@ -227,6 +229,7 @@ private:
|
||||
//void enableLibraryActions();
|
||||
|
||||
QString currentPath();
|
||||
QString currentFolderPath();
|
||||
|
||||
//settings
|
||||
QSettings * settings;
|
||||
@ -319,6 +322,11 @@ public slots:
|
||||
void toggleComicsView();
|
||||
void checkSearchNumResults(int numResults);
|
||||
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
|
||||
|
@ -13,8 +13,11 @@
|
||||
#include "compressed_archive.h"
|
||||
#include "comic_db.h"
|
||||
|
||||
QStringList Comic::extensions = QStringList() << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp";
|
||||
QStringList Comic::literalExtensions = QStringList() << ".jpg" << ".jpeg" << ".png" << ".gif" << ".tiff" << ".tif" << ".bmp";
|
||||
QStringList Comic::imageExtensions = 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()
|
||||
@ -177,7 +180,13 @@ bool Comic::pageIsLoaded(int page)
|
||||
{
|
||||
if(page < 0 || page >= _pages.size())
|
||||
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));
|
||||
}
|
||||
|
||||
//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)
|
||||
{
|
||||
Q_UNUSED(index)
|
||||
@ -425,7 +434,7 @@ void FileComic::process()
|
||||
return;
|
||||
}
|
||||
|
||||
//se filtran para obtener sólo los formatos soportados
|
||||
//se filtran para obtener s<EFBFBD>lo los formatos soportados
|
||||
_order = archive.getFileNames();
|
||||
_fileNames = filter(_order);
|
||||
|
||||
@ -472,7 +481,7 @@ void FileComic::process()
|
||||
emit imageLoaded(sortedIndex,_pages[sortedIndex]);
|
||||
}*/
|
||||
|
||||
emit imagesLoaded();
|
||||
emit imagesLoaded();
|
||||
//moveToThread(QApplication::instance()->thread());
|
||||
}
|
||||
|
||||
|
@ -49,8 +49,11 @@ class ComicDB;
|
||||
|
||||
bool _isPDF;
|
||||
|
||||
static QStringList extensions;
|
||||
static QStringList literalExtensions;
|
||||
static QStringList imageExtensions;
|
||||
static QStringList literalImageExtensions;
|
||||
static QStringList comicExtensions;
|
||||
static QStringList literalComicExtensions;
|
||||
|
||||
public:
|
||||
Bookmarks * bm;
|
||||
|
||||
@ -74,12 +77,14 @@ class ComicDB;
|
||||
//QPixmap * currentPage();
|
||||
bool loaded();
|
||||
//QPixmap * operator[](unsigned int index);
|
||||
QVector<QByteArray> * getRawData(){return &_pages;};
|
||||
QVector<QByteArray> * getRawData(){return &_pages;}
|
||||
QByteArray getRawPage(int page);
|
||||
bool pageIsLoaded(int page);
|
||||
|
||||
inline static QStringList getSupportedImageFormats() { return extensions;};
|
||||
inline static QStringList getSupportedImageLiteralFormats() { return literalExtensions;};
|
||||
inline static QStringList getSupportedImageFormats() { return imageExtensions;}
|
||||
inline static QStringList getSupportedImageLiteralFormats() { return literalImageExtensions;}
|
||||
|
||||
static bool fileIsComic(QUrl & path);
|
||||
|
||||
public slots:
|
||||
void loadFinished();
|
||||
|
Loading…
x
Reference in New Issue
Block a user