diff options
author | Arno <am@disconnect.de> | 2012-02-25 16:52:48 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-02-25 16:52:48 +0100 |
commit | 67ddb23a59cb56bd917db2d9c3c7bc62c96e53b4 (patch) | |
tree | 50282f53691db30c8fd2999c299d24ef859b11f3 | |
parent | dce686c895fce27cce1d8bf0247c692bd790f93a (diff) | |
download | SheMov-67ddb23a59cb56bd917db2d9c3c7bc62c96e53b4.tar.gz SheMov-67ddb23a59cb56bd917db2d9c3c7bc62c96e53b4.tar.bz2 SheMov-67ddb23a59cb56bd917db2d9c3c7bc62c96e53b4.zip |
Implemented mapping widget for NewPicsDialog
Make it possible to add mappings to new pictures. This actually was a
tough one. Maybe I shouldn't drink and code.
Next: make NewPicsDialog actually do something.
-rw-r--r-- | mappingtreemodel.cpp | 58 | ||||
-rw-r--r-- | mappingtreemodel.h | 29 | ||||
-rw-r--r-- | mappingtreewidget.cpp | 22 | ||||
-rw-r--r-- | mappingtreewidget.h | 3 | ||||
-rw-r--r-- | newpicsdialog.cpp | 47 | ||||
-rw-r--r-- | newpicsdialog.h | 18 |
6 files changed, 176 insertions, 1 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index 9c96e69..d64cb52 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -264,3 +264,61 @@ int MappingTreeModel::lowerBound(SmTreeItem *item, const QVariant &value, int co } return item->childCount(); } + +MappingTreeResultModel::MappingTreeResultModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { } + +Qt::ItemFlags MappingTreeResultModel::flags(const QModelIndex &index) const { + Q_UNUSED(index); + return (Qt::ItemIsEnabled | Qt::ItemIsSelectable); +} + +bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(role == NameRole){ + SmTreeItem *item = itemAt(index); + item->setData(Name, value); + return true; + } + return SmTreeModel::setData(index, value, role); +} + +void MappingTreeResultModel::addItem(const MappingData &data){ + SmTreeItem *curItem = root(); + for(int i = 0; i < data.path.count(); ++i){ + int childPos = hasChild(curItem, data.path.at(i)); + if(childPos != -1){ + //child already exists + curItem = curItem->child(childPos); + continue; + }else{ + //insert child + QModelIndex curIdx = insertChild(data.path.at(i), curItem); + curItem = itemAt(curIdx); + } + } +} + +QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, SmTreeItem *parent){ + QModelIndex parentIdx; + int row = parent->childCount(); + if(parent != root()){ + for(int i = 0; i < parent->childCount(); ++i){ + if(parent->child(i)->data(0).toString() > data.toString()){ + row = i; + } + } + parentIdx = createIndex(0, 0, parent); + } + insertRows(row, 1, parentIdx); + QModelIndex newIdx = index(row, 0, parentIdx); + setData(newIdx, data, NameRole); + return newIdx; +} + +int MappingTreeResultModel::hasChild(SmTreeItem *item, const QVariant &name, int column) const{ + for(int i = 0; i < item->childCount(); ++i){ + if(item->child(i)->data(column) == name){ + return i; + } + } + return -1; +} diff --git a/mappingtreemodel.h b/mappingtreemodel.h index 451ab83..a37e364 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -14,6 +14,8 @@ class QSqlQuery; class SmTreeItem; +class MappingData; +class SmTreeItem; class MappingTreeModel : public SmTreeModel { Q_OBJECT @@ -69,4 +71,31 @@ class MappingTreeModel : public SmTreeModel { }; +class MappingTreeResultModel : public SmTreeModel { + Q_OBJECT + public: + enum Roles { NameRole = Qt::UserRole + 1 }; + enum Fields { Name = 0 }; + enum { NumFields = 1 }; + explicit MappingTreeResultModel(const QStringList &headers, QObject *parent = 0); + + //data + flags + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); + QModelIndex insertChild(const QVariant &data, SmTreeItem *parent); + + public slots: + void addItem(const MappingData &data); + + + private: + int hasChild(SmTreeItem *item, const QVariant &name, int column = 0) const; +}; + +struct MappingData { + int id; + QString name; + QStringList path; +}; + #endif // MAPPINGTREEMODEL_H diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index e5b1f90..db8f649 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -19,6 +19,8 @@ #include <QAction> #include <QMenu> +#include <algorithm> + #include "mappingtreewidget.h" #include "mappingtreemodel.h" #include "smglobals.h" @@ -93,6 +95,26 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ setTabOrder(mEdit, mAddChild); } +MappingData MappingTreeWidget::selectedItem() const { + MappingData retval; + QModelIndex sel = selected(); + if(!sel.isValid()){ + 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; +} + void MappingTreeWidget::addChild(){ QModelIndex sel = selected(); if(!sel.isValid()){ diff --git a/mappingtreewidget.h b/mappingtreewidget.h index bd34576..8cb1cce 100644 --- a/mappingtreewidget.h +++ b/mappingtreewidget.h @@ -19,10 +19,13 @@ class QSortFilterProxyModel; class QStringListModel; class QAction; +struct MappingData; + class MappingTreeWidget : public QWidget { Q_OBJECT public: explicit MappingTreeWidget(QWidget *parent = 0); + MappingData selectedItem() const; public slots: void addChild(); diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp index 673865b..4395399 100644 --- a/newpicsdialog.cpp +++ b/newpicsdialog.cpp @@ -21,6 +21,8 @@ #include "newpicsdialog.h" #include "smtreeitem.h" #include "helper.h" +#include "mappingtreewidget.h" +#include "mappingtreemodel.h" NewPicsDialog::NewPicsDialog(QWidget *parent) : QWidget(parent) { //files widget @@ -46,11 +48,34 @@ NewPicsDialog::NewPicsDialog(QWidget *parent) : QWidget(parent) { filesLayout->addLayout(fileButtonLayout); mFilesWidget->setLayout(filesLayout); + //mapping widget + mMappingWidget = new QWidget; + mMappingTreeWidget = new MappingTreeWidget; + mResultView = new MappingTreeResultView; + mResultModel = new MappingTreeResultModel(QStringList() << tr("Name"), this); + mResultView->setModel(mResultModel); + mResultView->setAlternatingRowColors(true); + mAddMapping = new QPushButton(tr(">>")); + connect(mAddMapping, SIGNAL(clicked()), this, SLOT(addMapping())); + mRemoveMapping = new QPushButton(tr("<<")); + connect(mRemoveMapping, SIGNAL(clicked()), this, SLOT(removeMapping())); + QVBoxLayout *buttonLayout = new QVBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(mAddMapping); + buttonLayout->addWidget(mRemoveMapping); + buttonLayout->addStretch(); + QHBoxLayout *mappingLayout = new QHBoxLayout; + mappingLayout->addWidget(mMappingTreeWidget); + mappingLayout->addLayout(buttonLayout); + mappingLayout->addWidget(mResultView); + mMappingWidget->setLayout(mappingLayout); + //put it together setMinimumWidth(600); setMinimumHeight(400); mTab = new QTabWidget; mTab->addTab(mFilesWidget, tr("Files")); + mTab->addTab(mMappingWidget, tr("Mappings")); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(mTab); setLayout(mainLayout); @@ -91,8 +116,28 @@ void NewPicsDialog::removeFiles(){ } } +void NewPicsDialog::addMapping(){ + MappingData selected = mMappingTreeWidget->selectedItem(); + if(selected.id == -1){ + return; + } + mResultModel->addItem(selected); + mResultView->expandAll(); +} + +void NewPicsDialog::removeMapping(){ + QModelIndexList sel = mResultView->selectionModel()->selectedRows(); + if(sel.isEmpty()){ + return; + } + QModelIndex firstIdx = sel.first(); + mResultModel->removeRows(firstIdx.row(), 1, firstIdx.parent()); +} + +MappingTreeResultView::MappingTreeResultView(QWidget *parent) : QTreeView(parent) { } + NewPicFilesModel::NewPicFilesModel(const QStringList &header, QObject *parent) : SmTreeModel(header, parent){ - mDb = QSqlDatabase::database("mDb"); + mDb = QSqlDatabase::database("treedb"); mMd5Query = new QSqlQuery(mDb); mMd5Query->prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); } diff --git a/newpicsdialog.h b/newpicsdialog.h index de4275a..9a11675 100644 --- a/newpicsdialog.h +++ b/newpicsdialog.h @@ -10,6 +10,7 @@ #include <QWidget> #include <QSqlDatabase> +#include <QTreeView> #include "smtreemodel.h" @@ -20,6 +21,9 @@ class QTreeView; class NewPicFilesModel; class QSortFilterProxyModel; class QPushButton; +class MappingTreeWidget; +class MappingTreeResultView; +class MappingTreeResultModel; struct FileData; @@ -31,15 +35,29 @@ class NewPicsDialog : public QWidget { public slots: void addFiles(); void removeFiles(); + void addMapping(); + void removeMapping(); private: QTabWidget *mTab; QWidget *mFilesWidget; + QWidget *mMappingWidget; QTreeView *mFilesV; NewPicFilesModel *mFilesModel; QSortFilterProxyModel *mFilesProxy; QPushButton *mAddFiles; QPushButton *mRemoveFiles; + MappingTreeWidget *mMappingTreeWidget; + QPushButton *mAddMapping; + QPushButton *mRemoveMapping; + MappingTreeResultView *mResultView; + MappingTreeResultModel *mResultModel; +}; + +class MappingTreeResultView : public QTreeView { + Q_OBJECT + public: + explicit MappingTreeResultView(QWidget *parent = 0); }; class NewPicFilesModel : public SmTreeModel { |