From 093824e610532e6b78ae42ead5dd834ea07454f8 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Tue, 17 May 2016 17:53:01 +0800 Subject: [PATCH] Add search function for protocol list viewer @ LA mode --- DSView/darkstyle/style.qss | 2 +- DSView/icons/next.png | Bin 699 -> 465 bytes DSView/icons/pre.png | Bin 681 -> 475 bytes DSView/pv/data/decoderstack.cpp | 5 + DSView/pv/data/decoderstack.h | 2 + DSView/pv/dock/protocoldock.cpp | 163 ++++++++++++++++++++++++++++++-- DSView/pv/dock/protocoldock.h | 13 ++- DSView/pv/dock/searchdock.cpp | 6 +- DSView/pv/view/decodetrace.cpp | 4 +- DSView/pv/view/header.cpp | 2 + DSView/pv/view/ruler.cpp | 1 + DSView/pv/view/viewport.cpp | 1 + 12 files changed, 184 insertions(+), 15 deletions(-) mode change 100644 => 100755 DSView/icons/next.png mode change 100644 => 100755 DSView/icons/pre.png diff --git a/DSView/darkstyle/style.qss b/DSView/darkstyle/style.qss index cacf5e26..fdb48dec 100755 --- a/DSView/darkstyle/style.qss +++ b/DSView/darkstyle/style.qss @@ -611,7 +611,7 @@ background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, QComboBox:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover { - border: 1px solid #78879b; + border: 1px solid #606060; color: silver; } diff --git a/DSView/icons/next.png b/DSView/icons/next.png old mode 100644 new mode 100755 index cc35544b3e7214988506aca02f398494c7b80ab6..d3efe6f2e90787d139ef2069634b1c6d9b7a6c86 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5m^kh={g8AI%&+V01C2~c>21sKVTK)R^r>%)s+Vnn(yi27~*k!>(t%64F)_e$}Y^> zhJwrn?6S8H@PzanVEN+i=vTRMnMKcL`+PY&^kwro-lThsM)%rzzPv4jHv!g1^>iava{kb>sp2kq+6f zwqdN-{`oiRDBW}`ns6deZF*-+`lkgG)O&4KeTh_;Kh3_rw`QIGz2BVsTqnBSnpMRK zbgF8JYeY#(Vo9o1a#1RfVlXl=G}ARO)ipE^F*LL?HnB1^(Kax$GBDs%TnP*{Bn`Rw zDVb@NxHZ(*2z~@=kObKfoS#-wo>-L1P+nfHmzkGcoSayYs+V7sKKq@G6i^X^r>mdK II;Vst0ODSc-T(jq delta 686 zcmV;f0#W_Z1G@!~8Gi-<0047(dh`GQ03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)00009a7bBm000XU000XU0RWnu z7ytkQFG)l}R9M5smtU&dKorKmQwoBjv5KfD(g)wYOUMqqJAW`sa0%T(?+&irLA!#w z1p6)+#XqPh6E#6m^Yujs`_MLt{|1I6182V9oSB?CM@ZtC?E?Ua2t))V>m+-;f9sK~ ziwJ}yLl55VUK1K2_m`~BVkpdKs^;B*E6fMn3#0q{z)6T;@N zU2nm5yAAR?bbmy|jKyNkZnrZ?wgJ36(gW>SEam{f>1mNvH}Qbyc|ik$6_3Zioj*L! zs{v>ONJsI225?23W7xVMC&oOeQtNX0vIKY()lGtyWQDvXx4u zG{kDPY5)iYp#dDni2|Sin1*5eIuAIG6AD5DD5av_N`DG~nNFuQgi`7qfE5a0xm;dz zEh+$JCX>++%jGfq18pCStt~= z_+&C^_cH>3_brCu|XER;$$?^6c{bH-Tb= UYB>QoUH||907*qoM6N<$g2Eps)Bpeg diff --git a/DSView/icons/pre.png b/DSView/icons/pre.png old mode 100644 new mode 100755 index f7ccd2ebfe11c3dfb2733134678f602571a97923..ee773259723afbb3bf40760dc295c17407e988a9 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5m^kh={g8AI%&+V01C2~c>21sKVTK)R)`KIByi;Qf z9v(>Of6&*zVr`SgI&P5|;T07z4i5|&TiaPx#$<$ z6TSP|7B-8VrDVBIE}X*Kb>pwme&dxFKFzs#iGwxp?ati4Yds`%{9P|)?ACs^g@dK> z<38pYl@r~*NACOtbhK)TYeY#(Vo9o1a#1RfVlXl=G}ARO)ipE^F*LL?HnuXg&^9o# zGB8*#er*?uhTQy=%(P0}8t!@Ju>mzmf@}!RPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw T{mw=TsEEPS)z4*}Q$iB}Q{kJ* delta 668 zcmV;N0%QH#1E~d&8Gi-<0047(dh`GQ03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C00v@9M??Vs0RI60puMM)00009a7bBm000XU000XU0RWnu z7ytkQ9Z5t%R9M5sS6hnWKomW97zm;gQ9&gj^Wnd}gzUiHfq&^8xP;k3_YTJ1!ORX^ zg8eTf5noY|L{StqXMVJhnV&p-T&RyKxOGpR`>HD>@l5#!03rer0m&9goA(!+WJ^RK zBq1U=olY$PzaLD%s{(L59&G?W9t^+{k~ka=IspH{#sQpT002ndV)X&MlI%y-Q7+i+ zc4^b0FCwO6j0K7bk0Uv;+X<7gPnx+LLdr@@1Ujs-eJ^(Y5$$VW7w%cu+ zWG9MpS^z!(Gn>sSkSbV!|mdj-`48z36 z<1)}Il}c~d2WeiO1i*iCi@!viN@y+?i(mifn>7 z$Kxa+?SBI>4Z~3VU_2hT0YqjZ?SG&^vNsxynwNVF!-&O%VqiENrb%iafLX8C6%)hZ z@Et(s-V9tb(RE!{2LRV~^>cbgXTWisTZ~A306)*`C5nOqVB7XnX0+>G;NS^^$u)ou z9zU9OlnVf0Fc`GXKbw0q;fP45(P;dUTeQ?P@)Z}zEt!?dFvaiy0000 wait_for_data() const; diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 730c6e6f..e57ea47a 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include #include @@ -47,7 +49,8 @@ namespace dock { ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : QScrollArea(parent), - _session(session) + _session(session), + _cur_search_index(-1) { _up_widget = new QWidget(this); @@ -93,7 +96,7 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : _up_layout->addStretch(1); _up_widget->setLayout(_up_layout); - _up_widget->setMinimumHeight(120); + _up_widget->setMinimumHeight(150); // this->setWidget(_widget); // _widget->setGeometry(0, 0, sizeHint().width(), 500); @@ -129,12 +132,53 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : _table_view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); _table_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + _pre_button = new QPushButton(_dn_widget); + _nxt_button = new QPushButton(_dn_widget); + _pre_button->setIcon(QIcon::fromTheme("protocol", + QIcon(":/icons/pre.png"))); + _nxt_button->setIcon(QIcon::fromTheme("protocol", + QIcon(":/icons/next.png"))); + connect(_pre_button, SIGNAL(clicked()), + this, SLOT(search_pre())); + connect(_nxt_button, SIGNAL(clicked()), + this, SLOT(search_nxt())); + + QPushButton *search_button = new QPushButton(this); + search_button->setIcon(QIcon::fromTheme("protocol", + QIcon(":/icons/search.png"))); + search_button->setFixedWidth(search_button->height()); + search_button->setDisabled(true); + _search_edit = new QLineEdit(_dn_widget); + _search_edit->setPlaceholderText(tr("search")); + QHBoxLayout *search_layout = new QHBoxLayout(); + search_layout->addWidget(search_button); + search_layout->addStretch(); + search_layout->setContentsMargins(0, 0, 0, 0); + _search_edit->setLayout(search_layout); + _search_edit->setTextMargins(search_button->width(), 0, 0, 0); + QSizePolicy sp = _search_edit->sizePolicy(); + sp.setHorizontalStretch(1); + _search_edit->setSizePolicy(sp); + + QHBoxLayout *dn_search_layout = new QHBoxLayout(); + dn_search_layout->addWidget(_pre_button, 0, Qt::AlignLeft); + dn_search_layout->addWidget(_search_edit, 0, Qt::AlignLeft); + dn_search_layout->addWidget(_nxt_button, 0, Qt::AlignRight); + + _matchs_label = new QLabel(_dn_widget); + QHBoxLayout *dn_match_layout = new QHBoxLayout(); + dn_match_layout->addWidget(new QLabel(tr("Matching Items:")), 0, Qt::AlignLeft); + dn_match_layout->addWidget(_matchs_label, 0, Qt::AlignLeft); + dn_match_layout->addStretch(1); + QVBoxLayout *dn_layout = new QVBoxLayout(); dn_layout->addLayout(dn_title_layout); + dn_layout->addLayout(dn_search_layout); + dn_layout->addLayout(dn_match_layout); dn_layout->addWidget(_table_view); _dn_widget->setLayout(dn_layout); - _dn_widget->setMinimumHeight(400); + _dn_widget->setMinimumHeight(350); _split_widget = new QSplitter(this); _split_widget->insertWidget(0, _up_widget); @@ -154,12 +198,22 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : connect(this, SIGNAL(protocol_updated()), this, SLOT(update_model())); connect(_table_view, SIGNAL(clicked(QModelIndex)), this, SLOT(item_clicked(QModelIndex))); connect(_table_view->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(column_resize(int, int, int))); + //connect(_table_view->verticalScrollBar(), SIGNAL(sliderMoved()), this, SLOT(sliderMoved())); + connect(_search_edit, SIGNAL(editingFinished()), this, SLOT(search_done())); } ProtocolDock::~ProtocolDock() { } +void ProtocolDock::paintEvent(QPaintEvent *) +{ +// QStyleOption opt; +// opt.init(this); +// QPainter p(this); +// style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} + int ProtocolDock::decoder_name_cmp(const void *a, const void *b) { return strcmp(((const srd_decoder*)a)->name, @@ -220,7 +274,7 @@ void ProtocolDock::add_protocol() // progress connection const std::vector< boost::shared_ptr > decode_sigs( _session.get_decode_signals()); - connect(decode_sigs.back().get(), SIGNAL(decoded_progress(int)), this, SLOT(decoded_progess(int))); + connect(decode_sigs.back().get(), SIGNAL(decoded_progress(int)), this, SLOT(decoded_progress(int))); protocol_updated(); } @@ -339,23 +393,29 @@ void ProtocolDock::del_all_protocol() } } -void ProtocolDock::decoded_progess(int progress) +void ProtocolDock::decoded_progress(int progress) { (void) progress; + int pg; + QString err=""; const std::vector< boost::shared_ptr > decode_sigs( _session.get_decode_signals()); int index = 0; BOOST_FOREACH(boost::shared_ptr d, decode_sigs) { - QString progress_str = QString::number(d->get_progress()) + "%"; - if (d->get_progress() == 100) + pg = d->get_progress(); + if (d->decoder()->out_of_memory()) + err = tr("(Out of Memory)"); + QString progress_str = QString::number(pg) + "%" + err; + if (pg == 100) _progress_label_list.at(index)->setStyleSheet("color:green;"); else _progress_label_list.at(index)->setStyleSheet("color:red;"); _progress_label_list.at(index)->setText(progress_str); index++; } - update_model(); + if (pg == 0 || pg % 10 == 1) + update_model(); } void ProtocolDock::set_model() @@ -363,6 +423,8 @@ void ProtocolDock::set_model() pv::dialogs::ProtocolList *protocollist_dlg = new pv::dialogs::ProtocolList(this, _session); protocollist_dlg->exec(); resize_table_view(_session.get_decoder_model()); + _model_proxy.setSourceModel(_session.get_decoder_model()); + search_done(); } void ProtocolDock::update_model() @@ -386,7 +448,8 @@ void ProtocolDock::update_model() if (index >= decode_sigs.size()) decoder_model->setDecoderStack(decode_sigs.at(0)->decoder()); } - + _model_proxy.setSourceModel(decoder_model); + search_done(); resize_table_view(decoder_model); } @@ -417,10 +480,50 @@ void ProtocolDock::item_clicked(const QModelIndex &index) _session.show_region(ann.start_sample(), ann.end_sample()); } } + _table_view->resizeRowToContents(index.row()); + if (index.column() != _model_proxy.filterKeyColumn()) { + _model_proxy.setFilterKeyColumn(index.column()); + _model_proxy.setSourceModel(decoder_model); + search_done(); + } + QModelIndex filterIndex = _model_proxy.mapFromSource(index); + if (filterIndex.isValid()) { + _cur_search_index = filterIndex.row(); + } else { + if (_model_proxy.rowCount() == 0) { + _cur_search_index = -1; + } else { + uint64_t up = 0; + uint64_t dn = _model_proxy.rowCount() - 1; + do { + uint64_t md = (up + dn)/2; + QModelIndex curIndex = _model_proxy.mapToSource(_model_proxy.index(md,_model_proxy.filterKeyColumn())); + if (index.row() == curIndex.row()) { + _cur_search_index = md; + break; + } else if (md == up) { + if (curIndex.row() < index.row() && up < dn) { + QModelIndex nxtIndex = _model_proxy.mapToSource(_model_proxy.index(md+1,_model_proxy.filterKeyColumn())); + if (nxtIndex.row() < index.row()) + md++; + } + _cur_search_index = md + ((curIndex.row() < index.row()) ? 0.5 : -0.5); + break; + } else if (curIndex.row() < index.row()) { + up = md; + } else if (curIndex.row() > index.row()) { + dn = md; + } + }while(1); + } + } } void ProtocolDock::column_resize(int index, int old_size, int new_size) { + (void)index; + (void)old_size; + (void)new_size; pv::data::DecoderModel *decoder_model = _session.get_decoder_model(); if (decoder_model->getDecoderStack()) { int top_row = _table_view->rowAt(0); @@ -438,5 +541,47 @@ void ProtocolDock::export_table_view() protocolexp_dlg->exec(); } +void ProtocolDock::search_pre() +{ + // now the proxy only contains rows that match the name + // let's take the pre one and map it to the original model + if (_model_proxy.rowCount() == 0) + return; + _cur_search_index -= 1; + if (_cur_search_index <= -1 || _cur_search_index >= _model_proxy.rowCount()) + _cur_search_index = _model_proxy.rowCount() - 1; + QModelIndex matchingIndex = _model_proxy.mapToSource(_model_proxy.index(ceil(_cur_search_index),_model_proxy.filterKeyColumn())); + if(matchingIndex.isValid()){ + _table_view->scrollTo(matchingIndex); + _table_view->setCurrentIndex(matchingIndex); + _table_view->clicked(matchingIndex); + } +} + +void ProtocolDock::search_nxt() +{ + // now the proxy only contains rows that match the name + // let's take the pre one and map it to the original model + if (_model_proxy.rowCount() == 0) + return; + _cur_search_index += 1; + if (_cur_search_index < 0 || _cur_search_index >= _model_proxy.rowCount()) + _cur_search_index = 0; + QModelIndex matchingIndex = _model_proxy.mapToSource(_model_proxy.index(floor(_cur_search_index),_model_proxy.filterKeyColumn())); + if(matchingIndex.isValid()){ + _table_view->scrollTo(matchingIndex); + _table_view->setCurrentIndex(matchingIndex); + _table_view->clicked(matchingIndex); + } +} + +void ProtocolDock::search_done() +{ + QString str = _search_edit->text().trimmed(); + _model_proxy.setFilterFixedString(str); + _matchs_label->setText(QString::number(_model_proxy.rowCount())); +} + + } // namespace dock } // namespace pv diff --git a/DSView/pv/dock/protocoldock.h b/DSView/pv/dock/protocoldock.h index 195f89b7..dcd1dfd8 100644 --- a/DSView/pv/dock/protocoldock.h +++ b/DSView/pv/dock/protocoldock.h @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -60,6 +61,7 @@ class ProtocolDock : public QScrollArea public: ProtocolDock(QWidget *parent, SigSession &session); ~ProtocolDock(); + void paintEvent(QPaintEvent *); void del_all_protocol(); @@ -70,12 +72,15 @@ private slots: void add_protocol(); void rst_protocol(); void del_protocol(); - void decoded_progess(int progress); + void decoded_progress(int progress); void set_model(); void update_model(); void export_table_view(); void item_clicked(const QModelIndex &index); void column_resize(int index, int old_size, int new_size); + void search_pre(); + void search_nxt(); + void search_done(); private: static int decoder_name_cmp(const void *a, const void *b); @@ -83,11 +88,17 @@ private: private: SigSession &_session; + QSortFilterProxyModel _model_proxy; + double _cur_search_index; QSplitter *_split_widget; QWidget *_up_widget; QWidget *_dn_widget; QTableView *_table_view; + QPushButton *_pre_button; + QPushButton *_nxt_button; + QLineEdit *_search_edit; + QLabel *_matchs_label; QPushButton *_add_button; QPushButton *_del_all_button; diff --git a/DSView/pv/dock/searchdock.cpp b/DSView/pv/dock/searchdock.cpp index 3233b825..17fe110c 100644 --- a/DSView/pv/dock/searchdock.cpp +++ b/DSView/pv/dock/searchdock.cpp @@ -60,13 +60,13 @@ SearchDock::SearchDock(QWidget *parent, View &view, SigSession &session) : connect(&_nxt_button, SIGNAL(clicked()), this, SLOT(on_next())); - _pre_button.setIcon(QIcon::fromTheme("search", + _pre_button.setIcon(QIcon::fromTheme("searchDock", QIcon(":/icons/pre.png"))); - _nxt_button.setIcon(QIcon::fromTheme("search", + _nxt_button.setIcon(QIcon::fromTheme("searchDock", QIcon(":/icons/next.png"))); QPushButton *_search_button = new QPushButton(this); - _search_button->setIcon(QIcon::fromTheme("search", + _search_button->setIcon(QIcon::fromTheme("searchDock", QIcon(":/icons/search.png"))); _search_button->setFixedWidth(_search_button->height()); _search_button->setDisabled(true); diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index f3ba3af0..b47de76c 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -792,7 +792,9 @@ void DecodeTrace::on_new_decode_data() { uint64_t real_end = min(_decoder_stack->sample_count(), _decode_end+1); const int64_t need_sample_count = real_end - _decode_start; - if (need_sample_count <= 0) { + if (real_end == 0) { + _progress = 0; + } else if (need_sample_count <= 0) { _progress = 100; } else { const uint64_t samples_decoded = _decoder_stack->samples_decoded(); diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index 7ccb9828..a490805b 100644 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -119,6 +119,8 @@ void Header::paintEvent(QPaintEvent*) //painter.setRenderHint(QPainter::Antialiasing); style()->drawPrimitive(QStyle::PE_Widget, &o, &painter, this); + painter.begin(this); + const int w = width(); const vector< boost::shared_ptr > traces( _view.get_traces(ALL_VIEW)); diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index 61963fed..171d99de 100644 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -182,6 +182,7 @@ void Ruler::paintEvent(QPaintEvent*) QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this); + p.begin(this); //QPainter p(this); //p.setRenderHint(QPainter::Antialiasing); diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index 99263a85..7d5c87f7 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -128,6 +128,7 @@ void Viewport::paintEvent(QPaintEvent *event) QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this); + p.begin(this); const vector< boost::shared_ptr > traces(_view.get_traces(_type)); BOOST_FOREACH(const boost::shared_ptr t, traces) {