]> sigrok.org Git - pulseview.git/commitdiff
RowItem: Replaced fixed signal heights with extents
authorJoel Holdsworth <redacted>
Sun, 2 Nov 2014 18:44:28 +0000 (18:44 +0000)
committerJoel Holdsworth <redacted>
Wed, 19 Nov 2014 10:23:03 +0000 (10:23 +0000)
15 files changed:
pv/view/analogsignal.cpp
pv/view/analogsignal.h
pv/view/decodetrace.cpp
pv/view/decodetrace.h
pv/view/logicsignal.cpp
pv/view/logicsignal.h
pv/view/rowitem.h
pv/view/rowitemowner.cpp
pv/view/rowitemowner.h
pv/view/tracegroup.cpp
pv/view/tracegroup.h
pv/view/view.cpp
pv/view/view.h
pv/view/viewport.cpp
pv/view/viewport.h

index eaa25bccc947dac826d5bddf2eff50ec2fcdd325..250fb94e9bc6623c6720a581721662798cdb571c 100644 (file)
@@ -31,6 +31,7 @@
 #include <libsigrok/libsigrok.hpp>
 
 using std::max;
+using std::make_pair;
 using std::min;
 using std::shared_ptr;
 using std::deque;
@@ -40,6 +41,8 @@ using sigrok::Channel;
 namespace pv {
 namespace view {
 
+const int AnalogSignal::NominalHeight = 80;
+
 const QColor AnalogSignal::SignalColours[4] = {
        QColor(0xC4, 0xA0, 0x00),       // Yellow
        QColor(0x87, 0x20, 0x7A),       // Magenta
@@ -79,6 +82,11 @@ void AnalogSignal::set_scale(float scale)
        _scale = scale;
 }
 
+std::pair<int, int> AnalogSignal::v_extents() const
+{
+       return make_pair(-NominalHeight / 2, NominalHeight / 2);
+}
+
 void AnalogSignal::paint_back(QPainter &p, int left, int right)
 {
        if (_channel->enabled())
index a7ae455b8598159e47c738a48cc5e8176ace3ed7..710639005a615cf485efb53b013ef0d7fecaab8d 100644 (file)
@@ -37,6 +37,7 @@ namespace view {
 class AnalogSignal : public Signal
 {
 private:
+       static const int NominalHeight;
        static const QColor SignalColours[4];
 
        static const float EnvelopeThreshold;
@@ -54,6 +55,12 @@ public:
 
        void set_scale(float scale);
 
+       /**
+        * Computes the vertical extents of the contents of this row item.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       std::pair<int, int> v_extents() const;
+
        /**
         * Paints the background layer of the signal with a QPainter
         * @param p the QPainter to paint into.
index 1cb9ce7154a9c302f15e3ecb63637f109f84286a..d97d01ef623931c2769c25dc5fe34b798cd6365c 100644 (file)
@@ -60,6 +60,7 @@ using std::list;
 using std::lock_guard;
 using std::make_pair;
 using std::max;
+using std::make_pair;
 using std::map;
 using std::min;
 using std::pair;
@@ -155,6 +156,16 @@ const std::shared_ptr<pv::data::DecoderStack>& DecodeTrace::decoder() const
        return _decoder_stack;
 }
 
+pair<int, int> DecodeTrace::v_extents() const
+{
+       /// @todo Replace this with an implementation that knows the true
+       /// height of the trace
+       QFontMetrics m(QApplication::font());
+       const int text_height =  m.boundingRect(QRect(), 0, "Tg").height();
+       const int row_height = (text_height * 6) / 4;
+       return make_pair(-row_height / 2, row_height * 7 / 2);
+}
+
 void DecodeTrace::paint_back(QPainter &p, int left, int right)
 {
        Trace::paint_back(p, left, right);
index ab495fa06f156ff5763d2896db2a215c0a8e1202..2bb115412f9c5eb562296596a4c7145fc124b95c 100644 (file)
@@ -90,6 +90,12 @@ public:
 
        const std::shared_ptr<pv::data::DecoderStack>& decoder() const;
 
+       /**
+        * Computes the vertical extents of the contents of this row item.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       std::pair<int, int> v_extents() const;
+
        /**
         * Paints the background layer of the trace with a QPainter
         * @param p the QPainter to paint into.
index 69c495e609fafd84b8113e274b3d270305240ff8..37445d96072133e64fe3d90d1798e4840a7d2f9d 100644 (file)
@@ -41,6 +41,7 @@
 
 using std::deque;
 using std::max;
+using std::make_pair;
 using std::min;
 using std::pair;
 using std::shared_ptr;
@@ -58,6 +59,9 @@ using sigrok::TriggerMatchType;
 namespace pv {
 namespace view {
 
+const int LogicSignal::SignalHeight = 30;
+const int LogicSignal::SignalMargin = 10;
+
 const float LogicSignal::Oversampling = 2.0f;
 
 const QColor LogicSignal::EdgeColour(0x80, 0x80, 0x80);
@@ -120,6 +124,11 @@ shared_ptr<pv::data::Logic> LogicSignal::logic_data() const
        return _data;
 }
 
+std::pair<int, int> LogicSignal::v_extents() const
+{
+       return make_pair(-SignalHeight - SignalMargin, SignalMargin);
+}
+
 void LogicSignal::paint_back(QPainter &p, int left, int right)
 {
        if (_channel->enabled())
@@ -152,7 +161,7 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right)
        if (!_channel->enabled())
                return;
 
-       const float high_offset = y - View::SignalHeight + 0.5f;
+       const float high_offset = y - SignalHeight + 0.5f;
        const float low_offset = y + 0.5f;
 
        const deque< shared_ptr<pv::data::LogicSnapshot> > &snapshots =
index 958abd8f1890c26f7661ee75884b9d3cc096b3ed..a275f177783ac211ea6279ab0e04e3f5510d7cc3 100644 (file)
@@ -45,6 +45,9 @@ class LogicSignal : public Signal
        Q_OBJECT
 
 private:
+       static const int SignalHeight;
+       static const int SignalMargin;
+
        static const float Oversampling;
 
        static const QColor EdgeColour;
@@ -65,6 +68,12 @@ public:
 
        std::shared_ptr<pv::data::Logic> logic_data() const;
 
+       /**
+        * Computes the vertical extents of the contents of this row item.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       std::pair<int, int> v_extents() const;
+
        /**
         * Paints the background layer of the signal with a QPainter
         * @param p the QPainter to paint into.
index 2133db878188ba906f17619d2d8a1c06fb250f06..1aafca4be3fbfee81b663532e9e6a887601d6f12 100644 (file)
@@ -77,6 +77,12 @@ public:
         */
        QPoint point() const;
 
+       /**
+        * Computes the vertical extents of the contents of this row item.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       virtual std::pair<int, int> v_extents() const = 0;
+
        /**
         * Paints the background layer of the trace with a QPainter
         * @param p the QPainter to paint into.
index 8633525eb4cd9fb2976ea4f3a97a36df7f7163e8..0fa230ab4e3fb47a609c105cb1de0dc91ad4d277 100644 (file)
 #include "rowitem.h"
 #include "rowitemowner.h"
 
+using std::max;
+using std::make_pair;
+using std::min;
+using std::pair;
 using std::shared_ptr;
 using std::vector;
 
@@ -84,5 +88,24 @@ RowItemOwner::const_iterator RowItemOwner::end() const
        return const_iterator(this);
 }
 
+pair<int, int> RowItemOwner::v_extents() const
+{
+       pair<int, int> extents(0, 0);
+       for (const shared_ptr<RowItem> r : child_items()) {
+               assert(r);
+               if (!r->enabled())
+                       continue;
+
+               const int child_offset = r->v_offset();
+               const pair<int, int> child_extents = r->v_extents();
+               extents.first = min(child_extents.first + child_offset,
+                       extents.first);
+               extents.second = max(child_extents.second + child_offset,
+                       extents.second);
+       }
+
+       return extents;
+}
+
 } // view
 } // pv
index 98df5ff7221bd69cf68517d9615e7546a2918d9a..4b25a580da685bf6bd8de62ff3d3167db72612bc 100644 (file)
@@ -113,6 +113,12 @@ public:
         */
        const_iterator end() const;
 
+       /**
+        * Computes the vertical extents of the contents of this row item owner.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       std::pair<int, int> v_extents() const;
+
        virtual void update_viewport() = 0;
 
 private:
index 9d0465fc3c863421f69bec5eaf5740b7629e83f2..bc63d7f2e9a80ea5576550110cf9589779bdf3ff 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "tracegroup.h"
 
+using std::pair;
 using std::shared_ptr;
 
 namespace pv {
@@ -68,6 +69,11 @@ const pv::view::View* TraceGroup::view() const
        return _owner->view();
 }
 
+pair<int, int> TraceGroup::v_extents() const
+{
+       return RowItemOwner::v_extents();
+}
+
 void TraceGroup::paint_label(QPainter &p, int right, bool hover)
 {
        (void)p;
index 21298dcb01e4d10f09423289a2a98f4ba0cb8ad7..a9f5558f4a381893dcae3d05c9bf36d9a9742243 100644 (file)
@@ -66,6 +66,12 @@ public:
         */
        virtual const pv::view::View* view() const;
 
+       /**
+        * Computes the vertical extents of the contents of this row item.
+        * @return A pair containing the minimum and maximum y-values.
+        */
+       std::pair<int, int> v_extents() const;
+
        /**
         * Paints the signal label.
         * @param p the QPainter to paint into.
index 615802239e2486d1a37d44705f0c98c98265ba80..37c3b14a1380f45994648099944625b8f4295c21 100644 (file)
@@ -67,9 +67,6 @@ const double View::MinScale = 1e-15;
 
 const int View::MaxScrollValue = INT_MAX / 2;
 
-const int View::SignalHeight = 30;
-const int View::SignalMargin = 10;
-
 const QColor View::CursorAreaColour(220, 231, 243);
 
 const QSizeF View::LabelPadding(4, 0);
@@ -386,9 +383,11 @@ void View::update_scroll()
 
        // Set the vertical scrollbar
        verticalScrollBar()->setPageStep(areaSize.height());
-       verticalScrollBar()->setRange(0,
-               _viewport->get_total_height() + SignalMargin -
-               areaSize.height());
+
+       const pair<int, int> extents = v_extents();
+       const int extra_scroll_height = (extents.second - extents.first) / 4;
+       verticalScrollBar()->setRange(extents.first - extra_scroll_height,
+               extents.first + extra_scroll_height);
 }
 
 void View::update_layout()
@@ -513,10 +512,14 @@ void View::signals_changed()
 #endif
 
        // Create the initial layout
-       int offset = SignalMargin + SignalHeight;
+       int offset = 0;
        for (shared_ptr<RowItem> r : *this) {
+               const pair<int, int> extents = r->v_extents();
+               if (r->enabled())
+                       offset += -extents.first;
                r->set_v_offset(offset);
-               offset += SignalHeight + 2 * SignalMargin;
+               if (r->enabled())
+                       offset += extents.second;
        }
 
        update_layout();
index 9f66fc9630590caf4eee92107cba7a268cabd87f..0352864500d659152dfd738444d30e8aba02ca38 100644 (file)
@@ -56,9 +56,6 @@ private:
        static const int MaxScrollValue;
 
 public:
-       static const int SignalHeight;
-       static const int SignalMargin;
-
        static const QColor CursorAreaColour;
 
        static const QSizeF LabelPadding;
index 8963e047b355dc8f3f0d2d2eba30fd2cb3b92766..82d13c92b985985efa7c9033760d80307c181bb6 100644 (file)
@@ -56,14 +56,6 @@ Viewport::Viewport(View &parent) :
                this, SLOT(on_signals_moved()));
 }
 
-int Viewport::get_total_height() const
-{
-       int h = 0;
-       for (auto &i : _view)
-               h = max(i->v_offset() + View::SignalHeight, h);
-       return h;
-}
-
 void Viewport::signals_updated()
 {
        for (shared_ptr<RowItem> r : _view) {
index 1f8f8f61095748e4290911e1fe5caa2d4cbedd74..f88f4f108a5a0d630709b21ca100f3c2798e1329 100644 (file)
@@ -41,8 +41,6 @@ class Viewport : public QWidget
 public:
        explicit Viewport(View &parent);
 
-       int get_total_height() const;
-
        void signals_updated();
 
 protected: