X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=287bfb6c51b7429467d72779abd2cadb3b3a76a1;hb=e5cc818627748b95b6a6d14cc4cf509ab4669fa8;hp=4ac98114104a4eb603aea4c9000e825a8f99dc2c;hpb=25e734c848a23fc526d5b410235e8e7e9fb5edde;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 4ac98114..287bfb6c 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -129,6 +129,7 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : scale_(1e-3), offset_(0), updating_scroll_(false), + settings_restored_(false), sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui() always_zoom_to_fit_(false), tick_period_(0), @@ -140,7 +141,7 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : next_flag_text_('A'), trigger_markers_(), hover_point_(-1, -1), - scroll_needs_defaults_(false), + scroll_needs_defaults_(true), saved_v_offset_(0) { QVBoxLayout *root_layout = new QVBoxLayout(this); @@ -351,6 +352,8 @@ void View::restore_settings(QSettings &settings) scroll_needs_defaults_ = false; // Note: see eventFilter() for additional information } + + settings_restored_ = true; } vector< shared_ptr > View::time_items() const @@ -872,7 +875,7 @@ void View::set_scroll_default() set_v_offset(extents.first); } -bool View::header_fully_visible() const +bool View::header_was_shrunk() const { const int header_pane_width = splitter_->sizes().front(); const int header_width = header_->extended_size_hint().width(); @@ -880,24 +883,31 @@ bool View::header_fully_visible() const // Allow for a slight margin of error so that we also accept // slight differences when e.g. a label name change increased // the overall width - return (header_pane_width >= (header_width - 10)); + return (header_pane_width < (header_width - 10)); } -void View::update_layout() +void View::expand_header_to_fit() { - // Only adjust pane sizes if the header hasn't been partially hidden by the user - if (header_fully_visible()) { - int splitter_area_width = 0; - for (int w : splitter_->sizes()) - splitter_area_width += w; - - // Make sure the header has enough horizontal space to show all labels fully - QList pane_sizes; - pane_sizes.push_back(header_->extended_size_hint().width()); - pane_sizes.push_back(splitter_area_width - header_->extended_size_hint().width()); - splitter_->setSizes(pane_sizes); + int splitter_area_width = 0; + for (int w : splitter_->sizes()) + splitter_area_width += w; + + // Workaround for when the header needs resizing but the view + // isn't visible yet and thus splitter_->sizes() returns (0, 0) + if (splitter_area_width == 0) { + QTimer::singleShot(50, this, SLOT(on_repeat_splitter_expansion())); + return; } + // Make sure the header has enough horizontal space to show all labels fully + QList pane_sizes; + pane_sizes.push_back(header_->extended_size_hint().width()); + pane_sizes.push_back(splitter_area_width - header_->extended_size_hint().width()); + splitter_->setSizes(pane_sizes); +} + +void View::update_layout() +{ update_scroll(); } @@ -1071,8 +1081,19 @@ void View::on_splitter_moved() // Setting the maximum width of the header widget doesn't work as // expected because the splitter would allow the user to make the // pane wider than that, creating empty space as a result. - // To make this work, we stricly enforce the maximum width by calling - update_layout(); + // To make this work, we stricly enforce the maximum width by + // expanding the header unless the user shrunk it on purpose. + // As we're then setting the width of the header pane, we set the + // splitter to the maximum allowed position. + if (!header_was_shrunk()) + expand_header_to_fit(); +} + +void View::on_repeat_splitter_expansion() +{ + // Don't mess with the header if settings were restored in the meanwhile + if (!settings_restored_) + expand_header_to_fit(); } void View::h_scroll_value_changed(int value) @@ -1270,6 +1291,12 @@ void View::signals_changed() offset += extents.second; } + + if (!new_top_level_items.empty()) + // Expand the header pane because the header should become fully + // visible when new signals are added + expand_header_to_fit(); + update_layout(); header_->update();