X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=2fc14d2b64c9e777827650f7565125d1fe351aae;hb=8a5fd81fea577663e8c0f17e53d5928599d0926d;hp=772a95e07156f3232f24fd19fd46796b0711a7f3;hpb=5ed05b699e5367bae21828f533e3d169b9bab348;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 772a95e..2fc14d2 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 } } @@ -747,6 +746,30 @@ void View::calculate_tick_spacing() set_tick_precision(tick_precision); } +void View::adjust_top_margin() +{ + assert(viewport_); + + const QSize areaSize = viewport_->size(); + + const pair extents = v_extents(); + const int top_margin = owner_visual_v_offset() + extents.first; + const int trace_bottom = owner_visual_v_offset() + extents.first + extents.second; + + // Do we have empty space at the top while the last trace goes out of screen? + if ((top_margin > 0) && (trace_bottom > areaSize.height())) { + const int trace_height = extents.second - extents.first; + + // Center everything vertically if there is enough space + if (areaSize.height() >= trace_height) + set_v_offset(extents.first - + ((areaSize.height() - trace_height) / 2)); + else + // Remove the top margin to make as many traces fit on screen as possible + set_v_offset(extents.first); + } +} + void View::update_scroll() { assert(viewport_); @@ -816,11 +839,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,35 +954,38 @@ 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); } -void View::resizeEvent(QResizeEvent*) +void View::resizeEvent(QResizeEvent* event) { - 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. + // Only adjust the top margin if we shrunk vertically + if (event->size().height() < event->oldSize().height()) + adjust_top_margin(); - 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(); + update_layout(); } void View::row_item_appearance_changed(bool label, bool content)