]> sigrok.org Git - pulseview.git/commitdiff
View: Determine time unit and use it in other classes
authorSoeren Apel <redacted>
Sun, 9 Aug 2015 18:41:03 +0000 (20:41 +0200)
committerSoeren Apel <redacted>
Sun, 16 Aug 2015 12:28:02 +0000 (14:28 +0200)
pv/view/cursor.cpp
pv/view/cursorpair.cpp
pv/view/ruler.cpp
pv/view/view.cpp
pv/view/view.hpp

index 503031a7fbe592d4aa01b4873ca12de7c2d4966b..2f2bc482f22cc567c408723cd6eb8eedd651df32 100644 (file)
@@ -56,7 +56,7 @@ bool Cursor::enabled() const
 QString Cursor::get_text() const
 {
        return util::format_time(time_, view_.tick_prefix(),
 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
 }
 
 QRectF Cursor::label_rect(const QRectF &rect) const
index aec689193cff79702deec99ff06c76308a32573c..d7723752b62e6952467ef5ec5c615df4f049c364 100644 (file)
@@ -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").
        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));
 }
 
                arg(util::format_si_value(1.0 / fabs(delta), "Hz", -1, 4));
 }
 
index f25bcb8fc8fc3fabb8d2f929acc9af51775cbf2d..3ec75fc307ed7df0ec6d0b2e9a132510e32d2996 100644 (file)
@@ -122,7 +122,7 @@ void Ruler::paintEvent(QPaintEvent*)
                        // Draw a major tick
                        p.drawText(x, ValueMargin, 0, text_height,
                                AlignCenter | AlignTop | TextDontClip,
                        // 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));
                }
                        p.drawLine(QPointF(x, major_tick_y1),
                                QPointF(x, ruler_height));
                }
index 1aa7b7292da842b660865c821d6a884b929c18c9..42b22258dd59d2b0079ef6e1246b9382832e1166 100644 (file)
@@ -61,6 +61,7 @@ using boost::shared_mutex;
 using pv::data::SignalData;
 using pv::data::Segment;
 using pv::util::format_time;
 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;
 
 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),
        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'),
        show_cursors_(false),
        cursors_(new CursorPair(*this)),
        next_flag_text_('A'),
@@ -239,6 +241,11 @@ double View::tick_period() const
        return tick_period_;
 }
 
        return tick_period_;
 }
 
+TimeUnit View::time_unit() const
+{
+       return time_unit_;
+}
+
 void View::zoom(double steps)
 {
        zoom(steps, viewport_->width() / 2);
 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,
 
                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;
                                MinValueSpacing;
 
                min_width += SpacingIncrement;
@@ -638,6 +645,27 @@ vector< shared_ptr<Trace> > View::extract_new_traces_for_channels(
        return filtered_traces;
 }
 
        return filtered_traces;
 }
 
+void View::determine_time_unit()
+{
+       time_unit_ = util::Samples;
+
+       shared_lock<shared_mutex> lock(session().signals_mutex());
+       const unordered_set< shared_ptr<Signal> > &sigs(session().signals());
+
+       // Check all signals but...
+       for (const shared_ptr<Signal> signal : sigs) {
+               const shared_ptr<SignalData> data = signal->data();
+
+               // ...only check first segment of each
+               const vector< shared_ptr<Segment> > 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();
 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 {
                if (!delayed_view_updater_.isActive())
                        delayed_view_updater_.start();
        } else {
+               determine_time_unit();
                update_scroll();
                ruler_->update();
                viewport_->update();
                update_scroll();
                ruler_->update();
                viewport_->update();
@@ -902,6 +931,7 @@ void View::perform_delayed_view_update()
                offset_ = scale_ * length;
        }
 
                offset_ = scale_ * length;
        }
 
+       determine_time_unit();
        update_scroll();
        ruler_->update();
        viewport_->update();
        update_scroll();
        ruler_->update();
        viewport_->update();
index 2c81e74782cbbac3d3948aec2c9ca963d90632ae..b7d35e3c4102207998243147b0d2ab942c31d8c7 100644 (file)
@@ -34,6 +34,7 @@
 #include <QTimer>
 
 #include <pv/data/signaldata.hpp>
 #include <QTimer>
 
 #include <pv/data/signaldata.hpp>
+#include <pv/util.hpp>
 
 #include "cursorpair.hpp"
 #include "flag.hpp"
 
 #include "cursorpair.hpp"
 #include "flag.hpp"
@@ -129,6 +130,11 @@ public:
         */
        double tick_period() const;
 
         */
        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.
         */
        /**
         * Returns the number of nested parents that this row item owner has.
         */
@@ -259,6 +265,8 @@ private:
                        std::shared_ptr<Signal> > &signal_map,
                std::set< std::shared_ptr<Trace> > &add_list);
 
                        std::shared_ptr<Signal> > &signal_map,
                std::set< std::shared_ptr<Trace> > &add_list);
 
+       void determine_time_unit();
+
 private:
        bool eventFilter(QObject *object, QEvent *event);
 
 private:
        bool eventFilter(QObject *object, QEvent *event);
 
@@ -306,6 +314,7 @@ private:
 
        double tick_period_;
        unsigned int tick_prefix_;
 
        double tick_period_;
        unsigned int tick_prefix_;
+       util::TimeUnit time_unit_;
 
        bool show_cursors_;
        std::shared_ptr<CursorPair> cursors_;
 
        bool show_cursors_;
        std::shared_ptr<CursorPair> cursors_;