X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fsubwindows%2Fdecoder_selector%2Fsubwindow.cpp;h=94ed6f4b6da970e02a3191ba2a87dc7d951bd054;hb=0466001be51e779b23aaebec1cc9361305c07be9;hp=fb354ffd966e191c361d9307f031e13c8a9649ed;hpb=39cc336ab844ad56cdccdbd7a82a587d1b28645b;p=pulseview.git diff --git a/pv/subwindows/decoder_selector/subwindow.cpp b/pv/subwindows/decoder_selector/subwindow.cpp index fb354ffd..94ed6f4b 100644 --- a/pv/subwindows/decoder_selector/subwindow.cpp +++ b/pv/subwindows/decoder_selector/subwindow.cpp @@ -32,14 +32,23 @@ #include "pv/session.hpp" #include "pv/subwindows/decoder_selector/subwindow.hpp" +#include +#include "subwindow.hpp" // Required only for lupdate since above include isn't recognized + +#define DECODERS_HAVE_TAGS \ + ((SRD_PACKAGE_VERSION_MAJOR > 0) || \ + (SRD_PACKAGE_VERSION_MAJOR == 0) && (SRD_PACKAGE_VERSION_MINOR > 5)) + using std::reverse; -using std::shared_ptr; namespace pv { namespace subwindows { namespace decoder_selector { -const QString initial_notice = QApplication::tr("Select a decoder to see its description here."); +const char *initial_notice = + QT_TRANSLATE_NOOP("pv::subwindows::decoder_selector::SubWindow", + "Select a decoder to see its description here."); // clazy:exclude=non-pod-global-static + const int min_width_margin = 75; @@ -100,7 +109,9 @@ SubWindow::SubWindow(Session& session, QWidget* parent) : filter->setClearButtonEnabled(true); filter->addAction(filter_icon, QLineEdit::LeadingPosition); + sort_filter_model_->setSourceModel(model_); + sort_filter_model_->setSortCaseSensitivity(Qt::CaseInsensitive); sort_filter_model_->setFilterCaseSensitivity(Qt::CaseInsensitive); sort_filter_model_->setFilterKeyColumn(-1); @@ -117,6 +128,11 @@ SubWindow::SubWindow(Session& session, QWidget* parent) : tree_view_->setIndentation(10); +#if (!DECODERS_HAVE_TAGS) + tree_view_->expandAll(); + tree_view_->setItemsExpandable(false); +#endif + QScrollArea* info_label_body_container = new QScrollArea(); info_label_body_container->setWidget(info_label_body_); info_label_body_container->setWidgetResizable(true); @@ -132,13 +148,15 @@ SubWindow::SubWindow(Session& session, QWidget* parent) : info_label_header_->setTextInteractionFlags(flags); info_label_body_->setWordWrap(true); info_label_body_->setTextInteractionFlags(flags); - info_label_body_->setText(initial_notice); + info_label_body_->setText(QString(tr(initial_notice))); info_label_body_->setAlignment(Qt::AlignTop); info_label_footer_->setWordWrap(true); info_label_footer_->setTextInteractionFlags(flags); connect(filter, SIGNAL(textChanged(const QString&)), this, SLOT(on_filter_changed(const QString&))); + connect(filter, SIGNAL(returnPressed()), + this, SLOT(on_filter_return_pressed())); connect(tree_view_, SIGNAL(currentChanged(const QModelIndex&)), this, SLOT(on_item_changed(const QModelIndex&))); @@ -167,7 +185,7 @@ QToolBar* SubWindow::create_toolbar(QWidget *parent) const int SubWindow::minimum_width() const { QFontMetrics m(info_label_body_->font()); - const int label_width = m.width(initial_notice); + const int label_width = m.width(QString(tr(initial_notice))); return label_width + min_width_margin; } @@ -193,8 +211,10 @@ vector SubWindow::get_decoders_providing(const char* output) if (!d->outputs) continue; + const int maxlen = 1024; + // TODO For now we ignore that d->outputs is actually a list - if (strncmp((char*)(d->outputs->data), output, strlen(output)) == 0) + if (strncmp((char*)(d->outputs->data), output, maxlen) == 0) ret_val.push_back(d); } @@ -203,34 +223,47 @@ vector SubWindow::get_decoders_providing(const char* output) void SubWindow::on_item_changed(const QModelIndex& index) { - if (!index.isValid()) - return; + QString decoder_name, id, longname, desc, doc, tags; - QModelIndex id_index = index.model()->index(index.row(), 2, index.parent()); - QString decoder_name = index.model()->data(id_index, Qt::DisplayRole).toString(); + // If the parent isn't valid, a category title was clicked + if (index.isValid() && index.parent().isValid()) { + QModelIndex id_index = index.model()->index(index.row(), 2, index.parent()); + decoder_name = index.model()->data(id_index, Qt::DisplayRole).toString(); - if (decoder_name.isEmpty()) - return; + if (decoder_name.isEmpty()) + return; - const srd_decoder* d = srd_decoder_get_by_id(decoder_name.toUtf8()); + const srd_decoder* d = srd_decoder_get_by_id(decoder_name.toUtf8()); - const QString id = QString::fromUtf8(d->id); - const QString longname = QString::fromUtf8(d->longname); - const QString desc = QString::fromUtf8(d->desc); - const QString doc = QString::fromUtf8(srd_decoder_doc_get(d)).trimmed(); + id = QString::fromUtf8(d->id); + longname = QString::fromUtf8(d->longname); + desc = QString::fromUtf8(d->desc); + doc = QString::fromUtf8(srd_decoder_doc_get(d)).trimmed(); - QString tags; - for (GSList* li = (GSList*)d->tags; li; li = li->next) { - QString s = (li == (GSList*)d->tags) ? - tr((char*)li->data) : - QString(tr(", %1")).arg(tr((char*)li->data)); - tags.append(s); - } +#if DECODERS_HAVE_TAGS + for (GSList* li = (GSList*)d->tags; li; li = li->next) { + QString s = (li == (GSList*)d->tags) ? + tr((char*)li->data) : + QString(tr(", %1")).arg(tr((char*)li->data)); + tags.append(s); + } +#endif + } else + doc = QString(tr(initial_notice)); + + if (!id.isEmpty()) + info_label_header_->setText( + QString("%1 (%2)
%3") + .arg(longname, id, desc)); + else + info_label_header_->clear(); - info_label_header_->setText(QString("%1 (%2)
%3") - .arg(longname, id, desc)); info_label_body_->setText(doc); - info_label_footer_->setText(tr("

