]> sigrok.org Git - pulseview.git/commitdiff
TraceView: Improve the way we do the initial scrolling setup
authorSoeren Apel <redacted>
Tue, 30 May 2017 06:01:25 +0000 (08:01 +0200)
committerUwe Hermann <redacted>
Tue, 30 May 2017 18:10:15 +0000 (20:10 +0200)
The two commits
ae5f66281c38a76dcb7011907d7a86a99b9dd4dd and
66e4eae9ce743016c3f6d4974bceb9b7fc0ae7d7

Were okay but it showed that there was one case they didn't
cover: the first session receives a resize notification upon
startup whereas all other sessions don't. This means that
sessions restored from a previous run suddenly see the
size_finalized_ variable always staying at false - until the
user resizes the window.

While figuring out how to cover this case, I realized that
there is actually an easier way to perform all this:
instead of keeping an internal state of when and how we
received useless and useful resize notifications, we just
act upon the "show" event, which always comes after all
the widget resizing has been performed. This way, we can
remove the size_finalized_ variable completely and as it
is definitely always received when a session is shown,
we always end up in a sane and correct state.

Note: to reproduce, open up a 2nd session and use demo.
Then, when using the group handle to move the analog traces
upwards, you'll notice that the logic traces will move down
at the same time. This is because size_finalized_ is false
and the view will always center the traces vertically.

pv/view/view.cpp
pv/view/view.hpp

index 772a95e07156f3232f24fd19fd46796b0711a7f3..c7944179ad5a7185de2dc3c0bf2a30c69ef09860 100644 (file)
@@ -149,8 +149,7 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
        trigger_markers_(),
        hover_point_(-1, -1),
        scroll_needs_defaults_(false),
-       saved_v_offset_(0),
-       size_finalized_(false)
+       saved_v_offset_(0)
 {
        GlobalSettings settings;
        coloured_bg_ = settings.value(GlobalSettings::Key_View_ColouredBG).toBool();
@@ -319,7 +318,7 @@ void View::restore_settings(QSettings &settings)
                saved_v_offset_ = settings.value("v_offset").toInt();
                set_v_offset(saved_v_offset_);
                scroll_needs_defaults_ = false;
-               // Note: see resizeEvent() for additional information
+               // Note: see eventFilter() for additional information
        }
 }
 
@@ -816,11 +815,6 @@ void View::set_scroll_default()
        else
                // Put the first trace at the top, letting the bottom ones overflow
                set_v_offset(extents.first);
-
-       // If we're not sure whether setting the defaults worked as
-       // the window wasn't set up entirely yet, we want to be called
-       // again later to make sure
-       scroll_needs_defaults_ = !size_finalized_;
 }
 
 void View::update_layout()
@@ -936,6 +930,26 @@ bool View::eventFilter(QObject *object, QEvent *event)
        } else if (type == QEvent::Leave) {
                hover_point_ = QPoint(-1, -1);
                hover_point_changed();
+       } else if (type == QEvent::Show) {
+
+               // This is somewhat of a hack, unfortunately. We cannot use
+               // set_v_offset() from within restore_settings() as the view
+               // at that point is neither visible nor properly sized.
+               // This is the least intrusive workaround I could come up
+               // with: set the vertical offset (or scroll defaults) when
+               // the view is shown, which happens after all widgets were
+               // resized to their final sizes.
+               update_layout();
+
+               if (scroll_needs_defaults_) {
+                       set_scroll_default();
+                       scroll_needs_defaults_ = false;
+               }
+
+               if (saved_v_offset_) {
+                       set_v_offset(saved_v_offset_);
+                       saved_v_offset_ = 0;
+               }
        }
 
        return QObject::eventFilter(object, event);
@@ -944,27 +958,6 @@ bool View::eventFilter(QObject *object, QEvent *event)
 void View::resizeEvent(QResizeEvent*)
 {
        update_layout();
-
-       // This is somewhat of a hack, unfortunately. We cannot use
-       // set_v_offset() from within restore_settings() as the view
-       // at that point is neither visible nor properly sized.
-       // This is the least intrusive workaround I could come up
-       // with: set the vertical offset (or scroll defaults) when
-       // the view is visible and resized to its final size.
-       // Resize events that are sent when the view is not visible
-       // must be ignored as they have wrong sizes, potentially
-       // preventing the v offset from being set successfully.
-
-       if (isVisible())
-               size_finalized_ = true;
-
-       if (size_finalized_ && saved_v_offset_) {
-               set_v_offset(saved_v_offset_);
-               saved_v_offset_ = 0;
-       }
-
-       if (size_finalized_ && scroll_needs_defaults_)
-               set_scroll_default();
 }
 
 void View::row_item_appearance_changed(bool label, bool content)
index ce89a6bc55abb3c37921311e83d3757c31590f3b..1819ffddaba08873b30b10d23a900beed0001189 100644 (file)
@@ -444,8 +444,6 @@ private:
 
        // A nonzero value indicates the v offset to restore. See View::resizeEvent()
        int saved_v_offset_;
-
-       bool size_finalized_;
 };
 
 } // namespace TraceView