]> sigrok.org Git - pulseview.git/blobdiff - pv/view/view.cpp
View: Use the slider value for the v-offset
[pulseview.git] / pv / view / view.cpp
index c53c02e3abd44f8242dc7bd1ceaf3d43a38cf02b..5e89397aec8e5e71c7732bd7e27faedadb20f40d 100644 (file)
@@ -38,7 +38,6 @@
 
 #include <libsigrok/libsigrok.hpp>
 
-#include "cursorheader.hpp"
 #include "decodetrace.hpp"
 #include "header.hpp"
 #include "logicsignal.hpp"
@@ -60,7 +59,6 @@ using pv::data::SignalData;
 using pv::data::Segment;
 using pv::util::format_time;
 
-using std::back_inserter;
 using std::deque;
 using std::dynamic_pointer_cast;
 using std::list;
@@ -86,31 +84,26 @@ const int View::MaxScrollValue = INT_MAX / 2;
 
 const int View::ScaleUnits[3] = {1, 2, 5};
 
-const QColor View::CursorAreaColour(220, 231, 243);
-
-const QSizeF View::LabelPadding(4, 0);
-
 View::View(Session &session, QWidget *parent) :
        QAbstractScrollArea(parent),
        session_(session),
        viewport_(new Viewport(*this)),
        ruler_(new Ruler(*this)),
-       cursorheader_(new CursorHeader(*this)),
        header_(new Header(*this)),
        scale_(1e-6),
        offset_(0),
-       v_offset_(0),
        updating_scroll_(false),
        tick_period_(0.0),
        tick_prefix_(0),
        show_cursors_(false),
        cursors_(new CursorPair(*this)),
+       next_flag_text_('A'),
        hover_point_(-1, -1)
 {
        connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
                this, SLOT(h_scroll_value_changed(int)));
        connect(verticalScrollBar(), SIGNAL(valueChanged(int)),
-               this, SLOT(v_scroll_value_changed(int)));
+               this, SLOT(v_scroll_value_changed()));
 
        connect(&session_, SIGNAL(signals_changed()),
                this, SLOT(signals_changed()));
@@ -121,22 +114,14 @@ View::View(Session &session, QWidget *parent) :
        connect(&session_, SIGNAL(frame_ended()),
                this, SLOT(data_updated()));
 
-       connect(cursors_->first().get(), SIGNAL(time_changed()),
-               this, SLOT(marker_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()),
-               cursorheader_, SLOT(clear_selection()));
-       connect(cursorheader_, 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(cursorheader_, SIGNAL(selection_changed()),
+       connect(ruler_, SIGNAL(selection_changed()),
                this, SIGNAL(selection_changed()));
 
        connect(this, SIGNAL(hover_point_changed()),
@@ -150,7 +135,6 @@ View::View(Session &session, QWidget *parent) :
 
        viewport_->installEventFilter(this);
        ruler_->installEventFilter(this);
-       cursorheader_->installEventFilter(this);
        header_->installEventFilter(this);
 
        // Trigger the initial event manually. The default device has signals
@@ -158,7 +142,7 @@ View::View(Session &session, QWidget *parent) :
        signals_changed();
 
        // make sure the transparent widgets are on the top
-       cursorheader_->raise();
+       ruler_->raise();
        header_->raise();
 
        // Update the zoom state
@@ -197,7 +181,8 @@ const Viewport* View::viewport() const
 
 vector< shared_ptr<TimeItem> > View::time_items() const
 {
-       vector< shared_ptr<TimeItem> > items;
+       const vector<shared_ptr<Flag>> f(flags());
+       vector<shared_ptr<TimeItem>> items(f.begin(), f.end());
        items.push_back(cursors_);
        items.push_back(cursors_->first());
        items.push_back(cursors_->second());
@@ -216,7 +201,7 @@ double View::offset() const
 
 int View::owner_visual_v_offset() const
 {
-       return -v_offset_;
+       return -verticalScrollBar()->sliderPosition();
 }
 
 unsigned int View::depth() const
@@ -298,7 +283,6 @@ void View::set_scale_offset(double scale, double offset)
 
        update_scroll();
        ruler_->update();
-       cursorheader_->update();
        viewport_->update();
        scale_offset_changed();
 }
@@ -351,7 +335,7 @@ bool View::cursors_shown() const
 void View::show_cursors(bool show)
 {
        show_cursors_ = show;
-       cursorheader_->update();
+       ruler_->update();
        viewport_->update();
 }
 
@@ -360,7 +344,7 @@ 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);
-       cursorheader_->update();
+       ruler_->update();
        viewport_->update();
 }
 
@@ -369,6 +353,32 @@ std::shared_ptr<CursorPair> View::cursors() const
        return cursors_;
 }
 
