mirror of
https://github.com/YACReader/yacreader
synced 2025-07-18 04:54:29 -04:00
a?adida la capacidad de ocultar completamente el "comic flow", ha sido necesario modificar el c?digo de pictureflow para evitar un error inesperado al renderizar
completada la b?squeda con el soporte para incluir el nombre de los archivos, aunque falta por a?adir el scroll autom?tico arreglada la actualizaci?n de las librer?as, ahora se a?ade el nodo ra?z a la tabla folder, el nodo ra?z ahora tiene id=1 y padre 1, se debe excluir de todas las b?squedas
This commit is contained in:
@ -4,38 +4,27 @@
|
|||||||
#include <QSqlRecord>
|
#include <QSqlRecord>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//COMIC------------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
Comic::Comic()
|
Comic::Comic()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Comic::Comic(qulonglong cparentId, qulonglong ccomicInfoId, QString cname, QString cpath, QString chash)
|
Comic::Comic(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database)
|
||||||
:comicInfoId(ccomicInfoId),hash(chash)
|
|
||||||
{
|
{
|
||||||
parentId = cparentId;
|
parentId = cparentId;
|
||||||
name = cname;
|
name = cname;
|
||||||
path = cpath;
|
path = cpath;
|
||||||
}
|
|
||||||
|
|
||||||
qulonglong Comic::insert(QSqlDatabase & db)
|
if(!info.load(chash,database))
|
||||||
{
|
{
|
||||||
//TODO comprobar si ya hay comic info con ese hash
|
info.hash = chash;
|
||||||
QSqlQuery comicInfoInsert(db);
|
_hasCover = false;
|
||||||
comicInfoInsert.prepare("INSERT INTO comic_info (hash) "
|
}
|
||||||
"VALUES (:hash)");
|
else
|
||||||
comicInfoInsert.bindValue(":hash", hash);
|
_hasCover = true;
|
||||||
comicInfoInsert.exec();
|
|
||||||
qulonglong comicInfoId =comicInfoInsert.lastInsertId().toLongLong();
|
|
||||||
|
|
||||||
QSqlQuery query(db);
|
|
||||||
query.prepare("INSERT INTO comic (parentId, comicInfoId, fileName, path) "
|
|
||||||
"VALUES (:parentId,:comicInfoId,:name, :path)");
|
|
||||||
query.bindValue(":parentId", parentId);
|
|
||||||
query.bindValue(":comicInfoId", comicInfoId);
|
|
||||||
query.bindValue(":name", name);
|
|
||||||
query.bindValue(":path", path);
|
|
||||||
query.exec();
|
|
||||||
return query.lastInsertId().toLongLong();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<LibraryItem *> Comic::getComicsFromParent(qulonglong parentId, QSqlDatabase & db)
|
QList<LibraryItem *> Comic::getComicsFromParent(qulonglong parentId, QSqlDatabase & db)
|
||||||
@ -59,7 +48,7 @@ QList<LibraryItem *> Comic::getComicsFromParent(qulonglong parentId, QSqlDatabas
|
|||||||
currentItem->id = record.value(0).toLongLong();
|
currentItem->id = record.value(0).toLongLong();
|
||||||
currentItem->parentId = record.value(1).toLongLong();
|
currentItem->parentId = record.value(1).toLongLong();
|
||||||
currentItem->name = record.value(2).toString();
|
currentItem->name = record.value(2).toString();
|
||||||
currentItem->hash = record.value(3).toString();
|
currentItem->info.load(record.value(3).toString(),db);
|
||||||
int lessThan = 0;
|
int lessThan = 0;
|
||||||
if(list.isEmpty())
|
if(list.isEmpty())
|
||||||
list.append(currentItem);
|
list.append(currentItem);
|
||||||
@ -87,6 +76,44 @@ QList<LibraryItem *> Comic::getComicsFromParent(qulonglong parentId, QSqlDatabas
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Comic::load(qulonglong id, QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qulonglong Comic::insert(QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
//TODO comprobar si ya hay comic info con ese hash
|
||||||
|
|
||||||
|
if(!info.existOnDb)
|
||||||
|
{
|
||||||
|
QSqlQuery comicInfoInsert(db);
|
||||||
|
comicInfoInsert.prepare("INSERT INTO comic_info (hash) "
|
||||||
|
"VALUES (:hash)");
|
||||||
|
comicInfoInsert.bindValue(":hash", info.hash);
|
||||||
|
comicInfoInsert.exec();
|
||||||
|
info.id =comicInfoInsert.lastInsertId().toLongLong();
|
||||||
|
_hasCover = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_hasCover = true; //TODO check on disk...
|
||||||
|
|
||||||
|
QSqlQuery query(db);
|
||||||
|
query.prepare("INSERT INTO comic (parentId, comicInfoId, fileName, path) "
|
||||||
|
"VALUES (:parentId,:comicInfoId,:name, :path)");
|
||||||
|
query.bindValue(":parentId", parentId);
|
||||||
|
query.bindValue(":comicInfoId", info.id);
|
||||||
|
query.bindValue(":name", name);
|
||||||
|
query.bindValue(":path", path);
|
||||||
|
query.exec();
|
||||||
|
return query.lastInsertId().toLongLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comic::update(QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Comic::removeFromDB(QSqlDatabase & db)
|
void Comic::removeFromDB(QSqlDatabase & db)
|
||||||
{
|
{
|
||||||
QSqlQuery query(db);
|
QSqlQuery query(db);
|
||||||
@ -99,3 +126,49 @@ bool Comic::isDir()
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//COMIC_INFO-------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
ComicInfo::ComicInfo()
|
||||||
|
:existOnDb(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ComicInfo::load(QString hash, QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
QSqlQuery findComicInfo(db);
|
||||||
|
findComicInfo.prepare("SELECT * FROM comic_info WHERE hash = :hash");
|
||||||
|
findComicInfo.bindValue(":hash", hash);
|
||||||
|
findComicInfo.exec();
|
||||||
|
|
||||||
|
|
||||||
|
if(findComicInfo.next())
|
||||||
|
{
|
||||||
|
QSqlRecord record = findComicInfo.record();
|
||||||
|
|
||||||
|
this->hash = hash;
|
||||||
|
this->id = record.value(0).toLongLong();
|
||||||
|
this->name = record.value(2).toString();
|
||||||
|
this->read = record.value(3).toBool();
|
||||||
|
existOnDb = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
existOnDb = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
qulonglong ComicInfo::insert(QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void ComicInfo::removeFromDB(QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void ComicInfo::update(QSqlDatabase & db)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -5,19 +5,43 @@
|
|||||||
#include <QSqlDatabase>
|
#include <QSqlDatabase>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
class Comic : public LibraryItem
|
class ComicInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qulonglong comicInfoId;
|
ComicInfo();
|
||||||
QString hash;
|
|
||||||
|
|
||||||
Comic();
|
bool load(QString hash, QSqlDatabase & db);
|
||||||
Comic(qulonglong cparentId, qulonglong ccomicInfoId, QString cname, QString cpath, QString chash);
|
|
||||||
//Comic(QString fn, QString fp):name(fn),path(fp),knownParent(false), knownId(false){};
|
|
||||||
qulonglong insert(QSqlDatabase & db);
|
qulonglong insert(QSqlDatabase & db);
|
||||||
|
void removeFromDB(QSqlDatabase & db);
|
||||||
|
void update(QSqlDatabase & db);
|
||||||
|
|
||||||
|
qulonglong id;
|
||||||
|
bool read;
|
||||||
|
QString hash;
|
||||||
|
QString name;
|
||||||
|
|
||||||
|
bool existOnDb;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Comic : public LibraryItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool _hasCover;
|
||||||
|
public:
|
||||||
|
Comic();
|
||||||
|
Comic(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database);
|
||||||
|
//Comic(QString fn, QString fp):name(fn),path(fp),knownParent(false), knownId(false){};
|
||||||
|
|
||||||
static QList<LibraryItem *> getComicsFromParent(qulonglong parentId, QSqlDatabase & db);
|
static QList<LibraryItem *> getComicsFromParent(qulonglong parentId, QSqlDatabase & db);
|
||||||
bool isDir();
|
bool isDir();
|
||||||
|
|
||||||
|
bool load(qulonglong id, QSqlDatabase & db);
|
||||||
|
qulonglong insert(QSqlDatabase & db);
|
||||||
void removeFromDB(QSqlDatabase & db);
|
void removeFromDB(QSqlDatabase & db);
|
||||||
|
void update(QSqlDatabase & db);
|
||||||
|
bool hasCover() {return _hasCover;};
|
||||||
|
|
||||||
|
ComicInfo info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,8 +25,15 @@ QSqlDatabase DataBaseManagement::createDatabase(QString name, QString path)
|
|||||||
qDebug() << db.lastError();
|
qDebug() << db.lastError();
|
||||||
else {
|
else {
|
||||||
qDebug() << db.tables();
|
qDebug() << db.tables();
|
||||||
db.close();
|
|
||||||
}
|
}
|
||||||
|
QSqlQuery pragma("PRAGMA foreign_keys = ON",db);
|
||||||
|
DataBaseManagement::createTables(db);
|
||||||
|
|
||||||
|
QSqlQuery query("INSERT INTO folder (parentId, name, path) "
|
||||||
|
"VALUES (1,'root', '/')",db);
|
||||||
|
|
||||||
|
//db.close();
|
||||||
|
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,9 +44,32 @@ QSqlDatabase DataBaseManagement::loadDatabase(QString path)
|
|||||||
db.setDatabaseName(path+"/library.ydb");
|
db.setDatabaseName(path+"/library.ydb");
|
||||||
if (!db.open()) {
|
if (!db.open()) {
|
||||||
//se devuelve una base de datos vac<61>a e inv<6E>lida
|
//se devuelve una base de datos vac<61>a e inv<6E>lida
|
||||||
|
|
||||||
return QSqlDatabase();
|
return QSqlDatabase();
|
||||||
}
|
}
|
||||||
|
QSqlQuery pragma("PRAGMA foreign_keys = ON",db);
|
||||||
//devuelve la base de datos
|
//devuelve la base de datos
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DataBaseManagement::createTables(QSqlDatabase & database)
|
||||||
|
{
|
||||||
|
bool success = true;
|
||||||
|
|
||||||
|
//FOLDER (representa una carpeta en disco)
|
||||||
|
QSqlQuery queryFolder(database);
|
||||||
|
queryFolder.prepare("CREATE TABLE folder (id INTEGER PRIMARY KEY, parentId INTEGER NOT NULL, name TEXT NOT NULL, path TEXT NOT NULL, FOREIGN KEY(parentId) REFERENCES folder(id) ON DELETE CASCADE)");
|
||||||
|
success = success && queryFolder.exec();
|
||||||
|
|
||||||
|
//COMIC INFO (representa la informaci<63>n de un c<>mic, cada c<>mic tendr<64> un id<69>ntificador <20>nico formado por un hash sha1'de los primeros 512kb' + su tama<6D>o en bytes)
|
||||||
|
QSqlQuery queryComicInfo(database);
|
||||||
|
queryComicInfo.prepare("CREATE TABLE comic_info (id INTEGER PRIMARY KEY, hash TEXT NOT NULL, name TEXT, read BOOLEAN)");
|
||||||
|
success = success && queryComicInfo.exec();
|
||||||
|
|
||||||
|
//COMIC (representa un c<>mic en disco, contiene el nombre de fichero)
|
||||||
|
QSqlQuery queryComic(database);
|
||||||
|
queryComic.prepare("CREATE TABLE comic (id INTEGER PRIMARY KEY, parentId INTEGER NOT NULL, comicInfoId INTEGER NOT NULL, fileName TEXT NOT NULL, path TEXT, FOREIGN KEY(parentId) REFERENCES folder(id) ON DELETE CASCADE, FOREIGN KEY(comicInfoId) REFERENCES comic_info(id))");
|
||||||
|
success = success && queryComic.exec();
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
@ -15,8 +15,11 @@ private:
|
|||||||
public:
|
public:
|
||||||
DataBaseManagement();
|
DataBaseManagement();
|
||||||
TreeModel * newTreeModel(QString path);
|
TreeModel * newTreeModel(QString path);
|
||||||
|
//crea una base de datos y todas sus tablas
|
||||||
static QSqlDatabase createDatabase(QString name, QString path);
|
static QSqlDatabase createDatabase(QString name, QString path);
|
||||||
|
//carga una base de datos desde la ruta path
|
||||||
static QSqlDatabase loadDatabase(QString path);
|
static QSqlDatabase loadDatabase(QString path);
|
||||||
|
static bool createTables(QSqlDatabase & database);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -21,7 +21,7 @@ QList<LibraryItem *> Folder::getFoldersFromParent(qulonglong parentId, QSqlDatab
|
|||||||
QList<LibraryItem *> list;
|
QList<LibraryItem *> list;
|
||||||
|
|
||||||
QSqlQuery selectQuery(db); //TODO check
|
QSqlQuery selectQuery(db); //TODO check
|
||||||
selectQuery.prepare("SELECT * FROM folder WHERE parentId = :parentId");
|
selectQuery.prepare("SELECT * FROM folder WHERE parentId = :parentId and id <> 1");
|
||||||
selectQuery.bindValue(":parentId", parentId);
|
selectQuery.bindValue(":parentId", parentId);
|
||||||
selectQuery.exec();
|
selectQuery.exec();
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
//! [0]
|
//! [0]
|
||||||
TableItem::TableItem(const QList<QVariant> &data)
|
TableItem::TableItem(const QList<QVariant> &data)
|
||||||
|
|
||||||
{
|
{
|
||||||
itemData = data;
|
itemData = data;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
#include "comic.h"
|
||||||
|
|
||||||
//! [0]
|
//! [0]
|
||||||
class TableItem
|
class TableItem
|
||||||
@ -14,6 +15,7 @@ public:
|
|||||||
QVariant data(int column) const;
|
QVariant data(int column) const;
|
||||||
int row() const;
|
int row() const;
|
||||||
unsigned long long int id; //TODO sustituir por una clase adecuada
|
unsigned long long int id; //TODO sustituir por una clase adecuada
|
||||||
|
Comic comic;
|
||||||
private:
|
private:
|
||||||
QList<QVariant> itemData;
|
QList<QVariant> itemData;
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
#include <QModelIndex>
|
||||||
|
|
||||||
//! [0]
|
//! [0]
|
||||||
class TreeItem
|
class TreeItem
|
||||||
@ -63,9 +64,8 @@ public:
|
|||||||
TreeItem *parentItem;
|
TreeItem *parentItem;
|
||||||
unsigned long long int id;
|
unsigned long long int id;
|
||||||
QList<QString> comicNames;
|
QList<QString> comicNames;
|
||||||
int originalRow; //usado en los TreeItem filtrados //TODO crear clase espec<65>fica.....
|
QModelIndex index;
|
||||||
int originalColumn; //usado en los TreeItem filtrados //TODO crear clase espec<65>fica.....
|
QModelIndex originalIndex;
|
||||||
int column;
|
|
||||||
private:
|
private:
|
||||||
QList<TreeItem*> childItems;
|
QList<TreeItem*> childItems;
|
||||||
QList<QVariant> itemData;
|
QList<QVariant> itemData;
|
||||||
|
@ -52,6 +52,8 @@
|
|||||||
#include "treemodel.h"
|
#include "treemodel.h"
|
||||||
#include "data_base_management.h"
|
#include "data_base_management.h"
|
||||||
|
|
||||||
|
#define ROOT 1
|
||||||
|
|
||||||
TreeModel::TreeModel(QObject *parent)
|
TreeModel::TreeModel(QObject *parent)
|
||||||
: QAbstractItemModel(parent),rootItem(0),rootBeforeFilter(0),filterEnabled(false),includeComics(false)
|
: QAbstractItemModel(parent),rootItem(0),rootBeforeFilter(0),filterEnabled(false),includeComics(false)
|
||||||
{
|
{
|
||||||
@ -67,7 +69,7 @@ TreeModel::TreeModel( QSqlQuery &sqlquery, QObject *parent)
|
|||||||
QList<QVariant> rootData;
|
QList<QVariant> rootData;
|
||||||
rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
||||||
rootItem = new TreeItem(rootData);
|
rootItem = new TreeItem(rootData);
|
||||||
rootItem->id = 0;
|
rootItem->id = ROOT;
|
||||||
setupModelData(sqlquery, rootItem);
|
setupModelData(sqlquery, rootItem);
|
||||||
}
|
}
|
||||||
//! [0]
|
//! [0]
|
||||||
@ -145,8 +147,8 @@ QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
|
|||||||
TreeItem *childItem = parentItem->child(row);
|
TreeItem *childItem = parentItem->child(row);
|
||||||
if (childItem)
|
if (childItem)
|
||||||
{
|
{
|
||||||
childItem->column = column;
|
childItem->index = createIndex(row, column, childItem);
|
||||||
return createIndex(row, column, childItem);
|
return childItem->index;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
@ -165,7 +167,8 @@ QModelIndex TreeModel::parent(const QModelIndex &index) const
|
|||||||
if (parentItem == rootItem)
|
if (parentItem == rootItem)
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
|
|
||||||
return createIndex(parentItem->row(), 0, parentItem);
|
parentItem->index = createIndex(parentItem->row(), 0, parentItem);
|
||||||
|
return parentItem->index;
|
||||||
}
|
}
|
||||||
//! [7]
|
//! [7]
|
||||||
|
|
||||||
@ -188,21 +191,23 @@ int TreeModel::rowCount(const QModelIndex &parent) const
|
|||||||
void TreeModel::setupModelData(QString path)
|
void TreeModel::setupModelData(QString path)
|
||||||
{
|
{
|
||||||
emit(beforeReset());
|
emit(beforeReset());
|
||||||
if(rootItem == 0)
|
if(rootItem != 0)
|
||||||
delete rootItem; //TODO comprobar que se libera bien la memoria
|
delete rootItem; //TODO comprobar que se libera bien la memoria
|
||||||
|
filterEnabled = false;
|
||||||
|
rootItem = 0;
|
||||||
|
rootBeforeFilter = 0;
|
||||||
//inicializar el nodo ra<72>z
|
//inicializar el nodo ra<72>z
|
||||||
QList<QVariant> rootData;
|
QList<QVariant> rootData;
|
||||||
rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
||||||
rootItem = new TreeItem(rootData);
|
rootItem = new TreeItem(rootData);
|
||||||
rootItem->id = 0;
|
rootItem->id = ROOT;
|
||||||
|
|
||||||
//cargar la base de datos
|
//cargar la base de datos
|
||||||
if(_database.isOpen())
|
if(_database.isOpen())
|
||||||
_database.close();
|
_database.close();
|
||||||
_database = DataBaseManagement::loadDatabase(path);
|
_database = DataBaseManagement::loadDatabase(path);
|
||||||
//crear la consulta
|
//crear la consulta
|
||||||
QSqlQuery selectQuery("select * from folder order by parentId,name",_database);
|
QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name",_database);
|
||||||
|
|
||||||
setupModelData(selectQuery,rootItem);
|
setupModelData(selectQuery,rootItem);
|
||||||
_database.close();
|
_database.close();
|
||||||
@ -215,7 +220,7 @@ void TreeModel::setupModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
|||||||
{
|
{
|
||||||
//64 bits para la primary key, es decir la misma precisi<73>n que soporta sqlit 2^64
|
//64 bits para la primary key, es decir la misma precisi<73>n que soporta sqlit 2^64
|
||||||
//el diccionario permitir<69> encontrar cualquier nodo del <20>rbol r<>pidamente, de forma que a<>adir un hijo a un padre sea O(1)
|
//el diccionario permitir<69> encontrar cualquier nodo del <20>rbol r<>pidamente, de forma que a<>adir un hijo a un padre sea O(1)
|
||||||
|
items.clear();
|
||||||
//se a<>ade el nodo 0
|
//se a<>ade el nodo 0
|
||||||
items.insert(parent->id,parent);
|
items.insert(parent->id,parent);
|
||||||
|
|
||||||
@ -243,19 +248,29 @@ void TreeModel::setupFilteredModelData()
|
|||||||
|
|
||||||
if(rootBeforeFilter == 0)
|
if(rootBeforeFilter == 0)
|
||||||
rootBeforeFilter = rootItem;
|
rootBeforeFilter = rootItem;
|
||||||
|
else
|
||||||
|
delete rootItem;//los resultados de la b<>squeda anterior deben ser borrados
|
||||||
|
|
||||||
QList<QVariant> rootData;
|
QList<QVariant> rootData;
|
||||||
rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
rootData << "root"; //id 1, padre 1, title "root" (el id, y el id del padre van a ir en la clase TreeItem)
|
||||||
rootItem = new TreeItem(rootData);
|
rootItem = new TreeItem(rootData);
|
||||||
rootItem->id = 0;
|
rootItem->id = ROOT;
|
||||||
|
|
||||||
//cargar la base de datos
|
//cargar la base de datos
|
||||||
if(_database.isValid())
|
if(_database.isValid())
|
||||||
_database.open();
|
_database.open();
|
||||||
//crear la consulta
|
//crear la consulta
|
||||||
QSqlQuery selectQuery(_database); //TODO check
|
QSqlQuery selectQuery(_database); //TODO check
|
||||||
selectQuery.prepare("select * from folder where upper(name) like upper(:filter) order by parentId,name ");
|
if(!includeComics)
|
||||||
|
{
|
||||||
|
selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name ");
|
||||||
selectQuery.bindValue(":filter", "%%"+filter+"%%");
|
selectQuery.bindValue(":filter", "%%"+filter+"%%");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectQuery.prepare("select distinct f.id, f.parentId, f.name, f.path from folder f inner join comic c on (f.id = c.parentId) where f.id <> 1 and upper(c.fileName) like upper(:filter) order by f.parentId,f.name");
|
||||||
|
selectQuery.bindValue(":filter", "%%"+filter+"%%");
|
||||||
|
}
|
||||||
selectQuery.exec();
|
selectQuery.exec();
|
||||||
setupFilteredModelData(selectQuery,rootItem);
|
setupFilteredModelData(selectQuery,rootItem);
|
||||||
_database.close();
|
_database.close();
|
||||||
@ -286,8 +301,7 @@ void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
|||||||
filteredItems.insert(item->id,item);
|
filteredItems.insert(item->id,item);
|
||||||
|
|
||||||
//es necesario conocer las coordenadas de origen para poder realizar scroll autom<6F>tico en la vista
|
//es necesario conocer las coordenadas de origen para poder realizar scroll autom<6F>tico en la vista
|
||||||
item->originalRow = items.value(item->id)->row();
|
item->originalIndex = items.value(item->id)->index;
|
||||||
item->originalColumn = items.value(item->id)->column;
|
|
||||||
|
|
||||||
//si el padre ya existe en el modelo, el item se a<>ade como hijo
|
//si el padre ya existe en el modelo, el item se a<>ade como hijo
|
||||||
if(filteredItems.contains(parentId))
|
if(filteredItems.contains(parentId))
|
||||||
@ -298,7 +312,7 @@ void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
|||||||
bool parentPreviousInserted = false;
|
bool parentPreviousInserted = false;
|
||||||
|
|
||||||
//mientras no se alcance el nodo ra<72>z se procesan todos los padres (de abajo a arriba)
|
//mientras no se alcance el nodo ra<72>z se procesan todos los padres (de abajo a arriba)
|
||||||
while(parentId !=0 )
|
while(parentId != ROOT )
|
||||||
{
|
{
|
||||||
//el padre no estaba en el modelo filtrado, as<61> que se rescata del modelo original
|
//el padre no estaba en el modelo filtrado, as<61> que se rescata del modelo original
|
||||||
TreeItem * parentItem = items.value(parentId);
|
TreeItem * parentItem = items.value(parentId);
|
||||||
@ -306,6 +320,8 @@ void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
|||||||
TreeItem * newparentItem = new TreeItem(parentItem->getData()); //padre que se a<>adir<69> a la estructura de directorios filtrados
|
TreeItem * newparentItem = new TreeItem(parentItem->getData()); //padre que se a<>adir<69> a la estructura de directorios filtrados
|
||||||
newparentItem->id = parentId;
|
newparentItem->id = parentId;
|
||||||
|
|
||||||
|
newparentItem->originalIndex = parentItem->index;
|
||||||
|
|
||||||
//si el modelo contiene al padre, se a<>ade el item actual como hijo
|
//si el modelo contiene al padre, se a<>ade el item actual como hijo
|
||||||
if(filteredItems.contains(parentId))
|
if(filteredItems.contains(parentId))
|
||||||
{
|
{
|
||||||
@ -325,12 +341,10 @@ void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
|||||||
parentId = parentItem->parentItem->id;
|
parentId = parentItem->parentItem->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
//si el nodo hijo de 0, no hab<61>a sido previamente insertado como hijo, se a<>ade como tal
|
//si el nodo es hijo de 1 y no hab<61>a sido previamente insertado como hijo, se a<>ade como tal
|
||||||
if(!parentPreviousInserted)
|
if(!parentPreviousInserted)
|
||||||
filteredItems.value(0)->appendChild(item);
|
filteredItems.value(ROOT)->appendChild(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,7 +374,13 @@ void TreeModel::resetFilter()
|
|||||||
filter = "";
|
filter = "";
|
||||||
includeComics = false;
|
includeComics = false;
|
||||||
//TODO hay que liberar la memoria reservada para el filtrado
|
//TODO hay que liberar la memoria reservada para el filtrado
|
||||||
|
//items.clear();
|
||||||
|
filteredItems.clear();
|
||||||
|
TreeItem * root = rootItem;
|
||||||
rootItem = rootBeforeFilter; //TODO si no se aplica el filtro previamente, esto invalidar<61>a en modelo
|
rootItem = rootBeforeFilter; //TODO si no se aplica el filtro previamente, esto invalidar<61>a en modelo
|
||||||
|
//if(root !=0)
|
||||||
|
// delete root;
|
||||||
|
rootBeforeFilter = 0;
|
||||||
filterEnabled = false;
|
filterEnabled = false;
|
||||||
emit(reset());
|
emit(reset());
|
||||||
|
|
||||||
|
@ -32,5 +32,6 @@
|
|||||||
<file>../images/importCover.png</file>
|
<file>../images/importCover.png</file>
|
||||||
<file>../images/editComic.png</file>
|
<file>../images/editComic.png</file>
|
||||||
<file>../images/selectAll.png</file>
|
<file>../images/selectAll.png</file>
|
||||||
|
<file>../images/hideComicFlow.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
#include <QSqlRecord>
|
#include <QSqlRecord>
|
||||||
|
#include "data_base_management.h"
|
||||||
//QMutex mutex;
|
//QMutex mutex;
|
||||||
|
|
||||||
|
|
||||||
@ -38,27 +39,7 @@ void LibraryCreator::updateLibrary(const QString &source, const QString &target)
|
|||||||
_mode = UPDATER;
|
_mode = UPDATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LibraryCreator::createTables()
|
|
||||||
{
|
|
||||||
bool success = true;
|
|
||||||
|
|
||||||
//FOLDER (representa una carpeta en disco)
|
|
||||||
QSqlQuery queryFolder(_database);
|
|
||||||
queryFolder.prepare("CREATE TABLE folder (id INTEGER PRIMARY KEY, parentId INTEGER NOT NULL, name TEXT NOT NULL, path TEXT NOT NULL, FOREIGN KEY(parentId) REFERENCES folder(id) ON DELETE CASCADE)");
|
|
||||||
success = success && queryFolder.exec();
|
|
||||||
|
|
||||||
//COMIC INFO (representa la informaci<63>n de un c<>mic, cada c<>mic tendr<64> un id<69>ntificador <20>nico formado por un hash sha1'de los primeros 512kb' + su tama<6D>o en bytes)
|
|
||||||
QSqlQuery queryComicInfo(_database);
|
|
||||||
queryComicInfo.prepare("CREATE TABLE comic_info (id INTEGER PRIMARY KEY, hash TEXT NOT NULL, name TEXT)");
|
|
||||||
success = success && queryComicInfo.exec();
|
|
||||||
|
|
||||||
//COMIC (representa un c<>mic en disco, contiene el nombre de fichero)
|
|
||||||
QSqlQuery queryComic(_database);
|
|
||||||
queryComic.prepare("CREATE TABLE comic (id INTEGER PRIMARY KEY, parentId INTEGER NOT NULL, comicInfoId INTEGER NOT NULL, fileName TEXT NOT NULL, path TEXT, FOREIGN KEY(parentId) REFERENCES folder(id) ON DELETE CASCADE, FOREIGN KEY(comicInfoId) REFERENCES comic_info(id))");
|
|
||||||
success = success && queryComic.exec();
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
void LibraryCreator::run()
|
void LibraryCreator::run()
|
||||||
{
|
{
|
||||||
@ -66,17 +47,20 @@ void LibraryCreator::run()
|
|||||||
|
|
||||||
if(_mode == CREATOR)
|
if(_mode == CREATOR)
|
||||||
{
|
{
|
||||||
|
_currentPathFolders.clear();
|
||||||
|
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||||
|
//se crean los directorios .yacreaderlibrary y .yacreaderlibrary/covers
|
||||||
QDir dir;
|
QDir dir;
|
||||||
dir.mkpath(_target+"/covers");
|
dir.mkpath(_target+"/covers");
|
||||||
_database = QSqlDatabase::addDatabase("QSQLITE");
|
|
||||||
_database.setDatabaseName(_target+"/library.ydb");
|
//se crea la base de datos .yacreaderlibrary/library.ydb
|
||||||
if(!_database.open())
|
_database = DataBaseManagement::createDatabase("library",_target);//
|
||||||
|
/*if(!_database.open())
|
||||||
return; //TODO avisar del problema
|
return; //TODO avisar del problema
|
||||||
|
|
||||||
|
QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);*/
|
||||||
_database.transaction();
|
_database.transaction();
|
||||||
_currentPathFolders.clear();
|
//se crea la librer<65>a
|
||||||
_currentPathFolders.append(Folder(0,0,"root","/"));
|
|
||||||
if(!createTables())
|
|
||||||
return;
|
|
||||||
create(QDir(_source));
|
create(QDir(_source));
|
||||||
_database.commit();
|
_database.commit();
|
||||||
_database.close();
|
_database.close();
|
||||||
@ -84,11 +68,12 @@ void LibraryCreator::run()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_currentPathFolders.clear();
|
_currentPathFolders.clear();
|
||||||
_currentPathFolders.append(Folder(0,0,"root","/"));
|
_currentPathFolders.append(Folder(1,1,"root","/"));
|
||||||
_database = QSqlDatabase::addDatabase("QSQLITE");
|
_database = DataBaseManagement::loadDatabase(_target);
|
||||||
_database.setDatabaseName(_target+"/library.ydb");
|
//_database.setDatabaseName(_target+"/library.ydb");
|
||||||
if(!_database.open())
|
/*if(!_database.open())
|
||||||
return; //TODO avisar del problema
|
return; //TODO avisar del problema*/
|
||||||
|
//QSqlQuery pragma("PRAGMA foreign_keys = ON",_database);
|
||||||
_database.transaction();
|
_database.transaction();
|
||||||
update(QDir(_source));
|
update(QDir(_source));
|
||||||
_database.commit();
|
_database.commit();
|
||||||
@ -199,11 +184,15 @@ void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo &
|
|||||||
file.close();
|
file.close();
|
||||||
//hash Sha1 del primer 0.5MB + filesize
|
//hash Sha1 del primer 0.5MB + filesize
|
||||||
QString hash = QString(crypto.result().toHex().constData()) + QString::number(fileInfo.size());
|
QString hash = QString(crypto.result().toHex().constData()) + QString::number(fileInfo.size());
|
||||||
Comic(_currentPathFolders.last().id,0,fileInfo.fileName(),relativePath,hash).insert(_database);
|
Comic comic(_currentPathFolders.last().id,fileInfo.fileName(),relativePath,hash,_database);
|
||||||
|
comic.insert(_database);
|
||||||
|
if(!comic.hasCover())
|
||||||
|
{
|
||||||
ThumbnailCreator tc(QDir::cleanPath(fileInfo.absoluteFilePath()),_target+"/covers/"+hash+".jpg");
|
ThumbnailCreator tc(QDir::cleanPath(fileInfo.absoluteFilePath()),_target+"/covers/"+hash+".jpg");
|
||||||
//ThumbnailCreator tc(QDir::cleanPath(fileInfo.absoluteFilePath()),_target+"/covers/"+fileInfo.fileName()+".jpg");
|
//ThumbnailCreator tc(QDir::cleanPath(fileInfo.absoluteFilePath()),_target+"/covers/"+fileInfo.fileName()+".jpg");
|
||||||
tc.create();
|
tc.create();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LibraryCreator::update(QDir dirS)
|
void LibraryCreator::update(QDir dirS)
|
||||||
{
|
{
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
void create(QDir currentDirectory);
|
void create(QDir currentDirectory);
|
||||||
void update(QDir currentDirectory);
|
void update(QDir currentDirectory);
|
||||||
void run();
|
void run();
|
||||||
bool createTables();
|
|
||||||
qulonglong insertFolders();//devuelve el id del <20>ltimo folder a<>adido (<28>ltimo en la ruta)
|
qulonglong insertFolders();//devuelve el id del <20>ltimo folder a<>adido (<28>ltimo en la ruta)
|
||||||
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);
|
||||||
|
@ -44,7 +44,7 @@ void LibraryWindow::setupUI()
|
|||||||
|
|
||||||
void LibraryWindow::doLayout()
|
void LibraryWindow::doLayout()
|
||||||
{
|
{
|
||||||
QSplitter * sVertical = new QSplitter(Qt::Vertical); //spliter derecha
|
sVertical = new QSplitter(Qt::Vertical); //spliter derecha
|
||||||
QSplitter * sHorizontal = new QSplitter(Qt::Horizontal); //spliter principal
|
QSplitter * sHorizontal = new QSplitter(Qt::Horizontal); //spliter principal
|
||||||
//TODO: flowType is a global variable
|
//TODO: flowType is a global variable
|
||||||
//CONFIG COMIC_FLOW--------------------------------------------------------
|
//CONFIG COMIC_FLOW--------------------------------------------------------
|
||||||
@ -77,7 +77,7 @@ void LibraryWindow::doLayout()
|
|||||||
sVertical->setStretchFactor(1,0);
|
sVertical->setStretchFactor(1,0);
|
||||||
*/
|
*/
|
||||||
//views
|
//views
|
||||||
foldersView->setAnimated(true);
|
//foldersView->setAnimated(true);
|
||||||
foldersView->setContextMenuPolicy(Qt::ActionsContextMenu);
|
foldersView->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||||
foldersView->setContextMenuPolicy(Qt::ActionsContextMenu);
|
foldersView->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||||
foldersView->header()->hide();
|
foldersView->header()->hide();
|
||||||
@ -335,6 +335,12 @@ void LibraryWindow::createActions()
|
|||||||
forceConverExtractedAction = new QAction(this);
|
forceConverExtractedAction = new QAction(this);
|
||||||
forceConverExtractedAction->setText(tr("Update cover"));
|
forceConverExtractedAction->setText(tr("Update cover"));
|
||||||
forceConverExtractedAction->setIcon(QIcon(":/images/importCover.png"));
|
forceConverExtractedAction->setIcon(QIcon(":/images/importCover.png"));
|
||||||
|
|
||||||
|
hideComicViewAction = new QAction(this);
|
||||||
|
hideComicViewAction->setText(tr("Hide comic flow"));
|
||||||
|
hideComicViewAction->setIcon(QIcon(":/images/hideComicFlow.png"));
|
||||||
|
hideComicViewAction->setCheckable(true);
|
||||||
|
hideComicViewAction->setChecked(false);
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,6 +453,8 @@ void LibraryWindow::createToolBars()
|
|||||||
editInfoToolBar->addAction(selectAllComicsAction);
|
editInfoToolBar->addAction(selectAllComicsAction);
|
||||||
editInfoToolBar->addSeparator();
|
editInfoToolBar->addSeparator();
|
||||||
editInfoToolBar->addAction(forceConverExtractedAction);
|
editInfoToolBar->addAction(forceConverExtractedAction);
|
||||||
|
editInfoToolBar->addWidget(new QToolBarStretch());
|
||||||
|
editInfoToolBar->addAction(hideComicViewAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryWindow::createMenus()
|
void LibraryWindow::createMenus()
|
||||||
@ -538,6 +546,8 @@ void LibraryWindow::createConnections()
|
|||||||
//Comicts edition
|
//Comicts edition
|
||||||
connect(selectAllComicsAction,SIGNAL(triggered()),comicView,SLOT(selectAll()));
|
connect(selectAllComicsAction,SIGNAL(triggered()),comicView,SLOT(selectAll()));
|
||||||
|
|
||||||
|
connect(hideComicViewAction, SIGNAL(toggled(bool)),this, SLOT(hideComicFlow(bool)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LibraryWindow::loadLibrary(const QString & name)
|
void LibraryWindow::loadLibrary(const QString & name)
|
||||||
@ -553,7 +563,8 @@ void LibraryWindow::loadLibrary(const QString & name)
|
|||||||
|
|
||||||
loadCovers(QModelIndex());
|
loadCovers(QModelIndex());
|
||||||
|
|
||||||
includeComicsCheckBox->setCheckState(Qt::Unchecked);
|
//includeComicsCheckBox->setCheckState(Qt::Unchecked);
|
||||||
|
foldersFilter->clear();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -587,10 +598,12 @@ void LibraryWindow::loadCovers(const QModelIndex & mi)
|
|||||||
if(foldersFilter->text()!="")
|
if(foldersFilter->text()!="")
|
||||||
{
|
{
|
||||||
//setFoldersFilter("");
|
//setFoldersFilter("");
|
||||||
row = static_cast<TreeItem *>(mi.internalPointer())->originalRow;
|
if(mi.isValid())
|
||||||
column = static_cast<TreeItem *>(mi.internalPointer())->originalColumn;
|
{
|
||||||
|
index = static_cast<TreeItem *>(mi.internalPointer())->originalIndex;
|
||||||
foldersFilter->clear();
|
foldersFilter->clear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
unsigned long long int folderId = 0;
|
unsigned long long int folderId = 0;
|
||||||
if(mi.isValid())
|
if(mi.isValid())
|
||||||
{
|
{
|
||||||
@ -997,13 +1010,13 @@ void LibraryWindow::setFoldersFilter(QString filter)
|
|||||||
{
|
{
|
||||||
dm->resetFilter();
|
dm->resetFilter();
|
||||||
foldersView->collapseAll();
|
foldersView->collapseAll();
|
||||||
foldersView->scrollTo(dm->index(row,column),QAbstractItemView::PositionAtTop);
|
foldersView->scrollTo(index,QAbstractItemView::PositionAtTop);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!filter.isEmpty())
|
if(!filter.isEmpty())
|
||||||
{
|
{
|
||||||
dm->setFilter(filter, false);
|
dm->setFilter(filter, includeComicsCheckBox->isChecked());
|
||||||
foldersView->expandAll();
|
foldersView->expandAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1083,11 +1096,19 @@ void LibraryWindow::searchInFiles(int state)
|
|||||||
|
|
||||||
if(state == Qt::Checked)
|
if(state == Qt::Checked)
|
||||||
{
|
{
|
||||||
//dm->setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); //crash, after update proxy filter
|
if(!foldersFilter->text().isEmpty())
|
||||||
|
{
|
||||||
|
dm->setFilter(foldersFilter->text(), true);
|
||||||
|
foldersView->expandAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//dm->setFilter(QDir::Dirs|QDir::NoDotAndDotDot); //crash
|
if(!foldersFilter->text().isEmpty())
|
||||||
|
{
|
||||||
|
dm->setFilter(foldersFilter->text(), false);
|
||||||
|
foldersView->expandAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1095,3 +1116,24 @@ QString LibraryWindow::currentPath()
|
|||||||
{
|
{
|
||||||
return libraries.value(selectedLibrary->currentText());
|
return libraries.value(selectedLibrary->currentText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LibraryWindow::hideComicFlow(bool hide)
|
||||||
|
{
|
||||||
|
if(hide)
|
||||||
|
{
|
||||||
|
QList<int> sizes;
|
||||||
|
sizes.append(0);
|
||||||
|
int total = sVertical->sizes().at(0) + sVertical->sizes().at(1);
|
||||||
|
sizes.append(total);
|
||||||
|
sVertical->setSizes(sizes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QList<int> sizes;
|
||||||
|
int total = sVertical->sizes().at(0) + sVertical->sizes().at(1);
|
||||||
|
sizes.append(2*total/3);
|
||||||
|
sizes.append(total/3);
|
||||||
|
sVertical->setSizes(sizes);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -31,6 +31,7 @@ class LibraryWindow : public QMainWindow
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
QWidget * left;
|
QWidget * left;
|
||||||
|
QSplitter * sVertical;
|
||||||
CreateLibraryDialog * createLibraryDialog;
|
CreateLibraryDialog * createLibraryDialog;
|
||||||
UpdateLibraryDialog * updateLibraryDialog;
|
UpdateLibraryDialog * updateLibraryDialog;
|
||||||
ExportLibraryDialog * exportLibraryDialog;
|
ExportLibraryDialog * exportLibraryDialog;
|
||||||
@ -51,8 +52,7 @@ private:
|
|||||||
QSize slideSizeF;
|
QSize slideSizeF;
|
||||||
//search filter
|
//search filter
|
||||||
QLineEdit * foldersFilter;
|
QLineEdit * foldersFilter;
|
||||||
int row; //row a la que hay que hacer scroll autom<6F>tico despu<70>s de limpiar el filtro
|
QModelIndex index; //index al que hay que hacer scroll despu<70>s de pulsar sobre un folder filtrado
|
||||||
int column; //column a la que hay que hacer scroll autom<6F>tico despu<70>s de limpiar el filtro
|
|
||||||
QString previousFilter;
|
QString previousFilter;
|
||||||
QPushButton * clearFoldersFilter;
|
QPushButton * clearFoldersFilter;
|
||||||
QCheckBox * includeComicsCheckBox;
|
QCheckBox * includeComicsCheckBox;
|
||||||
@ -86,6 +86,7 @@ private:
|
|||||||
QAction * toggleFullScreenAction;
|
QAction * toggleFullScreenAction;
|
||||||
QAction * optionsAction;
|
QAction * optionsAction;
|
||||||
|
|
||||||
|
//tree actions
|
||||||
QAction * setRootIndexAction;
|
QAction * setRootIndexAction;
|
||||||
QAction * expandAllNodesAction;
|
QAction * expandAllNodesAction;
|
||||||
QAction * colapseAllNodesAction;
|
QAction * colapseAllNodesAction;
|
||||||
@ -98,10 +99,12 @@ private:
|
|||||||
QAction * setAllAsNonReadAction;
|
QAction * setAllAsNonReadAction;
|
||||||
QAction * showHideMarksAction;
|
QAction * showHideMarksAction;
|
||||||
|
|
||||||
|
//edit info actions
|
||||||
QAction * selectAllComicsAction;
|
QAction * selectAllComicsAction;
|
||||||
QAction * editSelectedComicsAction;
|
QAction * editSelectedComicsAction;
|
||||||
QAction * asignOrderActions;
|
QAction * asignOrderActions;
|
||||||
QAction * forceConverExtractedAction;
|
QAction * forceConverExtractedAction;
|
||||||
|
QAction * hideComicViewAction;
|
||||||
|
|
||||||
|
|
||||||
QToolBar * libraryToolBar;
|
QToolBar * libraryToolBar;
|
||||||
@ -174,6 +177,7 @@ public:
|
|||||||
void setComicsReaded();
|
void setComicsReaded();
|
||||||
void setComicsUnreaded();
|
void setComicsUnreaded();
|
||||||
void searchInFiles(int);
|
void searchInFiles(int);
|
||||||
|
void hideComicFlow(bool hide);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -569,6 +569,8 @@ void PictureFlowSoftwareRenderer::init()
|
|||||||
int wh = size.height();
|
int wh = size.height();
|
||||||
int w = (ww+1)/2;
|
int w = (ww+1)/2;
|
||||||
int h = (wh+1)/2;
|
int h = (wh+1)/2;
|
||||||
|
if(h<10)//TODO a partir de qu<71> h es seguro??
|
||||||
|
return;
|
||||||
|
|
||||||
#ifdef PICTUREFLOW_QT4
|
#ifdef PICTUREFLOW_QT4
|
||||||
buffer = QImage(ww, wh, QImage::Format_RGB32);
|
buffer = QImage(ww, wh, QImage::Format_RGB32);
|
||||||
|
BIN
images/hideComicFlow.png
Normal file
BIN
images/hideComicFlow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
Reference in New Issue
Block a user