X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fdecodesignal.cpp;h=5f6bfffcac63a95a5f3e45518405ddd5b1bf5353;hp=1e53427526361660461fb460f027513916b7372b;hb=5ed1adf555e0f0fb36d5b4b36f2be17745b5c8ae;hpb=82c7f64018db2a90f44704e55ba469151522762f diff --git a/pv/view/decodesignal.cpp b/pv/view/decodesignal.cpp index 1e534275..5f6bfffc 100644 --- a/pv/view/decodesignal.cpp +++ b/pv/view/decodesignal.cpp @@ -22,24 +22,41 @@ extern "C" { #include } +#include + +#include + #include "decodesignal.h" +#include +#include +#include +#include + using namespace boost; using namespace std; namespace pv { namespace view { -DecodeSignal::DecodeSignal(pv::SigSession &session, srd_decoder *const dec) : - Trace(session, QString(dec->name)), - _decoder(dec) -{ - _colour = Qt::red; -} +const QColor DecodeSignal::DecodeColours[4] = { + QColor(0xEF, 0x29, 0x29), // Red + QColor(0xFC, 0xE9, 0x4F), // Yellow + QColor(0x8A, 0xE2, 0x34), // Green + QColor(0x72, 0x9F, 0xCF) // Blue +}; -void DecodeSignal::init_context_bar_actions(QWidget *parent) +DecodeSignal::DecodeSignal(pv::SigSession &session, + boost::shared_ptr decoder, int index) : + Trace(session, QString(decoder->get_decoder()->name)), + _decoder(decoder) { - (void)parent; + assert(_decoder); + + _colour = DecodeColours[index % countof(DecodeColours)]; + + connect(_decoder.get(), SIGNAL(new_decode_data()), + this, SLOT(on_new_decode_data())); } bool DecodeSignal::enabled() const @@ -47,22 +64,73 @@ bool DecodeSignal::enabled() const return true; } -void DecodeSignal::paint(QPainter &p, int y, int left, int right, - double scale, double offset) +void DecodeSignal::set_view(pv::view::View *view) { - (void)p; - (void)y; - (void)left; - (void)right; - (void)offset; + assert(view); + Trace::set_view(view); +} +void DecodeSignal::paint_back(QPainter &p, int left, int right) +{ + paint_axis(p, get_y(), left, right); +} + +void DecodeSignal::paint_mid(QPainter &p, int left, int right) +{ + using namespace pv::view::decode; + + assert(_view); + const int y = get_y(); + + const double scale = _view->scale(); assert(scale > 0); + + double samplerate = _decoder->get_samplerate(); + + // Show sample rate as 1Hz when it is unknown + if (samplerate == 0.0) + samplerate = 1.0; + + const double pixels_offset = (_view->offset() - + _decoder->get_start_time()) / scale; + const double samples_per_pixel = samplerate * scale; + + assert(_decoder); + vector< shared_ptr > annotations(_decoder->annotations()); + BOOST_FOREACH(shared_ptr a, annotations) { + assert(a); + a->paint(p, get_text_colour(), _text_size.height(), + left, right, samples_per_pixel, pixels_offset, y); + } +} + +QMenu* DecodeSignal::create_context_menu(QWidget *parent) +{ + QMenu *const menu = Trace::create_context_menu(parent); + + menu->addSeparator(); + + QAction *const del = new QAction(tr("Delete"), this); + connect(del, SIGNAL(triggered()), this, SLOT(on_delete())); + menu->addAction(del); + + return menu; +} + +void DecodeSignal::on_new_decode_data() +{ + if (_view) + _view->update_viewport(); +} + +void DecodeSignal::delete_pressed() +{ + on_delete(); } -const list DecodeSignal::get_context_bar_actions() +void DecodeSignal::on_delete() { - list actions; - return actions; + _session.remove_decode_signal(this); } } // namespace view