From ed850ef374b48cb079d46d5a3ff134d7e59680e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Tue, 29 May 2012 23:45:31 +0200 Subject: [PATCH] Separaci?n en ficheros de las clases LibraryItem, Folder y Comic A?adida la toolbar para la gesti?n de c?mics + im?genes para los iconos Modificado el di?logo de informaci?n/propiedades de los c?mics --- YACReaderLibrary/YACReaderLibrary.pro | 10 +- YACReaderLibrary/db/comic.cpp | 101 ++++++++++++ YACReaderLibrary/db/comic.h | 24 +++ YACReaderLibrary/db/folder.cpp | 71 +++++++++ YACReaderLibrary/db/folder.h | 26 +++ YACReaderLibrary/db/library_item.cpp | 0 YACReaderLibrary/db/library_item.h | 17 ++ YACReaderLibrary/db/tableitem.cpp | 42 +++++ YACReaderLibrary/db/tableitem.h | 24 +++ YACReaderLibrary/db/tablemodel.cpp | 211 +++++++++++++++++++++++++ YACReaderLibrary/db/tablemodel.h | 52 ++++++ YACReaderLibrary/db/treeitem.h | 2 + YACReaderLibrary/db/treemodel.cpp | 9 ++ YACReaderLibrary/images.qrc | 3 + YACReaderLibrary/library_creator.cpp | 153 +----------------- YACReaderLibrary/library_creator.h | 53 +------ YACReaderLibrary/library_window.cpp | 109 +++++++++---- YACReaderLibrary/library_window.h | 6 + YACReaderLibrary/properties_dialog.cpp | 52 ++++-- YACReaderLibrary/properties_dialog.h | 6 + images/editComic.png | Bin 0 -> 27320 bytes images/importCover.png | Bin 0 -> 25015 bytes images/selectAll.png | Bin 0 -> 19946 bytes 23 files changed, 725 insertions(+), 246 deletions(-) create mode 100644 YACReaderLibrary/db/comic.cpp create mode 100644 YACReaderLibrary/db/comic.h create mode 100644 YACReaderLibrary/db/folder.cpp create mode 100644 YACReaderLibrary/db/folder.h create mode 100644 YACReaderLibrary/db/library_item.cpp create mode 100644 YACReaderLibrary/db/library_item.h create mode 100644 YACReaderLibrary/db/tableitem.cpp create mode 100644 YACReaderLibrary/db/tableitem.h create mode 100644 YACReaderLibrary/db/tablemodel.cpp create mode 100644 YACReaderLibrary/db/tablemodel.h create mode 100644 images/editComic.png create mode 100644 images/importCover.png create mode 100644 images/selectAll.png diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index a7b6f8e4..91bd18c8 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -33,7 +33,10 @@ HEADERS += comic_flow.h \ ./db/treeitem.h \ ./db/treemodel.h \ ./db/tablemodel.h \ - ./db/tableitem.h + ./db/tableitem.h \ + ./db/comic.h \ + ./db/folder.h \ + ./db/library_item.h SOURCES += comic_flow.cpp \ create_library_dialog.cpp \ library_creator.cpp \ @@ -54,7 +57,10 @@ SOURCES += comic_flow.cpp \ ./db/treeitem.cpp \ ./db/treemodel.cpp \ ./db/tablemodel.cpp \ - ./db/tableitem.cpp + ./db/tableitem.cpp \ + ./db/comic.cpp \ + ./db/folder.cpp \ + ./db/library_item.cpp include(./server/server.pri) diff --git a/YACReaderLibrary/db/comic.cpp b/YACReaderLibrary/db/comic.cpp new file mode 100644 index 00000000..1841f1ee --- /dev/null +++ b/YACReaderLibrary/db/comic.cpp @@ -0,0 +1,101 @@ +#include "comic.h" + +#include +#include +#include + +Comic::Comic() +{ + +} + +Comic::Comic(qulonglong cparentId, qulonglong ccomicInfoId, QString cname, QString cpath, QString chash) + :comicInfoId(ccomicInfoId),hash(chash) +{ + parentId = cparentId; + name = cname; + path = cpath; +} + +qulonglong Comic::insert(QSqlDatabase & db) +{ + //TODO comprobar si ya hay comic info con ese hash + QSqlQuery comicInfoInsert(db); + comicInfoInsert.prepare("INSERT INTO comic_info (hash) " + "VALUES (:hash)"); + comicInfoInsert.bindValue(":hash", hash); + 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 Comic::getComicsFromParent(qulonglong parentId, QSqlDatabase & db) +{ + QList list; + + QSqlQuery selectQuery(db); //TODO check + selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.parentId = :parentId"); + selectQuery.bindValue(":parentId", parentId); + selectQuery.exec(); + + Comic * currentItem; + while (selectQuery.next()) + { + QList data; + QSqlRecord record = selectQuery.record(); + for(int i=0;iid = record.value(0).toLongLong(); + currentItem->parentId = record.value(1).toLongLong(); + currentItem->name = record.value(2).toString(); + currentItem->hash = record.value(3).toString(); + int lessThan = 0; + if(list.isEmpty()) + list.append(currentItem); + else + { + Comic * last = static_cast(list.back()); + QString nameLast = last->name; + QString nameCurrent = currentItem->name; + QList::iterator i; + i = list.end(); + i--; + while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) //se usa la misma ordenación que en QDir + { + i--; + nameLast = (*i)->name; + } + if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después + list.insert(++i,currentItem); + else + list.insert(i,currentItem); + + } + } + + return list; +} + +void Comic::removeFromDB(QSqlDatabase & db) +{ + QSqlQuery query(db); + query.prepare("DELETE FROM comic WHERE id = :id"); + query.bindValue(":id", id); + query.exec(); +} + +bool Comic::isDir() +{ + return false; +} \ No newline at end of file diff --git a/YACReaderLibrary/db/comic.h b/YACReaderLibrary/db/comic.h new file mode 100644 index 00000000..338f05e3 --- /dev/null +++ b/YACReaderLibrary/db/comic.h @@ -0,0 +1,24 @@ +#ifndef __COMIC_H +#define __COMIC_H + +#include "library_item.h" +#include +#include + +class Comic : public LibraryItem +{ +public: + qulonglong comicInfoId; + QString hash; + + Comic(); + 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); + static QList getComicsFromParent(qulonglong parentId, QSqlDatabase & db); + bool isDir(); + void removeFromDB(QSqlDatabase & db); +}; + + +#endif \ No newline at end of file diff --git a/YACReaderLibrary/db/folder.cpp b/YACReaderLibrary/db/folder.cpp new file mode 100644 index 00000000..f411e6c5 --- /dev/null +++ b/YACReaderLibrary/db/folder.cpp @@ -0,0 +1,71 @@ + +#include "folder.h" +#include +#include +#include + +qulonglong Folder::insert(QSqlDatabase & db) +{ + QSqlQuery query(db); + query.prepare("INSERT INTO folder (parentId, name, path) " + "VALUES (:parentId, :name, :path)"); + query.bindValue(":parentId", parentId); + query.bindValue(":name", name); + query.bindValue(":path", path); + query.exec(); + return query.lastInsertId().toLongLong(); +} + +QList Folder::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db) +{ + QList list; + + QSqlQuery selectQuery(db); //TODO check + selectQuery.prepare("SELECT * FROM folder WHERE parentId = :parentId"); + selectQuery.bindValue(":parentId", parentId); + selectQuery.exec(); + + Folder * currentItem; + while (selectQuery.next()) + { + QList data; + QSqlRecord record = selectQuery.record(); + for(int i=0;i(list.back()); + QString nameLast = last->name; //TODO usar info name si está disponible, sino el nombre del fichero..... + QString nameCurrent = currentItem->name; + QList::iterator i; + i = list.end(); + i--; + while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) + { + i--; + nameLast = (*i)->name; + } + if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después + list.insert(++i,currentItem); + else + list.insert(i,currentItem); + + } + } + + return list; +} + +void Folder::removeFromDB(QSqlDatabase & db) +{ + QSqlQuery query(db); + query.prepare("DELETE FROM folder WHERE id = :id"); + query.bindValue(":id", id); + query.exec(); +} + diff --git a/YACReaderLibrary/db/folder.h b/YACReaderLibrary/db/folder.h new file mode 100644 index 00000000..dba5c44c --- /dev/null +++ b/YACReaderLibrary/db/folder.h @@ -0,0 +1,26 @@ +#ifndef __FOLDER_H +#define __FOLDER_H + +#include "library_item.h" + +#include +#include + +class Folder : public LibraryItem +{ +public: + bool knownParent; + bool knownId; + + Folder():knownParent(false), knownId(false){}; + Folder(qulonglong sid, qulonglong pid,QString fn, QString fp):knownParent(true), knownId(true){id = sid; parentId = pid;name = fn; path = fp;}; + Folder(QString fn, QString fp):knownParent(false), knownId(false){name = fn; path = fp;}; + void setId(qulonglong sid){id = sid;knownId = true;}; + void setFather(qulonglong pid){parentId = pid;knownParent = true;}; + static QList getFoldersFromParent(qulonglong parentId, QSqlDatabase & db); + qulonglong insert(QSqlDatabase & db); + bool isDir(){return true;}; + void removeFromDB(QSqlDatabase & db); +}; + +#endif \ No newline at end of file diff --git a/YACReaderLibrary/db/library_item.cpp b/YACReaderLibrary/db/library_item.cpp new file mode 100644 index 00000000..e69de29b diff --git a/YACReaderLibrary/db/library_item.h b/YACReaderLibrary/db/library_item.h new file mode 100644 index 00000000..52c3d654 --- /dev/null +++ b/YACReaderLibrary/db/library_item.h @@ -0,0 +1,17 @@ +#ifndef __LIBRARY_ITEM_H +#define __LIBRARY_ITEM_H + +#include + +class LibraryItem +{ +public: + virtual bool isDir() = 0; + virtual void removeFromDB(QSqlDatabase & db) = 0; + QString name; + QString path; + qulonglong parentId; + qulonglong id; +}; + +#endif \ No newline at end of file diff --git a/YACReaderLibrary/db/tableitem.cpp b/YACReaderLibrary/db/tableitem.cpp new file mode 100644 index 00000000..0557980a --- /dev/null +++ b/YACReaderLibrary/db/tableitem.cpp @@ -0,0 +1,42 @@ + +#include + +#include "tableitem.h" + +//! [0] +TableItem::TableItem(const QList &data) +{ + itemData = data; +} +//! [0] + +//! [1] +TableItem::~TableItem() +{ + +} +//! [1] + + +//! [5] +int TableItem::columnCount() const +{ + return itemData.count(); +} +//! [5] + +//! [6] +QVariant TableItem::data(int column) const +{ + return itemData.value(column); +} +//! [6] + + +//! [8] +int TableItem::row() const +{ + + return 0; +} +//! [8] diff --git a/YACReaderLibrary/db/tableitem.h b/YACReaderLibrary/db/tableitem.h new file mode 100644 index 00000000..ebad058a --- /dev/null +++ b/YACReaderLibrary/db/tableitem.h @@ -0,0 +1,24 @@ +#ifndef TABLEITEM_H +#define TABLEITEM_H + +#include +#include + +//! [0] +class TableItem +{ +public: + TableItem(const QList &data); + ~TableItem(); + int columnCount() const; + QVariant data(int column) const; + int row() const; + unsigned long long int id; //TODO sustituir por una clase adecuada +private: + QList itemData; + + +}; +//! [0] + +#endif \ No newline at end of file diff --git a/YACReaderLibrary/db/tablemodel.cpp b/YACReaderLibrary/db/tablemodel.cpp new file mode 100644 index 00000000..fee9ca3b --- /dev/null +++ b/YACReaderLibrary/db/tablemodel.cpp @@ -0,0 +1,211 @@ + +#include +#include + +#include "tableitem.h" +#include "tablemodel.h" +#include "data_base_management.h" +#include "qnaturalsorting.h" + +TableModel::TableModel(QObject *parent) + : QAbstractItemModel(parent) +{ + connect(this,SIGNAL(beforeReset()),this,SIGNAL(modelAboutToBeReset())); + connect(this,SIGNAL(reset()),this,SIGNAL(modelReset())); +} + +//! [0] +TableModel::TableModel( QSqlQuery &sqlquery, QObject *parent) + : QAbstractItemModel(parent) +{ + setupModelData(sqlquery); +} +//! [0] + +//! [1] +TableModel::~TableModel() +{ + qDeleteAll(_data); +} +//! [1] + +//! [2] +int TableModel::columnCount(const QModelIndex &parent) const +{ + if(_data.isEmpty()) + return 0; + return _data.first()->columnCount(); +} +//! [2] + +//! [3] +QVariant TableModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role == Qt::DecorationRole) + { + return QVariant(); + } + + if (role != Qt::DisplayRole) + return QVariant(); + + TableItem *item = static_cast(index.internalPointer()); + + return item->data(index.column()); +} +//! [3] + +//! [4] +Qt::ItemFlags TableModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} +//! [4] + +//! [5] +QVariant TableModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + { + switch(section)//TODO obtener esto de la query + { + case 0: + return QVariant(QString("Id")); + case 1: + return QVariant(QString("ParentId")); + case 2: + return QVariant(QString("File Name")); + case 3: + return QVariant(QString("Path")); + } + } + + if(orientation == Qt::Vertical && role == Qt::DecorationRole) + return QVariant(QIcon(":/images/icon.png")); + + return QVariant(); +} +//! [5] + +//! [6] +QModelIndex TableModel::index(int row, int column, const QModelIndex &parent) + const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + return createIndex(row, column, _data.at(row)); +} +//! [6] + +//! [7] +QModelIndex TableModel::parent(const QModelIndex &index) const +{ + return QModelIndex(); +} +//! [7] + +//! [8] +int TableModel::rowCount(const QModelIndex &parent) const +{ + TreeItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + return _data.count(); + + return 0; +} +//! [8] + +QStringList TableModel::getPaths(const QString & _source) +{ + QStringList paths; + QString source = _source + "/.yacreaderlibrary/covers/"; + QList::ConstIterator itr; + for(itr = _data.constBegin();itr != _data.constEnd();itr++) + { + QString path = (*itr)->data(4).toString(); + paths << source+ path +".jpg"; + } + + return paths; +} + +void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & db) +{ + //QFile f(QCoreApplication::applicationDirPath()+"/performance.txt"); + //f.open(QIODevice::Append); + emit(beforeReset()); + //QElapsedTimer timer; + //timer.start(); + qDeleteAll(_data); + _data.clear(); + + //QTextStream txtS(&f); + //txtS << "TABLEMODEL: Tiempo de borrado: " << timer.elapsed() << "ms\r\n"; + db.open(); + //crear la consulta + //timer.restart(); + QSqlQuery selectQuery(db); //TODO check + selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.parentId = :parentId"); + selectQuery.bindValue(":parentId", folderId); + selectQuery.exec(); + //txtS << "TABLEMODEL: Tiempo de consulta: " << timer.elapsed() << "ms\r\n"; + //timer.restart(); + setupModelData(selectQuery); + //txtS << "TABLEMODEL: Tiempo de creación del modelo: " << timer.elapsed() << "ms\r\n"; + db.close(); + emit(reset()); + //f.close(); +} + +QString TableModel::getComicPath(QModelIndex & mi) +{ + if(mi.isValid()) + return _data.at(mi.row())->data(3).toString(); + return ""; +} +void TableModel::setupModelData(QSqlQuery &sqlquery) +{ + TableItem * currentItem; + while (sqlquery.next()) + { + QList data; + QSqlRecord record = sqlquery.record(); + for(int i=0;idata(2).toString(); //TODO usar info name si está disponible, sino el nombre del fichero..... + QString nameCurrent = currentItem->data(2).toString(); + QList::iterator i; + i = _data.end(); + i--; + while ((lessThan = naturalSortLessThanCI(nameCurrent,nameLast)) && i != _data.begin()) + { + i--; + nameLast = (*i)->data(2).toString(); + } + if(!lessThan) //si se ha encontrado un elemento menor que current, se inserta justo después + _data.insert(++i,currentItem); + else + _data.insert(i,currentItem); + + } + } +} \ No newline at end of file diff --git a/YACReaderLibrary/db/tablemodel.h b/YACReaderLibrary/db/tablemodel.h new file mode 100644 index 00000000..9a0b8e30 --- /dev/null +++ b/YACReaderLibrary/db/tablemodel.h @@ -0,0 +1,52 @@ +#ifndef TABLEMODEL_H +#define TABLEMODEL_H + +#include +#include +#include +#include +#include + +class TableItem; + +//! [0] +class TableModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + TableModel(QObject *parent = 0); + TableModel( QSqlQuery &sqlquery, QObject *parent = 0); + ~TableModel(); + + QVariant data(const QModelIndex &index, int role) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + void setupModelData(unsigned long long int parentFolder,QSqlDatabase & db); + + //Métodos de conveniencia + QStringList getPaths(const QString & _source); + QString getComicPath(QModelIndex & mi); + //getComicInfo(QModelIndex & mi); --> para la edición + //getComicsInfo(QList list); --> recupera la información común a los comics seleccionados + //setcomicInfo(QModelIndex & mi); --> inserta en la base datos + //setComicInfoForAllComics(); --> inserta la información común a todos los cómics de una sola vez. + //setComicInfoForSelectedComis(QList list); -->inserta la información común para los comics seleccionados +private: + void setupModelData( QSqlQuery &sqlquery); + + QList _data; + +signals: + void beforeReset(); + void reset(); +}; +//! [0] + +#endif diff --git a/YACReaderLibrary/db/treeitem.h b/YACReaderLibrary/db/treeitem.h index 63678932..14ed0489 100644 --- a/YACReaderLibrary/db/treeitem.h +++ b/YACReaderLibrary/db/treeitem.h @@ -61,9 +61,11 @@ public: TreeItem *parent(); TreeItem *parentItem; unsigned long long int id; + QList comicNames; private: QList childItems; QList itemData; + }; diff --git a/YACReaderLibrary/db/treemodel.cpp b/YACReaderLibrary/db/treemodel.cpp index 73303f92..46642dfa 100644 --- a/YACReaderLibrary/db/treemodel.cpp +++ b/YACReaderLibrary/db/treemodel.cpp @@ -221,6 +221,15 @@ void TreeModel::setupModelData(QSqlQuery &sqlquery, TreeItem *parent) data << sqlquery.value(2).toString(); data << sqlquery.value(3).toString(); TreeItem * item = new TreeItem(data); + + /*QSqlQuery selectQuery(_database); //TODO check + selectQuery.prepare("select fileName from comic where parentId = :parentId"); + selectQuery.bindValue(":parentId", sqlquery.value(0).toLongLong()); + selectQuery.exec(); + while (selectQuery.next()) { + item->comicNames.append(sqlquery.value(0).toString()); + }*/ + item->id = sqlquery.value(0).toLongLong(); items.value(sqlquery.value(1).toLongLong())->appendChild(item); //se añade el item al map, de forma que se pueda encontrar como padre en siguientes iteraciones diff --git a/YACReaderLibrary/images.qrc b/YACReaderLibrary/images.qrc index b3f25463..e384bb8f 100644 --- a/YACReaderLibrary/images.qrc +++ b/YACReaderLibrary/images.qrc @@ -29,5 +29,8 @@ ../images/setUnread.png ../images/setAllUnread.png ../images/showMarks.png + ../images/importCover.png + ../images/editComic.png + ../images/selectAll.png diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 3681fd3e..fbff32d7 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -15,151 +15,6 @@ QMutex mutex; */ - -qint64 Folder::insert(QSqlDatabase & db) -{ - QSqlQuery query(db); - query.prepare("INSERT INTO folder (parentId, name, path) " - "VALUES (:parentId, :name, :path)"); - query.bindValue(":parentId", parentId); - query.bindValue(":name", name); - query.bindValue(":path", path); - query.exec(); - return query.lastInsertId().toLongLong(); -} - -QList Folder::getFoldersFromParent(qint64 parentId, QSqlDatabase & db) -{ - QList list; - - QSqlQuery selectQuery(db); //TODO check - selectQuery.prepare("SELECT * FROM folder WHERE parentId = :parentId"); - selectQuery.bindValue(":parentId", parentId); - selectQuery.exec(); - - Folder * currentItem; - while (selectQuery.next()) - { - QList data; - QSqlRecord record = selectQuery.record(); - for(int i=0;i(list.back()); - QString nameLast = last->name; //TODO usar info name si está disponible, sino el nombre del fichero..... - QString nameCurrent = currentItem->name; - QList::iterator i; - i = list.end(); - i--; - while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) - { - i--; - nameLast = (*i)->name; - } - if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después - list.insert(++i,currentItem); - else - list.insert(i,currentItem); - - } - } - - return list; -} - -void Folder::removeFromDB(QSqlDatabase & db) -{ - QSqlQuery query(db); - query.prepare("DELETE FROM folder WHERE id = :id"); - query.bindValue(":id", id); - query.exec(); -} - - - -qint64 Comic::insert(QSqlDatabase & db) -{ - //TODO comprobar si ya hay comic info con ese hash - QSqlQuery comicInfoInsert(db); - comicInfoInsert.prepare("INSERT INTO comic_info (hash) " - "VALUES (:hash)"); - comicInfoInsert.bindValue(":hash", hash); - comicInfoInsert.exec(); - qint64 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 Comic::getComicsFromParent(qint64 parentId, QSqlDatabase & db) -{ - QList list; - - QSqlQuery selectQuery(db); //TODO check - selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.parentId = :parentId"); - selectQuery.bindValue(":parentId", parentId); - selectQuery.exec(); - - Comic * currentItem; - while (selectQuery.next()) - { - QList data; - QSqlRecord record = selectQuery.record(); - for(int i=0;iid = record.value(0).toLongLong(); - currentItem->parentId = record.value(1).toLongLong(); - currentItem->name = record.value(2).toString(); - currentItem->hash = record.value(3).toString(); - int lessThan = 0; - if(list.isEmpty()) - list.append(currentItem); - else - { - Comic * last = static_cast(list.back()); - QString nameLast = last->name; - QString nameCurrent = currentItem->name; - QList::iterator i; - i = list.end(); - i--; - while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) //se usa la misma ordenación que en QDir - { - i--; - nameLast = (*i)->name; - } - if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después - list.insert(++i,currentItem); - else - list.insert(i,currentItem); - - } - } - - return list; -} - -void Comic::removeFromDB(QSqlDatabase & db) -{ - QSqlQuery query(db); - query.prepare("DELETE FROM comic WHERE id = :id"); - query.bindValue(":id", id); - query.exec(); -} //-------------------------------------------------------------------------------- LibraryCreator::LibraryCreator() { @@ -249,7 +104,7 @@ void LibraryCreator::stop() } //retorna el id del ultimo de los folders -qint64 LibraryCreator::insertFolders() +qulonglong LibraryCreator::insertFolders() { QList::iterator i; int currentId = 0; @@ -269,7 +124,7 @@ qint64 LibraryCreator::insertFolders() return 0; } -/*qint64 LibraryCreator::insertFolder(qint64 parentId,const Folder & folder) +/*qulonglong LibraryCreator::insertFolder(qulonglong parentId,const Folder & folder) { QSqlQuery query(_database); query.prepare("INSERT INTO folder (parentId, name, path) " @@ -281,7 +136,7 @@ qint64 LibraryCreator::insertFolders() return query.lastInsertId().toLongLong(); }*/ -/*qint64 LibraryCreator::insertComic(const Comic & comic) +/*qulonglong LibraryCreator::insertComic(const Comic & comic) { //TODO comprobar si ya hay comic info con ese hash QSqlQuery comicInfoInsert(_database); @@ -289,7 +144,7 @@ qint64 LibraryCreator::insertFolders() "VALUES (:hash)"); comicInfoInsert.bindValue(":hash", comic.hash); comicInfoInsert.exec(); - qint64 comicInfoId =comicInfoInsert.lastInsertId().toLongLong(); + qulonglong comicInfoId =comicInfoInsert.lastInsertId().toLongLong(); QSqlQuery query(_database); query.prepare("INSERT INTO comic (parentId, comicInfoId, fileName, path) " diff --git a/YACReaderLibrary/library_creator.h b/YACReaderLibrary/library_creator.h index 992c1315..0bdeb425 100644 --- a/YACReaderLibrary/library_creator.h +++ b/YACReaderLibrary/library_creator.h @@ -14,51 +14,8 @@ #include #include - -class LibraryItem -{ -public: - virtual bool isDir() = 0; - virtual void removeFromDB(QSqlDatabase & db) = 0; - QString name; - QString path; - qint64 parentId; - qint64 id; -}; - -class Folder : public LibraryItem -{ -public: - bool knownParent; - bool knownId; - - Folder():knownParent(false), knownId(false){}; - Folder(qint64 sid, qint64 pid,QString fn, QString fp):knownParent(true), knownId(true){id = sid; parentId = pid;name = fn; path = fp;}; - Folder(QString fn, QString fp):knownParent(false), knownId(false){name = fn; path = fp;}; - void setId(qint64 sid){id = sid;knownId = true;}; - void setFather(qint64 pid){parentId = pid;knownParent = true;}; - static QList getFoldersFromParent(qint64 parentId, QSqlDatabase & db); - qint64 insert(QSqlDatabase & db); - bool isDir(){return true;}; - void removeFromDB(QSqlDatabase & db); -}; - -class Comic : public LibraryItem -{ -public: - qint64 comicInfoId; - QString hash; - - Comic(){}; - Comic(qint64 cparentId, qint64 ccomicInfoId, QString cname, QString cpath, QString chash) - :comicInfoId(ccomicInfoId),hash(chash){parentId = cparentId;name = cname; path = cpath;}; - //Comic(QString fn, QString fp):name(fn),path(fp),knownParent(false), knownId(false){}; - qint64 insert(QSqlDatabase & db); - static QList getComicsFromParent(qint64 parentId, QSqlDatabase & db); - bool isDir(){return false;}; - void removeFromDB(QSqlDatabase & db); -}; - +#include "folder.h" +#include "comic.h" class LibraryCreator : public QThread @@ -83,10 +40,10 @@ public: void update(QDir currentDirectory); void run(); bool createTables(); - qint64 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) void insertComic(const QString & relativePath,const QFileInfo & fileInfo); - //qint64 insertFolder(qint64 parentId,const Folder & folder); - //qint64 insertComic(const Comic & comic); + //qulonglong insertFolder(qulonglong parentId,const Folder & folder); + //qulonglong insertComic(const Comic & comic); bool stopRunning; signals: void finished(); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index faa7444d..703c8a93 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -44,13 +44,11 @@ void LibraryWindow::setupUI() void LibraryWindow::doLayout() { - QSplitter * sVertical = new QSplitter(Qt::Vertical); - QSplitter * sHorizontal = new QSplitter(Qt::Horizontal); + QSplitter * sVertical = new QSplitter(Qt::Vertical); //spliter derecha + QSplitter * sHorizontal = new QSplitter(Qt::Horizontal); //spliter principal //TODO: flowType is a global variable - optionsDialog = new OptionsDialog(this); - optionsDialog->restoreOptions(); + //CONFIG COMIC_FLOW-------------------------------------------------------- comicFlow = new ComicFlow(0,flowType); - comicFlow->setFocusPolicy(Qt::StrongFocus); comicFlow->setShowMarks(true); QMatrix m; @@ -67,17 +65,46 @@ void LibraryWindow::doLayout() slideSizeF = QSize(width,height); comicFlow->setSlideSize(slideSizeW); setFocusProxy(comicFlow); + //------------------------------------------------------------------------- + //CONFIG TREE/TABLE VIEWS-------------------------------------------------- comicView = new QTableView; foldersView = new QTreeView; + //------------------------------------------------------------------------- - - sVertical->addWidget(comicFlow); - sVertical->addWidget(comicView); + //CONFIG FLOW/COMICS------------------------------------------------------- /*sVertical->setStretchFactor(0,1); sVertical->setStretchFactor(1,0); */ + //views + foldersView->setAnimated(true); + foldersView->setContextMenuPolicy(Qt::ActionsContextMenu); + foldersView->setContextMenuPolicy(Qt::ActionsContextMenu); + foldersView->header()->hide(); + foldersView->setUniformRowHeights(true); + comicView->setAlternatingRowColors(true); + //comicView->setStyleSheet("alternate-background-color: #e7e7d7;background-color: white;"); + //comicView->setItemDelegate(new YACReaderComicViewDelegate()); + comicView->setContextMenuPolicy(Qt::ActionsContextMenu); + comicView->setShowGrid(false); + comicView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); + comicView->horizontalHeader()->setStretchLastSection(true); + comicView->horizontalHeader()->setClickable(false); + //comicView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); + comicView->verticalHeader()->setDefaultSectionSize(24); + comicView->verticalHeader()->setClickable(false); //TODO comportamiento anómalo + comicView->setCornerButtonEnabled(false); + comicView->setStyleSheet("QTableView {selection-background-color: #d7d7c7; selection-color: #000000;}"); +// comicView->verticalHeader()->setStyleSheet("QHeaderView::section" +//"{" +// "background-color: white /* steelblue */" +//"}"); + comicView->setSelectionBehavior(QAbstractItemView::SelectRows); + comicView->setSelectionMode(QAbstractItemView::ExtendedSelection); + //------------------------------------------------------------------------- + + //CONFIG NAVEGACIÓN/BÚSQUEDA----------------------------------------------- left = new QWidget; QVBoxLayout * l = new QVBoxLayout; selectedLibrary = new QComboBox; @@ -104,37 +131,23 @@ void LibraryWindow::doLayout() l->addLayout(searchLayout); l->setSpacing(1); left->setLayout(l); + //------------------------------------------------------------------------- + //FINAL LAYOUT------------------------------------------------------------- + sVertical->addWidget(comicFlow); + QWidget *comics = new QWidget; + QVBoxLayout * comicsLayout = new QVBoxLayout; + comicsLayout->setContentsMargins(2,2,0,0); + comicsLayout->addWidget(editInfoToolBar = new QToolBar(comics)); + comicsLayout->addWidget(comicView); + comics->setLayout(comicsLayout); + sVertical->addWidget(comics); sHorizontal->addWidget(left); sHorizontal->addWidget(sVertical); sHorizontal->setStretchFactor(0,0); sHorizontal->setStretchFactor(1,1); setCentralWidget(sHorizontal); - - //views - foldersView->setAnimated(true); - foldersView->setContextMenuPolicy(Qt::ActionsContextMenu); - foldersView->setContextMenuPolicy(Qt::ActionsContextMenu); - foldersView->header()->hide(); - foldersView->setUniformRowHeights(true); - - comicView->setAlternatingRowColors(true); - //comicView->setStyleSheet("alternate-background-color: #e7e7d7;background-color: white;"); - //comicView->setItemDelegate(new YACReaderComicViewDelegate()); - comicView->setContextMenuPolicy(Qt::ActionsContextMenu); - comicView->setShowGrid(false); - comicView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); - comicView->horizontalHeader()->setStretchLastSection(true); - //comicView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); - comicView->verticalHeader()->setDefaultSectionSize(24); -// comicView->verticalHeader()->setStyleSheet("QHeaderView::section" -//"{" -// "background-color: white /* steelblue */" -//"}"); - comicView->setSelectionBehavior(QAbstractItemView::SelectRows); - comicView->setSelectionMode(QAbstractItemView::ExtendedSelection); - - + //FINAL LAYOUT------------------------------------------------------------- fullScreenToolTip = new QLabel(this); fullScreenToolTip->setText(tr(" press 'F' to close fullscreen mode ")); @@ -156,6 +169,8 @@ void LibraryWindow::doDialogs() exportLibraryDialog = new ExportLibraryDialog(this); importLibraryDialog = new ImportLibraryDialog(this); addLibraryDialog = new AddLibraryDialog(this); + optionsDialog = new OptionsDialog(this); + optionsDialog->restoreOptions(); had = new HelpAboutDialog(this); //TODO load data. QString sufix = QLocale::system().name(); if(QFile(":/files/about_"+sufix+".html").exists()) @@ -303,6 +318,24 @@ void LibraryWindow::createActions() openContainingFolderComicAction = new QAction(this); openContainingFolderComicAction->setText(tr("Open containing folder...")); openContainingFolderComicAction->setIcon(QIcon(":/images/open.png")); + + //Edit comics actions------------------------------------------------------ + selectAllComicsAction = new QAction(this); + selectAllComicsAction->setText(tr("Select all comics")); + selectAllComicsAction->setIcon(QIcon(":/images/selectAll.png")); + + editSelectedComicsAction = new QAction(this); + editSelectedComicsAction->setText(tr("Edit")); + editSelectedComicsAction->setIcon(QIcon(":/images/editComic.png")); + + asignOrderActions = new QAction(this); + asignOrderActions->setText(tr("Asign current order to comics")); + asignOrderActions->setIcon(QIcon(":/images/fit.png")); + + forceConverExtractedAction = new QAction(this); + forceConverExtractedAction->setText(tr("Update cover")); + forceConverExtractedAction->setIcon(QIcon(":/images/importCover.png")); + //------------------------------------------------------------------------- } //TODO unificar con disableActions @@ -407,6 +440,13 @@ void LibraryWindow::createToolBars() comicFlow->addAction(toggleFullScreenAction); comicFlow->addAction(openComicAction); + + editInfoToolBar->addAction(openComicAction); + editInfoToolBar->addSeparator(); + editInfoToolBar->addAction(editSelectedComicsAction); + editInfoToolBar->addAction(selectAllComicsAction); + editInfoToolBar->addSeparator(); + editInfoToolBar->addAction(forceConverExtractedAction); } void LibraryWindow::createMenus() @@ -495,6 +535,9 @@ void LibraryWindow::createConnections() //connect(dm,SIGNAL(directoryLoaded(QString)),foldersView,SLOT(expandAll())); //connect(dm,SIGNAL(directoryLoaded(QString)),this,SLOT(updateFoldersView(QString))); + //Comicts edition + connect(selectAllComicsAction,SIGNAL(triggered()),comicView,SLOT(selectAll())); + } void LibraryWindow::loadLibrary(const QString & name) diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 455e5cdd..b99dd9cc 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -96,10 +96,16 @@ private: QAction * setAllAsNonReadAction; QAction * showHideMarksAction; + QAction * selectAllComicsAction; + QAction * editSelectedComicsAction; + QAction * asignOrderActions; + QAction * forceConverExtractedAction; + QToolBar * libraryToolBar; QToolBar * treeActions; QToolBar * comicsToolBar; + QToolBar * editInfoToolBar; OptionsDialog * optionsDialog; diff --git a/YACReaderLibrary/properties_dialog.cpp b/YACReaderLibrary/properties_dialog.cpp index 8853f496..3ad230e6 100644 --- a/YACReaderLibrary/properties_dialog.cpp +++ b/YACReaderLibrary/properties_dialog.cpp @@ -2,16 +2,16 @@ #include #include #include - +#include PropertiesDialog::PropertiesDialog(QWidget * parent) :QDialog(parent) { - QVBoxLayout * l = new QVBoxLayout(); - - sa = new QScrollArea(this); - _cover = new QLabel(sa); + QHBoxLayout * l = new QHBoxLayout(); + + sa = new QScrollArea(); + _cover = new QLabel(); _cover->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); _cover->setScaledContents(true); _cover->setAlignment(Qt::AlignTop|Qt::AlignHCenter); @@ -24,18 +24,42 @@ PropertiesDialog::PropertiesDialog(QWidget * parent) sa->setFrameStyle(QFrame::NoFrame); sa->setAlignment(Qt::AlignCenter); - l->addWidget(sa); + QVBoxLayout * coverLayout = new QVBoxLayout(); + coverLayout->addWidget(sa); + //coverLayout->addStretch(); + + l->addLayout(coverLayout); QVBoxLayout * info = new QVBoxLayout(); info->addWidget(_name = new QLabel("name")); info->addWidget(_pages = new QLabel("pages")); info->addWidget(_size = new QLabel("size")); - info->setSizeConstraint(QLayout::SetMaximumSize); + info->addStretch(); + //coverLayout->setSizeConstraint(QLayout::SetMaximumSize); l->addLayout(info); + l->addStretch(); + //l->setSizeConstraint(QLayout::SetNoConstraint); this->setLayout(l); this->setWindowTitle(tr("Comic properties")); + + int heightDesktopResolution = QApplication::desktop()->screenGeometry().height(); + int widthDesktopResolution = QApplication::desktop()->screenGeometry().width(); + int sHeight,sWidth; + sHeight = static_cast(heightDesktopResolution*0.5); + sWidth = static_cast(sHeight*1.4); + this->resize(sWidth,sHeight); } +void PropertiesDialog::setComics(QList comics) +{ + +} + +void PropertiesDialog::updateComics(QList comics) +{ + +} +//Deprecated void PropertiesDialog::setCover(const QPixmap & cover) { _cover->setPixmap(cover); @@ -43,20 +67,20 @@ void PropertiesDialog::setCover(const QPixmap & cover) int heightDesktopResolution = QApplication::desktop()->screenGeometry().height(); int widthDesktopResolution = QApplication::desktop()->screenGeometry().width(); int sHeight,sWidth; - sHeight = static_cast(heightDesktopResolution*0.84); + sHeight = static_cast(heightDesktopResolution*0.5); if(aspectRatio<1) { - sWidth = static_cast(sHeight*0.70); - this->resize(sWidth,sHeight); + sWidth = static_cast(sHeight*1.4); + //this->resize(sWidth,sHeight); this->move(QPoint((widthDesktopResolution-sWidth)/2,((heightDesktopResolution-sHeight)-40)/2)); - _cover->resize(static_cast((height()-90)*aspectRatio), - (height()-90)); + _cover->resize(static_cast((sa->height())*aspectRatio), + (sa->height())); } else { - sWidth = static_cast(sHeight*1.10); - this->resize(sWidth,sHeight); + sWidth = static_cast(sHeight/1.16); + //this->resize(sWidth,sHeight); this->move(QPoint((widthDesktopResolution-sWidth)/2,((heightDesktopResolution-sHeight)-40)/2)); _cover->resize((width()-25), static_cast((width()-25)/aspectRatio)); diff --git a/YACReaderLibrary/properties_dialog.h b/YACReaderLibrary/properties_dialog.h index 2454680a..4eea80f3 100644 --- a/YACReaderLibrary/properties_dialog.h +++ b/YACReaderLibrary/properties_dialog.h @@ -7,6 +7,8 @@ #include #include +#include "comic.h" + class PropertiesDialog : public QDialog { Q_OBJECT @@ -20,6 +22,10 @@ public: PropertiesDialog(QWidget * parent = 0); public slots: + void setComics(QList comics); + void updateComics(QList comics); + + //Deprecated void setCover(const QPixmap & cover); void setFilename(const QString & name); void setNumpages(int pages); diff --git a/images/editComic.png b/images/editComic.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9803dd66b522839023eaec9775f305b4f71d8b GIT binary patch literal 27320 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 T3XGUI00000NkvXXu0mjfJ}Tf} literal 0 HcmV?d00001 diff --git a/images/importCover.png b/images/importCover.png new file mode 100644 index 0000000000000000000000000000000000000000..ae814ec82d76d4e1dbe9fda4bdaa88ade185ba50 GIT binary patch literal 25015 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 literal 0 HcmV?d00001 diff --git a/images/selectAll.png b/images/selectAll.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4ab94faecf5eec6a87796f456a1e923ffdd29b GIT binary patch literal 19946 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

