diff --git a/qcd_utils/qcd_view.cpp b/qcd_utils/qcd_view.cpp index 1edec79..593ed9d 100644 --- a/qcd_utils/qcd_view.cpp +++ b/qcd_utils/qcd_view.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "cdutils_k.h" #include "cdutils_x.h" #include "cdutils_c.h" @@ -16,6 +17,7 @@ using namespace CDUtils; CDView::CDView(QWidget * parent) : QTreeView(parent) { type_ = -1; model_ = 0; + proxy_ = 0; connect(this, SIGNAL(clicked(QModelIndex)), this, SLOT(indexClicked(QModelIndex))); connect(this, SIGNAL(_qcd_sendFailed()), this, SLOT(cd_sendFailed()), Qt::QueuedConnection); connect(this, SIGNAL(_qcd_sendSucceed()), this, SLOT(cd_sendSucceed()), Qt::QueuedConnection); @@ -27,8 +29,12 @@ CDView::CDView(QWidget * parent) : QTreeView(parent) { CDView::~CDView() { - if (model_) delete model_; + if (model_) { + delete model_; + delete proxy_; + } model_ = 0; + proxy_ = 0; } @@ -106,7 +112,12 @@ void CDView::refresh() { if (type_ < 0) return; if (!model_) { model_ = new CDItemModel(type_); - setModel(model_); + proxy_ = new QSortFilterProxyModel(); + proxy_->setRecursiveFilteringEnabled(true); + proxy_->setFilterKeyColumn(-1); + proxy_->setFilterCaseSensitivity(Qt::CaseInsensitive); + proxy_->setSourceModel(model_); + setModel(proxy_); setItemDelegateForColumn(type_ == CDType::cdC ? cName_Cmd : cValue, new CDDelegate()); if (type_ == CDType::cdX) setItemDelegateForColumn(cXMode, new CDDelegate()); @@ -280,6 +291,11 @@ void CDView::calculate() { } +void CDView::filter(const QString & f) { + proxy_->setFilterRegExp(QRegExp(f, Qt::CaseInsensitive)); +} + + void CDView::indexClicked(const QModelIndex & i) { if (!model_ || !i.isValid() || type_ != CDType::cdC || i.column() != cName_Cmd) return; CDItem * item = model_->getItem(i); diff --git a/qcd_utils/qcd_view.h b/qcd_utils/qcd_view.h index de21062..a50f721 100644 --- a/qcd_utils/qcd_view.h +++ b/qcd_utils/qcd_view.h @@ -10,6 +10,7 @@ namespace CDUtils { } class CDItemModel; +class QSortFilterProxyModel; class CDView: public QTreeView, public PIObject { @@ -43,6 +44,7 @@ public slots: void clear(); void buildFromHeader(const QString & description, int mode = 2); void calculate(); + void filter(const QString & f); private slots: void indexClicked(const QModelIndex & i); @@ -54,6 +56,7 @@ private slots: void cd_changedGlobal(); private: + bool filterTree(const QModelIndex & ti, const QString & filter); EVENT_HANDLER(void, pi_cd_sendFailed) {emit _qcd_sendFailed();} EVENT_HANDLER(void, pi_cd_sendSucceed) {emit _qcd_sendSucceed();} EVENT_HANDLER(void, pi_cd_receiveFailed) {emit _qcd_receiveFailed();} @@ -63,6 +66,7 @@ private: EVENT_HANDLER3(void, pi_cd_messageReceived, PIDeque, path, int, type, PIString, msg); CDItemModel * model_; + QSortFilterProxyModel * proxy_; int type_; signals: