summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mappingtreemodel.cpp56
-rw-r--r--mappingtreemodel.h5
-rw-r--r--pictureswidget.cpp44
-rw-r--r--pictureswidget.h15
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