Tags: %1

").arg(tags)); + + if (!tags.isEmpty()) + info_label_footer_->setText(tr("

Tags: %1

").arg(tags)); + else + info_label_footer_->clear(); } void SubWindow::on_item_activated(const QModelIndex& index) @@ -255,13 +288,13 @@ void SubWindow::on_item_activated(const QModelIndex& index) return; } - if (strncmp(inputs.at(0), "logic", 5) == 0) { + if (strcmp(inputs.at(0), "logic") == 0) { new_decoders_selected(decoders); return; } // Check if we can automatically fulfill the stacking requirements - while (strncmp(inputs.at(0), "logic", 5) != 0) { + while (strcmp(inputs.at(0), "logic") != 0) { vector prov_decoders = get_decoders_providing(inputs.at(0)); if (prov_decoders.size() == 0) { @@ -304,6 +337,31 @@ void SubWindow::on_item_activated(const QModelIndex& index) void SubWindow::on_filter_changed(const QString& text) { sort_filter_model_->setFilterFixedString(text); + + // Expand the "All Decoders" category/tag if the user filtered + tree_view_->setExpanded(tree_view_->model()->index(0, 0), !text.isEmpty()); +} + +void SubWindow::on_filter_return_pressed() +{ + int num_visible_decoders = 0; + QModelIndex last_valid_index; + + QModelIndex index = tree_view_->model()->index(0, 0); + + while (index.isValid()) { + QModelIndex id_index = index.model()->index(index.row(), 2, index.parent()); + QString decoder_name = index.model()->data(id_index, Qt::DisplayRole).toString(); + if (!decoder_name.isEmpty()) { + last_valid_index = index; + num_visible_decoders++; + } + index = tree_view_->indexBelow(index); + } + + // If only one decoder matches the filter, apply it when the user presses enter + if (num_visible_decoders == 1) + tree_view_->activated(last_valid_index); } } // namespace decoder_selector