]> sigrok.org Git - pulseview.git/blob - pv/view/view.h
83a6fe2d2a4d318288f084920e07f5c3c963e25a
[pulseview.git] / pv / view / view.h
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_H
22 #define PULSEVIEW_PV_VIEW_VIEW_H
23
24 #include <stdint.h>
25
26 #include <memory>
27 #include <set>
28 #include <vector>
29
30 #include <QAbstractScrollArea>
31 #include <QSizeF>
32
33 #include <pv/data/signaldata.h>
34
35 #include "cursorpair.h"
36
37 namespace pv {
38
39 class SigSession;
40
41 namespace view {
42
43 class Header;
44 class Ruler;
45 class Trace;
46 class Viewport;
47
48 class View : public QAbstractScrollArea {
49         Q_OBJECT
50
51 private:
52         static const double MaxScale;
53         static const double MinScale;
54
55         static const int MaxScrollValue;
56
57 public:
58         static const int SignalHeight;
59         static const int SignalMargin;
60         static const int SignalSnapGridSize;
61
62         static const QColor CursorAreaColour;
63
64         static const QSizeF LabelPadding;
65
66 public:
67         explicit View(SigSession &session, QWidget *parent = 0);
68
69         SigSession& session();
70         const SigSession& session() const;
71
72         /**
73          * Returns the view time scale in seconds per pixel.
74          */
75         double scale() const;
76
77         /**
78          * Returns the time offset of the left edge of the view in
79          * seconds.
80          */
81         double offset() const;
82         int v_offset() const;
83
84         void zoom(double steps);
85         void zoom(double steps, int offset);
86
87         void zoom_fit();
88
89         void zoom_one_to_one();
90
91         /**
92          * Sets the scale and offset.
93          * @param scale The new view scale in seconds per pixel.
94          * @param offset The view time offset in seconds.
95          */
96         void set_scale_offset(double scale, double offset);
97
98         std::vector< std::shared_ptr<Trace> > get_traces() const;
99
100         std::list<std::weak_ptr<SelectableItem> > selected_items() const;
101
102         std::set< std::shared_ptr<pv::data::SignalData> >
103                 get_visible_data() const;
104
105         std::pair<double, double> get_time_extents() const;
106
107         /**
108          * Returns true if cursors are displayed. false otherwise.
109          */
110         bool cursors_shown() const;
111
112         /**
113          * Shows or hides the cursors.
114          */
115         void show_cursors(bool show = true);
116
117         /**
118          * Moves the cursors to a convenient position in the view.
119          */
120         void centre_cursors();
121
122         /**
123          * Returns a reference to the pair of cursors.
124          */
125         CursorPair& cursors();
126
127         /**
128          * Returns a reference to the pair of cursors.
129          */
130         const CursorPair& cursors() const;
131
132         const QPoint& hover_point() const;
133
134         void normalize_layout();
135
136         void update_viewport();
137
138 signals:
139         void hover_point_changed();
140
141         void signals_moved();
142
143         void selection_changed();
144
145         void scale_offset_changed();
146
147 private:
148         void get_scroll_layout(double &length, double &offset) const;
149
150         /**
151          * Simultaneously sets the zoom and offset.
152          * @param scale The scale to set the view to in seconds per pixel. This
153          * value is clamped between MinScale and MaxScale.
154          * @param offset The offset of the left edge of the view in seconds.
155          */
156         void set_zoom(double scale, int offset);
157
158         void update_scroll();
159
160         void update_layout();
161
162         static bool compare_trace_v_offsets(
163                 const std::shared_ptr<pv::view::Trace> &a,
164                 const std::shared_ptr<pv::view::Trace> &b);
165
166 private:
167         bool eventFilter(QObject *object, QEvent *event);
168
169         bool viewportEvent(QEvent *e);
170
171         void resizeEvent(QResizeEvent *e);
172
173 private slots:
174
175         void h_scroll_value_changed(int value);
176         void v_scroll_value_changed(int value);
177
178         void signals_changed();
179         void data_updated();
180
181         void marker_time_changed();
182
183         void on_signals_moved();
184
185         void on_geometry_updated();
186
187 private:
188         SigSession &_session;
189
190         Viewport *_viewport;
191         Ruler *_ruler;
192         Header *_header;
193
194         /// The view time scale in seconds per pixel.
195         double _scale;
196
197         /// The view time offset in seconds.
198         double _offset;
199
200         int _v_offset;
201         bool _updating_scroll;
202
203         bool _show_cursors;
204         CursorPair _cursors;
205
206         QPoint _hover_point;
207 };
208
209 } // namespace view
210 } // namespace pv
211
212 #endif // PULSEVIEW_PV_VIEW_VIEW_H