]> sigrok.org Git - pulseview.git/blobdiff - pv/view/view.cpp
View: Added set_v_offset
[pulseview.git] / pv / view / view.cpp
index d58e074a3ef72ec77bc3e75c3487dac627cbb15d..c09609ac65d49daa9a9ad8988ff805f84cc39a6f 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,17 +114,14 @@ View::View(Session &session, QWidget *parent) :
        connect(&session_, SIGNAL(frame_ended()),
                this, SLOT(data_updated()));
 
-       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()),
@@ -145,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
@@ -153,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
@@ -192,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());
@@ -211,7 +201,14 @@ double View::offset() const
 
 int View::owner_visual_v_offset() const
 {
-       return -v_offset_;
+       return -verticalScrollBar()->sliderPosition();
+}
+
+void View::set_v_offset(int offset)
+{
+       verticalScrollBar()->setSliderPosition(offset);
+       header_->update();
+       viewport_->update();
 }
 
 unsigned int View::depth() const
@@ -293,7 +290,6 @@ void View::set_scale_offset(double scale, double offset)
 
        update_scroll();
        ruler_->update();
-       cursorheader_->update();
        viewport_->update();
        scale_offset_changed();
 }
@@ -346,7 +342,7 @@ bool View::cursors_shown() const
 void View::show_cursors(bool show)
 {
        show_cursors_ = show;
-       cursorheader_->update();
+       ruler_->update();
        viewport_->update();
 }
 
@@ -355,7 +351,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();
 }
 
@@ -364,6 +360,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_;
@@ -491,13 +513,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();
 }
 
@@ -561,7 +579,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());
@@ -613,7 +631,7 @@ void View::row_item_appearance_changed(bool label, bool content)
 void View::time_item_appearance_changed(bool label, bool content)
 {
        if (label)
-               cursorheader_->update();
+               ruler_->update();
        if (content)
                viewport_->update();
 }
@@ -641,13 +659,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();
 }
@@ -731,18 +747,14 @@ void View::data_updated()
        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;