JMM+H+{B1spZ5XVbI-{lcyMVRI_egRE? z!I$=3sSepJ$aTk$wUhdw&GlUYV5^E^zTxn}rwv`-v)Rsx*5~usGjV|HkG_XreEYkw zlS$mhn!LJhkVx9x`saVl%V##d_|eat6u_ywm8lD}|GH8rJVI;iEla5AXz>%Cf1OAR zh>jO_S(FhVkkzt?97G*17c;P%$6NO^&`5*{HY%XlEu-R3bonNOZi6*UacfC=zLKNrAUc9Kw zr4<0OWD2G^G&RUpO~C&R0KkZ88aoc`*?nu$ws%~*D_wYYs!J`B)<~?JgKg(p`b#P$F_hzV1&pV zWXDE^K0Mste^gPF%Mzs5T{o;$YimoZt23*G^=HE{^l3_#4``~Yn7XcKY}4#9O*3ie zx^3vXsi~@>D2mePsxS;fKL|qKaowuxx}{p(nRV**dC&8Uv=5O)XNx`&A)V~$%bG!$ zPLY6tRtImLX5243b`GtK6aWzSgVr#vCS4D$3~$GL;b&|q3P=+HpqEGs^bw^v^`vbd z93LJ2a8D+)=harj0Bh^(g_*helfLi!b=NC}VYp5tL9+d<$1V$`W1?fl1B-J?th~Gx zBp4>n#na(+nx46Alc70cN2lrKi!#E7*QIOac6zb8d6?$$JIdkOS5RIXObXI`0lxL$YHd_O1?p}k78 zBR!hZAHYOoCQ`%Js-~ zi*~mQ=i<^G#P;R7>GFSLV4|GY7Gu&jk`mRLGqbR~{IKWyif!9NhOS+DVW=)tu2hSs z&Yt_B@B0;686xbYkRHJ_p^k;*`%)P>4i^$8OPa91qKqS5Bh7K&wi}uUe#5f4LF~1#HI+9?%Ma1+pkp}1^8pvQa&e=qcqN=HC zt~ZyxZm=)^j&v$D(yj7#G{3ZbZf17wCw>r!4;hIEta35p#RJIUmH>p@nX>mAPpb+o zA&;<$cZyuUEUEE4eH`2I#`2wP@0 z_5}!pb0|i*BpUl-q>Evh=14A+zOFZyyE$@~f z%PERt1!3U2u2-zP_2n>Z$)3r~5>h2+tprnCsl2Q@6aTQq(h#ylAzVw6%4m% zY6+88M^fzDG~-*5F%z~;Zm{q{1c+3rY}`2#ZSABEeW{ELr1&v8w;ymZ!{Z>7?8iI6>faUZ#DvN?%s4Ps@5Ig#s-&&L@XuP@I0ZBe_< zjGF~nYU1cDx%84>^`uVca zRshiMx=S%oJ|>%qcA5j)tIT+PojPbUZRy1DPFg{Z>*FR&w#iCt+m7NMzMxK{gf0th z7XaPrx)cyP9cx#n(^#@j^|kXG;^o_&7yGg)k>3}{^r|~zKTCQw0kD~Sb#pp9N&KZ8 zvQGcwHa}i(JGzwp{(nc869DmhZuZ`rPHMbPuhZ-FI=xP>)9bWp`d`HOi8=86%<%vK N002ovPDHLkV1lv*|E&N3 literal 0 HcmV?d00001