using pv::data::decode::Annotation;
using pv::data::decode::Row;
-using pv::data::DecodeChannel;
+using pv::data::decode::DecodeChannel;
using pv::data::DecodeSignal;
namespace pv {
{
decode_signal_ = dynamic_pointer_cast<data::DecodeSignal>(base_);
+ GlobalSettings settings;
+ always_show_all_rows_ = settings.value(GlobalSettings::Key_Dec_AlwaysShowAllRows).toBool();
+
+ GlobalSettings::add_change_handler(this);
+
// Determine shortest string we want to see displayed in full
QFontMetrics m(QApplication::font());
min_useful_label_width_ = m.width("XX"); // e.g. two hex characters
delayed_trace_updater_.setInterval(1000 / MaxTraceUpdateRate);
}
+DecodeTrace::~DecodeTrace()
+{
+ GlobalSettings::remove_change_handler(this);
+}
+
bool DecodeTrace::enabled() const
{
return true;
sample_range.second = min((int64_t)sample_range.second,
decode_signal_->get_decoded_sample_count(current_segment_, false));
- const vector<Row> rows = decode_signal_->visible_rows();
+ const vector<Row> rows = decode_signal_->get_rows();
visible_rows_.clear();
for (const Row& row : rows) {
// Cache the row title widths
int row_title_width;
- try {
- row_title_width = row_title_widths_.at(row);
- } catch (out_of_range&) {
+ auto cached_width = row_title_widths_.find(row);
+
+ if (cached_width != row_title_widths_.end())
+ row_title_width = cached_width->second;
+ else {
const int w = p.boundingRect(QRectF(), 0, row.title()).width() +
RowTitleMargin;
row_title_widths_[row] = w;
vector<Annotation> annotations;
decode_signal_->get_annotation_subset(annotations, row,
current_segment_, sample_range.first, sample_range.second);
- if (!annotations.empty()) {
+
+ // Show row if there are visible annotations or when user wants to see
+ // all rows that have annotations somewhere and this one is one of them
+ bool row_visible = !annotations.empty() ||
+ (always_show_all_rows_ && (decode_signal_->get_annotation_count(row, current_segment_) > 0));
+
+ if (row_visible) {
draw_annotations(annotations, p, annotation_height, pp, y,
get_row_color(row.index()), row_title_width);
y += row_height_;
connect(decoder_menu, SIGNAL(decoder_selected(srd_decoder*)),
this, SLOT(on_stack_decoder(srd_decoder*)));
+ decoder_menu->setStyleSheet("QMenu { menu-scrollable: 1; }");
+
stack_button_->setMenu(decoder_menu);
stack_button_->show();
return;
QAction *const copy_annotation_to_clipboard =
new QAction(tr("Copy annotation text to clipboard"), this);
copy_annotation_to_clipboard->setIcon(QIcon::fromTheme("edit-paste",
- QIcon(":/icons/edit-paste.png")));
+ QIcon(":/icons/edit-paste.svg")));
connect(copy_annotation_to_clipboard, SIGNAL(triggered()), this, SLOT(on_copy_annotation_to_clipboard()));
menu->addAction(copy_annotation_to_clipboard);
msg.exec();
}
+void DecodeTrace::on_setting_changed(const QString &key, const QVariant &value)
+{
+ Trace::on_setting_changed(key, value);
+
+ if (key == GlobalSettings::Key_Dec_AlwaysShowAllRows) {
+ visible_rows_.clear();
+ max_visible_rows_ = 0;
+ always_show_all_rows_ = value.toBool();
+ }
+}
+
void DecodeTrace::on_new_annotations()
{
if (!delayed_trace_updater_.isActive())
if (annotations->empty())
return;
- QClipboard *clipboard = QGuiApplication::clipboard();
- clipboard->setText(annotations->front().annotations().front());
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setText(annotations->front().annotations().front(), QClipboard::Clipboard);
+
+ if (clipboard->supportsSelection())
+ clipboard->setText(annotations->front().annotations().front(), QClipboard::Selection);
delete annotations;
}