PulseView  0.3.0
A Qt-based sigrok GUI
view.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef PULSEVIEW_PV_VIEW_VIEW_HPP
22 #define PULSEVIEW_PV_VIEW_VIEW_HPP
23 
24 #include <stdint.h>
25 
26 #include <list>
27 #include <memory>
28 #include <set>
29 #include <unordered_map>
30 #include <vector>
31 
32 #include <QAbstractScrollArea>
33 #include <QSizeF>
34 #include <QTimer>
35 
36 #include <pv/data/signaldata.hpp>
37 #include <pv/util.hpp>
38 
39 #include "cursorpair.hpp"
40 #include "flag.hpp"
41 #include "tracetreeitemowner.hpp"
42 
43 namespace sigrok {
44 class ChannelGroup;
45 }
46 
47 namespace pv {
48 
49 class Session;
50 
51 namespace view {
52 
53 class CursorHeader;
54 class Header;
55 class Ruler;
56 class Trace;
57 class Viewport;
58 class TriggerMarker;
59 
61  Q_OBJECT
62 
63 private:
64  enum StickyEvents {
67  };
68 
69 private:
72 
73  static const int MaxScrollValue;
74  static const int MaxViewAutoUpdateRate;
75 
76  static const int ScaleUnits[3];
77 
78 public:
79  explicit View(Session &session, QWidget *parent = 0);
80 
81  Session& session();
82  const Session& session() const;
83 
87  virtual pv::view::View* view();
88 
92  virtual const pv::view::View* view() const;
93 
94  Viewport* viewport();
95 
96  const Viewport* viewport() const;
97 
101  std::vector< std::shared_ptr<TimeItem> > time_items() const;
102 
106  double scale() const;
107 
112  const pv::util::Timestamp& offset() const;
113 
117  int owner_visual_v_offset() const;
118 
122  void set_v_offset(int offset);
123 
128 
132  unsigned int tick_precision() const;
133 
137  const pv::util::Timestamp& tick_period() const;
138 
142  util::TimeUnit time_unit() const;
143 
147  unsigned int depth() const;
148 
149  void zoom(double steps);
150  void zoom(double steps, int offset);
151 
152  void zoom_fit(bool gui_state);
153 
154  void zoom_one_to_one();
155 
161  void set_scale_offset(double scale, const pv::util::Timestamp& offset);
162 
163  std::set< std::shared_ptr<pv::data::SignalData> >
164  get_visible_data() const;
165 
166  std::pair<pv::util::Timestamp, pv::util::Timestamp> get_time_extents() const;
167 
172  void enable_sticky_scrolling(bool state);
173 
178  void enable_coloured_bg(bool state);
179 
183  bool cursors_shown() const;
184 
188  void show_cursors(bool show = true);
189 
193  void centre_cursors();
194 
198  std::shared_ptr<CursorPair> cursors() const;
199 
203  void add_flag(const pv::util::Timestamp& time);
204 
208  void remove_flag(std::shared_ptr<Flag> flag);
209 
213  std::vector< std::shared_ptr<Flag> > flags() const;
214 
215  const QPoint& hover_point() const;
216 
217  void update_viewport();
218 
220 
221 Q_SIGNALS:
222  void hover_point_changed();
223 
224  void selection_changed();
225 
227  void offset_changed();
228 
230  void scale_changed();
231 
232  void sticky_scrolling_changed(bool state);
233 
234  void always_zoom_to_fit_changed(bool state);
235 
237  void tick_prefix_changed();
238 
240  void tick_precision_changed();
241 
243  void tick_period_changed();
244 
246  void time_unit_changed();
247 
248 public Q_SLOTS:
249  void trigger_event(util::Timestamp location);
250 
251 private:
252  void get_scroll_layout(double &length, pv::util::Timestamp &offset) const;
253 
260  void set_zoom(double scale, int offset);
261 
266  void calculate_tick_spacing();
267 
268  void update_scroll();
269 
270  void update_layout();
271 
278  void paint_label(QPainter &p, const QRect &rect, bool hover);
279 
285  QRectF label_rect(const QRectF &rect);
286 
288  const std::shared_ptr<sigrok::ChannelGroup> &group,
289  const std::unordered_map<std::shared_ptr<sigrok::Channel>,
290  std::shared_ptr<Signal> > &signal_map);
291 
292  static std::vector< std::shared_ptr<Trace> >
294  const std::vector< std::shared_ptr<sigrok::Channel> > &channels,
295  const std::unordered_map<std::shared_ptr<sigrok::Channel>,
296  std::shared_ptr<Signal> > &signal_map,
297  std::set< std::shared_ptr<Trace> > &add_list);
298 
299  void determine_time_unit();
300 
301  bool eventFilter(QObject *object, QEvent *event);
302 
303  bool viewportEvent(QEvent *e);
304 
305  void resizeEvent(QResizeEvent *e);
306 
307 public:
308  void row_item_appearance_changed(bool label, bool content);
309  void time_item_appearance_changed(bool label, bool content);
310 
311  void extents_changed(bool horz, bool vert);
312 
313 private Q_SLOTS:
314 
315  void h_scroll_value_changed(int value);
316  void v_scroll_value_changed();
317 
318  void signals_changed();
319  void capture_state_updated(int state);
320  void data_updated();
321 
323 
324  void process_sticky_events();
325 
326  void on_hover_point_changed();
327 
333 
338  void set_scale(double scale);
339 
345 
350  void set_tick_precision(unsigned tick_precision);
351 
357 
363 
364 private:
366 
370 
372  double scale_;
373 
376 
381 
384  unsigned int tick_precision_;
386 
388  std::shared_ptr<CursorPair> cursors_;
389 
390  std::list< std::shared_ptr<Flag> > flags_;
392 
393  std::vector< std::shared_ptr<TriggerMarker> > trigger_markers_;
394 
395  QPoint hover_point_;
396 
397  unsigned int sticky_events_;
399 };
400 
401 } // namespace view
402 } // namespace pv
403 
404 #endif // PULSEVIEW_PV_VIEW_VIEW_HPP
std::shared_ptr< CursorPair > cursors() const
Definition: view.cpp:487
bool always_zoom_to_fit_
Definition: view.hpp:379
void determine_time_unit()
Definition: view.cpp:778
bool updating_scroll_
Definition: view.hpp:377
void set_tick_period(const pv::util::Timestamp &tick_period)
Definition: view.cpp:294
QRectF label_rect(const QRectF &rect)
Definition: view.cpp:710
int owner_visual_v_offset() const
Definition: view.cpp:246
void restack_all_trace_tree_items()
Definition: view.cpp:532
static const pv::util::Timestamp MaxScale
Definition: view.hpp:70
void centre_cursors()
Definition: view.cpp:478
pv::util::SIPrefix tick_prefix() const
Definition: view.cpp:263
Viewport * viewport_
Definition: view.hpp:367
SIPrefix
Definition: util.hpp:41
void paint_label(QPainter &p, const QRect &rect, bool hover)
Definition: view.cpp:703
double scale_
The view time scale in seconds per pixel.
Definition: view.hpp:372
void data_updated()
Definition: view.cpp:1069
bool show_cursors_
Definition: view.hpp:387
std::list< std::shared_ptr< Flag > > flags_
Definition: view.hpp:390
void set_scale_offset(double scale, const pv::util::Timestamp &offset)
Definition: view.cpp:367
pv::util::Timestamp offset_
The view time offset in seconds.
Definition: view.hpp:375
void update_layout()
Definition: view.cpp:691
static const int ScaleUnits[3]
Definition: view.hpp:76
std::vector< std::shared_ptr< Flag > > flags() const
Definition: view.cpp:509
void v_scroll_value_changed()
Definition: view.cpp:897
void row_item_appearance_changed(bool label, bool content)
Definition: view.cpp:847
void set_scale(double scale)
Definition: view.cpp:225
TraceTreeItemOwner * find_prevalent_trace_group(const std::shared_ptr< sigrok::ChannelGroup > &group, const std::unordered_map< std::shared_ptr< sigrok::Channel >, std::shared_ptr< Signal > > &signal_map)
Definition: view.cpp:716
void set_zoom(double scale, int offset)
Definition: view.cpp:573
unsigned int tick_precision() const
Definition: view.cpp:276
void time_item_appearance_changed(bool label, bool content)
Definition: view.cpp:855
void signals_changed()
Definition: view.cpp:903
char next_flag_text_
Definition: view.hpp:391
void process_sticky_events()
Definition: view.cpp:1105
static const pv::util::Timestamp MinScale
Definition: view.hpp:71
void extents_changed(bool horz, bool vert)
Definition: view.cpp:863
void on_hover_point_changed()
Definition: view.cpp:1118
void calculate_tick_spacing()
Definition: view.cpp:585
bool viewportEvent(QEvent *e)
Definition: view.cpp:824
static const int MaxScrollValue
Definition: view.hpp:73
unsigned int tick_precision_
Definition: view.hpp:384
bool eventFilter(QObject *object, QEvent *event)
Definition: view.cpp:799
void tick_prefix_changed()
Emitted when the tick_prefix changed.
Definition: moc_view.cpp:345
void perform_delayed_view_update()
Definition: view.cpp:1082
void trigger_event(util::Timestamp location)
Definition: view.cpp:560
void set_tick_precision(unsigned tick_precision)
Definition: view.cpp:281
void selection_changed()
Definition: moc_view.cpp:313
QTimer lazy_event_handler_
Definition: view.hpp:398
void get_scroll_layout(double &length, pv::util::Timestamp &offset) const
Definition: view.cpp:566
util::TimeUnit time_unit() const
Definition: view.cpp:302
void time_unit_changed()
Emitted when the time_unit changed.
Definition: moc_view.cpp:363
void zoom(double steps)
Definition: view.cpp:315
Ruler * ruler_
Definition: view.hpp:368
const QPoint & hover_point() const
Definition: view.cpp:520
static std::vector< std::shared_ptr< Trace > > extract_new_traces_for_channels(const std::vector< std::shared_ptr< sigrok::Channel > > &channels, const std::unordered_map< std::shared_ptr< sigrok::Channel >, std::shared_ptr< Signal > > &signal_map, std::set< std::shared_ptr< Trace > > &add_list)
Definition: view.cpp:753
double scale() const
Definition: view.cpp:220
void scale_changed()
Emitted when the scale changed.
Definition: moc_view.cpp:325
void set_time_unit(pv::util::TimeUnit time_unit)
Definition: view.cpp:307
bool cursors_shown() const
Definition: view.cpp:466
void tick_precision_changed()
Emitted when the tick_precision changed.
Definition: moc_view.cpp:351
void zoom_one_to_one()
Definition: view.cpp:350
std::pair< pv::util::Timestamp, pv::util::Timestamp > get_time_extents() const
Definition: view.cpp:408
std::vector< std::shared_ptr< TriggerMarker > > trigger_markers_
Definition: view.hpp:393
Session & session()
Definition: view.cpp:176
void set_tick_prefix(pv::util::SIPrefix tick_prefix)
Definition: view.cpp:268
void set_v_offset(int offset)
Definition: view.cpp:251
std::shared_ptr< CursorPair > cursors_
Definition: view.hpp:388
void show_cursors(bool show=true)
Definition: view.cpp:471
void zoom_fit(bool gui_state)
Definition: view.cpp:325
std::vector< std::shared_ptr< TimeItem > > time_items() const
Definition: view.cpp:206
void update_viewport()
Definition: view.cpp:525
void offset_changed()
Emitted when the offset changed.
Definition: moc_view.cpp:319
Viewport * viewport()
Definition: view.cpp:196
void enable_sticky_scrolling(bool state)
Definition: view.cpp:436
void sticky_scrolling_changed(bool state)
Definition: moc_view.cpp:331
bool sticky_scrolling_
Definition: view.hpp:378
void resizeEvent(QResizeEvent *e)
Definition: view.cpp:842
virtual pv::view::View * view()
Definition: view.cpp:186
void set_offset(const pv::util::Timestamp &offset)
Definition: view.cpp:238
util::TimeUnit time_unit_
Definition: view.hpp:385
Session & session_
Definition: view.hpp:365
unsigned int sticky_events_
Definition: view.hpp:397
pv::util::SIPrefix tick_prefix_
Definition: view.hpp:383
unsigned int depth() const
Definition: view.cpp:258
TimeUnit
Definition: util.hpp:36
void enable_coloured_bg(bool state)
Definition: view.cpp:441
const pv::util::Timestamp & offset() const
Definition: view.cpp:233
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 24 >, boost::multiprecision::et_off > Timestamp
Timestamp type providing yoctosecond resolution.
Definition: util.hpp:58
void update_scroll()
Definition: view.cpp:652
const pv::util::Timestamp & tick_period() const
Definition: view.cpp:289
void capture_state_updated(int state)
Definition: view.cpp:1048
void add_flag(const pv::util::Timestamp &time)
Definition: view.cpp:492
QPoint hover_point_
Definition: view.hpp:395
std::set< std::shared_ptr< pv::data::SignalData > > get_visible_data() const
Definition: view.cpp:395
void hover_point_changed()
Definition: moc_view.cpp:307
View(Session &session, QWidget *parent=0)
Definition: view.cpp:101
void h_scroll_value_changed(int value)
Definition: view.cpp:871
void remove_flag(std::shared_ptr< Flag > flag)
Definition: view.cpp:503
pv::util::Timestamp tick_period_
Definition: view.hpp:382
static const int MaxViewAutoUpdateRate
Definition: view.hpp:74
QTimer delayed_view_updater_
Definition: view.hpp:380
void tick_period_changed()
Emitted when the tick_period changed.
Definition: moc_view.cpp:357
Header * header_
Definition: view.hpp:369
void always_zoom_to_fit_changed(bool state)
Definition: moc_view.cpp:338