diff options
-rw-r--r-- | mappingtreemodel.cpp | 56 | ||||
-rw-r--r-- | mappingtreemodel.h | 5 | ||||
-rw-r--r-- | pictureswidget.cpp | 44 | ||||
-rw-r--r-- | pictureswidget.h | 15 |
4 files changed, 120 insertions, 0 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index 4cd3f29..8872d45 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -94,6 +94,12 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{ if(role == AddedRole){ return item->data(Added); } + if(role == Qt::ForegroundRole){ + int id = item->data(Id).toInt(); + if(mSelectedMappings.contains(id)){ + return QColor(Qt::blue); + } + } return SmTreeModel::data(index, role); } @@ -180,6 +186,8 @@ bool MappingTreeModel::addChild(const QVariant &name, const QModelIndex &parent) mAddParentQ->bindValue(":parentid", pItem->data(Id)); mAddParentQ->exec(); } + mValidMappings.clear(); + mValidMappings = mappingData(root()); return true; } } @@ -197,6 +205,8 @@ bool MappingTreeModel::deleteChild(const QModelIndex &idx){ mDeleteChildQ->bindValue(":id", item->data(Id)); if(mDeleteChildQ->exec()){ removeRows(idx.row(), 1, idx.parent()); + mValidMappings.clear(); + mValidMappings = mappingData(root()); return true; } return false; @@ -210,6 +220,30 @@ int MappingTreeModel::childCount(const QModelIndex &idx) const{ return item->childCount(); } +MappingData MappingTreeModel::mappingDataFromId(int mappingId) const{ + MappingData retval = { -1, QString(), QStringList() }; + foreach(MappingData d, mValidMappings){ + if(d.id == mappingId){ + retval = d; + break; + } + } + return retval; +} + +void MappingTreeModel::setSelectedMappings(const QList<int> &mappingIds){ + mSelectedMappings = mappingIds; + /*foreach(int id, mappingIds){ + QModelIndex idx = findRecursive(id, Id); + if(idx.isValid()){ + emit dataChanged(idx, idx); + } + }*/ + beginResetModel(); + endResetModel(); + emit needExpansion(); +} + void MappingTreeModel::populate(){ if(mType == -1){ return; @@ -231,6 +265,8 @@ void MappingTreeModel::populate(){ getChildrenRecursive(childItem); } setRoot(rootItem); + mValidMappings.clear(); + mValidMappings = mappingData(root()); emit needExpansion(); } } @@ -274,6 +310,26 @@ int MappingTreeModel::lowerBound(SmTreeItem *item, const QVariant &value, int co return item->childCount(); } +QList<MappingData> MappingTreeModel::mappingData(SmTreeItem *item){ + QList<MappingData> retval; + if(item->childCount() > 0){ + for(int i = 0; i < item->childCount(); ++i){ + retval << mappingData(item->child(i)); + } + } + MappingData mapItem = { item->data(Id).toInt(), item->data(Name).toString(), QStringList() }; + QStringList path; + SmTreeItem *p = item; + while(p->parent()){ + path << p->data(Name).toString(); + p = p->parent(); + } + std::reverse(path.begin(), path.end()); + mapItem.path = path; + retval << mapItem; + return retval; +} + MappingTreeResultModel::MappingTreeResultModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { } Qt::ItemFlags MappingTreeResultModel::flags(const QModelIndex &index) const { diff --git a/mappingtreemodel.h b/mappingtreemodel.h index fa2cfef..60c7bd4 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -40,6 +40,8 @@ class MappingTreeModel : public SmTreeModel { bool addChild(const QVariant &name, const QModelIndex &parent); bool deleteChild(const QModelIndex &idx); int childCount(const QModelIndex &idx) const; + MappingData mappingDataFromId(int mappingId) const; + void setSelectedMappings(const QList<int> &mappingData); public slots: void populate(); @@ -57,6 +59,7 @@ class MappingTreeModel : public SmTreeModel { void getMappingTypes(); void getChildrenRecursive(SmTreeItem *item); int lowerBound(SmTreeItem *item, const QVariant &value, int column = 0) const; + QList<MappingData> mappingData(SmTreeItem *item); QSqlDatabase mDb; QSqlQuery *mTypesQ; QSqlQuery *mTypeParentsQ; @@ -69,6 +72,8 @@ class MappingTreeModel : public SmTreeModel { QSqlQuery *mAddParentQ; QSqlQuery *mDeleteChildQ; QList<mappingType> mMappingTypes; + QList<MappingData> mValidMappings; + QList<int> mSelectedMappings; int mType; }; diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 4bc2aad..29b6094 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -24,6 +24,8 @@ #include "smtreeitem.h" #include "helper.h" #include "hoverwindow.h" +#include "mappingtreemodel.h" +#include "smglobals.h" PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent) { //setup gui @@ -31,6 +33,7 @@ PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent) { mMappingTree = new MappingTreeWidget; mPictureView = new PictureView; connect(mMappingTree, SIGNAL(mappingChanged(int)), mPictureView, SLOT(mappingChanged(int))); + connect(mPictureView, SIGNAL(newFileMappigs()), this, SLOT(setMappingColors())); splitter->addWidget(mMappingTree); splitter->addWidget(mPictureView); splitter->setStretchFactor(0, 1); @@ -42,12 +45,18 @@ PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent) { setLayout(mainLayout); } +void PicturesWidget::setMappingColors(){ + MappingTreeModel *mtm = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); + mtm->setSelectedMappings(mPictureView->fileMappings()); +} + PictureView::PictureView(QWidget *parent) : QTreeView(parent) { //setup model mModel = new PicFilesModel(QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"), this); mProxy = new QSortFilterProxyModel(this); mProxy->setSourceModel(mModel); setModel(mProxy); + connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(setFileMappings())); //read settings QSettings s; @@ -146,6 +155,19 @@ void PictureView::contextMenuEvent(QContextMenuEvent *e){ ctxMenu.exec(e->globalPos()); } +void PictureView::setFileMappings(){ + QModelIndexList sel = selectionModel()->selectedRows(); + if(sel.isEmpty()){ + return; + } + QList<QVariant> fileIds; + foreach(QModelIndex i, sel){ + fileIds << i.data(PicFilesModel::IdRole); + } + mFilesMappings = mModel->mappingIds(fileIds); + emit newFileMappigs(); +} + PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { //setup database mDb = QSqlDatabase::database("treedb"); @@ -153,6 +175,23 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr mPopulateQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mapid AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); mDeleteFileQ = new QSqlQuery(mDb); mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); + mCurMappingIdsQ = new QSqlQuery(mDb); + mCurMappingIdsQ->prepare("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (SELECT ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mid AND pics_mappings.ipics_id = pics.ipicsid)"); + mCurMappingIdsQS = QString("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (%1)"); +} + +QList<int> PicFilesModel::mappingIds(const QList<QVariant> &fileIds){ + QList<int> retval; + QStringList ids; + foreach(QVariant f, fileIds){ + ids << f.toString(); + } + QString mappingQuery = mCurMappingIdsQS.arg(ids.join(",")); + QSqlQuery idQ(mappingQuery, mDb); + while(idQ.next()){ + retval << idQ.value(0).toInt(); + } + return retval; } QVariant PicFilesModel::data(const QModelIndex &index, int role) const { @@ -223,6 +262,11 @@ void PicFilesModel::populate(){ SmTreeItem *child = new SmTreeItem(data, root); root->appendChild(child); } + mCurMappingsIds.clear(); + mCurMappingIdsQ->bindValue(":mid", mMappingId); + while(mCurMappingIdsQ->next()){ + mCurMappingsIds << mCurMappingIdsQ->value(0).toInt(); + } setRoot(root); } } diff --git a/pictureswidget.h b/pictureswidget.h index b0bd277..b8a7b40 100644 --- a/pictureswidget.h +++ b/pictureswidget.h @@ -29,6 +29,9 @@ class PicturesWidget : public QWidget { explicit PicturesWidget(QWidget *parent = 0); PictureView *picView() { return mPictureView; } + private slots: + void setMappingColors(); + private: MappingTreeWidget *mMappingTree; PictureView *mPictureView; @@ -38,6 +41,7 @@ class PictureView : public QTreeView { Q_OBJECT public: explicit PictureView(QWidget *parent = 0); + QList<int> fileMappings() { return mFilesMappings; } public slots: void mappingChanged(int mapping); @@ -48,12 +52,19 @@ class PictureView : public QTreeView { virtual bool event(QEvent *e); virtual void contextMenuEvent(QContextMenuEvent *e); + private slots: + void setFileMappings(); + + signals: + void newFileMappigs(); + private: HoverWindow *mHoverWin; QModelIndex mCurHover; QSortFilterProxyModel *mProxy; PicFilesModel *mModel; int mCursorOffset; + QList<int> mFilesMappings; }; class PicFilesModel : public SmTreeModel { @@ -64,6 +75,7 @@ class PicFilesModel : public SmTreeModel { enum { NumFields = 8 }; explicit PicFilesModel(const QStringList &headers, QObject *parent = 0); void setMapping(int mappingId) { mMappingId = mappingId; } + QList<int> mappingIds(const QList<QVariant> &fileIds); //some data Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } @@ -77,7 +89,10 @@ class PicFilesModel : public SmTreeModel { QSqlDatabase mDb; QSqlQuery *mPopulateQ; QSqlQuery *mDeleteFileQ; + QSqlQuery *mCurMappingIdsQ; + QString mCurMappingIdsQS; int mMappingId; + QList<int> mCurMappingsIds; }; #endif // PICTURESWIDGET_H |