]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/standardbar.cpp
Rework new segment notification mechanism
[pulseview.git] / pv / views / trace / standardbar.cpp
index def3ebc594c2e1d860a89b17214909bf020feefb..d773a5c1367df44113d9392ef8e44a2e4a53a38a 100644 (file)
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <QAction>
 #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 {
@@ -43,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"));
 
@@ -65,11 +65,11 @@ StandardBar::StandardBar(Session &session, QWidget *parent,
 
        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")));
+       action_view_zoom_fit_->setIcon(QIcon::fromTheme("zoom-fit-best",
+               QIcon(":/icons/zoom-fit-best.png")));
        action_view_zoom_fit_->setShortcut(QKeySequence(Qt::Key_F));
        connect(action_view_zoom_fit_, SIGNAL(triggered(bool)),
-               this, SLOT(on_actionViewZoomFit_triggered()));
+               this, SLOT(on_actionViewZoomFit_triggered(bool)));
 
        action_view_zoom_one_to_one_->setText(tr("Zoom to O&ne-to-One"));
        action_view_zoom_one_to_one_->setIcon(QIcon::fromTheme("zoom-original",
@@ -79,18 +79,27 @@ 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)),
+               view_, SLOT(on_segment_changed(int)));
+
+       connect(view_, SIGNAL(always_zoom_to_fit_changed(bool)),
+               this, SLOT(on_always_zoom_to_fit_changed(bool)));
+
        if (add_default_widgets)
                add_toolbar_widgets();
 }
 
-Session &StandardBar::session(void) const
+Session &StandardBar::session() const
 {
        return session_;
 }
@@ -104,6 +113,18 @@ 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);
 }
 
 QAction* StandardBar::action_view_zoom_in() const
@@ -141,9 +162,9 @@ void StandardBar::on_actionViewZoomOut_triggered()
        view_->zoom(-1);
 }
 
-void StandardBar::on_actionViewZoomFit_triggered()
+void StandardBar::on_actionViewZoomFit_triggered(bool checked)
 {
-       view_->zoom_fit(action_view_zoom_fit_->isChecked());
+       view_->zoom_fit(checked);
 }
 
 void StandardBar::on_actionViewZoomOneToOne_triggered()
@@ -165,6 +186,15 @@ 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);
+       } else
+               show_multi_segment_ui(false);
+}
+
 } // namespace trace
 } // namespace views
 } // namespace pv