From 5b70ebeaadf476bf5014be5d0a1f6acf931f2c22 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann <2039670+selmf@users.noreply.github.com> Date: Fri, 22 May 2015 17:29:19 +0200 Subject: [PATCH] merge --- YACReaderLibrary/classic_comics_view.cpp | 37 +++-- .../comic_vine/sort_volume_comics.cpp | 6 +- YACReaderLibrary/db/comic_model.cpp | 27 +++- YACReaderLibrary/qml/GridComicsView.qml | 6 + .../server/controllers/foldercontroller.cpp | 128 +++++++++--------- .../lib/bfHttpServer/httpsessionstore.cpp | 6 +- release/server/docroot/css/styles_ipad.css | 5 +- release/server/docroot/css/styles_iphone.css | 3 +- 8 files changed, 133 insertions(+), 85 deletions(-) diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index 63cdb322..92777822 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -72,6 +72,7 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) connect(tableView, SIGNAL(comicRated(int,QModelIndex)), this, SIGNAL(comicRated(int,QModelIndex))); connect(comicFlow, SIGNAL(selected(uint)), this, SIGNAL(selected(uint))); connect(tableView->horizontalHeader(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(saveTableHeadersStatus())); + connect(tableView->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(saveTableHeadersStatus())); connect(comicFlow, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(requestedViewContextMenu(QPoint))); connect(tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(requestedItemContextMenu(QPoint))); layout->addWidget(sVertical); @@ -83,8 +84,10 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) sVertical->setCollapsible(1,false); #endif + settingsMutex.lock(); if(settings->contains(COMICS_VIEW_FLOW_SPLITTER_STATUS)) sVertical->restoreState(settings->value(COMICS_VIEW_FLOW_SPLITTER_STATUS).toByteArray()); + settingsMutex.unlock(); } void ClassicComicsView::setToolBar(QToolBar *toolBar) @@ -120,22 +123,30 @@ void ClassicComicsView::setModel(ComicModel *model) tableView->horizontalHeader()->setMovable(true); #endif //TODO parametrizar la configuración de las columnas - for(int i = 0;ihorizontalHeader()->count();i++) - tableView->horizontalHeader()->hideSection(i); + settingsMutex.lock(); + if(!settings->contains(COMICS_VIEW_HEADERS)) + { + for(int i = 0;ihorizontalHeader()->count();i++) + tableView->horizontalHeader()->hideSection(i); - tableView->horizontalHeader()->showSection(ComicModel::Number); - tableView->horizontalHeader()->showSection(ComicModel::Title); - tableView->horizontalHeader()->showSection(ComicModel::FileName); - tableView->horizontalHeader()->showSection(ComicModel::NumPages); - tableView->horizontalHeader()->showSection(ComicModel::Hash); //Size is part of the Hash...TODO add Columns::Size to Columns - tableView->horizontalHeader()->showSection(ComicModel::ReadColumn); - tableView->horizontalHeader()->showSection(ComicModel::CurrentPage); - tableView->horizontalHeader()->showSection(ComicModel::Rating); + tableView->horizontalHeader()->showSection(ComicModel::Number); + tableView->horizontalHeader()->showSection(ComicModel::Title); + tableView->horizontalHeader()->showSection(ComicModel::FileName); + tableView->horizontalHeader()->showSection(ComicModel::NumPages); + tableView->horizontalHeader()->showSection(ComicModel::Hash); //Size is part of the Hash...TODO add Columns::Size to Columns + tableView->horizontalHeader()->showSection(ComicModel::ReadColumn); + tableView->horizontalHeader()->showSection(ComicModel::CurrentPage); + tableView->horizontalHeader()->showSection(ComicModel::Rating); + } + settingsMutex.unlock(); //debido a un bug, qt4 no es capaz de ajustar el ancho teniendo en cuenta todas la filas (no sólo las visibles) //así que se ecala la primera vez y después se deja el control al usuario. - //if(!settings->contains(COMICS_VIEW_HEADERS)) - tableView->resizeColumnsToContents(); + settingsMutex.lock(); + if(!settings->contains(COMICS_VIEW_HEADERS)) + tableView->resizeColumnsToContents(); + settingsMutex.unlock(); + tableView->horizontalHeader()->setStretchLastSection(true); QStringList paths = model->getPaths(model->getCurrentPath());//TODO ComicsView: get currentpath from somewhere currentPath()); @@ -270,8 +281,10 @@ void ClassicComicsView::saveTableHeadersStatus() void ClassicComicsView::saveSplitterStatus() { + settingsMutex.lock(); if(!searching) settings->setValue(COMICS_VIEW_FLOW_SPLITTER_STATUS, sVertical->saveState()); + settingsMutex.unlock(); } void ClassicComicsView::applyModelChanges(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) diff --git a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp index 6d7441f2..16e7d782 100644 --- a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp +++ b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp @@ -169,10 +169,12 @@ void SortVolumeComics::moveDownCL() QList selection = tableFiles->selectionModel()->selectedIndexes(); if(selection.count() > 0) + { localComicsModel->moveSelectionDown(selection); - selection = tableFiles->selectionModel()->selectedIndexes(); - tableFiles->scrollTo(selection.last()); + selection = tableFiles->selectionModel()->selectedIndexes(); + tableFiles->scrollTo(selection.last()); + } } void SortVolumeComics::moveUpIL() diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index 68918a76..6afb7053 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -47,7 +47,7 @@ bool ComicModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, i return data->formats().contains(YACReader::YACReaderLibrarComiscSelectionMimeDataFormat); } -//TODO: optimize this method +//TODO: optimize this method (seriously) bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { @@ -118,9 +118,26 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int QLOG_INFO() << newSorting; - if(!beginMoveRows(parent,currentIndexes.first(),currentIndexes.last(),parent,row)) - return false; - _data = resortedData; + int tempRow = row; + foreach(qulonglong id, comicIds) + { + int i = 0; + foreach (ComicItem *item, _data) { + if(item->data(Id) == id) + { + beginMoveRows(parent,i,i,parent,tempRow); + _data.removeAll(item); + _data.insert(tempRow++, item); + endMoveRows(); + break; + } + i++; + } + } + + /*if(!beginMoveRows(parent,currentIndexes.first(),currentIndexes.last(),parent,row)) + return false;*/ + _data = resortedData; //TODO No longer needed //TODO emit signals @@ -145,7 +162,7 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int QSqlDatabase::removeDatabase(_databasePath); - endMoveRows(); + //endMoveRows(); emit resortedIndexes(newSorting); int destSelectedIndex = row<0?_data.length():row; diff --git a/YACReaderLibrary/qml/GridComicsView.qml b/YACReaderLibrary/qml/GridComicsView.qml index 2c317116..c1f9922d 100644 --- a/YACReaderLibrary/qml/GridComicsView.qml +++ b/YACReaderLibrary/qml/GridComicsView.qml @@ -339,6 +339,12 @@ Rectangle { currentIndex: 0 cacheBuffer: 0 + footer: Rectangle { //fix for the scroll issue, TODO find what causes the issue (some times the bottoms cells are hidden for the toolbar, no full scroll) + height : 25 + width : parent.width + color : backgroundColor + } + move: Transition { NumberAnimation { properties: "x,y"; duration: 250 } } diff --git a/YACReaderLibrary/server/controllers/foldercontroller.cpp b/YACReaderLibrary/server/controllers/foldercontroller.cpp index 7a8f9cb7..30aa657f 100644 --- a/YACReaderLibrary/server/controllers/foldercontroller.cpp +++ b/YACReaderLibrary/server/controllers/foldercontroller.cpp @@ -51,7 +51,7 @@ void FolderController::service(HttpRequest& request, HttpResponse& response) } if(folderId!=1) - t.setVariable("folder.name",folderName); + t.setVariable("folder.name",folderName); else t.setVariable("folder.name",libraryName); QList folderContent = DBHelper::getFolderSubfoldersFromLibrary(libraryId,folderId); @@ -155,75 +155,81 @@ void FolderController::service(HttpRequest& request, HttpResponse& response) t.setVariable(QString("path%1.name").arg(i-1),DBHelper::getFolderName(libraryId,foldersPath[i].first)); } - t.loop("element",numFoldersAtCurrentPage); - int i = 0; - while(iname); - if(item->isDir()) - { - t.setVariable(QString("element%1.class").arg(i),"folder"); - - QList children = DBHelper::getFolderComicsFromLibrary(libraryId, item->id); - if(children.length()>0) + if(folderContent.length() > 0) + { + t.loop("element",numFoldersAtCurrentPage); + int i = 0; + while(iname); + if(item->isDir()) { - const ComicDB * comic = static_cast(children.at(0)); - t.setVariable(QString("element%1.image.url").arg(i),QString("/library/%1/cover/%2.jpg?folderCover=true").arg(libraryId).arg(comic->info.hash)); + t.setVariable(QString("element%1.class").arg(i),"folder"); + + QList children = DBHelper::getFolderComicsFromLibrary(libraryId, item->id); + if(children.length()>0) + { + const ComicDB * comic = static_cast(children.at(0)); + t.setVariable(QString("element%1.image.url").arg(i),QString("/library/%1/cover/%2.jpg?folderCover=true").arg(libraryId).arg(comic->info.hash)); + } + else + t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png"); + + t.setVariable(QString("element%1.browse").arg(i),QString("BROWSE").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); + t.setVariable(QString("element%1.cover.browse").arg(i),QString("").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); + t.setVariable(QString("element%1.cover.browse.end").arg(i),""); + //t.setVariable(QString("element%1.url").arg(i),"/library/"+libraryName+"/folder/"+QString("%1").arg(folderContent.at(i + (page*10))->id)); + //t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id)); + + t.setVariable(QString("element%1.download").arg(i),QString("IMPORT").arg("/library/"+QString::number(libraryId)+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id))); + t.setVariable(QString("element%1.read").arg(i),""); + + t.setVariable(QString("element%1.size").arg(i),""); + t.setVariable(QString("element%1.pages").arg(i),""); + t.setVariable(QString("element%1.status").arg(i),""); } else - t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png"); - - t.setVariable(QString("element%1.browse").arg(i),QString("BROWSE").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); - t.setVariable(QString("element%1.cover.browse").arg(i),QString("").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); - t.setVariable(QString("element%1.cover.browse.end").arg(i),""); - //t.setVariable(QString("element%1.url").arg(i),"/library/"+libraryName+"/folder/"+QString("%1").arg(folderContent.at(i + (page*10))->id)); - //t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id)); - - t.setVariable(QString("element%1.download").arg(i),QString("IMPORT").arg("/library/"+QString::number(libraryId)+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id))); - t.setVariable(QString("element%1.read").arg(i),""); - - t.setVariable(QString("element%1.size").arg(i),""); - t.setVariable(QString("element%1.pages").arg(i),""); - t.setVariable(QString("element%1.status").arg(i),""); - } - else - { - t.setVariable(QString("element%1.class").arg(i),"cover"); - const ComicDB * comic = (ComicDB *)item; - t.setVariable(QString("element%1.browse").arg(i),""); - //t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/comic/"+QString("%1").arg(comic->id)); - if(!session.isComicOnDevice(comic->info.hash) && !session.isComicDownloaded(comic->info.hash)) - t.setVariable(QString("element%1.download").arg(i),QString("IMPORT").arg("/library/"+QString::number(libraryId)+"/comic/"+QString("%1").arg(comic->id))); - else if (session.isComicOnDevice(comic->info.hash)) + { + t.setVariable(QString("element%1.class").arg(i),"cover"); + const ComicDB * comic = (ComicDB *)item; + t.setVariable(QString("element%1.browse").arg(i),""); + //t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/comic/"+QString("%1").arg(comic->id)); + if(!session.isComicOnDevice(comic->info.hash) && !session.isComicDownloaded(comic->info.hash)) + t.setVariable(QString("element%1.download").arg(i),QString("IMPORT").arg("/library/"+QString::number(libraryId)+"/comic/"+QString("%1").arg(comic->id))); + else if (session.isComicOnDevice(comic->info.hash)) t.setVariable(QString("element%1.download").arg(i),QString("
IMPORTED
")); - else - t.setVariable(QString("element%1.download").arg(i),QString("
IMPORTING
")); - - //t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png"); + else + t.setVariable(QString("element%1.download").arg(i),QString("
IMPORTING
")); - t.setVariable(QString("element%1.read").arg(i),QString("READ").arg("/library/"+QString::number(libraryId)+"/comic/"+QString("%1").arg(comic->id)+"/remote")); + //t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png"); - t.setVariable(QString("element%1.image.url").arg(i),QString("/library/%1/cover/%2.jpg").arg(libraryId).arg(comic->info.hash)); + t.setVariable(QString("element%1.read").arg(i),QString("READ").arg("/library/"+QString::number(libraryId)+"/comic/"+QString("%1").arg(comic->id)+"/remote")); - t.setVariable(QString("element%1.size").arg(i),"" + QString::number(comic->info.hash.right(comic->info.hash.length()-40).toInt()/1024.0/1024.0,'f',2)+"Mb"); - if(comic->info.hasBeenOpened) - t.setVariable(QString("element%1.pages").arg(i),QString("%1/%2 pages").arg(comic->info.currentPage).arg(comic->info.numPages.toInt())); - else - t.setVariable(QString("element%1.pages").arg(i),QString("%1 pages").arg(comic->info.numPages.toInt())); + t.setVariable(QString("element%1.image.url").arg(i),QString("/library/%1/cover/%2.jpg").arg(libraryId).arg(comic->info.hash)); - if(comic->info.read) - t.setVariable(QString("element%1.status").arg(i), QString("
")); - else if(comic->info.hasBeenOpened) - t.setVariable(QString("element%1.status").arg(i), QString("
")); - else - t.setVariable(QString("element%1.status").arg(i),""); + t.setVariable(QString("element%1.size").arg(i),"" + QString::number(comic->info.hash.right(comic->info.hash.length()-40).toInt()/1024.0/1024.0,'f',2)+"Mb"); + if(comic->info.hasBeenOpened) + t.setVariable(QString("element%1.pages").arg(i),QString("%1/%2 pages").arg(comic->info.currentPage).arg(comic->info.numPages.toInt())); + else + t.setVariable(QString("element%1.pages").arg(i),QString("%1 pages").arg(comic->info.numPages.toInt())); - t.setVariable(QString("element%1.cover.browse").arg(i),""); - t.setVariable(QString("element%1.cover.browse.end").arg(i),""); - } - i++; - } + if(comic->info.read) + t.setVariable(QString("element%1.status").arg(i), QString("
")); + else if(comic->info.hasBeenOpened) + t.setVariable(QString("element%1.status").arg(i), QString("
")); + else + t.setVariable(QString("element%1.status").arg(i),""); + + t.setVariable(QString("element%1.cover.browse").arg(i),""); + t.setVariable(QString("element%1.cover.browse.end").arg(i),""); + } + i++; + } + } else + { + t.loop("element",0); + } if(numPages > 1) { diff --git a/YACReaderLibrary/server/lib/bfHttpServer/httpsessionstore.cpp b/YACReaderLibrary/server/lib/bfHttpServer/httpsessionstore.cpp index af7dc50c..87ce7d4a 100644 --- a/YACReaderLibrary/server/lib/bfHttpServer/httpsessionstore.cpp +++ b/YACReaderLibrary/server/lib/bfHttpServer/httpsessionstore.cpp @@ -14,7 +14,7 @@ HttpSessionStore::HttpSessionStore(QSettings* settings, QObject* parent) connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(timerEvent())); cleanupTimer.start(60000); cookieName=settings->value("cookieName","sessionid").toByteArray(); - expirationTime=settings->value("expirationTime",86400000).toInt(); + expirationTime=settings->value("expirationTime",864000000).toInt(); qDebug("HttpSessionStore: Sessions expire after %i milliseconds",expirationTime); } @@ -90,7 +90,9 @@ void HttpSessionStore::timerEvent() { ++i; HttpSession session=prev.value(); qint64 lastAccess=session.getLastAccess(); - if (now-lastAccess>expirationTime) { + if (now-lastAccess>expirationTime) { //TODO cleaning up will cause current opened comic to be deleted, so clients won't be able to download it + //If the cleaning occurs in the midle of a download it going to cause issues + //Temporal fix: use a big expirationTime = 10 days qDebug("HttpSessionStore: session %s expired",session.getId().data()); sessions.erase(prev); } diff --git a/release/server/docroot/css/styles_ipad.css b/release/server/docroot/css/styles_ipad.css index 8f415579..1419c4b2 100644 --- a/release/server/docroot/css/styles_ipad.css +++ b/release/server/docroot/css/styles_ipad.css @@ -5,7 +5,7 @@ body{ /* libraries */ #contentLibraries{ - width: 300px; + width: 400px; border: 1px solid #C6C6C6; background-color: white; margin-left: auto; @@ -36,7 +36,7 @@ body{ #contentLibraries .library-link { - width: 211px; + width: 311px; height: 28px; border: none; padding: 11px 0 0 0px; @@ -47,6 +47,7 @@ body{ font-size: 16px; text-decoration: none; color: #525252 ; + overflow: hidden; } #contentLibraries a diff --git a/release/server/docroot/css/styles_iphone.css b/release/server/docroot/css/styles_iphone.css index a2ef844c..200ce45f 100644 --- a/release/server/docroot/css/styles_iphone.css +++ b/release/server/docroot/css/styles_iphone.css @@ -35,7 +35,7 @@ body{ #contentLibraries .library-link { - width: 211px; + width: 65%; height: 28px; border: none; padding: 11px 0 0 0px; @@ -46,6 +46,7 @@ body{ font-size: 16px; text-decoration: none; color: #525252 ; + overflow: hidden; } #contentLibraries a