#include <pv/widgets/decodermenu.hpp>
using std::all_of;
-using std::list;
using std::make_pair;
using std::max;
-using std::make_pair;
-using std::map;
using std::min;
using std::out_of_range;
using std::pair;
using std::shared_ptr;
-using std::make_shared;
using std::tie;
-using std::unordered_set;
using std::vector;
using pv::data::decode::Annotation;
const int DecodeTrace::RowTitleMargin = 10;
const int DecodeTrace::DrawPadding = 100;
+const int DecodeTrace::MaxTraceUpdateRate = 1; // No more than 1 Hz
+
const QColor DecodeTrace::Colours[16] = {
QColor(0xEF, 0x29, 0x29),
QColor(0xF6, 0x6A, 0x32),
connect(decode_signal_.get(), SIGNAL(new_annotations()),
this, SLOT(on_new_annotations()));
+ connect(decode_signal_.get(), SIGNAL(decode_finished()),
+ this, SLOT(on_decode_finished()));
connect(decode_signal_.get(), SIGNAL(channels_updated()),
this, SLOT(on_channels_updated()));
this, SLOT(on_delete_decoder(int)));
connect(&show_hide_mapper_, SIGNAL(mapped(int)),
this, SLOT(on_show_hide_decoder(int)));
+
+ connect(&delayed_trace_updater_, SIGNAL(timeout()),
+ this, SLOT(on_delayed_trace_update()));
+ delayed_trace_updater_.setSingleShot(true);
+ delayed_trace_updater_.setInterval(1000 / MaxTraceUpdateRate);
}
bool DecodeTrace::enabled() const
// Draw the hatching
draw_unresolved_period(p, annotation_height, pp.left(), pp.right());
- if ((int)visible_rows_.size() > max_visible_rows_)
- owner_->extents_changed(false, true);
+ if ((int)visible_rows_.size() > max_visible_rows_) {
+ max_visible_rows_ = (int)visible_rows_.size();
- // Update the maximum row count if needed
- max_visible_rows_ = max(max_visible_rows_, (int)visible_rows_.size());
+ // Call order is important, otherwise the lazy event handler won't work
+ owner_->extents_changed(false, true);
+ owner_->row_item_appearance_changed(false, true);
+ }
}
void DecodeTrace::paint_fore(QPainter &p, ViewItemPaintParams &pp)
init_state_map_.clear();
decoder_forms_.clear();
- const list< shared_ptr<Decoder> > &stack =
- decode_signal_->decoder_stack_list();
+ const vector< shared_ptr<Decoder> > &stack = decode_signal_->decoder_stack();
if (stack.empty()) {
QLabel *const l = new QLabel(
double samples_per_pixel, pixels_offset;
- const int64_t sample_count = decode_signal_->sample_count();
+ const int64_t sample_count = decode_signal_->get_working_sample_count();
if (sample_count == 0)
return;
- const int64_t samples_decoded = decode_signal_->samples_decoded();
+ const int64_t samples_decoded = decode_signal_->get_decoded_sample_count();
if (sample_count == samples_decoded)
return;
QString() : annotations[0].annotations().front();
}
-void DecodeTrace::hover_point_changed()
+void DecodeTrace::hover_point_changed(const QPoint &hp)
{
assert(owner_);
const View *const view = owner_->view();
assert(view);
- QPoint hp = view->hover_point();
+ if (hp.x() == 0) {
+ QToolTip::hideText();
+ return;
+ }
+
QString ann = get_annotation_at_point(hp);
assert(view);
// If it did, the tool tip would constantly hide and re-appear.
// We also push it up by one row so that it appears above the
// decode trace, not below.
- hp.setX(hp.x() - (text_size.width() / 2) - padding);
+ QPoint p = hp;
+ p.setX(hp.x() - (text_size.width() / 2) - padding);
- hp.setY(get_visual_y() - (row_height_ / 2) +
+ p.setY(get_visual_y() - (row_height_ / 2) +
(hover_row * row_height_) -
row_height_ - text_size.height() - padding);
- QToolTip::showText(view->viewport()->mapToGlobal(hp), ann);
+ QToolTip::showText(view->viewport()->mapToGlobal(p), ann);
}
void DecodeTrace::create_decoder_form(int index,
QFormLayout *const decoder_form = new QFormLayout;
group->add_layout(decoder_form);
- const list<DecodeChannel> channels = decode_signal_->get_channels();
+ const vector<DecodeChannel> channels = decode_signal_->get_channels();
// Add the channels
for (DecodeChannel ch : channels) {
.arg(ch.name, ch.desc, required_flag), hlayout);
}
- shared_ptr<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
// Add the options
shared_ptr<binding::Decoder> binding(
- new binding::Decoder(decoder_stack, dec));
+ new binding::Decoder(decode_signal_, dec));
binding->add_properties_to_form(decoder_form, true);
bindings_.push_back(binding);
}
void DecodeTrace::on_new_annotations()
+{
+ if (!delayed_trace_updater_.isActive())
+ delayed_trace_updater_.start();
+}
+
+void DecodeTrace::on_delayed_trace_update()
+{
+ if (owner_)
+ owner_->row_item_appearance_changed(false, true);
+}
+
+void DecodeTrace::on_decode_finished()
{
if (owner_)
owner_->row_item_appearance_changed(false, true);
{
decode_signal_->remove_decoder(index);
+ // Force re-calculation of the trace height, see paint_mid()
+ max_visible_rows_ = 0;
+ owner_->extents_changed(false, true);
+
// Update the popup
create_popup_form();
}
assert(index < (int)decoder_forms_.size());
decoder_forms_[index]->set_decoder_visible(state);
+ if (!state) {
+ // Force re-calculation of the trace height, see paint_mid()
+ max_visible_rows_ = 0;
+ owner_->extents_changed(false, true);
+ }
+
if (owner_)
owner_->row_item_appearance_changed(false, true);
}