+void View::add_flag(double time)
+{
+       flags_.push_back(shared_ptr<Flag>(new Flag(*this, time,
+               QString("%1").arg(next_flag_text_))));
+       next_flag_text_ = (next_flag_text_ >= 'Z') ? 'A' :
+               (next_flag_text_ + 1);
+       time_item_appearance_changed(true, true);
+}
+
+void View::remove_flag(std::shared_ptr<Flag> flag)
+{
+       flags_.remove(flag);
+       time_item_appearance_changed(true, true);
+}
+
+vector< std::shared_ptr<Flag> > View::flags() const
+{
+       vector< std::shared_ptr<Flag> > flags(flags_.begin(), flags_.end());
+       stable_sort(flags.begin(), flags.end(),
+               [](const shared_ptr<Flag> &a, const shared_ptr<Flag> &b) {
+                       return a->time() < b->time();
+               });
+
+       return flags;
+}
+
 const QPoint& View::hover_point() const
 {
        return hover_point_;
@@ -496,13 +506,9 @@ void View::update_layout()
                header_->sizeHint().width() - pv::view::Header::BaselineOffset,
                ruler_->sizeHint().height(), 0, 0);
        ruler_->setGeometry(viewport_->x(), 0,
-               viewport_->width(), viewport_->y());
-       cursorheader_->setGeometry(
-               viewport_->x(),
-               ruler_->sizeHint().height() - cursorheader_->sizeHint().height() / 2,
-               viewport_->width(), cursorheader_->sizeHint().height());
+               viewport_->width(), ruler_->extended_size_hint().height());
        header_->setGeometry(0, viewport_->y(),
-               header_->sizeHint().width(), viewport_->height());
+               header_->extended_size_hint().width(), viewport_->height());
        update_scroll();
 }
 
@@ -566,7 +572,7 @@ bool View::eventFilter(QObject *object, QEvent *event)
                const QMouseEvent *const mouse_event = (QMouseEvent*)event;
                if (object == viewport_)
                        hover_point_ = mouse_event->pos();
-               else if (object == ruler_ || object == cursorheader_)
+               else if (object == ruler_)
                        hover_point_ = QPoint(mouse_event->x(), 0);
                else if (object == header_)
                        hover_point_ = QPoint(0, mouse_event->y());
@@ -615,6 +621,14 @@ void View::row_item_appearance_changed(bool label, bool content)
                viewport_->update();
 }
 
+void View::time_item_appearance_changed(bool label, bool content)
+{
+       if (label)
+               ruler_->update();
+       if (content)
+               viewport_->update();
+}
+
 void View::extents_changed(bool horz, bool vert)
 {
        sticky_events_ |=
@@ -638,13 +652,11 @@ void View::h_scroll_value_changed(int value)
        }
 
        ruler_->update();
-       cursorheader_->update();
        viewport_->update();
 }
 
-void View::v_scroll_value_changed(int value)
+void View::v_scroll_value_changed()
 {
-       v_offset_ = value;
        header_->update();
        viewport_->update();
 }
@@ -728,24 +740,14 @@ void View::data_updated()
        viewport_->update();
 }
 
-void View::marker_time_changed()
-{
-       cursorheader_->update();
-       viewport_->update();
-}
-
-void View::on_signals_moved()
-{
-       update_scroll();
-       signals_moved();
-}
-
 void View::process_sticky_events()
 {
        if (sticky_events_ & RowItemHExtentsChanged)
                update_layout();
-       if (sticky_events_ & RowItemVExtentsChanged)
+       if (sticky_events_ & RowItemVExtentsChanged) {
                restack_all_row_items();
+               update_scroll();
+       }
 
        // Clear the sticky events
        sticky_events_ = 0;