diff options
Diffstat (limited to 'mappingtreewidget.cpp')
-rw-r--r-- | mappingtreewidget.cpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index 873afd2..dcf96e1 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -30,7 +30,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ //setup model mModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); - mProxy = new QSortFilterProxyModel(this); + mProxy = new MappingTreeProxy(this); mProxy->setSourceModel(mModel); mTypesModel = new QStringListModel(this); mTypesModel->setStringList(mModel->mappingTypeNames()); @@ -46,11 +46,12 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ mTree->expandAll(); connect(mModel, SIGNAL(needExpansion()), mTree, SLOT(expandAll())); connect(mTree->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged())); + /* Hide buttons, this doesn't really work, + * but keep them for future use :) */ mTypeBox = new QComboBox; mTypeBox->setModel(mTypesModel); connect(mTypeBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(typeChanged(QString))); - /* Hide buttons, this doesn't really work, - * but keep them for future use :) */ + mTypeBox->setHidden(true); mAddType = new QPushButton(tr("Add &type")); connect(mAddType, SIGNAL(clicked()), this, SLOT(addType())); mAddType->setHidden(true); @@ -76,6 +77,20 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ typeChanged(lastType); } + // filter + mFilter = new QLineEdit; + connect(mFilter, SIGNAL(returnPressed()), this, SLOT(filter())); + mDoFilter = new QPushButton(tr("Filter")); + connect(mDoFilter, SIGNAL(clicked()), this, SLOT(filter())); + mClearFilter = new QPushButton(tr("Clear")); + connect(mClearFilter, SIGNAL(clicked()), this, SLOT(clearFilter())); + QLabel *filterLabel = new QLabel(tr("Filter")); + QHBoxLayout *filterLayout = new QHBoxLayout; + filterLayout->addWidget(filterLabel); + filterLayout->addWidget(mFilter); + filterLayout->addWidget(mDoFilter); + filterLayout->addWidget(mClearFilter); + //setup actions mAddChildA = new QAction(tr("Add..."), this); connect(mAddChildA, SIGNAL(triggered()), this, SLOT(addChild())); @@ -93,6 +108,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ //widget layout and tab order QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTypeBox); + mainLayout->addLayout(filterLayout); mainLayout->addLayout(typesButtonLayout); mainLayout->addWidget(mTree); setLayout(mainLayout); @@ -259,6 +275,18 @@ void MappingTreeWidget::moveChild(){ } } +void MappingTreeWidget::filter(){ + QString filter = mFilter->text(); + mProxy->setFilter(filter); + mTree->expandAll(); +} + +void MappingTreeWidget::clearFilter(){ + mFilter->clear(); + mProxy->setFilter(QString()); + mTree->expandAll(); +} + const QModelIndex MappingTreeWidget::selected() const{ QModelIndexList sel = mTree->selectionModel()->selectedRows(); if(sel.isEmpty()){ @@ -392,3 +420,19 @@ MappingEditDialog::MappingEditDialog(QWidget *parent, Qt::WindowFlags f) : QDial mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } + +MappingTreeProxy::MappingTreeProxy(QObject *parent) : QSortFilterProxyModel(parent) {} + +void MappingTreeProxy::setFilter(const QString &filter){ + mFilter = QRegExp(filter); + invalidateFilter(); +} + +bool MappingTreeProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const{ + if(mFilter.isEmpty()){ + return true; + } + QModelIndex nameIdx = sourceModel()->index(sourceRow, MappingTreeModel::Name, sourceParent); + MappingTreeModel *model = qobject_cast<MappingTreeModel*>(sourceModel()); + return model->matchRecursive(nameIdx, mFilter); +} |