summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivetreeview.cpp50
-rw-r--r--archivetreeview.h11
-rw-r--r--filestreemodel.cpp83
-rw-r--r--filestreemodel.h1
-rw-r--r--filestreewidget.cpp8
-rw-r--r--seriestreemodel.cpp14
-rw-r--r--seriestreemodel.h1
-rw-r--r--seriestreewidget.cpp8
-rw-r--r--seriestreewidget.h1
-rw-r--r--smmodelsingleton.cpp2
10 files changed, 129 insertions, 50 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp
index d59d723..211aa37 100644
--- a/archivetreeview.cpp
+++ b/archivetreeview.cpp
@@ -11,6 +11,7 @@
#include <QVBoxLayout>
#include <QItemSelectionModel>
#include <QAbstractItemModel>
+#include <QItemSelection>
#include "archivetreeview.h"
#include "smmodelsingleton.h"
@@ -18,18 +19,22 @@
#include "seriestreewidget.h"
#include "filestreewidget.h"
#include "filestreemodel.h"
+#include "seriestreemodel.h"
ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){
// series view
mSeriesWidget = new SeriesTreeWidget;
QItemSelectionModel *selModel = mSeriesWidget->seriesTree()->selectionModel();
- connect(selModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged()));
+ connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(currentChanged(QItemSelection,QItemSelection)));
+ mSeriesModel = static_cast<SeriesTreeModel*>(SmModelSingleton::instance()->model("SeriesModel"));
// files view
mFilesWidget = new FilesTreeWidget;
- QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesTreeModel");
+ QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesModel");
mFilesModel = static_cast<FilesTreeModel*>(filesModel);
-
+ for(int i = 5; i < 11; ++i){
+ mFilesWidget->filesTree()->setColumnHidden(i, true);
+ }
// layout
QHBoxLayout *mainLayout = new QHBoxLayout;
@@ -40,13 +45,42 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){
setLayout(mainLayout);
}
-void ArchiveTreeView::currentChanged(){
- QModelIndexList sel = mSeriesWidget->seriesTree()->selectionModel()->selectedRows();
- if(sel.isEmpty()){
+void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){
+ foreach(QModelIndex i, deselected.indexes()){
+ mSelectedItems.removeAll(i);
+ }
+ foreach(QModelIndex i, selected.indexes()){
+ if(!mSelectedItems.contains(i)){
+ mSelectedItems << i;
+ }
+ }
+ if(mSelectedItems.isEmpty()){
return;
}
- mSelectedPartIds.clear();
- foreach(QModelIndex i, sel){
+ QList<int> selectedPartIds;
+ QModelIndexList realSel = mSeriesWidget->mapToSource(mSelectedItems);
+ foreach(QModelIndex i, realSel){
+ if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){
+ QList<QVariant> ids = mSeriesModel->childrenColumnList(i, SeriesTreeModel::SeriesPartId);
+ foreach(QVariant id, ids){
+ int thisId = id.toInt();
+ if(!selectedPartIds.contains(thisId)){
+ selectedPartIds << thisId;
+ }
+ }
+ }
+ if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){
+ int thisId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt();
+ if(!selectedPartIds.contains(thisId)){
+ selectedPartIds << thisId;
+ }
+ }
}
+ mFilesModel->setIds(selectedPartIds);
+ mFilesWidget->filesTree()->expandAll();
+ mFilesWidget->filesTree()->resizeColumnToContents(0);
+ mFilesWidget->filesTree()->resizeColumnToContents(1);
+ mFilesWidget->filesTree()->resizeColumnToContents(2);
+ mFilesWidget->filesTree()->resizeColumnToContents(3);
}
diff --git a/archivetreeview.h b/archivetreeview.h
index 613bdc6..9958138 100644
--- a/archivetreeview.h
+++ b/archivetreeview.h
@@ -9,12 +9,14 @@
#define ARCHIVETREEVIEW_H
#include <QWidget>
-#include <QList>
+#include <QModelIndexList>
class SmUberModel;
class SeriesTreeWidget;
class FilesTreeWidget;
class FilesTreeModel;
+class SeriesTreeModel;
+class QItemSelection;
class ArchiveTreeView : public QWidget
{
@@ -25,14 +27,17 @@ class ArchiveTreeView : public QWidget
FilesTreeWidget *filesWidget() { return mFilesWidget; }
private slots:
- void currentChanged();
+ void currentChanged(const QItemSelection &selected, const QItemSelection &deselected);
private:
//widgets
SeriesTreeWidget *mSeriesWidget;
FilesTreeWidget *mFilesWidget;
- QList<int> mSelectedPartIds;
FilesTreeModel *mFilesModel;
+ SeriesTreeModel *mSeriesModel;
+
+ //lists
+ QModelIndexList mSelectedItems;
};
#endif
diff --git a/filestreemodel.cpp b/filestreemodel.cpp
index 27d93df..87c1e8d 100644
--- a/filestreemodel.cpp
+++ b/filestreemodel.cpp
@@ -15,8 +15,6 @@
FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){
mDb = QSqlDatabase::database("treedb");
- mFilesQuery = new QSqlQuery(mDb);
- mFilesQuery->prepare("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id FROM files where iseriesparts_id = :id ORDER BY tfilename, sifileno");
mUpdateDvdQuery = new QSqlQuery(mDb);
mUpdateDvdQuery->prepare("UPDATE files SET idvd = :dvd WHERE ifiles_id = :id");
mUpdateQualityQuery = new QSqlQuery(mDb);
@@ -24,7 +22,6 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo
}
FilesTreeModel::~FilesTreeModel(){
- delete mFilesQuery;
delete mUpdateDvdQuery;
mDb = QSqlDatabase();
}
@@ -38,39 +35,40 @@ void FilesTreeModel::setIds(const QList<int> &seriesPartIds){
covers->setData(FileName, tr("Covers"));
root->appendChild(covers);
QLocale l;
+ QStringList ids;
foreach(int s, seriesPartIds){
- mFilesQuery->bindValue(":id", s);
- if(mFilesQuery->exec()){
- while(mFilesQuery->next()){
- QList<QVariant> data;
- data << mFilesQuery->value(1); //filename
- data << mFilesQuery->value(6); //partno
- data << l.toString(mFilesQuery->value(3).toLongLong()); //displaysize
- data << mFilesQuery->value(7); //quality
- data << mFilesQuery->value(4); //dvdno
- data << Helper::createArchivePath(mFilesQuery->value(1).toString(), mFilesQuery->value(2).toString()); //fullpath
- data << mFilesQuery->value(3); //size
- data << mFilesQuery->value(5); //filetype
- data << mFilesQuery->value(2); //md5sum
- data << mFilesQuery->value(0); //seriesparts_id
- data << mFilesQuery->value(8); //files_id
- switch(mFilesQuery->value(5).toInt()){
- case Movie:{
- SmTreeItem *item = new SmTreeItem(data, files);
- files->appendChild(item);
- break;
- }
- case FrontCover:
- case BackCover:
- case GeneralCover:{
- SmTreeItem *item = new SmTreeItem(data, covers);
- covers->appendChild(item);
- break;
- }
- default:
- ;
- }
+ ids << QString::number(s);
+ }
+ QString query = QString("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id FROM files WHERE iseriespart_id IN (%1) ORDER BY tfilename, sifileno ASC").arg(ids.join(","));
+ QSqlQuery filesQuery(query, mDb);
+ while(filesQuery.next()){
+ QList<QVariant> data;
+ data << filesQuery.value(1); //filename
+ data << filesQuery.value(6); //partno
+ data << l.toString(filesQuery.value(3).toLongLong()); //displaysize
+ data << filesQuery.value(7); //quality
+ data << filesQuery.value(4); //dvdno
+ data << Helper::createArchivePath(filesQuery.value(1).toString(), filesQuery.value(2).toString()); //fullpath
+ data << filesQuery.value(3); //size
+ data << filesQuery.value(5); //filetype
+ data << filesQuery.value(2); //md5sum
+ data << filesQuery.value(0); //seriesparts_id
+ data << filesQuery.value(8); //files_id
+ switch(filesQuery.value(5).toInt()){
+ case Movie:{
+ SmTreeItem *item = new SmTreeItem(data, files);
+ files->appendChild(item);
+ break;
}
+ case FrontCover:
+ case BackCover:
+ case GeneralCover:{
+ SmTreeItem *item = new SmTreeItem(data, covers);
+ covers->appendChild(item);
+ break;
+ }
+ default:
+ ;
}
}
setRoot(root);
@@ -85,10 +83,13 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{
if(role == Qt::DisplayRole){
if(index.column() == DvdNo){
- if(index.data().toInt() == -1){
+ if(index.data(FileTypeRole) == QVariant()){
+ return QVariant();
+ }
+ if(item->data(DvdNo).toInt() == -1){
return QString(tr("(local)"));
}else{
- QString retval = QString(tr("DVD #%1")).arg(index.data().toInt());
+ QString retval = QString(tr("DVD #%1")).arg(item->data(DvdNo).toInt());
return retval;
}
}
@@ -102,6 +103,11 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{
return QIcon(":/dildo.png");
}
}
+ if(role == Qt::TextAlignmentRole){
+ if(index.column() > 0 && index.column() < 4){
+ return Qt::AlignRight;
+ }
+ }
if(role == FileNameRole){
return item->data(FileName);
}
@@ -168,9 +174,12 @@ bool FilesTreeModel::setData(const QModelIndex &index, const QVariant &value, in
}
Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{
- if(!index.isValid() || index.data(FileTypeRole) == QVariant()){
+ if(!index.isValid()){
return 0;
}
+ if(index.data(FileTypeRole) == QVariant()){
+ return Qt::ItemIsEnabled;
+ }
Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if(index.column() == DvdNo || index.column() == Quality){
return retval | Qt::ItemIsEditable;
diff --git a/filestreemodel.h b/filestreemodel.h
index 0db1f39..97ae239 100644
--- a/filestreemodel.h
+++ b/filestreemodel.h
@@ -32,7 +32,6 @@ class FilesTreeModel : public SmTreeModel {
private:
QSqlDatabase mDb;
- QSqlQuery *mFilesQuery;
QSqlQuery *mUpdateDvdQuery;
QSqlQuery *mUpdateQualityQuery;
};
diff --git a/filestreewidget.cpp b/filestreewidget.cpp
index 5b1211d..e8afe7c 100644
--- a/filestreewidget.cpp
+++ b/filestreewidget.cpp
@@ -5,14 +5,22 @@
2 of the License, or (at your option) any later version.
*/
+#include <QHBoxLayout>
+
#include "filestreewidget.h"
#include "smmodelsingleton.h"
#include "filestreemodel.h"
FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent){
+ //the view
mView = new FilesTreeView;
mModel = static_cast<FilesTreeModel*>(SmModelSingleton::instance()->model("FilesModel"));
mView->setModel(mModel);
+
+ //layout
+ QHBoxLayout *mainLayout = new QHBoxLayout;
+ mainLayout->addWidget(mView);
+ setLayout(mainLayout);
}
FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent) {}
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp
index 122c163..2cda1d0 100644
--- a/seriestreemodel.cpp
+++ b/seriestreemodel.cpp
@@ -141,6 +141,19 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i
return false;
}
+QList<QVariant> SeriesTreeModel::childrenColumnList(const QModelIndex &parent, int column) const{
+ if(!parent.isValid()){
+ return QList<QVariant>();
+ }
+ SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer());
+ QList<QVariant> retval;
+ for(int i = 0; i < item->childCount(); ++i){
+ SmTreeItem *child = item->child(i);
+ retval << child->data(column);
+ }
+ return retval;
+}
+
QModelIndex SeriesTreeModel::findValue(const QVariant &value, const QModelIndex &parent, int column) const{
SmTreeItem *parentItem = root();
if(parent != QModelIndex()){
@@ -199,6 +212,7 @@ QFileInfoList SeriesTreeModel::findMovies(const QModelIndexList &from) const{
return retval;
}
+
bool SeriesTreeModel::deleteFromSeries(const QModelIndex &what){
int nodeType = what.data(TypeRole).toInt();
QSqlQuery *query = 0;
diff --git a/seriestreemodel.h b/seriestreemodel.h
index 6d88535..67be97c 100644
--- a/seriestreemodel.h
+++ b/seriestreemodel.h
@@ -29,6 +29,7 @@ class SeriesTreeModel : public SmTreeModel {
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
+ QList<QVariant> childrenColumnList(const QModelIndex &parent, int column) const;
//find
QModelIndex findValue(const QVariant &value, const QModelIndex &parent = QModelIndex(), int column = 0) const;
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp
index 5415655..a8e13d4 100644
--- a/seriestreewidget.cpp
+++ b/seriestreewidget.cpp
@@ -60,6 +60,14 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
}
+QModelIndexList SeriesTreeWidget::mapToSource(const QModelIndexList &indexes) const{
+ QModelIndexList retval;
+ foreach(QModelIndex i, indexes){
+ retval << mProxy->mapToSource(i);
+ }
+ return retval;
+}
+
void SeriesTreeWidget::newSeries(){
QList<QVariant> data;
data << tr("<New series>") << QVariant() << QVariant() << QVariant() << SeriesTreeModel::NewSeries;
diff --git a/seriestreewidget.h b/seriestreewidget.h
index 972d7d9..bfeedf6 100644
--- a/seriestreewidget.h
+++ b/seriestreewidget.h
@@ -24,6 +24,7 @@ class SeriesTreeWidget : public QWidget {
public:
explicit SeriesTreeWidget(QWidget *parent = 0);
SeriesTreeView *seriesTree() { return mView; }
+ QModelIndexList mapToSource(const QModelIndexList &indexes) const;
public slots:
void newSeries();
diff --git a/smmodelsingleton.cpp b/smmodelsingleton.cpp
index d850c9d..08cbbba 100644
--- a/smmodelsingleton.cpp
+++ b/smmodelsingleton.cpp
@@ -46,7 +46,7 @@ QAbstractItemModel *SmModelSingleton::model(const QString &which){
}
}else if(which == "FilesModel"){
if(!mModels.contains(which)){
- QStringList headers = QStringList() << tr("Name") << tr("P") << tr("Size") << tr("Q") << tr("DvdNo") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID");
+ QStringList headers = QStringList() << tr("Name") << tr("Part") << tr("Size") << tr("Qual.") << tr("Dvd") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID");
FilesTreeModel *model = new FilesTreeModel(headers);
mModels.insert(which, model);
}