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();
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
}
}
set_tick_precision(tick_precision);
}
+void View::adjust_top_margin()
+{
+ assert(viewport_);
+
+ const QSize areaSize = viewport_->size();
+
+ const pair<int, int> 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_);
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()
} 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)