Improved row annotation colouring
[pulseview.git] / pv / view / decodetrace.cpp
index cf5cd2ee35e1cc496f953a44b63fdd711756bdfc..dd76b4ca4a78e491dbac1b5784aba4d624d56739 100644 (file)
@@ -47,8 +47,13 @@ extern "C" {
 #include <pv/widgets/decodergroupbox.h>
 #include <pv/widgets/decodermenu.h>
 
-using namespace boost;
-using namespace std;
+using boost::dynamic_pointer_cast;
+using boost::shared_ptr;
+using std::list;
+using std::max;
+using std::map;
+using std::min;
+using std::vector;
 
 namespace pv {
 namespace view {
@@ -117,7 +122,7 @@ void DecodeTrace::paint_back(QPainter &p, int left, int right)
 
 void DecodeTrace::paint_mid(QPainter &p, int left, int right)
 {
-       using pv::data::decode::Annotation;
+       using namespace pv::data::decode;
 
        const double scale = _view->scale();
        assert(scale > 0);
@@ -132,29 +137,50 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right)
                _decoder_stack->get_start_time()) / scale;
        const double samples_per_pixel = samplerate * scale;
 
+       const uint64_t start_sample = (uint64_t)max((left + pixels_offset) *
+               samples_per_pixel, 0.0);
+       const uint64_t end_sample = (uint64_t)max((right + pixels_offset) *
+               samples_per_pixel, 0.0);
+
        QFontMetrics m(QApplication::font());
-       const int h = (m.boundingRect(QRect(), 0, "Tg").height() * 5) / 4;
+       const int text_height =  m.boundingRect(QRect(), 0, "Tg").height();
+       const int annotation_height = (text_height * 5) / 4;
+       const int row_height = (text_height * 6) / 4;
 
        assert(_decoder_stack);
        const QString err = _decoder_stack->error_message();
        if (!err.isEmpty())
        {
                draw_error(p, err, left, right);
-               draw_unresolved_period(p, h, left, right, samples_per_pixel,
-                       pixels_offset);
+               draw_unresolved_period(p, annotation_height, left, right,
+                       samples_per_pixel, pixels_offset);
                return;
        }
 
+       // Iterate through the rows
        assert(_view);
-       const int y = get_y();
+       int y = get_y();
 
        assert(_decoder_stack);
-       vector<Annotation> annotations(_decoder_stack->annotations());
-       BOOST_FOREACH(const Annotation &a, annotations)
-               draw_annotation(a, p, get_text_colour(), h, left, right,
-                       samples_per_pixel, pixels_offset, y);
 
-       draw_unresolved_period(p, h, left, right,
+       const vector<Row> rows(_decoder_stack->get_rows());
+       for (size_t i = 0; i < rows.size(); i++)
+       {
+               const Row &row = rows[i];
+               vector<Annotation> annotations;
+               _decoder_stack->get_annotation_subset(annotations, row,
+                       start_sample, end_sample);
+               if (!annotations.empty()) {
+                       BOOST_FOREACH(const Annotation &a, annotations)
+                               draw_annotation(a, p, get_text_colour(),
+                                       annotation_height, left, right,
+                                       samples_per_pixel, pixels_offset, y, i);
+                       y += row_height;
+               }
+       }
+
+       // Draw the hatching
+       draw_unresolved_period(p, annotation_height, left, right,
                samples_per_pixel, pixels_offset);
 }
 
@@ -226,14 +252,14 @@ QMenu* DecodeTrace::create_context_menu(QWidget *parent)
 
 void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a, QPainter &p,
        QColor text_color, int h, int left, int right, double samples_per_pixel,
-       double pixels_offset, int y) const
+       double pixels_offset, int y, unsigned int row_index) const
 {
        const double start = a.start_sample() / samples_per_pixel -
                pixels_offset;
        const double end = a.end_sample() / samples_per_pixel -
                pixels_offset;
-       const QColor fill = Colours[(a.format() * (countof(Colours) / 2 + 1)) %
-               countof(Colours)];
+       const QColor fill = Colours[((row_index * 2 + a.format()) *
+               (countof(Colours) / 4 + 1)) % countof(Colours)];
        const QColor outline(fill.darker());
 
        if (start > right + DrawPadding || end < left - DrawPadding)