From 7ad391f932c9ec33cccf49eff8996ccaf2d303d5 Mon Sep 17 00:00:00 2001 From: Arno Date: Thu, 24 Jun 2010 21:26:44 +0200 Subject: Made FilesTreeWidget work It wasn't as easy as I thought. Quite big changes: 1. I changed the query for setIds in FilesTreeModel. Initially it executed a database query for every id. Changed it to WHERE seriespart_id IN (ids). I didn't have a chance to test the first version, but this one is blazing fast. 2. Fixed a recursio ad infinitum in FilesTreeModel. This happens if you call data() from data(). Either use the *item or use a role different from what you've been called. 3. Introduce a new function in SeriesTreeModel: QList childrenColumnList. It returns a QList from the children values of the given column. 4. Lot's of UI changes. Hide unneded columns, align the remaining ones properly. What doesn't work: we can't let the database do the sorting of files. We need a proxy for this. --- archivetreeview.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) (limited to 'archivetreeview.cpp') diff --git a/archivetreeview.cpp b/archivetreeview.cpp index d59d723..211aa37 100644 --- a/archivetreeview.cpp +++ b/archivetreeview.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #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(SmModelSingleton::instance()->model("SeriesModel")); // files view mFilesWidget = new FilesTreeWidget; - QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesTreeModel"); + QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesModel"); mFilesModel = static_cast(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 selectedPartIds; + QModelIndexList realSel = mSeriesWidget->mapToSource(mSelectedItems); + foreach(QModelIndex i, realSel){ + if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){ + QList 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); } -- cgit v1.2.3-70-g09d2