From: Soeren Apel Date: Fri, 10 Apr 2020 11:49:52 +0000 (+0200) Subject: TabularDecView: Make the model/view work X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=f54e68b03d5d24c7787962fcc701d8d52b0ec8ab;p=pulseview.git TabularDecView: Make the model/view work --- diff --git a/CMakeLists.txt b/CMakeLists.txt index f429553e..c77435d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -399,7 +399,6 @@ if(ENABLE_DECODE) pv/subwindows/decoder_selector/subwindow.cpp pv/views/decoder_binary/view.cpp pv/views/decoder_binary/QHexView.cpp - pv/views/tabular_decoder/item.cpp pv/views/tabular_decoder/model.cpp pv/views/tabular_decoder/view.cpp pv/views/trace/decodetrace.cpp diff --git a/pv/data/decode/annotation.cpp b/pv/data/decode/annotation.cpp index 8ac8d5f9..689c08de 100644 --- a/pv/data/decode/annotation.cpp +++ b/pv/data/decode/annotation.cpp @@ -86,8 +86,7 @@ Annotation& Annotation::operator=(Annotation&& a) Annotation::~Annotation() { - if (annotations_) - delete annotations_; + delete annotations_; } uint64_t Annotation::start_sample() const @@ -118,6 +117,11 @@ const vector* Annotation::annotations() const return annotations_; } +const QString Annotation::longest_annotation() const +{ + return annotations_->front(); +} + const Row* Annotation::row() const { return row_; diff --git a/pv/data/decode/annotation.hpp b/pv/data/decode/annotation.hpp index cfa5e5e9..e599bdd4 100644 --- a/pv/data/decode/annotation.hpp +++ b/pv/data/decode/annotation.hpp @@ -53,6 +53,7 @@ public: const QString ann_class_name() const; const vector* annotations() const; + const QString longest_annotation() const; const Row* row() const; bool operator<(const Annotation &other) const; diff --git a/pv/data/decode/decoder.cpp b/pv/data/decode/decoder.cpp index e6fe82d2..600382fe 100644 --- a/pv/data/decode/decoder.cpp +++ b/pv/data/decode/decoder.cpp @@ -36,8 +36,9 @@ namespace pv { namespace data { namespace decode { -Decoder::Decoder(const srd_decoder *const dec) : +Decoder::Decoder(const srd_decoder *const dec, uint8_t stack_level) : srd_decoder_(dec), + stack_level_(stack_level), visible_(true), decoder_inst_(nullptr) { @@ -96,6 +97,11 @@ const srd_decoder* Decoder::get_srd_decoder() const return srd_decoder_; } +uint8_t Decoder::get_stack_level() const +{ + return stack_level_; +} + const char* Decoder::name() const { return srd_decoder_->name; diff --git a/pv/data/decode/decoder.hpp b/pv/data/decode/decoder.hpp index eb9a44bf..7b1a2013 100644 --- a/pv/data/decode/decoder.hpp +++ b/pv/data/decode/decoder.hpp @@ -82,12 +82,14 @@ struct DecodeBinaryClassInfo class Decoder { public: - Decoder(const srd_decoder *const dec); + Decoder(const srd_decoder *const dec, uint8_t stack_level); virtual ~Decoder(); const srd_decoder* get_srd_decoder() const; + uint8_t get_stack_level() const; + const char* name() const; bool visible() const; @@ -97,7 +99,6 @@ public: void set_channels(vector channels); const map& options() const; - void set_option(const char *id, GVariant *value); void apply_all_options(); @@ -120,6 +121,7 @@ public: private: const srd_decoder* const srd_decoder_; + uint8_t stack_level_; bool visible_; diff --git a/pv/data/decode/rowdata.cpp b/pv/data/decode/rowdata.cpp index 7b6ec2d3..fc1480a1 100644 --- a/pv/data/decode/rowdata.cpp +++ b/pv/data/decode/rowdata.cpp @@ -90,8 +90,10 @@ void RowData::get_annotation_subset( } } -void RowData::emplace_annotation(srd_proto_data *pdata) +const Annotation* RowData::emplace_annotation(srd_proto_data *pdata) { + const Annotation* result = nullptr; + // We insert the annotation in a way so that the annotation list // is sorted by start sample. Otherwise, we'd have to sort when // painting, which is expensive @@ -108,11 +110,15 @@ void RowData::emplace_annotation(srd_proto_data *pdata) if (it != annotations_.begin()) it++; - annotations_.emplace(it, pdata, row_); + it = annotations_.emplace(it, pdata, row_); + result = &(*it); } else { annotations_.emplace_back(pdata, row_); + result = &(annotations_.back()); prev_ann_start_sample_ = pdata->start_sample; } + + return result; } } // namespace decode diff --git a/pv/data/decode/rowdata.hpp b/pv/data/decode/rowdata.hpp index 01ea94f4..48b6a41a 100644 --- a/pv/data/decode/rowdata.hpp +++ b/pv/data/decode/rowdata.hpp @@ -52,7 +52,7 @@ public: void get_annotation_subset(deque &dest, uint64_t start_sample, uint64_t end_sample) const; - void emplace_annotation(srd_proto_data *pdata); + const Annotation* emplace_annotation(srd_proto_data *pdata); private: deque annotations_; diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index f8e71999..a4888175 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -83,7 +83,7 @@ void DecodeSignal::stack_decoder(const srd_decoder *decoder, bool restart_decode if ((stack_.empty()) || ((stack_.size() > 0) && (name() == prev_dec_name))) set_name(QString::fromUtf8(decoder->name)); - const shared_ptr dec = make_shared(decoder); + const shared_ptr dec = make_shared(decoder, stack_.size()); stack_.push_back(dec); // Include the newly created decode channels in the channel lists @@ -642,6 +642,19 @@ const DecodeBinaryClass* DecodeSignal::get_binary_data_class(uint32_t segment_id return nullptr; } +const deque* DecodeSignal::get_all_annotations_by_segment( + uint32_t segment_id) const +{ + try { + const DecodeSegment *segment = &(segments_.at(segment_id)); + return &(segment->all_annotations); + } catch (out_of_range&) { + // Do nothing + } + + return nullptr; +} + void DecodeSignal::save_settings(QSettings &settings) const { SignalBase::save_settings(settings); @@ -737,7 +750,7 @@ void DecodeSignal::restore_settings(QSettings &settings) continue; if (QString::fromUtf8(dec->id) == id) { - shared_ptr decoder = make_shared(dec); + shared_ptr decoder = make_shared(dec, stack_.size()); stack_.push_back(decoder); decoder->set_visible(settings.value("visible", true).toBool()); @@ -1379,7 +1392,7 @@ void DecodeSignal::connect_input_notifiers() void DecodeSignal::create_decode_segment() { // Create annotation segment - segments_.emplace_back(DecodeSegment()); + segments_.emplace_back(); // Add annotation classes for (const shared_ptr& dec : stack_) @@ -1435,8 +1448,15 @@ void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signa if (!row) row = dec->get_row_by_id(0); - // Add the annotation - ds->segments_[ds->current_segment_id_].annotation_rows.at(row).emplace_annotation(pdata); + RowData& row_data = ds->segments_[ds->current_segment_id_].annotation_rows.at(row); + + // Add the annotation to the row + const Annotation* ann = row_data.emplace_annotation(pdata); + + // Add the annotation to the global annotation list + deque& all_annotations = + ds->segments_[ds->current_segment_id_].all_annotations; + all_annotations.emplace_back(ann); } void DecodeSignal::binary_callback(srd_proto_data *pdata, void *decode_signal) diff --git a/pv/data/decodesignal.hpp b/pv/data/decodesignal.hpp index cee4ccf0..51745b7b 100644 --- a/pv/data/decodesignal.hpp +++ b/pv/data/decodesignal.hpp @@ -77,11 +77,17 @@ struct DecodeBinaryClass struct DecodeSegment { + // Constructor is a no-op + DecodeSegment() { }; + // Copy constructor is a no-op + DecodeSegment(DecodeSegment&& ds) { (void)ds; }; + map annotation_rows; pv::util::Timestamp start_time; double samplerate; int64_t samples_decoded_incl, samples_decoded_excl; vector binary_classes; + deque all_annotations; }; class DecodeSignal : public SignalBase @@ -176,6 +182,8 @@ public: const DecodeBinaryClass* get_binary_data_class(uint32_t segment_id, const Decoder* dec, uint32_t bin_class_id) const; + const deque* get_all_annotations_by_segment(uint32_t segment_id) const; + virtual void save_settings(QSettings &settings) const; virtual void restore_settings(QSettings &settings); diff --git a/pv/views/tabular_decoder/item.cpp b/pv/views/tabular_decoder/item.cpp deleted file mode 100644 index a4b79f33..00000000 --- a/pv/views/tabular_decoder/item.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2020 Soeren Apel - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -#include "pv/views/tabular_decoder/view.hpp" - -using std::out_of_range; - -namespace pv { -namespace views { -namespace tabular_decoder { - -AnnotationCollectionItem::AnnotationCollectionItem(const vector& data, - shared_ptr parent) : - data_(data), - parent_(parent) -{ -} - -void AnnotationCollectionItem::appendSubItem(shared_ptr item) -{ - subItems_.push_back(item); -} - -shared_ptr AnnotationCollectionItem::subItem(int row) const -{ - try { - return subItems_.at(row); - } catch (out_of_range&) { - return nullptr; - } -} - -shared_ptr AnnotationCollectionItem::parent() const -{ - return parent_; -} - -shared_ptr AnnotationCollectionItem::findSubItem( - const QVariant& value, int column) -{ - for (shared_ptr item : subItems_) - if (item->data(column) == value) - return item; - - return nullptr; -} - -int AnnotationCollectionItem::subItemCount() const -{ - return subItems_.size(); -} - -int AnnotationCollectionItem::columnCount() const -{ - return data_.size(); -} - -int AnnotationCollectionItem::row() const -{ - if (parent_) - for (size_t i = 0; i < parent_->subItems_.size(); i++) - if (parent_->subItems_.at(i).get() == const_cast(this)) - return i; - - return 0; -} - -QVariant AnnotationCollectionItem::data(int column) const -{ - try { - return data_.at(column); - } catch (out_of_range&) { - return QVariant(); - } -} - -} // namespace tabular_decoder -} // namespace views -} // namespace pv diff --git a/pv/views/tabular_decoder/model.cpp b/pv/views/tabular_decoder/model.cpp index 35cdc958..e54fda8c 100644 --- a/pv/views/tabular_decoder/model.cpp +++ b/pv/views/tabular_decoder/model.cpp @@ -17,6 +17,7 @@ * along with this program; if not, see . */ +#include #include #include "pv/views/tabular_decoder/view.hpp" @@ -28,16 +29,17 @@ namespace views { namespace tabular_decoder { AnnotationCollectionModel::AnnotationCollectionModel(QObject* parent) : - QAbstractItemModel(parent) + QAbstractTableModel(parent), + all_annotations_(nullptr), + prev_segment_(0), + prev_last_row_(0) { - vector header_data; - header_data.emplace_back(tr("ID")); // Column #0 - header_data.emplace_back(tr("Start Time")); // Column #1 - header_data.emplace_back(tr("End Time")); // Column #2 - header_data.emplace_back(tr("Ann Row Name")); // Column #3 - header_data.emplace_back(tr("Class Row Name")); // Column #4 - header_data.emplace_back(tr("Value")); // Column #5 - root_ = make_shared(header_data); + // TBD Maybe use empty columns as indentation levels to indicate stacked decoders + header_data_.emplace_back(tr("Start Sample")); // Column #0 + header_data_.emplace_back(tr("Start Time")); // Column #1 + header_data_.emplace_back(tr("Ann Row Name")); // Column #2 + header_data_.emplace_back(tr("Ann Class Name")); // Column #3 + header_data_.emplace_back(tr("Value")); // Column #4 } QVariant AnnotationCollectionModel::data(const QModelIndex& index, int role) const @@ -45,19 +47,18 @@ QVariant AnnotationCollectionModel::data(const QModelIndex& index, int role) con if (!index.isValid()) return QVariant(); - if (role == Qt::DisplayRole) - { - AnnotationCollectionItem* item = - static_cast(index.internalPointer()); - - return item->data(index.column()); - } - - if ((role == Qt::FontRole) && (index.parent().isValid()) && (index.column() == 0)) - { - QFont font; - font.setItalic(true); - return QVariant(font); + if (role == Qt::DisplayRole) { + const Annotation* ann = + static_cast(index.internalPointer()); + + switch (index.column()) { + case 0: return QVariant((qulonglong)ann->start_sample()); // Column #0, Start Sample + case 1: return QVariant(0/*(qulonglong)ann->start_sample()*/); // Column #1, Start Time + case 2: return QVariant(ann->row()->title()); // Column #2, Ann Row Name + case 3: return QVariant(ann->ann_class_name()); // Column #3, Ann Class Name + case 4: return QVariant(ann->longest_annotation()); // Column #4, Value + default: return QVariant(); + } } return QVariant(); @@ -66,7 +67,7 @@ QVariant AnnotationCollectionModel::data(const QModelIndex& index, int role) con Qt::ItemFlags AnnotationCollectionModel::flags(const QModelIndex& index) const { if (!index.isValid()) - return nullptr; + return 0; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } @@ -75,7 +76,7 @@ QVariant AnnotationCollectionModel::headerData(int section, Qt::Orientation orie int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return root_->data(section); + return header_data_.at(section); return QVariant(); } @@ -83,55 +84,68 @@ QVariant AnnotationCollectionModel::headerData(int section, Qt::Orientation orie QModelIndex AnnotationCollectionModel::index(int row, int column, const QModelIndex& parent_idx) const { - if (!hasIndex(row, column, parent_idx)) - return QModelIndex(); - - AnnotationCollectionItem* parent = root_.get(); + (void)parent_idx; - if (parent_idx.isValid()) - parent = static_cast(parent_idx.internalPointer()); + if (!all_annotations_) + return QModelIndex(); - AnnotationCollectionItem* subItem = parent->subItem(row).get(); + if ((size_t)row > all_annotations_->size()) + return QModelIndex(); - return subItem ? createIndex(row, column, subItem) : QModelIndex(); + return createIndex(row, column, (void*)(all_annotations_->at(row))); } QModelIndex AnnotationCollectionModel::parent(const QModelIndex& index) const { - if (!index.isValid()) - return QModelIndex(); - - AnnotationCollectionItem* subItem = - static_cast(index.internalPointer()); + (void)index; - shared_ptr parent = subItem->parent(); - - return (parent == root_) ? QModelIndex() : - createIndex(parent->row(), 0, parent.get()); + return QModelIndex(); } int AnnotationCollectionModel::rowCount(const QModelIndex& parent_idx) const { - AnnotationCollectionItem* parent = root_.get(); + (void)parent_idx; - if (parent_idx.column() > 0) + if (!all_annotations_) return 0; - if (parent_idx.isValid()) - parent = static_cast(parent_idx.internalPointer()); - - return parent->subItemCount(); + return all_annotations_->size(); } int AnnotationCollectionModel::columnCount(const QModelIndex& parent_idx) const { - if (parent_idx.isValid()) - return static_cast( - parent_idx.internalPointer())->columnCount(); - else - return root_->columnCount(); + (void)parent_idx; + + return header_data_.size(); } +void AnnotationCollectionModel::set_signal_and_segment(data::DecodeSignal* signal, uint32_t current_segment) +{ + all_annotations_ = signal->get_all_annotations_by_segment(current_segment); + + if (!all_annotations_ || all_annotations_->empty()) { + prev_segment_ = current_segment; + return; + } + + const size_t new_row_count = all_annotations_->size() - 1; + + // Force the view associated with this model to update when the segment changes + if (prev_segment_ != current_segment) { + dataChanged(QModelIndex(), QModelIndex()); + layoutChanged(); + } else { + // Force the view associated with this model to update when we have more annotations + if (prev_last_row_ < new_row_count) { + dataChanged(index(prev_last_row_, 0, QModelIndex()), + index(new_row_count, 0, QModelIndex())); + layoutChanged(); + } + } + + prev_segment_ = current_segment; + prev_last_row_ = new_row_count; +} } // namespace tabular_decoder } // namespace views diff --git a/pv/views/tabular_decoder/view.cpp b/pv/views/tabular_decoder/view.cpp index 8c5859e3..069e55a0 100644 --- a/pv/views/tabular_decoder/view.cpp +++ b/pv/views/tabular_decoder/view.cpp @@ -19,8 +19,11 @@ #include +#include #include #include +#include +#include #include #include #include @@ -40,12 +43,32 @@ using pv::data::SignalBase; using pv::data::decode::Decoder; using pv::util::Timestamp; +using std::make_shared; using std::shared_ptr; namespace pv { namespace views { namespace tabular_decoder { +QSize QCustomTableView::minimumSizeHint() const +{ + QSize size(QTableView::sizeHint()); + + int width = 0; + for (int i = 0; i < horizontalHeader()->count(); i++) + if (!horizontalHeader()->isSectionHidden(i)) + width += horizontalHeader()->sectionSizeHint(i); + + size.setWidth(width + (horizontalHeader()->count() * 1)); + + return size; +} + +QSize QCustomTableView::sizeHint() const +{ + return minimumSizeHint(); +} + View::View(Session &session, bool is_main_view, QMainWindow *parent) : ViewBase(session, is_main_view, parent), @@ -55,9 +78,10 @@ View::View(Session &session, bool is_main_view, QMainWindow *parent) : decoder_selector_(new QComboBox()), save_button_(new QToolButton()), save_action_(new QAction(this)), - table_view_(new QTableView()), + table_view_(new QCustomTableView()), model_(new AnnotationCollectionModel()), - signal_(nullptr) + signal_(nullptr), + updating_data_(false) { QVBoxLayout *root_layout = new QVBoxLayout(this); root_layout->setContentsMargins(0, 0, 0, 0); @@ -101,6 +125,14 @@ View::View(Session &session, bool is_main_view, QMainWindow *parent) : table_view_->setSortingEnabled(true); table_view_->sortByColumn(0, Qt::AscendingOrder); + const int font_height = QFontMetrics(QApplication::font()).height(); + table_view_->verticalHeader()->setDefaultSectionSize((font_height * 5) / 4); + + table_view_->horizontalHeader()->setSectionResizeMode(model_->columnCount() - 1, QHeaderView::Stretch); + + table_view_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + parent->setSizePolicy(table_view_->sizePolicy()); + reset_view_state(); } @@ -135,18 +167,12 @@ void View::add_decode_signal(shared_ptr signal) connect(signal.get(), SIGNAL(decoder_removed(void*)), this, SLOT(on_decoder_removed(void*))); - // Add all decoders provided by this signal + // Add the top-level decoder provided by this signal auto stack = signal->decoder_stack(); - if (stack.size() > 1) { - for (const shared_ptr& dec : stack) { - QString title = QString("%1 (%2)").arg(signal->name(), dec->name()); - decoder_selector_->addItem(title, QVariant::fromValue((void*)dec.get())); - } - } else - if (!stack.empty()) { - shared_ptr& dec = stack.at(0); - decoder_selector_->addItem(signal->name(), QVariant::fromValue((void*)dec.get())); - } + if (!stack.empty()) { + shared_ptr& dec = stack.at(0); + decoder_selector_->addItem(signal->name(), QVariant::fromValue((void*)dec.get())); + } } void View::remove_decode_signal(shared_ptr signal) @@ -191,7 +217,18 @@ void View::update_data() if (!signal_) return; - // TBD + if (updating_data_) { + if (!delayed_view_updater_.isActive()) + delayed_view_updater_.start(); + return; + } + + updating_data_ = true; + + table_view_->setRootIndex(model_->index(1, 0, QModelIndex())); + model_->set_signal_and_segment(signal_, current_segment_); + + updating_data_ = false; } void View::save_data() const @@ -249,9 +286,8 @@ void View::on_selected_decoder_changed(int index) if (decoder_ == dec.get()) signal_ = ds.get(); - if (signal_) { + if (signal_) connect(signal_, SIGNAL(new_annotations()), this, SLOT(on_new_annotations())); - } update_data(); } @@ -266,24 +302,15 @@ void View::on_signal_name_changed(const QString &name) DecodeSignal* signal = dynamic_cast(sb); assert(signal); - // Update all decoder entries provided by this signal + // Update the top-level decoder provided by this signal auto stack = signal->decoder_stack(); - if (stack.size() > 1) { - for (const shared_ptr& dec : stack) { - QString title = QString("%1 (%2)").arg(signal->name(), dec->name()); - int index = decoder_selector_->findData(QVariant::fromValue((void*)dec.get())); - - if (index != -1) - decoder_selector_->setItemText(index, title); - } - } else - if (!stack.empty()) { - shared_ptr& dec = stack.at(0); - int index = decoder_selector_->findData(QVariant::fromValue((void*)dec.get())); + if (!stack.empty()) { + shared_ptr& dec = stack.at(0); + int index = decoder_selector_->findData(QVariant::fromValue((void*)dec.get())); - if (index != -1) - decoder_selector_->setItemText(index, signal->name()); - } + if (index != -1) + decoder_selector_->setItemText(index, signal->name()); + } } void View::on_new_annotations() @@ -294,8 +321,6 @@ void View::on_new_annotations() void View::on_decoder_stacked(void* decoder) { - // TODO This doesn't change existing entries for the same signal - but it should as the naming scheme may change - Decoder* d = static_cast(decoder); // Find the signal that contains the selected decoder @@ -308,9 +333,8 @@ void View::on_decoder_stacked(void* decoder) assert(signal); - // Add the decoder to the list - QString title = QString("%1 (%2)").arg(signal->name(), d->name()); - decoder_selector_->addItem(title, QVariant::fromValue((void*)d)); + if (signal == signal_) + update_data(); } void View::on_decoder_removed(void* decoder) diff --git a/pv/views/tabular_decoder/view.hpp b/pv/views/tabular_decoder/view.hpp index 83a45491..b19ba614 100644 --- a/pv/views/tabular_decoder/view.hpp +++ b/pv/views/tabular_decoder/view.hpp @@ -35,31 +35,7 @@ namespace views { namespace tabular_decoder { -class AnnotationCollectionItem -{ -public: - AnnotationCollectionItem(const vector& data, - shared_ptr parent = nullptr); - - void appendSubItem(shared_ptr item); - - shared_ptr subItem(int row) const; - shared_ptr parent() const; - shared_ptr findSubItem(const QVariant& value, int column); - - int subItemCount() const; - int columnCount() const; - int row() const; - QVariant data(int column) const; - -private: - vector< shared_ptr > subItems_; - vector data_; - shared_ptr parent_; -}; - - -class AnnotationCollectionModel : public QAbstractItemModel +class AnnotationCollectionModel : public QAbstractTableModel { Q_OBJECT @@ -79,8 +55,23 @@ public: int rowCount(const QModelIndex& parent_idx = QModelIndex()) const override; int columnCount(const QModelIndex& parent_idx = QModelIndex()) const override; + void set_signal_and_segment(data::DecodeSignal* signal, uint32_t current_segment); + private: - shared_ptr root_; + vector header_data_; + const deque* all_annotations_; + uint32_t prev_segment_; + uint64_t prev_last_row_; +}; + + +class QCustomTableView : public QTableView +{ + Q_OBJECT + +public: + QSize minimumSizeHint() const; + QSize sizeHint() const; }; @@ -127,17 +118,18 @@ private Q_SLOTS: private: QWidget* parent_; - QComboBox *decoder_selector_; + QComboBox* decoder_selector_; QToolButton* save_button_; QAction* save_action_; - QTableView* table_view_; + QCustomTableView* table_view_; AnnotationCollectionModel* model_; - data::DecodeSignal *signal_; - const data::decode::Decoder *decoder_; + data::DecodeSignal* signal_; + const data::decode::Decoder* decoder_; + bool updating_data_; }; } // namespace tabular_decoder diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d800368b..5ab5afa4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -176,7 +176,6 @@ if(ENABLE_DECODE) ${PROJECT_SOURCE_DIR}/pv/subwindows/decoder_selector/subwindow.cpp ${PROJECT_SOURCE_DIR}/pv/views/decoder_binary/view.cpp ${PROJECT_SOURCE_DIR}/pv/views/decoder_binary/QHexView.cpp - ${PROJECT_SOURCE_DIR}/pv/views/tabular_decoder/item.cpp ${PROJECT_SOURCE_DIR}/pv/views/tabular_decoder/model.cpp ${PROJECT_SOURCE_DIR}/pv/views/tabular_decoder/view.cpp ${PROJECT_SOURCE_DIR}/pv/views/trace/decodetrace.cpp