DecoderSelector: Use proxy model to permit sorting
[pulseview.git] / pv / subwindows / decoder_selector / subwindow.cpp
index 781e494fbc85d5196bcb823cd63098db6d123df9..375e749e789b9860af5988f07422a42c404d5ea9 100644 (file)
@@ -36,15 +36,24 @@ namespace subwindows {
 namespace decoder_selector {
 
 
+void QCustomTreeView::currentChanged(const QModelIndex& current,
+       const QModelIndex& previous)
+{
+       QTreeView::currentChanged(current, previous);
+       currentChanged(current);
+}
+
+
 SubWindow::SubWindow(Session& session, QWidget* parent) :
        SubWindowBase(session, parent),
        splitter_(new QSplitter()),
-       tree_view_(new QTreeView()),
+       tree_view_(new QCustomTreeView()),
        info_box_(new QWidget()),
        info_label_header_(new QLabel()),
        info_label_body_(new QLabel()),
        info_label_footer_(new QLabel()),
-       model_(new DecoderCollectionModel())
+       model_(new DecoderCollectionModel()),
+       sort_filter_model_(new QSortFilterProxyModel())
 {
        QVBoxLayout* root_layout = new QVBoxLayout(this);
        root_layout->setContentsMargins(0, 0, 0, 0);
@@ -54,8 +63,12 @@ SubWindow::SubWindow(Session& session, QWidget* parent) :
        splitter_->addWidget(tree_view_);
        splitter_->addWidget(info_box_);
 
-       tree_view_->setModel(model_);
+       sort_filter_model_->setSourceModel(model_);
+
+       tree_view_->setModel(sort_filter_model_);
        tree_view_->setRootIsDecorated(true);
+       tree_view_->setSortingEnabled(true);
+       tree_view_->sortByColumn(0, Qt::AscendingOrder);
 
        // Hide the columns that hold the detailed item information
        tree_view_->hideColumn(2);  // ID
@@ -68,10 +81,10 @@ SubWindow::SubWindow(Session& session, QWidget* parent) :
        info_label_body_->setWordWrap(true);
        info_label_body_->setText(tr("Select a decoder to see its description here."));
 
-       connect(tree_view_, SIGNAL(clicked(const QModelIndex&)),
-               this, SLOT(on_item_clicked(const QModelIndex&)));
-       connect(tree_view_, SIGNAL(doubleClicked(const QModelIndex&)),
-               this, SLOT(on_item_double_clicked(const QModelIndex&)));
+       connect(tree_view_, SIGNAL(currentChanged(const QModelIndex&)),
+               this, SLOT(on_item_changed(const QModelIndex&)));
+       connect(tree_view_, SIGNAL(activated(const QModelIndex&)),
+               this, SLOT(on_item_activated(const QModelIndex&)));
 
        connect(this, SIGNAL(new_decoders_selected(vector<const srd_decoder*>)),
                &session, SLOT(on_new_decoders_selected(vector<const srd_decoder*>)));
@@ -141,7 +154,7 @@ vector<const srd_decoder*> SubWindow::decoders_providing(const char* output) con
        return ret_val;
 }
 
-void SubWindow::on_item_clicked(const QModelIndex& index)
+void SubWindow::on_item_changed(const QModelIndex& index)
 {
        if (!index.isValid())
                return;
@@ -175,7 +188,7 @@ void SubWindow::on_item_clicked(const QModelIndex& index)
        info_label_footer_->setText(tr("<p align='right'>Tags: %1</p>").arg(tags));
 }
 
-void SubWindow::on_item_double_clicked(const QModelIndex& index)
+void SubWindow::on_item_activated(const QModelIndex& index)
 {
        if (!index.isValid())
                return;