diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index c42f5fac..f389c213 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -126,7 +126,8 @@ HEADERS += comic_flow.h \ yacreader_folders_view.h \ yacreader_reading_lists_view.h \ add_label_dialog.h \ - yacreader_history_controller.h + yacreader_history_controller.h \ + yacreader_navigation_controller.h SOURCES += comic_flow.cpp \ @@ -181,7 +182,8 @@ SOURCES += comic_flow.cpp \ yacreader_folders_view.cpp \ yacreader_reading_lists_view.cpp \ add_label_dialog.cpp \ - yacreader_history_controller.cpp + yacreader_history_controller.cpp \ + yacreader_navigation_controller.cpp include(./server/server.pri) diff --git a/YACReaderLibrary/comic_files_manager.cpp b/YACReaderLibrary/comic_files_manager.cpp index c40383c4..50f2b81d 100644 --- a/YACReaderLibrary/comic_files_manager.cpp +++ b/YACReaderLibrary/comic_files_manager.cpp @@ -12,17 +12,19 @@ ComicFilesManager::ComicFilesManager(QObject *parent) : { } -void ComicFilesManager::copyComicsTo(const QList > &sourceComics, const QString &folderDest) +void ComicFilesManager::copyComicsTo(const QList > &sourceComics, const QString &folderDest, const QModelIndex & dest) { comics = sourceComics; folder = folderDest; + folderDestinationModelIndex = dest; move = false; } -void ComicFilesManager::moveComicsTo(const QList > &sourceComics, const QString &folderDest) +void ComicFilesManager::moveComicsTo(const QList > &sourceComics, const QString &folderDest, const QModelIndex &dest) { comics = sourceComics; folder = folderDest; + folderDestinationModelIndex = dest; move = true; } @@ -34,17 +36,24 @@ QList > ComicFilesManager::getDroppedFiles(const QList(currentPath,"/"); else { + QLOG_DEBUG() << "XXXXXXXXXXXX :" << currentPath; QFileInfo info(currentPath); if(info.isDir()) { + QLOG_DEBUG() << "origin path prior to absoluteFilePath : " << info.absolutePath(); foreach(QString comicPath, Comic::findValidComicFilesInFolder(info.absoluteFilePath())) { QFileInfo comicInfo(comicPath); QString path = comicInfo.absolutePath(); + QLOG_DEBUG() << "comic path : " << comicPath; + QLOG_DEBUG() << "full comic path : " << path; + QLOG_DEBUG() << "origin path : " << info.absolutePath(); dropedFiles << QPair(comicPath, path.remove(info.absolutePath())); } } @@ -64,7 +73,7 @@ void ComicFilesManager::process() if(canceled) { if(successProcesingFiles) - emit success(); + emit success(folderDestinationModelIndex); emit finished(); return; //TODO rollback? @@ -88,7 +97,7 @@ void ComicFilesManager::process() } if(successProcesingFiles) - emit success(); + emit success(folderDestinationModelIndex); emit finished(); } diff --git a/YACReaderLibrary/comic_files_manager.h b/YACReaderLibrary/comic_files_manager.h index 9a962dfd..a6b54060 100644 --- a/YACReaderLibrary/comic_files_manager.h +++ b/YACReaderLibrary/comic_files_manager.h @@ -4,6 +4,7 @@ #include #include #include +#include //this class is intended to work in background, just use moveToThread and process to start working @@ -12,14 +13,14 @@ class ComicFilesManager : public QObject Q_OBJECT public: explicit ComicFilesManager(QObject *parent = 0); - void copyComicsTo(const QList > & sourceComics, const QString & folderDest); - void moveComicsTo(const QList > & comics, const QString & folderDest); + void copyComicsTo(const QList > & sourceComics, const QString & folderDest, const QModelIndex &dest); + void moveComicsTo(const QList > & comics, const QString & folderDest, const QModelIndex &dest); static QList > getDroppedFiles(const QList & urls); signals: void currentComic(QString); void progress(int); void finished(); - void success(); //at least one comics has been copied or moved + void success(QModelIndex); //at least one comics has been copied or moved public slots: void process(); void cancel(); @@ -29,6 +30,7 @@ protected: bool canceled; QList > comics; QString folder; + QModelIndex folderDestinationModelIndex; }; diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index cdee3fb8..892cbf5a 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -99,7 +99,7 @@ void drawMacOSXFinishedFolderIcon() #define ROOT 1 FolderModel::FolderModel(QObject *parent) - : QAbstractItemModel(parent),rootItem(0),rootBeforeFilter(0),filterEnabled(false),includeComics(false) + : QAbstractItemModel(parent),rootItem(0) { connect(this,SIGNAL(beforeReset()),this,SIGNAL(modelAboutToBeReset())); connect(this,SIGNAL(reset()),this,SIGNAL(modelReset())); @@ -107,7 +107,7 @@ FolderModel::FolderModel(QObject *parent) //! [0] FolderModel::FolderModel( QSqlQuery &sqlquery, QObject *parent) - : QAbstractItemModel(parent),rootItem(0),rootBeforeFilter(0),filterEnabled(false),includeComics(false) + : QAbstractItemModel(parent),rootItem(0) { //lo m�s probable es que el nodo ra�z no necesite tener informaci�n QList rootData; @@ -234,6 +234,7 @@ QModelIndex FolderModel::parent(const QModelIndex &index) const } //! [7] +/* QModelIndex FolderModel::indexFromItem(FolderItem * item,int column) { //if(item->parent() != 0) @@ -241,7 +242,7 @@ QModelIndex FolderModel::indexFromItem(FolderItem * item,int column) //else // return index(item->row(),0,QModelIndex()); return createIndex(item->row(), column, item); -} +}*/ //! [8] @@ -265,9 +266,9 @@ void FolderModel::setupModelData(QString path) beginResetModel(); if(rootItem != 0) delete rootItem; //TODO comprobar que se libera bien la memoria - filterEnabled = false; + rootItem = 0; - rootBeforeFilter = 0; + //inicializar el nodo ra�z QList rootData; rootData << "root"; //id 0, padre 0, title "root" (el id, y el id del padre van a ir en la clase TreeItem) @@ -323,6 +324,7 @@ void FolderModel::setupModelData(QSqlQuery &sqlquery, FolderItem *parent) void FolderModel::updateFolderModelData(QSqlQuery &sqlquery, FolderItem *parent) { while (sqlquery.next()) { + QLOG_DEBUG () << "habia next"; QList data; QSqlRecord record = sqlquery.record(); @@ -342,160 +344,6 @@ void FolderModel::updateFolderModelData(QSqlQuery &sqlquery, FolderItem *parent) } } -void FolderModel::setupFilteredModelData() -{ - beginResetModel(); - - //TODO hay que liberar memoria de anteriores filtrados - - //inicializar el nodo ra�z - - if(rootBeforeFilter == 0) - rootBeforeFilter = rootItem; - else - delete rootItem;//los resultados de la b�squeda anterior deben ser borrados - - QList rootData; - rootData << "root"; //id 1, padre 1, title "root" (el id, y el id del padre van a ir en la clase TreeItem) - rootItem = new FolderItem(rootData); - rootItem->id = ROOT; - rootItem->parentItem = 0; - - //cargar la base de datos - QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - //crear la consulta - { - QSqlQuery selectQuery(db); //TODO check - if(!includeComics) - { - selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name "); - selectQuery.bindValue(":filter", "%%"+filter+"%%"); - } - else - { - switch(modifier) - { - case YACReader::NoModifiers: - selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " - "FROM folder f LEFT JOIN comic c ON (f.id = c.parentId) " - "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) ORDER BY f.parentId,f.name"); - selectQuery.bindValue(":filter", "%%"+filter+"%%"); - selectQuery.bindValue(":filter2", "%%"+filter+"%%"); - break; - - case YACReader::OnlyRead: - selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " - "FROM folder f LEFT JOIN (comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id)) ON (f.id = c.parentId) " - "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) AND ci.read = 1 ORDER BY f.parentId,f.name;"); - selectQuery.bindValue(":filter", "%%"+filter+"%%"); - selectQuery.bindValue(":filter2", "%%"+filter+"%%"); - break; - - case YACReader::OnlyUnread: - selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " - "FROM folder f LEFT JOIN (comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id)) ON (f.id = c.parentId) " - "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) AND ci.read = 0 ORDER BY f.parentId,f.name;"); - selectQuery.bindValue(":filter", "%%"+filter+"%%"); - selectQuery.bindValue(":filter2", "%%"+filter+"%%"); - break; - - default: - QLOG_ERROR() << "not implemented"; - break; - - } - - - } - selectQuery.exec(); - - setupFilteredModelData(selectQuery,rootItem); - } - //selectQuery.finish(); - db.close(); - QSqlDatabase::removeDatabase(_databasePath); - - endResetModel(); -} - -void FolderModel::setupFilteredModelData(QSqlQuery &sqlquery, FolderItem *parent) -{ - //64 bits para la primary key, es decir la misma precisi�n que soporta sqlit 2^64 - filteredItems.clear(); - - //se a�ade el nodo 0 al modelo que representa el arbol de elementos que cumplen con el filtro - filteredItems.insert(parent->id,parent); - - while (sqlquery.next()) { //se procesan todos los folders que cumplen con el filtro - //datos de la base de datos - QList data; - QSqlRecord record = sqlquery.record(); - - data << record.value("name").toString(); - data << record.value("path").toString(); - data << record.value("finished").toBool(); - data << record.value("completed").toBool(); - - FolderItem * item = new FolderItem(data); - item->id = sqlquery.value(0).toULongLong(); - - //id del padre - quint64 parentId = record.value("parentId").toULongLong(); - - //se a�ade el item al map, de forma que se pueda encontrar como padre en siguientes iteraciones - if(!filteredItems.contains(item->id)) - filteredItems.insert(item->id,item); - - //es necesario conocer las coordenadas de origen para poder realizar scroll autom�tico en la vista - item->originalItem = items.value(item->id); - - //si el padre ya existe en el modelo, el item se a�ade como hijo - if(filteredItems.contains(parentId)) - filteredItems.value(parentId)->appendChild(item); - else//si el padre a�n no se ha a�adido, hay que a�adirlo a �l y todos los padres hasta el nodo ra�z - { - //comprobamos con esta variable si el �ltimo de los padres (antes del nodo ra�z) ya exist�a en el modelo - bool parentPreviousInserted = false; - - //mientras no se alcance el nodo ra�z se procesan todos los padres (de abajo a arriba) - while(parentId != ROOT ) - { - //el padre no estaba en el modelo filtrado, as� que se rescata del modelo original - FolderItem * parentItem = items.value(parentId); - //se debe crear un nuevo nodo (para no compartir los hijos con el nodo original) - FolderItem * newparentItem = new FolderItem(parentItem->getData()); //padre que se a�adir� a la estructura de directorios filtrados - newparentItem->id = parentId; - - newparentItem->originalItem = parentItem; - - //si el modelo contiene al padre, se a�ade el item actual como hijo - if(filteredItems.contains(parentId)) - { - filteredItems.value(parentId)->appendChild(item); - parentPreviousInserted = true; - } - //sino se registra el nodo para poder encontrarlo con posterioridad y se a�ade el item actual como hijo - else - { - newparentItem->appendChild(item); - filteredItems.insert(newparentItem->id,newparentItem); - parentPreviousInserted = false; - } - - //variables de control del bucle, se avanza hacia el nodo padre - item = newparentItem; - parentId = parentItem->parentItem->id; - } - - //si el nodo es hijo de 1 y no hab�a sido previamente insertado como hijo, se a�ade como tal - if(!parentPreviousInserted) - filteredItems.value(ROOT)->appendChild(item); - } - } -} - - - QString FolderModel::getDatabase() { return _databasePath; @@ -508,15 +356,7 @@ QString FolderModel::getFolderPath(const QModelIndex &folder) return static_cast(folder.internalPointer())->data(FolderModel::Path).toString(); } -void FolderModel::setFilter(const YACReader::SearchModifiers modifier, QString filter, bool includeComics) -{ - this->filter = filter; - this->includeComics = includeComics; - this->modifier = modifier; - filterEnabled = true; - setupFilteredModelData(); -} - +/* void FolderModel::resetFilter() { beginResetModel(); @@ -535,7 +375,7 @@ void FolderModel::resetFilter() endResetModel(); -} +}*/ void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool status) { @@ -609,9 +449,12 @@ void FolderModel::fetchMoreFromDB(const QModelIndex &parent) item = rootItem; //Remove all children - beginRemoveRows(parent, 0, item->childCount()); - item->clearChildren(); - endRemoveRows(); + if(item->childCount() > 0) + { + beginRemoveRows(parent, 0, item->childCount()-1); + item->clearChildren(); + endRemoveRows(); + } QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); @@ -622,26 +465,38 @@ void FolderModel::fetchMoreFromDB(const QModelIndex &parent) selectQuery.prepare("select * from folder where id <> 1 and parentId = :parentId order by parentId,name"); items << item; - bool firstLevelUpdate = false; + bool firstLevelUpdated = false; while(items.size() > 0) { nextLevelItems.clear(); foreach(FolderItem * item, items) { + QLOG_DEBUG() << "ID " << item->id; selectQuery.bindValue(":parentId", item->id); selectQuery.exec(); - //Reload all children - if(!firstLevelUpdate) + + if(!firstLevelUpdated) { - beginInsertRows(parent, 0, selectQuery.numRowsAffected()); - firstLevelUpdate = true; + //NO size support + int numResults = 0; + while(selectQuery.next()) + numResults++; + + if(!selectQuery.seek(-1)) + selectQuery.exec(); + //END no size support + + beginInsertRows(parent, 0, numResults-1); } updateFolderModelData(selectQuery,item); - if(!firstLevelUpdate) - endInsertRows(); + if(!firstLevelUpdated) + { + endInsertRows(); + firstLevelUpdated = true; + } nextLevelItems << item->children(); @@ -651,6 +506,9 @@ void FolderModel::fetchMoreFromDB(const QModelIndex &parent) items = nextLevelItems; } + QLOG_DEBUG() << "item->childCount()-1" << item->childCount()-1; + + db.close(); QSqlDatabase::removeDatabase(_databasePath); } @@ -713,3 +571,208 @@ void FolderModel::deleteFolder(const QModelIndex &mi) endRemoveRows(); } + + +//PROXY + +FolderModelProxy::FolderModelProxy(QObject *parent) + :QSortFilterProxyModel(parent),rootItem(0),filterEnabled(false),filter(""),includeComics(true) +{ + +} + +FolderModelProxy::~FolderModelProxy() +{ + +} + +bool FolderModelProxy::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +{ + if(!filterEnabled) + return true; + + FolderItem * parent = static_cast(source_parent.internalPointer()); + + if(parent == 0) + parent = static_cast(sourceModel())->rootItem; + + FolderItem * item = parent->children().at(source_row); + + return filteredItems.contains(item->id); +} + +void FolderModelProxy::setFilter(const YACReader::SearchModifiers modifier, QString filter, bool includeComics) +{ + clear(); + this->filter = filter; + this->includeComics = includeComics; + this->modifier = modifier; + filterEnabled = true; + setupFilteredModelData(); +} + +void FolderModelProxy::setupFilteredModelData() +{ + beginResetModel(); + + //TODO hay que liberar memoria de anteriores filtrados + + //inicializar el nodo ra�z + + if(rootItem != 0) + delete rootItem; //TODO comprobar que se libera bien la memoria + + rootItem = 0; + + //inicializar el nodo ra�z + QList rootData; + rootData << "root"; + rootItem = new FolderItem(rootData); + rootItem->id = ROOT; + rootItem->parentItem = 0; + + FolderModel * model = static_cast(sourceModel()); + + //cargar la base de datos + QSqlDatabase db = DataBaseManagement::loadDatabase(model->_databasePath); + //crear la consulta + { + QSqlQuery selectQuery(db); //TODO check + if(!includeComics) + { + selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name "); + selectQuery.bindValue(":filter", "%%"+filter+"%%"); + } + else + { + switch(modifier) + { + case YACReader::NoModifiers: + selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " + "FROM folder f LEFT JOIN comic c ON (f.id = c.parentId) " + "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) ORDER BY f.parentId,f.name"); + selectQuery.bindValue(":filter", "%%"+filter+"%%"); + selectQuery.bindValue(":filter2", "%%"+filter+"%%"); + break; + + case YACReader::OnlyRead: + selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " + "FROM folder f LEFT JOIN (comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id)) ON (f.id = c.parentId) " + "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) AND ci.read = 1 ORDER BY f.parentId,f.name;"); + selectQuery.bindValue(":filter", "%%"+filter+"%%"); + selectQuery.bindValue(":filter2", "%%"+filter+"%%"); + break; + + case YACReader::OnlyUnread: + selectQuery.prepare("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " + "FROM folder f LEFT JOIN (comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id)) ON (f.id = c.parentId) " + "WHERE f.id <> 1 AND ((UPPER(c.fileName) like UPPER(:filter)) OR (UPPER(f.name) like UPPER(:filter2))) AND ci.read = 0 ORDER BY f.parentId,f.name;"); + selectQuery.bindValue(":filter", "%%"+filter+"%%"); + selectQuery.bindValue(":filter2", "%%"+filter+"%%"); + break; + + default: + QLOG_ERROR() << "not implemented"; + break; + + } + + + } + selectQuery.exec(); + + setupFilteredModelData(selectQuery,rootItem); + } + //selectQuery.finish(); + db.close(); + QSqlDatabase::removeDatabase(model->_databasePath); + + endResetModel(); +} + +void FolderModelProxy::clear() +{ + filterEnabled = false; + + filteredItems.clear(); + + QSortFilterProxyModel::clear(); +} + +void FolderModelProxy::setupFilteredModelData(QSqlQuery &sqlquery, FolderItem *parent) +{ + FolderModel * model = static_cast(sourceModel()); + + //64 bits para la primary key, es decir la misma precisi�n que soporta sqlit 2^64 + filteredItems.clear(); + + //se a�ade el nodo 0 al modelo que representa el arbol de elementos que cumplen con el filtro + filteredItems.insert(parent->id,parent); + + while (sqlquery.next()) { //se procesan todos los folders que cumplen con el filtro + //datos de la base de datos + QList data; + QSqlRecord record = sqlquery.record(); + + data << record.value("name").toString(); + data << record.value("path").toString(); + data << record.value("finished").toBool(); + data << record.value("completed").toBool(); + + FolderItem * item = new FolderItem(data); + item->id = sqlquery.value(0).toULongLong(); + + //id del padre + quint64 parentId = record.value("parentId").toULongLong(); + + //se a�ade el item al map, de forma que se pueda encontrar como padre en siguientes iteraciones + if(!filteredItems.contains(item->id)) + filteredItems.insert(item->id,item); + + //es necesario conocer las coordenadas de origen para poder realizar scroll autom�tico en la vista + item->originalItem = model->items.value(item->id); + + //si el padre ya existe en el modelo, el item se a�ade como hijo + if(filteredItems.contains(parentId)) + filteredItems.value(parentId)->appendChild(item); + else//si el padre a�n no se ha a�adido, hay que a�adirlo a �l y todos los padres hasta el nodo ra�z + { + //comprobamos con esta variable si el �ltimo de los padres (antes del nodo ra�z) ya exist�a en el modelo + bool parentPreviousInserted = false; + + //mientras no se alcance el nodo ra�z se procesan todos los padres (de abajo a arriba) + while(parentId != ROOT ) + { + //el padre no estaba en el modelo filtrado, as� que se rescata del modelo original + FolderItem * parentItem = model->items.value(parentId); + //se debe crear un nuevo nodo (para no compartir los hijos con el nodo original) + FolderItem * newparentItem = new FolderItem(parentItem->getData()); //padre que se a�adir� a la estructura de directorios filtrados + newparentItem->id = parentId; + + newparentItem->originalItem = parentItem; + + //si el modelo contiene al padre, se a�ade el item actual como hijo + if(filteredItems.contains(parentId)) + { + filteredItems.value(parentId)->appendChild(item); + parentPreviousInserted = true; + } + //sino se registra el nodo para poder encontrarlo con posterioridad y se a�ade el item actual como hijo + else + { + newparentItem->appendChild(item); + filteredItems.insert(newparentItem->id,newparentItem); + parentPreviousInserted = false; + } + + //variables de control del bucle, se avanza hacia el nodo padre + item = newparentItem; + parentId = parentItem->parentItem->id; + } + + //si el nodo es hijo de 1 y no hab�a sido previamente insertado como hijo, se a�ade como tal + if(!parentPreviousInserted) + filteredItems.value(ROOT)->appendChild(item); + } + } +} diff --git a/YACReaderLibrary/db/folder_model.h b/YACReaderLibrary/db/folder_model.h index eb00634a..95b2de0a 100644 --- a/YACReaderLibrary/db/folder_model.h +++ b/YACReaderLibrary/db/folder_model.h @@ -42,6 +42,7 @@ #define TREEMODEL_H #include +#include #include #include #include @@ -51,11 +52,38 @@ class FolderItem; -//! [0] +class FolderModelProxy : public QSortFilterProxyModel +{ + Q_OBJECT +public: + explicit FolderModelProxy(QObject *parent = 0); + ~FolderModelProxy(); + + void setFilter(const YACReader::SearchModifiers modifier, QString filter, bool includeComics); + void setupFilteredModelData( QSqlQuery &sqlquery, FolderItem *parent); + void setupFilteredModelData(); + void clear(); + + bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + +protected: + FolderItem *rootItem; + QMap filteredItems; //relación entre folders + + bool includeComics; + QString filter; + bool filterEnabled; + + YACReader::SearchModifiers modifier; +}; + class FolderModel : public QAbstractItemModel { + Q_OBJECT + friend class FolderModelProxy; + public: FolderModel(QObject *parent = 0); FolderModel( QSqlQuery &sqlquery, QObject *parent = 0); @@ -76,10 +104,10 @@ public: void setupModelData(QString path); QString getDatabase(); QString getFolderPath(const QModelIndex &folder); - QModelIndex indexFromItem(FolderItem * item, int column); - void setFilter(const YACReader::SearchModifiers modifier, QString filter, bool includeComics); - void resetFilter(); - bool isFilterEnabled(){return filterEnabled;}; + //QModelIndex indexFromItem(FolderItem * item, int column); + + + //bool isFilterEnabled(){return filterEnabled;}; void updateFolderCompletedStatus(const QModelIndexList & list, bool status); void updateFolderFinishedStatus(const QModelIndexList & list, bool status); @@ -103,22 +131,12 @@ public slots: private: void setupModelData( QSqlQuery &sqlquery, FolderItem *parent); void updateFolderModelData( QSqlQuery &sqlquery, FolderItem *parent); - void setupFilteredModelData( QSqlQuery &sqlquery, FolderItem *parent); - void setupFilteredModelData(); FolderItem *rootItem; //el árbol QMap items; //relación entre folders - FolderItem *rootBeforeFilter; - QMap filteredItems; //relación entre folders - QString _databasePath; - bool includeComics; - QString filter; - bool filterEnabled; - - YACReader::SearchModifiers modifier; signals: void beforeReset(); void reset(); diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index be0de1e9..aa3108fa 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -53,9 +53,10 @@ void LibraryCreator::updateLibrary(const QString &source, const QString &target) processLibrary(source, target); } -void LibraryCreator::updateFolder(const QString &source, const QString &target, const QString &sourceFolder) +void LibraryCreator::updateFolder(const QString &source, const QString &target, const QString &sourceFolder, const QModelIndex & dest) { partialUpdate = true; + folderDestinationModelIndex = dest; _currentPathFolders.clear(); _currentPathFolders.append(Folder(1,1,"root","/")); @@ -198,7 +199,10 @@ void LibraryCreator::run() } //msleep(100);//TODO try to solve the problem with the udpate dialog (ya no se usa más...) if(partialUpdate) - emit updatedCurrentFolder(); + { + emit updatedCurrentFolder(folderDestinationModelIndex); + emit finished(); + } else emit finished(); creation = false; diff --git a/YACReaderLibrary/library_creator.h b/YACReaderLibrary/library_creator.h index f051b5d1..83c06164 100644 --- a/YACReaderLibrary/library_creator.h +++ b/YACReaderLibrary/library_creator.h @@ -13,6 +13,7 @@ #include #include #include +#include #include "folder.h" #include "comic_db.h" @@ -25,7 +26,7 @@ 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 updateFolder(const QString & source, const QString & target, const QString & folder, const QModelIndex &dest); void stop(); private: @@ -52,6 +53,7 @@ //LibraryCreator está en modo creación si creation == true; bool creation; bool partialUpdate; + QModelIndex folderDestinationModelIndex; signals: void finished(); @@ -62,7 +64,7 @@ void created(); void failedCreatingDB(QString); void failedOpeningDB(QString); - void updatedCurrentFolder(); + void updatedCurrentFolder(QModelIndex); }; class ThumbnailCreator : public QObject diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index cfd62ad9..44cc18c5 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -90,7 +90,7 @@ #endif LibraryWindow::LibraryWindow() - :QMainWindow(),fullscreen(false),fetching(false),previousFilter(""),removeError(false) + :QMainWindow(),fullscreen(false),fetching(false),previousFilter(""),removeError(false),status(LibraryWindow::Normal) { setupUI(); loadLibraries(); @@ -104,6 +104,8 @@ LibraryWindow::LibraryWindow() showRootWidget(); selectedLibrary->setCurrentIndex(0); } + + navigationController = new YACReaderNavigationController(this); } void LibraryWindow::setupUI() @@ -406,12 +408,14 @@ void LibraryWindow::doModels() { //folders foldersModel = new FolderModel(); + foldersModelProxy = new FolderModelProxy(); + //foldersModelProxy->setSourceModel(foldersModel); //comics comicsModel = new ComicModel(); //lists listsModel = new ReadingListModel(); - setSearchFilter(YACReader::NoModifiers, ""); //clear search filter + //setSearchFilter(YACReader::NoModifiers, ""); //clear search filter } void LibraryWindow::disconnectComicsViewConnections(ComicsView * widget) @@ -1025,9 +1029,7 @@ void LibraryWindow::createConnections() //-- connect(historyController,SIGNAL(enabledBackward(bool)),backAction,SLOT(setEnabled(bool))); connect(historyController,SIGNAL(enabledForward(bool)),forwardAction,SLOT(setEnabled(bool))); - connect(historyController,SIGNAL(modelIndexSelected(QModelIndex)),this,SLOT(loadCovers(QModelIndex))); - connect(historyController,SIGNAL(modelIndexSelected(QModelIndex)),foldersView,SLOT(setCurrentIndex(QModelIndex))); - connect(foldersView, SIGNAL(clicked(QModelIndex)), historyController, SLOT(updateHistory(QModelIndex))); + //connect(foldersView, SIGNAL(clicked(QModelIndex)), historyController, SLOT(updateHistory(QModelIndex))); //libraryCreator connections connect(createLibraryDialog,SIGNAL(createLibrary(QString,QString,QString)),this,SLOT(create(QString,QString,QString))); @@ -1039,8 +1041,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(reloadAfterCopyMove())); + //connect(libraryCreator,SIGNAL(updatedCurrentFolder()), this, SLOT(showRootWidget())); + connect(libraryCreator,SIGNAL(updatedCurrentFolder(QModelIndex)), this, SLOT(reloadAfterCopyMove(QModelIndex))); connect(libraryCreator,SIGNAL(comicAdded(QString,QString)),importWidget,SLOT(newComic(QString,QString))); //libraryCreator errors connect(libraryCreator,SIGNAL(failedCreatingDB(QString)),this,SLOT(manageCreatingError(QString))); @@ -1074,8 +1076,8 @@ void LibraryWindow::createConnections() connect(renameLibraryDialog,SIGNAL(renameLibrary(QString)),this,SLOT(rename(QString))); //navigations between view modes (tree,list and flow) - connect(foldersView, SIGNAL(pressed(QModelIndex)), this, SLOT(updateFoldersViewConextMenu(QModelIndex))); - connect(foldersView, SIGNAL(clicked(QModelIndex)), this, SLOT(loadCovers(QModelIndex))); + //TODO connect(foldersView, SIGNAL(pressed(QModelIndex)), this, SLOT(updateFoldersViewConextMenu(QModelIndex))); + //connect(foldersView, SIGNAL(clicked(QModelIndex)), this, SLOT(loadCovers(QModelIndex))); //drops in folders view connect(foldersView, SIGNAL(copyComicsToFolder(QList >,QModelIndex)), this, SLOT(copyAndImportComicsToFolder(QList >,QModelIndex))); @@ -1155,9 +1157,9 @@ void LibraryWindow::createConnections() connect(comicsViewTransition,SIGNAL(transitionFinished()),this,SLOT(showComicsView())); - connect(comicsModel,SIGNAL(isEmpty()),this,SLOT(showEmptyFolderView())); - connect(comicsModel,SIGNAL(searchNumResults(int)),this,SLOT(checkSearchNumResults(int))); - connect(emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); + //connect(comicsModel,SIGNAL(isEmpty()),this,SLOT(showEmptyFolderView())); + //connect(comicsModel,SIGNAL(searchNumResults(int)),this,SLOT(checkSearchNumResults(int))); + //connect(emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); //Drops connect(emptyFolderWidget, SIGNAL(copyComicsToCurrentFolder(QList >)), this, SLOT(copyAndImportComicsToCurrentFolder(QList >))); connect(emptyFolderWidget, SIGNAL(moveComicsToCurrentFolder(QList >)), this, SLOT(moveAndImportComicsToCurrentFolder(QList >))); @@ -1166,7 +1168,7 @@ void LibraryWindow::createConnections() //update folders (partial updates) connect(updateCurrentFolderAction,SIGNAL(triggered()), this, SLOT(updateCurrentFolder())); - connect(updateFolderAction,SIGNAL(triggered()), this, SLOT(updateTreeFolder())); + connect(updateFolderAction,SIGNAL(triggered()), this, SLOT(updateCurrentFolder())); //lists connect(addReadingListAction,SIGNAL(triggered()),this,SLOT(addNewReadingList())); @@ -1212,10 +1214,9 @@ void LibraryWindow::loadLibrary(const QString & name) if(comparation == 0 || updated) //en caso de que la versión se igual que la actual { - index = 0; - foldersModel->setupModelData(path); - foldersView->setModel(foldersModel); + foldersModelProxy->setSourceModel(foldersModel); + foldersView->setModel(foldersModelProxy); listsModel->setupReadingListsData(path); listsView->setModel(listsModel); @@ -1342,13 +1343,14 @@ void LibraryWindow::loadCovers(const QModelIndex & mi) //cambiado de orden, ya que al llamar a foldersFilter->clear() se invalidan los model index + /* if(searchEdit->text()!="") { //setFoldersFilter(""); if(mi.isValid()) { index = static_cast(mi.internalPointer())->originalItem; - column = mi.column(); + column = mi.column(); searchEdit->clear(); } } @@ -1356,7 +1358,8 @@ void LibraryWindow::loadCovers(const QModelIndex & mi) { index = static_cast(mi.internalPointer()); column = mi.column(); - } + } +*/ //comicsView->setModel(NULL); comicsModel->setupModelData(folderId,foldersModel->getDatabase()); @@ -1391,12 +1394,12 @@ void LibraryWindow::copyAndImportComicsToCurrentFolder(const QListcopyComicsTo(comics,destFolderPath); + comicFilesManager->copyComicsTo(comics,destFolderPath,folderDestination); processComicFiles(comicFilesManager, progressDialog); } @@ -1409,12 +1412,12 @@ void LibraryWindow::moveAndImportComicsToCurrentFolder(const QListmoveComicsTo(comics,destFolderPath); + comicFilesManager->moveComicsTo(comics,destFolderPath,folderDestination); processComicFiles(comicFilesManager, progressDialog); } @@ -1424,17 +1427,17 @@ void LibraryWindow::copyAndImportComicsToFolder(const QList0) - { - QString destFolderPath = QDir::cleanPath(currentPath()+foldersModel->getFolderPath(miFolder)); + { + QModelIndex folderDestination = foldersModelProxy->mapToSource(miFolder); - updateDestination = miFolder; + QString destFolderPath = QDir::cleanPath(currentPath()+foldersModel->getFolderPath(folderDestination)); QLOG_DEBUG() << "Coping to " << destFolderPath; QProgressDialog * progressDialog = newProgressDialog(tr("Copying comics..."),comics.size()); ComicFilesManager * comicFilesManager = new ComicFilesManager(); - comicFilesManager->copyComicsTo(comics,destFolderPath); + comicFilesManager->copyComicsTo(comics,destFolderPath,folderDestination); processComicFiles(comicFilesManager, progressDialog); } @@ -1445,16 +1448,16 @@ void LibraryWindow::moveAndImportComicsToFolder(const QList0) { - QString destFolderPath = QDir::cleanPath(currentPath()+foldersModel->getFolderPath(miFolder)); + QModelIndex folderDestination = foldersModelProxy->mapToSource(miFolder); - updateDestination = miFolder; + QString destFolderPath = QDir::cleanPath(currentPath()+foldersModel->getFolderPath(folderDestination)); QLOG_DEBUG() << "Moving to " << destFolderPath; QProgressDialog * progressDialog = newProgressDialog(tr("Moving comics..."),comics.size()); ComicFilesManager * comicFilesManager = new ComicFilesManager(); - comicFilesManager->moveComicsTo(comics,destFolderPath); + comicFilesManager->moveComicsTo(comics,destFolderPath,folderDestination); processComicFiles(comicFilesManager, progressDialog); } @@ -1473,7 +1476,7 @@ void LibraryWindow::processComicFiles(ComicFilesManager * comicFilesManager, QPr connect(progressDialog, SIGNAL(canceled()), comicFilesManager, SLOT(cancel()), Qt::DirectConnection); connect(thread, SIGNAL(started()), comicFilesManager, SLOT(process())); - connect(comicFilesManager, SIGNAL(success()), this, SLOT(updateCopyMoveFolderDestination())); + connect(comicFilesManager, SIGNAL(success(QModelIndex)), this, SLOT(updateCopyMoveFolderDestination(QModelIndex))); connect(comicFilesManager, SIGNAL(finished()), thread, SLOT(quit())); connect(comicFilesManager, SIGNAL(finished()), comicFilesManager, SLOT(deleteLater())); connect(comicFilesManager, SIGNAL(finished()), progressDialog, SLOT(close())); @@ -1484,9 +1487,9 @@ void LibraryWindow::processComicFiles(ComicFilesManager * comicFilesManager, QPr thread->start(); } -void LibraryWindow::updateCopyMoveFolderDestination() +void LibraryWindow::updateCopyMoveFolderDestination(const QModelIndex & mi) { - updateFolder(updateDestination); + updateFolder(mi); } void LibraryWindow::updateCurrentFolder() @@ -1494,15 +1497,9 @@ void LibraryWindow::updateCurrentFolder() updateFolder(getCurrentFolderIndex()); } -void LibraryWindow::updateTreeFolder() -{ - updateFolder(foldersView->currentIndex()); -} - void LibraryWindow::updateFolder(const QModelIndex & miFolder) { QLOG_DEBUG() << "UPDATE FOLDER!!!!"; - updateDestination = miFolder; importWidget->setUpdateLook(); showImportingWidget(); @@ -1510,7 +1507,7 @@ void LibraryWindow::updateFolder(const QModelIndex & miFolder) QString currentLibrary = selectedLibrary->currentText(); QString path = libraries.getPath(currentLibrary); _lastAdded = currentLibrary; - libraryCreator->updateFolder(QDir::cleanPath(path),QDir::cleanPath(path+"/.yacreaderlibrary"),QDir::cleanPath(currentPath()+foldersModel->getFolderPath(miFolder))); + libraryCreator->updateFolder(QDir::cleanPath(path),QDir::cleanPath(path+"/.yacreaderlibrary"),QDir::cleanPath(currentPath()+foldersModel->getFolderPath(miFolder)),miFolder); libraryCreator->start(); } @@ -1523,12 +1520,12 @@ QProgressDialog *LibraryWindow::newProgressDialog(const QString &label, int maxV return progressDialog; } -void LibraryWindow::reloadAfterCopyMove() +void LibraryWindow::reloadAfterCopyMove(const QModelIndex & mi) { - if(getCurrentFolderIndex() == updateDestination) + if(getCurrentFolderIndex() == mi) reloadCovers(); - foldersModel->fetchMoreFromDB(updateDestination); + foldersModel->fetchMoreFromDB(mi); enableNeededActions(); } @@ -1536,7 +1533,7 @@ void LibraryWindow::reloadAfterCopyMove() QModelIndex LibraryWindow::getCurrentFolderIndex() { if(foldersView->selectionModel()->selectedRows().length()>0) - return foldersView->currentIndex(); + return foldersModelProxy->mapToSource(foldersView->currentIndex()); else return QModelIndex(); } @@ -1742,10 +1739,10 @@ void LibraryWindow::reloadCovers() } if(foldersView->selectionModel()->selectedRows().length()>0) - loadCovers(foldersView->currentIndex()); + loadCovers(foldersModelProxy->mapToSource(foldersView->currentIndex())); else loadCovers(QModelIndex()); -QLOG_INFO() << "reloaded covers at row : " << foldersView->currentIndex().row(); +QLOG_INFO() << "reloaded covers at row : " << foldersModelProxy->mapToSource(foldersView->currentIndex()).row(); QModelIndex mi = comicsModel->getIndexFromId(_comicIdEdited); if(mi.isValid()) { @@ -1972,7 +1969,7 @@ void LibraryWindow::rename(QString newName) //TODO replace libraries.save(); renameLibraryDialog->close(); #ifndef Q_OS_MAC - if(!foldersView->currentIndex().isValid()) + if(!foldersModelProxy->mapToSource(foldersView->currentIndex()).isValid()) libraryToolBar->setCurrentFolderName(selectedLibrary->currentText()); #endif } @@ -2066,35 +2063,53 @@ void LibraryWindow::toNormal() void LibraryWindow::setSearchFilter(const YACReader::SearchModifiers modifier, QString filter) { - if(filter.isEmpty() && foldersModel->isFilterEnabled()) + /* + if(filter.isEmpty()) { - foldersModel->resetFilter(); + QLOG_DEBUG() << "clearing filter"; + foldersModelProxy->clear(); comicsView->enableFilterMode(false); - //foldersView->collapseAll(); - if(index != 0) + foldersView->collapseAll(); + + //TODO scroll to folder after clearing the filter + //1. histoy last index + //2. scrollto + //3. setCurrentIndex + if(index != 0) { QModelIndex mi = foldersModel->indexFromItem(index,column); foldersView->scrollTo(mi,QAbstractItemView::PositionAtTop); historyController->updateHistory(mi); foldersView->setCurrentIndex(mi); - } + } reloadCovers(); - } - else + }*/ + if(!filter.isEmpty()) { - if(!filter.isEmpty()) - { - foldersModel->setFilter(modifier, filter, true);//includeComicsCheckBox->isChecked()); + status = LibraryWindow::Searching; + foldersModelProxy->setFilter(modifier, filter, true);//includeComicsCheckBox->isChecked()); comicsModel->setupModelData(modifier, filter, foldersModel->getDatabase()); comicsView->enableFilterMode(true); foldersView->expandAll(); - //loadCoversFromCurrentModel(); - } } + else if(status == LibraryWindow::Searching) + {//if no searching, then ignore this + clearSearchFilter(); + navigationController->loadPreviousStatus(); + } } +void LibraryWindow::clearSearchFilter() +{ + foldersModelProxy->clear(); + comicsView->enableFilterMode(false); + foldersView->collapseAll(); + status = LibraryWindow::Normal; +} + + void LibraryWindow::showProperties() { QModelIndexList indexList = getSelectedComics(); @@ -2301,7 +2316,7 @@ QFileInfo file = QDir::cleanPath(currentPath() + comicsModel->getComicPath(model void LibraryWindow::openContainingFolder() { - QModelIndex modelIndex = foldersView->currentIndex(); + QModelIndex modelIndex = foldersModelProxy->mapToSource(foldersView->currentIndex()); QString path; if(modelIndex.isValid()) path = QDir::cleanPath(currentPath() + foldersModel->getFolderPath(modelIndex)); @@ -2360,7 +2375,7 @@ QString LibraryWindow::currentFolderPath() QString path; if(foldersView->selectionModel()->selectedRows().length()>0) - path = foldersModel->getFolderPath(foldersView->currentIndex()); + path = foldersModel->getFolderPath(foldersModelProxy->mapToSource(foldersView->currentIndex())); else path = foldersModel->getFolderPath(QModelIndex()); diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 7a89d191..b4317605 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -6,7 +6,9 @@ #include #include #include "yacreader_global.h" -#include +#include "yacreader_libraries.h" + +#include "yacreader_navigation_controller.h" #ifdef Q_OS_MAC #include "yacreader_macosx_toolbar.h" @@ -35,8 +37,8 @@ class QCheckBox; class QPushButton; class ComicModel; class QSplitter; -class FolderItem; class FolderModel; +class FolderModelProxy; class QItemSelectionModel; class QString; class QLabel; @@ -72,6 +74,8 @@ using namespace YACReader; class LibraryWindow : public QMainWindow { + friend class YACReaderNavigationController; + Q_OBJECT private: YACReaderSideBar * sideBar; @@ -105,12 +109,13 @@ private: #else YACReaderSearchLineEdit * searchEdit; #endif - FolderItem * index; //index al que hay que hacer scroll despu�s de pulsar sobre un folder filtrado - int column; + QString previousFilter; QCheckBox * includeComicsCheckBox; //------------- + YACReaderNavigationController * navigationController; + ComicsView * comicsView; ClassicComicsView * classicComicsView; GridComicsView * gridComicsView; @@ -123,6 +128,7 @@ private: YACReaderReadingListsView * listsView; YACReaderLibraryListWidget * selectedLibrary; FolderModel * foldersModel; + FolderModelProxy * foldersModelProxy; ComicModel * comicsModel; ReadingListModel * listsModel; //QStringList paths; @@ -231,10 +237,18 @@ private: //QModelIndex _rootIndex; //QModelIndex _rootIndexCV; - QModelIndex updateDestination; + //QModelIndex updateDestination; quint64 _comicIdEdited; + enum NavigationStatus + { + Normal, // + Searching + }; + + NavigationStatus status; + void setupUI(); void createActions(); void createToolBars(); @@ -311,6 +325,7 @@ public slots: void toNormal(); void toFullScreen(); void setSearchFilter(const YACReader::SearchModifiers modifier, QString filter); + void clearSearchFilter(); void showProperties(); void exportLibrary(QString destPath); void importLibrary(QString clc,QString destPath,QString name); @@ -354,12 +369,11 @@ public slots: void copyAndImportComicsToFolder(const QList > & comics, const QModelIndex & miFolder); void moveAndImportComicsToFolder(const QList > & comics, const QModelIndex & miFolder); void processComicFiles(ComicFilesManager * comicFilesManager, QProgressDialog * progressDialog); - void updateCopyMoveFolderDestination(); //imports new comics from the current folder + void updateCopyMoveFolderDestination(const QModelIndex & mi); //imports new comics from the current folder void updateCurrentFolder(); - void updateTreeFolder(); void updateFolder(const QModelIndex & miFolder); QProgressDialog * newProgressDialog(const QString & label, int maxValue); - void reloadAfterCopyMove(); + void reloadAfterCopyMove(const QModelIndex &mi); QModelIndex getCurrentFolderIndex(); void enableNeededActions(); void addFolderToCurrentIndex(); diff --git a/YACReaderLibrary/yacreader_folders_view.cpp b/YACReaderLibrary/yacreader_folders_view.cpp index bdb61fdb..ddc5b45b 100644 --- a/YACReaderLibrary/yacreader_folders_view.cpp +++ b/YACReaderLibrary/yacreader_folders_view.cpp @@ -87,6 +87,7 @@ YACReaderFoldersViewItemDeletegate::YACReaderFoldersViewItemDeletegate(QObject * void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { +/* FolderItem * item = static_cast(index.internalPointer()); if(!item->data(FolderModel::Completed).toBool()) @@ -101,6 +102,6 @@ void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOp painter->drawRect(0,option.rect.y(),2,option.rect.height()); painter->restore(); } - +*/ QStyledItemDelegate::paint(painter, option, index); } diff --git a/YACReaderLibrary/yacreader_history_controller.cpp b/YACReaderLibrary/yacreader_history_controller.cpp index 8c37e4c8..86bfcff0 100644 --- a/YACReaderLibrary/yacreader_history_controller.cpp +++ b/YACReaderLibrary/yacreader_history_controller.cpp @@ -64,3 +64,13 @@ void YACReaderHistoryController::updateHistory(const QModelIndex &mi) emit(enabledForward(false)); } + +QModelIndex YACReaderHistoryController::lastIndex() +{ + return history.last(); +} + +QModelIndex YACReaderHistoryController::currentIndex() +{ + return history.at(currentFolderNavigation); +} diff --git a/YACReaderLibrary/yacreader_history_controller.h b/YACReaderLibrary/yacreader_history_controller.h index 4b31987d..70166001 100644 --- a/YACReaderLibrary/yacreader_history_controller.h +++ b/YACReaderLibrary/yacreader_history_controller.h @@ -21,6 +21,8 @@ public slots: void backward(); void forward(); void updateHistory(const QModelIndex & mi); + QModelIndex lastIndex(); + QModelIndex currentIndex(); protected: int currentFolderNavigation; diff --git a/YACReaderLibrary/yacreader_navigation_controller.cpp b/YACReaderLibrary/yacreader_navigation_controller.cpp new file mode 100644 index 00000000..9dd53dc7 --- /dev/null +++ b/YACReaderLibrary/yacreader_navigation_controller.cpp @@ -0,0 +1,125 @@ +#include "yacreader_navigation_controller.h" + +#include + +#include "library_window.h" +#include "yacreader_folders_view.h" +#include "yacreader_reading_lists_view.h" +#include "folder_item.h" +#include "yacreader_history_controller.h" +#include "comic_model.h" +#include "folder_model.h" +#include "comics_view.h" +#include "empty_folder_widget.h" + +YACReaderNavigationController::YACReaderNavigationController(LibraryWindow *parent) : + QObject(parent),libraryWindow(parent) +{ + setupConnections(); +} + +void YACReaderNavigationController::selectedFolder(const QModelIndex &mi) +{ + //A proxy is used + QModelIndex modelIndex = libraryWindow->foldersModelProxy->mapToSource(mi); + + //update history + libraryWindow->historyController->updateHistory(modelIndex); + + if(libraryWindow->status == LibraryWindow::Searching) + { + //when a folder is selected the search mode has to be reset + libraryWindow->searchEdit->clearText(); + libraryWindow->clearSearchFilter(); + libraryWindow->foldersView->scrollTo(mi,QAbstractItemView::PositionAtTop); + libraryWindow->foldersView->setCurrentIndex(mi); + } + + loadFolderInfo(modelIndex); + +} + +void YACReaderNavigationController::loadFolderInfo(const QModelIndex &modelIndex) +{ + //Get FolderItem + qulonglong folderId = folderModelIndexToID(modelIndex); + + //check comics in folder with id = folderId + libraryWindow->comicsModel->setupModelData(folderId,libraryWindow->foldersModel->getDatabase()); + libraryWindow->comicsView->setModel(libraryWindow->comicsModel); + + //configure views + if(libraryWindow->comicsModel->rowCount() > 0) + { + //updateView + libraryWindow->showComicsView(); + } + else{ + //showEmptyFolder + QStringList subfolders; + subfolders = libraryWindow->foldersModel->getSubfoldersNames(modelIndex); + libraryWindow->emptyFolderWidget->setSubfolders(modelIndex,subfolders); + libraryWindow->showEmptyFolderView(); + } +} + + + +void YACReaderNavigationController::selectedList(const QModelIndex &mi) +{ + +} + +void YACReaderNavigationController::selectedIndexFromHistory(const QModelIndex &sourceMI) +{ + //TODO NO searching allowed, just disable backward/forward actions in searching mode + if(libraryWindow->status == LibraryWindow::Searching) + { + //when a folder is selected the search mode has to be reset + libraryWindow->searchEdit->clearText(); + libraryWindow->clearSearchFilter(); + } + + //TODO more info about mi is needed (folder, lists...) + QModelIndex mi = libraryWindow->foldersModelProxy->mapFromSource(sourceMI); + libraryWindow->foldersView->scrollTo(mi,QAbstractItemView::PositionAtTop); + libraryWindow->foldersView->setCurrentIndex(mi); + loadFolderInfo(sourceMI); +} + +void YACReaderNavigationController::selectSubfolder(const QModelIndex &sourceMIParent, int child) +{ + QModelIndex dest = libraryWindow->foldersModel->index(child,0,sourceMIParent); + libraryWindow->foldersView->setCurrentIndex(libraryWindow->foldersModelProxy->mapFromSource(dest)); + libraryWindow->historyController->updateHistory(dest); + loadFolderInfo(dest); +} + +void YACReaderNavigationController::loadPreviousStatus() +{ + QModelIndex sourceMI = libraryWindow->historyController->currentIndex(); + QModelIndex mi = libraryWindow->foldersModelProxy->mapFromSource(sourceMI); + libraryWindow->foldersView->scrollTo(mi,QAbstractItemView::PositionAtTop); + libraryWindow->foldersView->setCurrentIndex(mi); + loadFolderInfo(sourceMI); +} + +void YACReaderNavigationController::setupConnections() +{ + connect(libraryWindow->foldersView,SIGNAL(clicked(QModelIndex)),this,SLOT(selectedFolder(QModelIndex))); + connect(libraryWindow->listsView,SIGNAL(clicked(QModelIndex)),this,SLOT(selectedList(QModelIndex))); + connect(libraryWindow->historyController,SIGNAL(modelIndexSelected(QModelIndex)),this,SLOT(selectedIndexFromHistory(QModelIndex))); + connect(libraryWindow->emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); +} + +qulonglong YACReaderNavigationController::folderModelIndexToID(const QModelIndex &mi) +{ + if(!mi.isValid()) + return 1; + + FolderItem * folderItem = static_cast(mi.internalPointer()); + if(folderItem != 0) + return folderItem->id; + + return 1; +} diff --git a/YACReaderLibrary/yacreader_navigation_controller.h b/YACReaderLibrary/yacreader_navigation_controller.h new file mode 100644 index 00000000..f3202a94 --- /dev/null +++ b/YACReaderLibrary/yacreader_navigation_controller.h @@ -0,0 +1,40 @@ +#ifndef YACREADER_NAVIGATION_CONTROLLER_H +#define YACREADER_NAVIGATION_CONTROLLER_H + +#include +class LibraryWindow; + + +class YACReaderNavigationController : public QObject +{ + Q_OBJECT +public: + + explicit YACReaderNavigationController(LibraryWindow * parent); + +signals: + +public slots: + //info origins + //folders view + void selectedFolder(const QModelIndex & mi); + //reading lists + void selectedList(const QModelIndex & mi); + //history navigation + void selectedIndexFromHistory(const QModelIndex & mi); + //empty subfolder + void selectSubfolder(const QModelIndex &sourceMI, int child); + + void loadFolderInfo(const QModelIndex & modelIndex); + void loadPreviousStatus(); + +private: + + void setupConnections(); + LibraryWindow * libraryWindow; + + //convenience methods + qulonglong folderModelIndexToID(const QModelIndex & mi); +}; + +#endif // YACREADER_NAVIGATION_CONTROLLER_H diff --git a/custom_widgets/yacreader_macosx_toolbar.h b/custom_widgets/yacreader_macosx_toolbar.h index 40cae2fd..a37b144b 100644 --- a/custom_widgets/yacreader_macosx_toolbar.h +++ b/custom_widgets/yacreader_macosx_toolbar.h @@ -17,6 +17,7 @@ public: public slots: QString text(); void clear(); + void clearText(); //no signal emited void setDisabled(bool disabled); void setEnabled(bool enabled); diff --git a/custom_widgets/yacreader_macosx_toolbar.mm b/custom_widgets/yacreader_macosx_toolbar.mm index 0bb7c1ae..b5c52d3d 100644 --- a/custom_widgets/yacreader_macosx_toolbar.mm +++ b/custom_widgets/yacreader_macosx_toolbar.mm @@ -342,6 +342,12 @@ void YACReaderMacOSXSearchLineEdit::clear() emit filterChanged(YACReader::NoModifiers, ""); } +void YACReaderMacOSXSearchLineEdit::clearText() +{ + //TODO be sure that this will not generate any event.... + [((NSTextField *)nstextfield) setStringValue:@""]; +} + void YACReaderMacOSXSearchLineEdit::setDisabled(bool disabled) { [((NSTextField *)nstextfield) setEnabled:!disabled]; diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index d9b66b6e..f81d276c 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -70,6 +70,13 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) connect(this,SIGNAL(textChanged(QString)),this,SLOT(processText(QString))); } +void YACReaderSearchLineEdit::clearText() +{ + disconnect(this,SIGNAL(textChanged(QString)),this,SLOT(processText(QString))); + clear(); + connect(this,SIGNAL(textChanged(QString)),this,SLOT(processText(QString))); +} + //modifiers are not returned const QString YACReaderSearchLineEdit::text() { diff --git a/custom_widgets/yacreader_search_line_edit.h b/custom_widgets/yacreader_search_line_edit.h index 6d08a72d..50f6fdbe 100644 --- a/custom_widgets/yacreader_search_line_edit.h +++ b/custom_widgets/yacreader_search_line_edit.h @@ -15,6 +15,7 @@ class YACReaderSearchLineEdit : public QLineEdit public: YACReaderSearchLineEdit(QWidget *parent = 0); + void clearText(); //no signal emited; const QString text(); protected: