From 5f9b7de5c8c71801141d35497786bf57f75e3ca4 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Tue, 30 May 2017 08:01:25 +0200 Subject: [PATCH] TraceView: Improve the way we do the initial scrolling setup 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 | 51 +++++++++++++++++++++--------------------------- pv/view/view.hpp | 2 -- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 772a95e0..c7944179 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -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) diff --git a/pv/view/view.hpp b/pv/view/view.hpp index ce89a6bc..1819ffdd 100644 --- a/pv/view/view.hpp +++ b/pv/view/view.hpp @@ -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 -- 2.30.2