X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Flogicsignal.cpp;h=22b39bbbcfaa49f907696c005fb991508e3cb3eb;hp=4b07c568d90268dcccb5b5c25c251e07902c45ff;hb=ddfda54df6070f6188663d9cc17b7cafeb30cc40;hpb=0f1f98fe5b6ccc7add3cedc035b0df5d8e5431eb diff --git a/pv/view/logicsignal.cpp b/pv/view/logicsignal.cpp index 4b07c56..22b39bb 100644 --- a/pv/view/logicsignal.cpp +++ b/pv/view/logicsignal.cpp @@ -81,6 +81,22 @@ const QColor LogicSignal::SignalColours[10] = { QColor(0xEE, 0xEE, 0xEC), // White }; +QColor LogicSignal::TriggerMarkerBackgroundColour = QColor(0xED, 0xD4, 0x00); +const int LogicSignal::TriggerMarkerPadding = 2; +const char* LogicSignal::TriggerMarkerIcons[8] = { + nullptr, + ":/icons/trigger-marker-low.svg", + ":/icons/trigger-marker-high.svg", + ":/icons/trigger-marker-rising.svg", + ":/icons/trigger-marker-falling.svg", + ":/icons/trigger-marker-change.svg", + nullptr, + nullptr +}; + +QCache LogicSignal::icon_cache_; +QCache LogicSignal::pixmap_cache_; + LogicSignal::LogicSignal( pv::Session &session, shared_ptr device, @@ -220,6 +236,45 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right) delete[] cap_lines; } +void LogicSignal::paint_fore(QPainter &p, int left, int right) +{ + (void)left; + + // Draw the trigger marker + if (!trigger_match_) + return; + + const int y = get_visual_y(); + const vector trig_types = get_trigger_types(); + for (int32_t type_id : trig_types) { + const TriggerMatchType *const type = + TriggerMatchType::get(type_id); + if (trigger_match_ != type || type_id < 0 || + (size_t)type_id >= countof(TriggerMarkerIcons) || + !TriggerMarkerIcons[type_id]) + continue; + + const QPixmap *const pixmap = get_pixmap( + TriggerMarkerIcons[type_id]); + if (!pixmap) + continue; + + const int pad = TriggerMarkerPadding; + const QSize size = pixmap->size(); + const QPoint point( + right - size.width() - pad * 2, + y - (SignalHeight + size.height()) / 2); + + p.setPen(QPen(Qt::NoPen)); + p.setBrush(TriggerMarkerBackgroundColour); + p.drawRoundedRect(QRect(point, size).adjusted( + -pad, -pad, pad, pad), pad, pad); + p.drawPixmap(point, *pixmap); + + break; + } +} + void LogicSignal::paint_caps(QPainter &p, QLineF *const lines, vector< pair > &edges, bool level, double samples_per_pixel, double pixels_offset, float x_offset, @@ -378,6 +433,9 @@ void LogicSignal::modify_trigger() session_.session()->set_trigger( new_trigger->stages().empty() ? nullptr : new_trigger); + + if (owner_) + owner_->appearance_changed(false, true); } const QIcon* LogicSignal::get_icon(const char *path) @@ -391,6 +449,17 @@ const QIcon* LogicSignal::get_icon(const char *path) return icon; } +const QPixmap* LogicSignal::get_pixmap(const char *path) +{ + const QPixmap *pixmap = pixmap_cache_.take(path); + if (!pixmap) { + pixmap = new QPixmap(path); + pixmap_cache_.insert(path, pixmap); + } + + return pixmap; +} + void LogicSignal::on_trigger() { QAction *action;