]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/standardbar.cpp
View: Fixes related to multi-segment display
[pulseview.git] / pv / views / trace / standardbar.cpp
index 1a77edaa7594f7546a6d582114e44b78435f84e0..65f9ae3e684d57434667ed4c48666a6cc3cf30bf 100644 (file)
 #include <QMessageBox>
 
 #include "standardbar.hpp"
+#include "view.hpp"
 
 #include <pv/mainwindow.hpp>
-#include <pv/view/view.hpp>
 
-using pv::views::TraceView::View;
+using pv::views::trace::View;
 
 namespace pv {
 namespace views {
@@ -42,7 +42,8 @@ StandardBar::StandardBar(Session &session, QWidget *parent,
        action_view_zoom_out_(new QAction(this)),
        action_view_zoom_fit_(new QAction(this)),
        action_view_zoom_one_to_one_(new QAction(this)),
-       action_view_show_cursors_(new QAction(this))
+       action_view_show_cursors_(new QAction(this)),
+       segment_selector_(new QSpinBox(this))
 {
        setObjectName(QString::fromUtf8("StandardBar"));
 
@@ -78,13 +79,28 @@ StandardBar::StandardBar(Session &session, QWidget *parent,
                this, SLOT(on_actionViewZoomOneToOne_triggered()));
 
        action_view_show_cursors_->setCheckable(true);
-       action_view_show_cursors_->setIcon(QIcon::fromTheme("show-cursors",
-               QIcon(":/icons/show-cursors.svg")));
+       action_view_show_cursors_->setIcon(QIcon(":/icons/show-cursors.svg"));
        action_view_show_cursors_->setShortcut(QKeySequence(Qt::Key_C));
        connect(action_view_show_cursors_, SIGNAL(triggered(bool)),
                this, SLOT(on_actionViewShowCursors_triggered()));
        action_view_show_cursors_->setText(tr("Show &Cursors"));
 
+       segment_selector_->setMinimum(1);
+       segment_selector_->hide();
+       connect(&session_, SIGNAL(new_segment(int)),
+               this, SLOT(on_new_segment(int)));
+
+       connect(segment_selector_, SIGNAL(valueChanged(int)),
+               this, SLOT(on_segment_selected(int)));
+       connect(view_, SIGNAL(segment_changed(int)),
+               this, SLOT(on_segment_changed(int)));
+
+       connect(this, SIGNAL(segment_selected(int)),
+               view_, SLOT(on_segment_changed(int)));
+
+       connect(view_, SIGNAL(segment_display_mode_changed(bool)),
+               this, SLOT(on_segment_display_mode_changed(bool)));
+
        connect(view_, SIGNAL(always_zoom_to_fit_changed(bool)),
                this, SLOT(on_always_zoom_to_fit_changed(bool)));
 
@@ -106,6 +122,20 @@ void StandardBar::add_toolbar_widgets()
        addAction(action_view_zoom_one_to_one_);
        addSeparator();
        addAction(action_view_show_cursors_);
+       multi_segment_actions_.push_back(addSeparator());
+       multi_segment_actions_.push_back(addWidget(segment_selector_));
+       addSeparator();
+
+       // Hide the multi-segment UI until we know that there are multiple segments
+       show_multi_segment_ui(false);
+}
+
+void StandardBar::show_multi_segment_ui(const bool state)
+{
+       for (QAction* action : multi_segment_actions_)
+               action->setVisible(state);
+
+       on_segment_display_mode_changed(view_->segment_is_selectable());
 }
 
 QAction* StandardBar::action_view_zoom_in() const
@@ -167,6 +197,41 @@ void StandardBar::on_always_zoom_to_fit_changed(bool state)
        action_view_zoom_fit_->setChecked(state);
 }
 
+void StandardBar::on_new_segment(int new_segment_id)
+{
+       if (new_segment_id > 1) {
+               show_multi_segment_ui(true);
+               segment_selector_->setMaximum(new_segment_id + 1);
+       } else
+               show_multi_segment_ui(false);
+}
+
+void StandardBar::on_segment_changed(int segment_id)
+{
+       // This is called when the current segment was changed
+       // by other parts of the UI, e.g. the view itself
+
+       // We need to adjust the value by 1 because internally, segments
+       // start at 0 while they start with 1 for the spinbox
+       segment_selector_->setValue(segment_id + 1);
+
+       segment_selected(segment_id);
+}
+
+void StandardBar::on_segment_selected(int ui_segment_id)
+{
+       // This is called when the user selected a segment using the spin box
+
+       // We need to adjust the value by 1 because internally, segments
+       // start at 0 while they start with 1 for the spinbox
+       segment_selected(ui_segment_id - 1);
+}
+
+void StandardBar::on_segment_display_mode_changed(bool segment_selectable)
+{
+       segment_selector_->setReadOnly(!segment_selectable);
+}
+
 } // namespace trace
 } // namespace views
 } // namespace pv