From: Soeren Apel Date: Fri, 24 Jul 2015 05:55:29 +0000 (+0200) Subject: Implement "always zoom to fit" feature X-Git-Tag: pulseview-0.3.0~166 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=ce11b2ea851633dc937881cdbd358541685b43be Implement "always zoom to fit" feature --- diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 6d28194b..6b7fe4f5 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -401,6 +401,7 @@ void MainWindow::setup_ui() QString::fromUtf8("actionViewZoomOut")); menu_view->addAction(action_view_zoom_out_); + action_view_zoom_fit_->setCheckable(true); action_view_zoom_fit_->setText(tr("Zoom to &Fit")); action_view_zoom_fit_->setIcon(QIcon::fromTheme("zoom-fit", QIcon(":/icons/zoom-fit.png"))); @@ -495,7 +496,8 @@ void MainWindow::setup_ui() // Setup view_ events connect(view_, SIGNAL(sticky_scrolling_changed(bool)), this, SLOT(sticky_scrolling_changed(bool))); - + connect(view_, SIGNAL(always_zoom_to_fit_changed(bool)), this, + SLOT(always_zoom_to_fit_changed(bool))); } void MainWindow::select_init_device() { @@ -730,7 +732,7 @@ void MainWindow::on_actionViewZoomOut_triggered() void MainWindow::on_actionViewZoomFit_triggered() { - view_->zoom_fit(); + view_->zoom_fit(action_view_zoom_fit_->isChecked()); } void MainWindow::on_actionViewZoomOneToOne_triggered() @@ -765,6 +767,11 @@ void MainWindow::sticky_scrolling_changed(bool state) action_view_sticky_scrolling_->setChecked(state); } +void MainWindow::always_zoom_to_fit_changed(bool state) +{ + action_view_zoom_fit_->setChecked(state); +} + void MainWindow::add_decoder(srd_decoder *decoder) { #ifdef ENABLE_DECODE diff --git a/pv/mainwindow.hpp b/pv/mainwindow.hpp index ad7e6b2b..e86dd183 100644 --- a/pv/mainwindow.hpp +++ b/pv/mainwindow.hpp @@ -166,6 +166,8 @@ private Q_SLOTS: void sticky_scrolling_changed(bool state); + void always_zoom_to_fit_changed(bool state); + private: DeviceManager &device_manager_; diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 130d2d78..d4aa1619 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -86,7 +86,7 @@ const double View::MaxScale = 1e9; const double View::MinScale = 1e-15; const int View::MaxScrollValue = INT_MAX / 2; -const int View::MaxViewAutoUpdateRate = 25; // No more than 25 Hz +const int View::MaxViewAutoUpdateRate = 25; // No more than 25 Hz with sticky scrolling const int View::ScaleUnits[3] = {1, 2, 5}; @@ -100,6 +100,7 @@ View::View(Session &session, QWidget *parent) : offset_(0), updating_scroll_(false), sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui() + always_zoom_to_fit_(false), tick_period_(0.0), tick_prefix_(0), show_cursors_(false), @@ -248,8 +249,17 @@ void View::zoom(double steps, int offset) set_zoom(scale_ * pow(3.0/2.0, -steps), offset); } -void View::zoom_fit() +void View::zoom_fit(bool gui_state) { + // Act as one-shot when stopped, toggle along with the GUI otherwise + if (session_.get_capture_state() == Session::Stopped) { + always_zoom_to_fit_ = false; + always_zoom_to_fit_changed(false); + } else { + always_zoom_to_fit_ = gui_state; + always_zoom_to_fit_changed(gui_state); + } + const pair extents = get_time_extents(); const double delta = extents.second - extents.first; if (delta < 1e-12) @@ -295,11 +305,20 @@ void View::zoom_one_to_one() void View::set_scale_offset(double scale, double offset) { - // Disable sticky scrolling when acquisition runs and user drags the viewport + // Disable sticky scrolling / always zoom to fit when acquisition runs + // and user drags the viewport if ((scale_ == scale) && (offset_ != offset) && - sticky_scrolling_ && (session_.get_capture_state() == Session::Running)) { - sticky_scrolling_ = false; - sticky_scrolling_changed(false); + (session_.get_capture_state() == Session::Running)) { + + if (sticky_scrolling_) { + sticky_scrolling_ = false; + sticky_scrolling_changed(false); + } + + if (always_zoom_to_fit_) { + always_zoom_to_fit_ = false; + always_zoom_to_fit_changed(false); + } } scale_ = scale; @@ -449,6 +468,10 @@ void View::get_scroll_layout(double &length, double &offset) const void View::set_zoom(double scale, int offset) { + // Reset the "always zoom to fit" feature as the user changed the zoom + always_zoom_to_fit_ = false; + always_zoom_to_fit_changed(false); + const double cursor_offset = offset_ + scale_ * offset; const double new_scale = max(min(scale, MaxScale), MinScale); const double new_offset = cursor_offset - new_scale * offset; @@ -847,7 +870,13 @@ void View::signals_changed() void View::data_updated() { - if (sticky_scrolling_) { + // Reset "always zoom to fit" when we change to the stopped state + if (always_zoom_to_fit_ && (session_.get_capture_state() == Session::Stopped)) { + always_zoom_to_fit_ = false; + always_zoom_to_fit_changed(false); + } + + if (always_zoom_to_fit_ || sticky_scrolling_) { if (!delayed_view_updater_.isActive()) delayed_view_updater_.start(); } else { @@ -859,6 +888,9 @@ void View::data_updated() void View::perform_delayed_view_update() { + if (always_zoom_to_fit_) + zoom_fit(true); + if (sticky_scrolling_) { // Make right side of the view sticky double length = 0, offset; diff --git a/pv/view/view.hpp b/pv/view/view.hpp index b29fb157..2c81e747 100644 --- a/pv/view/view.hpp +++ b/pv/view/view.hpp @@ -137,7 +137,7 @@ public: void zoom(double steps); void zoom(double steps, int offset); - void zoom_fit(); + void zoom_fit(bool gui_state); void zoom_one_to_one(); @@ -209,6 +209,8 @@ Q_SIGNALS: void sticky_scrolling_changed(bool state); + void always_zoom_to_fit_changed(bool state); + private: void get_scroll_layout(double &length, double &offset) const; @@ -299,6 +301,7 @@ private: bool updating_scroll_; bool sticky_scrolling_; + bool always_zoom_to_fit_; QTimer delayed_view_updater_; double tick_period_;