]> sigrok.org Git - pulseview.git/blobdiff - pv/view/view.cpp
Wrapped Cursors in a shared_ptr
[pulseview.git] / pv / view / view.cpp
index 34676334dc67867ba9b17fa064498232693e74e0..eca6b8eabce92c05575cbefeb1473ea95e424028 100644 (file)
@@ -70,9 +70,9 @@ View::View(SigSession &session, QWidget *parent) :
        _scale(1e-6),
        _offset(0),
        _v_offset(0),
+       _updating_scroll(false),
        _show_cursors(false),
-       _cursors(pair<Cursor, Cursor>(Cursor(*this, 0.0),
-               Cursor(*this, 1.0))),
+       _cursors(*this),
        _hover_point(-1, -1)
 {
        connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
@@ -85,14 +85,24 @@ View::View(SigSession &session, QWidget *parent) :
        connect(&_session, SIGNAL(data_updated()),
                this, SLOT(data_updated()));
 
-       connect(&_cursors.first, SIGNAL(time_changed()),
+       connect(_cursors.first().get(), SIGNAL(time_changed()),
                this, SLOT(marker_time_changed()));
-       connect(&_cursors.second, SIGNAL(time_changed()),
+       connect(_cursors.second().get(), SIGNAL(time_changed()),
                this, SLOT(marker_time_changed()));
 
        connect(_header, SIGNAL(signals_moved()),
                this, SLOT(on_signals_moved()));
 
+       connect(_header, SIGNAL(selection_changed()),
+               _ruler, SLOT(clear_selection()));
+       connect(_ruler, SIGNAL(selection_changed()),
+               _header, SLOT(clear_selection()));
+
+       connect(_header, SIGNAL(selection_changed()),
+               this, SIGNAL(selection_changed()));
+       connect(_ruler, SIGNAL(selection_changed()),
+               this, SIGNAL(selection_changed()));
+
        setViewportMargins(LabelMarginWidth, RulerHeight, 0, 0);
        setViewport(_viewport);
 
@@ -161,7 +171,21 @@ void View::show_cursors(bool show)
        _viewport->update();
 }
 
-std::pair<Cursor, Cursor>& View::cursors()
+void View::centre_cursors()
+{
+       const double time_width = _scale * _viewport->width();
+       _cursors.first()->set_time(_offset + time_width * 0.4);
+       _cursors.second()->set_time(_offset + time_width * 0.6);
+       _ruler->update();
+       _viewport->update();
+}
+
+CursorPair& View::cursors()
+{
+       return _cursors;
+}
+
+const CursorPair& View::cursors() const
 {
        return _cursors;
 }
@@ -208,7 +232,9 @@ void View::update_scroll()
        get_scroll_layout(length, offset);
        length = max(length - areaSize.width(), 0.0);
 
-       horizontalScrollBar()->setPageStep(areaSize.width());
+       horizontalScrollBar()->setPageStep(areaSize.width() / 2);
+
+       _updating_scroll = true;
 
        if (length < MaxScrollValue) {
                horizontalScrollBar()->setRange(0, length);
@@ -219,6 +245,8 @@ void View::update_scroll()
                        _offset * MaxScrollValue / (_scale * length));
        }
 
+       _updating_scroll = false;
+
        // Set the vertical scrollbar
        verticalScrollBar()->setPageStep(areaSize.height());
        verticalScrollBar()->setRange(0,
@@ -290,6 +318,9 @@ void View::resizeEvent(QResizeEvent*)
 
 void View::h_scroll_value_changed(int value)
 {
+       if (_updating_scroll)
+               return;
+
        const int range = horizontalScrollBar()->maximum();
        if (range < MaxScrollValue)
                _offset = _scale * value;