]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/view.cpp
Fix #1440 by moving shortcuts from the main window to the view
[pulseview.git] / pv / views / trace / view.cpp
index 05e6da3e67000a75720595aba455697ac7d265d7..ae98dc3a85a50c30c377929dede032a81bbcb894 100644 (file)
@@ -130,7 +130,8 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
        // Note: Place defaults in View::reset_view_state(), not here
        splitter_(new QSplitter()),
        header_was_shrunk_(false),  // The splitter remains unchanged after a reset, so this goes here
-       sticky_scrolling_(false)  // Default setting is set in MainWindow::setup_ui()
+       sticky_scrolling_(false),  // Default setting is set in MainWindow::setup_ui()
+       scroll_needs_defaults_(true)
 {
        QVBoxLayout *root_layout = new QVBoxLayout(this);
        root_layout->setContentsMargins(0, 0, 0, 0);
@@ -205,11 +206,33 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
                this, SLOT(process_sticky_events()));
        lazy_event_handler_.setSingleShot(true);
 
+       // Set up local keyboard shortcuts
+       zoom_in_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Plus), this,
+                       SLOT(on_zoom_in_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+       zoom_in_shortcut_->setAutoRepeat(false);
+
+       zoom_out_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Minus), this,
+               SLOT(on_zoom_out_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+       zoom_out_shortcut_->setAutoRepeat(false);
+
+       zoom_in_shortcut_2_ = new QShortcut(QKeySequence(Qt::Key_Up), this,
+               SLOT(on_zoom_in_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+       zoom_out_shortcut_2_ = new QShortcut(QKeySequence(Qt::Key_Down), this,
+               SLOT(on_zoom_out_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+
+       home_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Home), this,
+               SLOT(on_scroll_to_start_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+       home_shortcut_->setAutoRepeat(false);
+
+       end_shortcut_ = new QShortcut(QKeySequence(Qt::Key_End), this,
+               SLOT(on_scroll_to_end_shortcut_triggered()), nullptr, Qt::WidgetWithChildrenShortcut);
+       end_shortcut_->setAutoRepeat(false);
+
        // Trigger the initial event manually. The default device has signals
        // which were created before this object came into being
        signals_changed();
 
-       // make sure the transparent widgets are on the top
+       // Make sure the transparent widgets are on the top
        ruler_->raise();
        header_->raise();
 
@@ -493,6 +516,11 @@ void View::reset_zero_position()
        ruler_->update();
 }
 
+pv::util::Timestamp View::zero_offset() const
+{
+       return zero_offset_;
+}
+
 int View::owner_visual_v_offset() const
 {
        return -scrollarea_->verticalScrollBar()->sliderPosition();
@@ -505,6 +533,18 @@ void View::set_v_offset(int offset)
        viewport_->update();
 }
 
+void View::set_h_offset(int offset)
+{
+       scrollarea_->horizontalScrollBar()->setSliderPosition(offset);
+       header_->update();
+       viewport_->update();
+}
+
+int View::get_h_scrollbar_maximum() const
+{
+       return scrollarea_->horizontalScrollBar()->maximum();
+}
+
 unsigned int View::depth() const
 {
        return 0;
@@ -790,22 +830,36 @@ bool View::cursors_shown() const
 
 void View::show_cursors(bool show)
 {
-       show_cursors_ = show;
-       cursor_state_changed(show);
+       if (show_cursors_ != show) {
+               show_cursors_ = show;
+
+               cursor_state_changed(show);
+               ruler_->update();
+               viewport_->update();
+       }
+}
+
+void View::set_cursors(pv::util::Timestamp& first, pv::util::Timestamp& second)
+{
+       assert(cursors_);
+
+       cursors_->first()->set_time(first);
+       cursors_->second()->set_time(second);
+
        ruler_->update();
        viewport_->update();
 }
 
 void View::centre_cursors()
 {
-       if (cursors_) {
-               const double time_width = scale_ * viewport_->width();
-               cursors_->first()->set_time(offset_ + time_width * 0.4);
-               cursors_->second()->set_time(offset_ + time_width * 0.6);
+       assert(cursors_);
 
-               ruler_->update();
-               viewport_->update();
-       }
+       const double time_width = scale_ * viewport_->width();
+       cursors_->first()->set_time(offset_ + time_width * 0.4);
+       cursors_->second()->set_time(offset_ + time_width * 0.6);
+
+       ruler_->update();
+       viewport_->update();
 }
 
 shared_ptr<CursorPair> View::cursors() const
@@ -813,15 +867,17 @@ shared_ptr<CursorPair> View::cursors() const
        return cursors_;
 }
 
-void View::add_flag(const Timestamp& time)
+shared_ptr<Flag> View::add_flag(const Timestamp& time)
 {
-       flags_.push_back(make_shared<Flag>(*this, time,
-               QString("%1").arg(next_flag_text_)));
+       shared_ptr<Flag> flag =
+               make_shared<Flag>(*this, time, QString("%1").arg(next_flag_text_));
+       flags_.push_back(flag);
 
        next_flag_text_ = (next_flag_text_ >= 'Z') ? 'A' :
                (next_flag_text_ + 1);
 
        time_item_appearance_changed(true, true);
+       return flag;
 }
 
 void View::remove_flag(shared_ptr<Flag> flag)
@@ -1457,6 +1513,26 @@ void View::on_splitter_moved()
                resize_header_to_fit();
 }
 
+void View::on_zoom_in_shortcut_triggered()
+{
+       zoom(1);
+}
+
+void View::on_zoom_out_shortcut_triggered()
+{
+       zoom(-1);
+}
+
+void View::on_scroll_to_start_shortcut_triggered()
+{
+       set_h_offset(0);
+}
+
+void View::on_scroll_to_end_shortcut_triggered()
+{
+       set_h_offset(get_h_scrollbar_maximum());
+}
+
 void View::h_scroll_value_changed(int value)
 {
        if (updating_scroll_)