summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2012-09-30 04:34:22 +0200
committerArno <am@disconnect.de>2012-09-30 04:34:22 +0200
commit887c2cd696c54af0cd6fdd54950d006626afeacc (patch)
tree2ad296208a7d8e44ac249612dfcd09919e7ba07d
parent5addc8a8ec89c1e354949bcf5c3152fea4fe44b9 (diff)
downloadSheMov-887c2cd696c54af0cd6fdd54950d006626afeacc.tar.gz
SheMov-887c2cd696c54af0cd6fdd54950d006626afeacc.tar.bz2
SheMov-887c2cd696c54af0cd6fdd54950d006626afeacc.zip
Foremost a fix for SmTreeModel
Not working again, but I eventually have to commit the changes. Fixes to SmTreeModel: * Fix SmTreeModel::index(). The previous comment was quite valid. I'm surprised that it worked at all. I have no clue why to return an invalid QModelIndex if the column isn't 0. Now an index with any valid column number can be created. * Fix SmTreeModel::parent(). Again, why shouldn't we create a parent index with a column other than 0? No idea... * Fix SmTreeModel::headerData(). Add some sanity checks. * Fix SmTreeModel::findRecursive(). Well, what is there to say. It never worked for models with a depth > 1, but obviously it didn't really matter until now. To make it work I had to change SmTreeItem as well. SmTreeItem::next() returns the next valid parent/sibling, or 0 if there isn't one. There may be some fallout from these changes, but they're yet to be seen. Changes to PictureView: * fix selecting an item according to the new datasbase layout * same goes for editing items. If an update actually works has to be checked. Overall, it's an intermediate commit that should have been a sane series of commits. Can't be changed now...
-rw-r--r--mappingtreemodel.cpp48
-rw-r--r--mappingtreemodel.h2
-rw-r--r--mappingtreewidget.cpp34
-rw-r--r--mappingtreewidget.h2
-rw-r--r--pictureswidget.cpp49
-rw-r--r--pictureswidget.h4
-rw-r--r--pictureviewer2.cpp1
-rw-r--r--propertiesdialog.cpp4
-rw-r--r--seriestreemodel.cpp3
-rw-r--r--seriestreewidget.cpp19
-rw-r--r--smtreeitem.cpp11
-rw-r--r--smtreeitem.h1
-rw-r--r--smtreemodel.cpp74
-rw-r--r--smtreemodel.h3
14 files changed, 180 insertions, 75 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp
index 9bb278d..ff7d7d3 100644
--- a/mappingtreemodel.cpp
+++ b/mappingtreemodel.cpp
@@ -11,6 +11,8 @@
#include <algorithm>
+#include <QDebug>
+
#include "mappingtreemodel.h"
#include "smtreeitem.h"
@@ -148,7 +150,7 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{
}
QList<QVariant> MappingTreeModel::childList(const QVariant &value, int column) const{
- QModelIndex itemIdx = findRecursive(value, column, createIndex(0, 0, root()));
+ QModelIndex itemIdx = findRecursive(value, column, createIndex(0, column, root()));
SmTreeItem *item = static_cast<SmTreeItem*>(itemIdx.internalPointer());
if(item){
if(item->childCount()){
@@ -169,6 +171,23 @@ QList<QVariant> MappingTreeModel::mappingsForFile(const QVariant &fileId) const{
return retval;
}
+QStringList MappingTreeModel::path(QModelIndex &idx) const{
+ if(!idx.isValid()){
+ return QStringList();
+ }
+ QStringList retval;
+ SmTreeItem *item = static_cast<SmTreeItem*>(idx.internalPointer());
+ do {
+ QString d = item->data(MappingTreeModel::Name).toString();
+ if(!d.isEmpty()){
+ retval << d;
+ }
+ item = item->parent();
+ }while(item);
+ std::reverse(retval.begin(), retval.end());
+ return retval;
+}
+
QModelIndex MappingTreeModel::indexFromPath(const QString &path, int column) const{
QStringList items = path.split("/");
if(items.isEmpty() || column >= NumFields){
@@ -362,14 +381,37 @@ int MappingTreeModel::childCount(const QModelIndex &idx) const{
return item->childCount();
}
+MappingData MappingTreeModel::mappingDataFromIndex(QModelIndex &idx) const{
+ MappingData retval = { -1, QString(), QStringList() };
+ if(!idx.isValid()){
+ return retval;
+ }
+ retval.id = idx.data(MappingTreeModel::IdRole).toInt();
+ retval.name = idx.data(MappingTreeModel::NameRole).toString();
+ retval.path = path(idx);
+ return retval;
+}
+
+//continue here!
MappingData MappingTreeModel::mappingDataFromId(int mappingId) const{
MappingData retval = { -1, QString(), QStringList() };
- foreach(MappingData d, mValidMappings){
+ QModelIndex mapIdx = findRecursive(mappingId, MappingTreeModel::Id, rootIndex());
+ //REMOVE ME
+ Q_ASSERT(mapIdx.isValid());
+ retval.id = mappingId;
+ retval.name = mapIdx.data(MappingTreeModel::NameRole).toString();
+ qDebug() << "mapping" << retval.id << retval.name;
+ SmTreeItem *mapItem = static_cast<SmTreeItem*>(mapIdx.internalPointer());
+ //REMOVE ME
+ Q_ASSERT(mapItem);
+ //retval.path = path(mapItem);
+
+ /*foreach(MappingData d, mValidMappings){
if(d.id == mappingId){
retval = d;
break;
}
- }
+ }*/
return retval;
}
diff --git a/mappingtreemodel.h b/mappingtreemodel.h
index 4b45f09..f2771c9 100644
--- a/mappingtreemodel.h
+++ b/mappingtreemodel.h
@@ -40,6 +40,7 @@ class MappingTreeModel : public SmTreeModel {
QVariant data(const QModelIndex &index, int role) const;
QList<QVariant> childList(const QVariant &value, int column = 0) const;
QList<QVariant> mappingsForFile(const QVariant &fileId) const;
+ QStringList path(QModelIndex &idx) const;
QModelIndex indexFromPath(const QString &path, int column = 0) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
void move(const QModelIndex &source, const QModelIndex &dest);
@@ -48,6 +49,7 @@ class MappingTreeModel : public SmTreeModel {
bool addChild(const QVariant &name, const QModelIndex &parent);
bool deleteChild(const QModelIndex &idx);
int childCount(const QModelIndex &idx) const;
+ MappingData mappingDataFromIndex(QModelIndex &idx) const;
MappingData mappingDataFromId(int mappingId) const;
QStringList paths() const;
const QString &forbidden() const { return mForbidden; }
diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp
index e4e9e76..82a1490 100644
--- a/mappingtreewidget.cpp
+++ b/mappingtreewidget.cpp
@@ -92,28 +92,13 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){
}
MappingData MappingTreeWidget::selectedItem() const {
- MappingData retval;
+ MappingData retval = { -1, QString(), QStringList() };
QModelIndex sel = selected();
if(!sel.isValid()){
- retval.id = -1;
- }else{
- QModelIndex real = mProxy->mapToSource(sel);
- if(mModel->childCount(real)){
- retval.id = -1;
- }else{
- retval.id = sel.data(MappingTreeModel::IdRole).toInt();
- }
- retval.name = sel.data(MappingTreeModel::NameRole).toString();
- QStringList p;
- QModelIndex parent = sel;
- while(parent.isValid()){
- p << parent.data().toString();
- parent = parent.parent();
- }
- std::reverse(p.begin(), p.end());
- retval.path = p;
+ return retval;
}
- return retval;
+ QModelIndex real = mProxy->mapToSource(sel);
+ return mModel->mappingDataFromIndex(real);
}
void MappingTreeWidget::addChild(){
@@ -308,17 +293,18 @@ void MappingEditWidget::removeMapping(){
mResultModel->removeRows(firstIdx.row(), 1, firstIdx.parent());
}
-void MappingEditWidget::setMappings(const QList<int> &mappings){
+void MappingEditWidget::setMappings(const QList<MappingData> &mappings){
if(mappings.isEmpty()){
return;
}
- MappingTreeModel *mModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
+ //MappingTreeModel *mModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
mResultModel->clearData();
- foreach(int i, mappings){
- MappingData curData = mModel->mappingDataFromId(i);
+ foreach(MappingData d, mappings){
+ mResultModel->addItem(d);
+ /*MappingData curData = mModel->mappingDataFromId(i);
if(curData.id != -1){
mResultModel->addItem(curData);
- }
+ }*/
}
mMappingResult->expandAll();
}
diff --git a/mappingtreewidget.h b/mappingtreewidget.h
index ae0f81e..60bbecc 100644
--- a/mappingtreewidget.h
+++ b/mappingtreewidget.h
@@ -88,7 +88,7 @@ class MappingEditWidget : public QWidget {
public slots:
void addMapping();
void removeMapping();
- void setMappings(const QList<int> &mappings);
+ void setMappings(const QList<MappingData> &mappings);
private:
MappingTreeWidget *mMappingTree;
diff --git a/pictureswidget.cpp b/pictureswidget.cpp
index d5caa76..bc4b143 100644
--- a/pictureswidget.cpp
+++ b/pictureswidget.cpp
@@ -72,8 +72,13 @@ void PicturesWidget::readSettings(){
}
void PicturesWidget::editMappings(){
- QList<int> currentMappings = mPictureView->fileMappings();
- mEditDialog->editWidget()->setMappings(currentMappings);
+ QModelIndexList selectedFids = mPictureView->selectionModel()->selectedRows(PicFilesModel::Id);
+ QList<int> fileIds;
+ foreach(QModelIndex idx, selectedFids){
+ fileIds << idx.data().toInt();
+ }
+ QList<MappingData> mappings = mPictureView->filesModel()->mappingDataFromFiles(fileIds);
+ mEditDialog->editWidget()->setMappings(mappings);
int retval = mEditDialog->exec();
if(retval == QDialog::Accepted){
QList<int> selMappings = mEditDialog->editWidget()->mappingIds();
@@ -272,12 +277,14 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr
//setup database
mDb = QSqlDatabase::database("treedb");
mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename");
+ mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.ipics_id IN (%1)");
mDeleteFileQ = new QSqlQuery(mDb);
mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id");
mDeleteMappingsQ = new QSqlQuery(mDb);
- mDeleteMappingsQ->prepare("DELETE FROM pics_mappings WHERE ipics_id = :id");
+ mDeleteMappingsQ->prepare("DELETE FROM pics_mappings2 WHERE ipics_id = :id");
mAddMappingsQ = new QSqlQuery(mDb);
- mAddMappingsQ->prepare("INSERT INTO pics_mappings(ipics_id, imapping_id) VALUES(:pid, :id)");
+ mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imapping_id) VALUES(:pid, :id)");
+
}
PicFilesModel::~PicFilesModel(){
@@ -399,6 +406,40 @@ bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &
return false;
}
+QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) const{
+ QList<int> parentIds = mappingPIdsFromFiles(fileIds);
+ if(parentIds.isEmpty()){
+ return QList<MappingData>();
+ }
+ QList<MappingData> retval;
+ foreach(int pId, parentIds){
+ QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex());
+ MappingData curData;
+ curData.id = curIdx.data(MappingTreeModel::IdRole).toInt();
+ curData.name = curIdx.data(MappingTreeModel::NameRole).toString();
+ curData.path = mMappingTreeModel->path(curIdx);
+ retval << curData;
+ }
+ return retval;
+}
+
+QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{
+ if(fileIds.isEmpty()){
+ return QList<int>();
+ }
+ QStringList idList;
+ foreach(int id, fileIds){
+ idList << QString::number(id);
+ }
+ QString query = mMappingsQS.arg(idList.join(","));
+ QSqlQuery q(query, mDb);
+ QList<int> retval;
+ while(q.next()){
+ retval << q.value(0).toInt();
+ }
+ return retval;
+}
+
void PicFilesModel::populate(){
SmTreeItem *root = new SmTreeItem(NumFields);
QStringList idList;
diff --git a/pictureswidget.h b/pictureswidget.h
index cc1578d..b2da8ea 100644
--- a/pictureswidget.h
+++ b/pictureswidget.h
@@ -28,6 +28,7 @@ class QEvent;
class HoverWindow;
class PictureViewer2;
class QAction;
+struct MappingData;
class PicturesWidget : public QWidget {
Q_OBJECT
@@ -119,14 +120,17 @@ class PicFilesModel : public SmTreeModel {
QList<QList<QVariant> > allFiles() const;
void removeFiles(const QList<QPersistentModelIndex> &files);
bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds);
+ QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const;
public slots:
void populate();
private:
+ QList<int> mappingPIdsFromFiles(QList<int> fileIds) const;
QSqlDatabase mDb;
MappingTreeModel *mMappingTreeModel;
QString mPopulateQS;
+ QString mMappingsQS;
QSqlQuery *mDeleteFileQ;
QSqlQuery *mDeleteMappingsQ;
QSqlQuery *mAddMappingsQ;
diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp
index bf2dbce..36701ff 100644
--- a/pictureviewer2.cpp
+++ b/pictureviewer2.cpp
@@ -306,6 +306,7 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){
mScene->addItem(mFnItem);
}
+//FIXME!
void PictureViewer2::constructMappingItem(const PicData &file){
MappingTreeModel *mappingModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
QList<QVariant> mappings = mappingModel->mappingsForFile(file.at(PicFilesModel::Id));
diff --git a/propertiesdialog.cpp b/propertiesdialog.cpp
index 485df6b..2068cdf 100644
--- a/propertiesdialog.cpp
+++ b/propertiesdialog.cpp
@@ -66,7 +66,7 @@ void PropertiesDialog::populate(int seriesPartId){
mDisplayModel->setRoot(root);
//setup caption
- QModelIndex seriesIdx = mSeriesModel->findRecursive(seriesPartId, SeriesTreeModel::SeriesPartId, QModelIndex());
+ QModelIndex seriesIdx = mSeriesModel->findRecursive(seriesPartId, SeriesTreeModel::SeriesPartId, mSeriesModel->rootIndex());
Q_ASSERT(seriesIdx.isValid());
QString captionString = QString(tr("Properties for %1")).arg(mSeriesModel->index(seriesIdx.row(), SeriesTreeModel::Name, seriesIdx.parent()).data().toString());
mCaption->setText(captionString);
@@ -88,7 +88,7 @@ void PropertiesDialog::showPicture(QModelIndex current, QModelIndex previous){
QPixmap pic = SmGlobals::instance()->frameCache()->entry(current.data().toString());
mPictureLabel->setPixmap(pic);
}else if(nodeType == PictureFileNode){
- QModelIndex fileIdx = mFilesModel->findRecursive(fileId, FilesTreeModel::FilesId, mFilesModel->index(0, 0, QModelIndex()));
+ QModelIndex fileIdx = mFilesModel->findRecursive(fileId, FilesTreeModel::FilesId, mFilesModel->rootIndex());
if(fileIdx.isValid()){
QString fullPath = fileIdx.data(FilesTreeModel::FullPathRole).toString();
mPictureLabel->setPixmap(fullPath);
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp
index 2319c51..c8260c4 100644
--- a/seriestreemodel.cpp
+++ b/seriestreemodel.cpp
@@ -526,6 +526,9 @@ void SeriesTreeModel::readSettings(){
}
void SeriesTreeModel::conditionalUpdate(const QModelIndex &parent, int field, const QVariant &value){
+ if(!parent.isValid()){
+ return;
+ }
SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer());
if(item->childCount() > 0){
//series
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp
index 1f96a11..2a487fb 100644
--- a/seriestreewidget.cpp
+++ b/seriestreewidget.cpp
@@ -68,12 +68,12 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
mView = new SeriesTreeView;
mProxy = new SeriesTreeSortModel(this);
mModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel"));
- mProxy->setSourceModel(mModel);
- mView->setModel(mProxy);
- mView->setSortingEnabled(true);
- for(int i = 1; i < SeriesTreeModel::NumFields; ++i){
+ mProxy->setSourceModel(mModel);
+ mView->setModel(mProxy);
+ mView->setSortingEnabled(true);
+ for(int i = 1; i < SeriesTreeModel::NumFields; ++i){
mView->setColumnHidden(i, true);
- }
+ }
mView->resizeColumnToContents(0);
mView->setSelectionMode(QAbstractItemView::ExtendedSelection);
mView->setEditTriggers(QAbstractItemView::NoEditTriggers);
@@ -495,9 +495,14 @@ bool SeriesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &r
}
bool SeriesTreeSortModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
- SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(sourceModel());
+ SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(sourceModel());
int rowFilter = seriesModel->rowFilter();
- QModelIndex curIdx = sourceModel()->index(source_row, 0, source_parent);
+ /*QModelIndex parent = source_parent;
+ if(!parent.isValid()){
+ parent = seriesModel->rootIndex();
+ }*/
+ QModelIndex curIdx = sourceModel()->index(source_row, 0, source_parent);
+ //QModelIndex curIdx = source_parent;
QString name = curIdx.data(SeriesTreeModel::NameRole).toString();
QRegExp filterRe = filterRegExp();
if(rowFilter == SeriesTreeModel::All){
diff --git a/smtreeitem.cpp b/smtreeitem.cpp
index ed9f73e..ab5e636 100644
--- a/smtreeitem.cpp
+++ b/smtreeitem.cpp
@@ -42,6 +42,17 @@ SmTreeItem *SmTreeItem::child(int row) const{
return 0;
}
+SmTreeItem *SmTreeItem::next() const{
+ int pos = row();
+ if(pos + 1 < parent()->childCount()){
+ return parent()->child(pos + 1);
+ }
+ if(parent() == 0){
+ return 0;
+ }
+ return parent()->next();
+}
+
int SmTreeItem::childCount() const{
return mChildren.count();
}
diff --git a/smtreeitem.h b/smtreeitem.h
index b0b9ca7..61e121e 100644
--- a/smtreeitem.h
+++ b/smtreeitem.h
@@ -19,6 +19,7 @@ class SmTreeItem {
~SmTreeItem();
void appendChild(SmTreeItem *child);
SmTreeItem *child(int row) const;
+ SmTreeItem *next() const;
int childCount() const;
int columnCount() const;
int row() const;
diff --git a/smtreemodel.cpp b/smtreemodel.cpp
index 7df30d3..98fa4c8 100644
--- a/smtreemodel.cpp
+++ b/smtreemodel.cpp
@@ -9,6 +9,8 @@
#include <QSettings>
#include <QBrush>
+#include <QDebug>
+
#include "smtreemodel.h"
#include "smtreeitem.h"
#include "smglobals.h"
@@ -40,16 +42,20 @@ int SmTreeModel::columnCount(const QModelIndex &parent) const{
}
QModelIndex SmTreeModel::index(int row, int column, const QModelIndex &parent) const{
- //this is totally bogus! Why? Tentatively leaving it in for now...
- if(parent.isValid() && (parent.column() != 0)){
- return QModelIndex();
+ // return child from root if parent is invalid
+ // this was difficult to figure this out!
+ if(!parent.isValid()){
+ return createIndex(row, column, mRootItem->child(row));
}
- SmTreeItem *parentItem = itemAt(parent);
- SmTreeItem *childItem = parentItem->child(row);
- if(childItem){
- return createIndex(row, column, childItem);
- }
- return QModelIndex();
+ SmTreeItem *parentItem = static_cast<SmTreeItem*>(parent.internalPointer());
+ if( (parentItem == 0) ||
+ (row < 0) ||
+ (column < 0) ||
+ (row >= parentItem->childCount()) ||
+ (column > parentItem->columnCount())){
+ return QModelIndex();
+ }
+ return createIndex(row, column, parentItem->child(row));
}
QModelIndex SmTreeModel::parent(const QModelIndex &child) const{
@@ -57,13 +63,13 @@ QModelIndex SmTreeModel::parent(const QModelIndex &child) const{
return QModelIndex();
}
- SmTreeItem *childItem = itemAt(child);
+ SmTreeItem *childItem = static_cast<SmTreeItem*>(child.internalPointer());
SmTreeItem *parentItem = childItem->parent();
- if(parentItem == mRootItem){
+ if(parentItem == 0){
return QModelIndex();
}
- return createIndex(parentItem->row(), 0, parentItem);
+ return createIndex(parentItem->row(), child.column(), parentItem);
}
Qt::ItemFlags SmTreeModel::flags(const QModelIndex &index) const{
@@ -74,7 +80,7 @@ Qt::ItemFlags SmTreeModel::flags(const QModelIndex &index) const{
}
QVariant SmTreeModel::headerData(int section, Qt::Orientation orientation, int role) const{
- if((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)){
+ if((orientation == Qt::Horizontal) && (role == Qt::DisplayRole) && (section > -1) && (section < mHeaders.count())){
return mHeaders.at(section);
}
return QVariant();
@@ -142,30 +148,28 @@ QModelIndex SmTreeModel::find(const QVariant &value, int column, const QModelInd
return QModelIndex();
}
-QModelIndex SmTreeModel::findRecursive(const QVariant &value, int column, const QModelIndex &parent) const{
- SmTreeItem *parentItem = 0;
- if(!parent.isValid()){
- parentItem = mRootItem;
- }else{
- parentItem = static_cast<SmTreeItem*>(parent.internalPointer());
- }
- if(parentItem->data(column) == value){
- return parent;
+QModelIndex SmTreeModel::findRecursive(const QVariant &value, int column, const QModelIndex &start) const{
+ if(!start.isValid()){
+ return QModelIndex();
}
- for(int i = 0; i < parentItem->childCount(); ++i){
- SmTreeItem *child = parentItem->child(i);
+ SmTreeItem *startItem = static_cast<SmTreeItem*>(start.internalPointer());
+ if(startItem->data(column) == value){
+ return start;
+ }
+ for(int i = 0; i < startItem->childCount(); ++i){
+ SmTreeItem *child = startItem->child(i);
if(child->data(column) == value){
return createIndex(i, column, child);
}
- if(child->childCount()){
- return findRecursive(value, column, createIndex(i, column, child));
- }
- }
- QModelIndex next = index(parent.row() + 1, column, parent.parent());
- if(!next.isValid()){
- return QModelIndex();
- }
- return findRecursive(value, column, next);
+ if(child->childCount()){
+ return findRecursive(value, column, createIndex(i, column, child));
+ }
+ }
+ SmTreeItem *next = startItem->next();
+ if(next){
+ return findRecursive(value, column, createIndex(next->row(), column, next));
+ }
+ return QModelIndex();
}
bool SmTreeModel::setRoot(SmTreeItem *rootItem){
@@ -179,6 +183,10 @@ bool SmTreeModel::setRoot(SmTreeItem *rootItem){
return false;
}
+QModelIndex SmTreeModel::rootIndex() const {
+ return createIndex(0, 0, mRootItem);
+}
+
SmTreeItem *SmTreeModel::parentItem(const QModelIndex &child) const{
QModelIndex parent = child.parent();
if(parent == QModelIndex()){
diff --git a/smtreemodel.h b/smtreemodel.h
index 515f7b3..7037e4c 100644
--- a/smtreemodel.h
+++ b/smtreemodel.h
@@ -37,11 +37,12 @@ class SmTreeModel : public QAbstractItemModel {
virtual QVariant data(const QModelIndex &index, int role) const;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
virtual QModelIndex find(const QVariant &value, int column = 0, const QModelIndex &parent = QModelIndex()) const;
- virtual QModelIndex findRecursive(const QVariant &value, int column = 0, const QModelIndex &parent = QModelIndex()) const;
+ virtual QModelIndex findRecursive(const QVariant &value, int column, const QModelIndex &start) const;
// root + parent item
bool setRoot(SmTreeItem *rootItem);
SmTreeItem *root() const { return mRootItem; }
+ QModelIndex rootIndex() const;
SmTreeItem *parentItem(const QModelIndex &child) const;
void reparent(const QModelIndex &idx, const QModelIndex &newParent, bool sorted = false);