PulseView  unreleased development snapshot
A Qt-based sigrok GUI
standardbar.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2016 Soeren Apel <soeren@apelpie.net>
5  * Copyright (C) 2012-2015 Joel Holdsworth <joel@airwebreathe.org.uk>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include <QAction>
22 #include <QMessageBox>
23 
24 #include "standardbar.hpp"
25 #include "view.hpp"
26 
27 #include <pv/mainwindow.hpp>
28 
30 
31 namespace pv {
32 namespace views {
33 
34 namespace trace {
35 
36 StandardBar::StandardBar(Session &session, QWidget *parent,
37  View *view, bool add_default_widgets) :
38  QToolBar("Standard Trace View Toolbar", parent),
39  session_(session),
40  view_(view),
41  action_view_zoom_in_(new QAction(this)),
42  action_view_zoom_out_(new QAction(this)),
43  action_view_zoom_fit_(new QAction(this)),
44  action_view_show_cursors_(new QAction(this)),
45  segment_display_mode_selector_(new QToolButton(this)),
46  action_sdm_last_(new QAction(this)),
47  action_sdm_last_complete_(new QAction(this)),
48  action_sdm_single_(new QAction(this)),
49  segment_selector_(new QSpinBox(this))
50 {
51  setObjectName(QString::fromUtf8("StandardBar"));
52 
53  // Actions
54  action_view_zoom_in_->setText(tr("Zoom &In"));
55  action_view_zoom_in_->setIcon(QIcon::fromTheme("zoom-in",
56  QIcon(":/icons/zoom-in.png")));
57  // simply using Qt::Key_Plus shows no + in the menu
58  action_view_zoom_in_->setShortcut(QKeySequence::ZoomIn);
59  connect(action_view_zoom_in_, SIGNAL(triggered(bool)),
60  this, SLOT(on_actionViewZoomIn_triggered()));
61 
62  action_view_zoom_out_->setText(tr("Zoom &Out"));
63  action_view_zoom_out_->setIcon(QIcon::fromTheme("zoom-out",
64  QIcon(":/icons/zoom-out.png")));
65  action_view_zoom_out_->setShortcut(QKeySequence::ZoomOut);
66  connect(action_view_zoom_out_, SIGNAL(triggered(bool)),
67  this, SLOT(on_actionViewZoomOut_triggered()));
68 
69  action_view_zoom_fit_->setCheckable(true);
70  action_view_zoom_fit_->setText(tr("Zoom to &Fit"));
71  action_view_zoom_fit_->setIcon(QIcon::fromTheme("zoom-fit-best",
72  QIcon(":/icons/zoom-fit-best.png")));
73  action_view_zoom_fit_->setShortcut(QKeySequence(Qt::Key_F));
74  connect(action_view_zoom_fit_, SIGNAL(triggered(bool)),
75  this, SLOT(on_actionViewZoomFit_triggered(bool)));
76 
77  action_view_show_cursors_->setCheckable(true);
78  action_view_show_cursors_->setIcon(QIcon(":/icons/show-cursors.svg"));
79  action_view_show_cursors_->setShortcut(QKeySequence(Qt::Key_C));
80  connect(action_view_show_cursors_, SIGNAL(triggered(bool)),
82  action_view_show_cursors_->setText(tr("Show &Cursors"));
83 
84  action_sdm_last_->setIcon(QIcon(":/icons/view-displaymode-last_segment.svg"));
85  action_sdm_last_->setText(tr("Display last segment only"));
86  connect(action_sdm_last_, SIGNAL(triggered(bool)),
87  this, SLOT(on_actionSDMLast_triggered()));
88 
89  action_sdm_last_complete_->setIcon(QIcon(":/icons/view-displaymode-last_complete_segment.svg"));
90  action_sdm_last_complete_->setText(tr("Display last complete segment only"));
91  connect(action_sdm_last_complete_, SIGNAL(triggered(bool)),
93 
94  action_sdm_single_->setIcon(QIcon(":/icons/view-displaymode-single_segment.svg"));
95  action_sdm_single_->setText(tr("Display a single segment"));
96  connect(action_view_show_cursors_, SIGNAL(triggered(bool)),
97  this, SLOT(on_actionSDMSingle_triggered()));
98 
102  segment_display_mode_selector_->setPopupMode(QToolButton::InstantPopup);
104 
105  segment_selector_->setMinimum(1);
106  segment_selector_->hide();
107 
108  connect(&session_, SIGNAL(new_segment(int)),
109  this, SLOT(on_new_segment(int)));
110 
111  connect(&session_, SIGNAL(segment_completed(int)),
112  view_, SLOT(on_segment_completed(int)));
113 
114  connect(segment_selector_, SIGNAL(valueChanged(int)),
115  this, SLOT(on_segment_selected(int)));
116  connect(view_, SIGNAL(segment_changed(int)),
117  this, SLOT(on_segment_changed(int)));
118 
119  connect(this, SIGNAL(segment_selected(int)),
120  view_, SLOT(on_segment_changed(int)));
121 
122  connect(view_, SIGNAL(segment_display_mode_changed(int, bool)),
123  this, SLOT(on_segment_display_mode_changed(int, bool)));
124 
125  connect(view_, SIGNAL(always_zoom_to_fit_changed(bool)),
126  this, SLOT(on_always_zoom_to_fit_changed(bool)));
127 
128  connect(view_, SIGNAL(cursor_state_changed(bool)),
129  this, SLOT(on_cursor_state_changed(bool)));
130 
131  if (add_default_widgets)
133 }
134 
136 {
137  return session_;
138 }
139 
141 {
142  // Setup the toolbar
143  addAction(action_view_zoom_in_);
144  addAction(action_view_zoom_out_);
145  addAction(action_view_zoom_fit_);
146  addSeparator();
147  addAction(action_view_show_cursors_);
148  multi_segment_actions_.push_back(addSeparator());
150  multi_segment_actions_.push_back(addWidget(segment_selector_));
151  addSeparator();
152 
153  // Hide the multi-segment UI until we know that there are multiple segments
154  show_multi_segment_ui(false);
155 }
156 
158 {
159  for (QAction* action : multi_segment_actions_)
160  action->setVisible(state);
161 
164 }
165 
167 {
168  return action_view_zoom_in_;
169 }
170 
172 {
173  return action_view_zoom_out_;
174 }
175 
177 {
178  return action_view_zoom_fit_;
179 }
180 
182 {
184 }
185 
187 {
188  view_->zoom(1);
189 }
190 
192 {
193  view_->zoom(-1);
194 }
195 
197 {
198  view_->zoom_fit(checked);
199 }
200 
202 {
203  const bool show = action_view_show_cursors_->isChecked();
204 
205  if (show)
207 
208  view_->show_cursors(show);
209 }
210 
212 {
214 }
215 
217 {
219 }
220 
222 {
224 }
225 
227 {
228  action_view_zoom_fit_->setChecked(state);
229 }
230 
231 void StandardBar::on_new_segment(int new_segment_id)
232 {
233  if (new_segment_id > 0) {
234  show_multi_segment_ui(true);
235  segment_selector_->setMaximum(new_segment_id + 1);
236  } else
237  show_multi_segment_ui(false);
238 }
239 
241 {
242  // We need to adjust the value by 1 because internally, segments
243  // start at 0 while they start with 1 for the spinbox
244  const uint32_t ui_segment_id = segment_id + 1;
245 
246  // This is called when the current segment was changed
247  // by other parts of the UI, e.g. the view itself
248 
249  // Make sure our value isn't limited by a too low maximum
250  // Note: this can happen if on_segment_changed() is called before
251  // on_new_segment()
252  if ((uint32_t)segment_selector_->maximum() < ui_segment_id)
253  segment_selector_->setMaximum(ui_segment_id);
254 
255  segment_selector_->setValue(ui_segment_id);
256 }
257 
258 void StandardBar::on_segment_selected(int ui_segment_id)
259 {
260  // We need to adjust the value by 1 because internally, segments
261  // start at 0 while they start with 1 for the spinbox
262  const uint32_t segment_id = ui_segment_id - 1;
263 
264  // This is called when the user selected a segment using the spin box
265  // or when the value of the spinbox was assigned a new value. Since we
266  // only care about the former, we filter out the latter:
267  if (segment_id == view_->current_segment())
268  return;
269 
270  // No matter which segment display mode we were in, we now show a single segment
273 
274  segment_selected(segment_id);
275 }
276 
277 void StandardBar::on_segment_display_mode_changed(int mode, bool segment_selectable)
278 {
279  segment_selector_->setReadOnly(!segment_selectable);
280 
281  switch ((Trace::SegmentDisplayMode)mode) {
284  break;
287  break;
290  break;
291  default:
292  break;
293  }
294 }
295 
297 {
298  action_view_show_cursors_->setChecked(show);
299 }
300 
301 } // namespace trace
302 } // namespace views
303 } // namespace pv
QAction *const action_view_zoom_fit_
Definition: standardbar.hpp:74
void on_segment_selected(int ui_segment_id)
void on_segment_changed(int segment_id)
QAction *const action_sdm_last_complete_
Definition: standardbar.hpp:79
vector< QAction * > multi_segment_actions_
QAction * action_view_zoom_out() const
QAction * action_view_zoom_fit() const
Session & session() const
void on_segment_display_mode_changed(int mode, bool segment_selectable)
QAction * action_view_show_cursors() const
void on_new_segment(int new_segment_id)
void set_segment_display_mode(Trace::SegmentDisplayMode mode)
Definition: view.cpp:778
void on_always_zoom_to_fit_changed(bool state)
void show_cursors(bool show=true)
Definition: view.cpp:973
uint32_t current_segment() const
Definition: view.cpp:681
StandardBar(Session &session, QWidget *parent, trace::View *view, bool add_default_widgets=true)
Definition: standardbar.cpp:36
void segment_selected(int segment_id)
QAction *const action_sdm_single_
Definition: standardbar.hpp:80
QAction * action_view_zoom_in() const
QAction *const action_view_zoom_out_
Definition: standardbar.hpp:73
void on_cursor_state_changed(bool show)
void zoom_fit(bool gui_state)
Definition: view.cpp:834
virtual void add_toolbar_widgets()
Trace::SegmentDisplayMode segment_display_mode() const
Definition: view.cpp:773
QAction *const action_view_zoom_in_
Definition: standardbar.hpp:72
void on_actionViewZoomFit_triggered(bool checked)
it will come up with a session that has the demo device selected That you can get to know the program even when you don t have any hardware to use it you see a list of devices PulseView has recognized If the device you want to use is you can just select it here image::device_selector_dropdown png[] If it s not you ll need to scan for it first Since most serial port and Ethernet devices can t be auto this is usually required for those To do either choose the Connect to Device option from the list or click on the button itself You will see the following you ll need to pick a driver that you want to use In order to do this
Definition: acquisition.txt:14
void zoom(double steps)
Definition: view.cpp:824
QToolButton * segment_display_mode_selector_
Definition: standardbar.hpp:77
QAction *const action_view_show_cursors_
Definition: standardbar.hpp:75
virtual void show_multi_segment_ui(const bool state)
bool segment_is_selectable() const
Definition: view.cpp:768