From ef454ad5cf454ae2da91b45219e1be2e010d8312 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Sun, 9 Aug 2015 20:41:03 +0200 Subject: [PATCH] View: Determine time unit and use it in other classes --- pv/view/cursor.cpp | 2 +- pv/view/cursorpair.cpp | 2 +- pv/view/ruler.cpp | 2 +- pv/view/view.cpp | 32 +++++++++++++++++++++++++++++++- pv/view/view.hpp | 9 +++++++++ 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/pv/view/cursor.cpp b/pv/view/cursor.cpp index 503031a7..2f2bc482 100644 --- a/pv/view/cursor.cpp +++ b/pv/view/cursor.cpp @@ -56,7 +56,7 @@ bool Cursor::enabled() const QString Cursor::get_text() const { return util::format_time(time_, view_.tick_prefix(), - util::TimeUnit::Time, 2); + view_.time_unit(), 2); } QRectF Cursor::label_rect(const QRectF &rect) const diff --git a/pv/view/cursorpair.cpp b/pv/view/cursorpair.cpp index aec68919..d7723752 100644 --- a/pv/view/cursorpair.cpp +++ b/pv/view/cursorpair.cpp @@ -164,7 +164,7 @@ QString CursorPair::format_string() const unsigned int prefix = view_.tick_prefix(); const double delta = second_->time() - first_->time(); return QString("%1 / %2"). - arg(util::format_time(delta, prefix, util::TimeUnit::Time, 2)). + arg(util::format_time(delta, prefix, view_.time_unit(), 2)). arg(util::format_si_value(1.0 / fabs(delta), "Hz", -1, 4)); } diff --git a/pv/view/ruler.cpp b/pv/view/ruler.cpp index f25bcb8f..3ec75fc3 100644 --- a/pv/view/ruler.cpp +++ b/pv/view/ruler.cpp @@ -122,7 +122,7 @@ void Ruler::paintEvent(QPaintEvent*) // Draw a major tick p.drawText(x, ValueMargin, 0, text_height, AlignCenter | AlignTop | TextDontClip, - util::format_time(t, prefix)); + util::format_time(t, prefix, view_.time_unit())); p.drawLine(QPointF(x, major_tick_y1), QPointF(x, ruler_height)); } diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 1aa7b729..42b22258 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -61,6 +61,7 @@ using boost::shared_mutex; using pv::data::SignalData; using pv::data::Segment; using pv::util::format_time; +using pv::util::TimeUnit; using std::deque; using std::dynamic_pointer_cast; @@ -103,6 +104,7 @@ View::View(Session &session, QWidget *parent) : always_zoom_to_fit_(false), tick_period_(0.0), tick_prefix_(0), + time_unit_(util::Time), show_cursors_(false), cursors_(new CursorPair(*this)), next_flag_text_('A'), @@ -239,6 +241,11 @@ double View::tick_period() const return tick_period_; } +TimeUnit View::time_unit() const +{ + return time_unit_; +} + void View::zoom(double steps) { zoom(steps, viewport_->width() / 2); @@ -504,7 +511,7 @@ void View::calculate_tick_spacing() typical_width = m.boundingRect(0, 0, INT_MAX, INT_MAX, Qt::AlignLeft | Qt::AlignTop, - format_time(offset_, tick_prefix_)).width() + + format_time(offset_, tick_prefix_, time_unit_)).width() + MinValueSpacing; min_width += SpacingIncrement; @@ -638,6 +645,27 @@ vector< shared_ptr > View::extract_new_traces_for_channels( return filtered_traces; } +void View::determine_time_unit() +{ + time_unit_ = util::Samples; + + shared_lock lock(session().signals_mutex()); + const unordered_set< shared_ptr > &sigs(session().signals()); + + // Check all signals but... + for (const shared_ptr signal : sigs) { + const shared_ptr data = signal->data(); + + // ...only check first segment of each + const vector< shared_ptr > segments = data->segments(); + if (!segments.empty()) + if (segments[0]->samplerate()) { + time_unit_ = util::Time; + break; + } + } +} + bool View::eventFilter(QObject *object, QEvent *event) { const QEvent::Type type = event->type(); @@ -880,6 +908,7 @@ void View::data_updated() if (!delayed_view_updater_.isActive()) delayed_view_updater_.start(); } else { + determine_time_unit(); update_scroll(); ruler_->update(); viewport_->update(); @@ -902,6 +931,7 @@ void View::perform_delayed_view_update() offset_ = scale_ * length; } + determine_time_unit(); update_scroll(); ruler_->update(); viewport_->update(); diff --git a/pv/view/view.hpp b/pv/view/view.hpp index 2c81e747..b7d35e3c 100644 --- a/pv/view/view.hpp +++ b/pv/view/view.hpp @@ -34,6 +34,7 @@ #include #include +#include #include "cursorpair.hpp" #include "flag.hpp" @@ -129,6 +130,11 @@ public: */ double tick_period() const; + /** + * Returns the unit of time currently used. + */ + util::TimeUnit time_unit() const; + /** * Returns the number of nested parents that this row item owner has. */ @@ -259,6 +265,8 @@ private: std::shared_ptr > &signal_map, std::set< std::shared_ptr > &add_list); + void determine_time_unit(); + private: bool eventFilter(QObject *object, QEvent *event); @@ -306,6 +314,7 @@ private: double tick_period_; unsigned int tick_prefix_; + util::TimeUnit time_unit_; bool show_cursors_; std::shared_ptr cursors_; -- 2.30.2