]> sigrok.org Git - pulseview.git/blame - pv/view/view.h
Make member variable underscores a suffix instead of a prefix
[pulseview.git] / pv / view / view.h
CommitLineData
adb4b10c 1/*
b3f22de0 2 * This file is part of the PulseView project.
adb4b10c
JH
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
640d091b
UH
21#ifndef PULSEVIEW_PV_VIEW_VIEW_H
22#define PULSEVIEW_PV_VIEW_VIEW_H
adb4b10c
JH
23
24#include <stdint.h>
25
f9abf97e 26#include <memory>
1bc6525b 27#include <set>
448a72cf 28#include <unordered_map>
38eeddea
JH
29#include <vector>
30
adb4b10c 31#include <QAbstractScrollArea>
2e04f9bd 32#include <QSizeF>
32218d3e 33#include <QTimer>
adb4b10c 34
1bc6525b
JH
35#include <pv/data/signaldata.h>
36
b42d25c4 37#include "cursorpair.h"
eae6e30a 38#include "rowitemowner.h"
f76af637 39
51e77110
JH
40namespace pv {
41
adb4b10c 42class SigSession;
adb4b10c 43
cdf7bea7
JH
44namespace view {
45
84a0d458 46class CursorHeader;
1d8dca91 47class Header;
ccdd3ef5 48class Ruler;
cdf7bea7
JH
49class Viewport;
50
eae6e30a 51class View : public QAbstractScrollArea, public RowItemOwner {
adb4b10c
JH
52 Q_OBJECT
53
32218d3e
JH
54private:
55 enum StickyEvents {
56 SelectableItemHExtentsChanged = 1,
57 SelectableItemVExtentsChanged = 2
58 };
59
adb4b10c
JH
60private:
61 static const double MaxScale;
62 static const double MinScale;
63
f25770e2
JH
64 static const int MaxScrollValue;
65
1d8dca91 66public:
f76af637
JH
67 static const QColor CursorAreaColour;
68
2e04f9bd
JH
69 static const QSizeF LabelPadding;
70
adb4b10c 71public:
cdf7bea7 72 explicit View(SigSession &session, QWidget *parent = 0);
adb4b10c 73
1d19ef83 74 SigSession& session();
38eeddea 75 const SigSession& session() const;
1d19ef83 76
eae6e30a
JH
77 /**
78 * Returns the view of the owner.
79 */
80 virtual pv::view::View* view();
81
82 /**
83 * Returns the view of the owner.
84 */
85 virtual const pv::view::View* view() const;
86
2ae445ba
SA
87 Viewport* viewport();
88
89 const Viewport* viewport() const;
90
e2f5223b
JH
91 /**
92 * Returns the view time scale in seconds per pixel.
93 */
adb4b10c 94 double scale() const;
e2f5223b
JH
95
96 /**
97 * Returns the time offset of the left edge of the view in
98 * seconds.
99 */
adb4b10c 100 double offset() const;
7ff0145f 101 int owner_visual_v_offset() const;
adb4b10c 102
3e769a37
JH
103 /**
104 * Returns the number of nested parents that this row item owner has.
105 */
106 unsigned int depth() const;
107
adb4b10c 108 void zoom(double steps);
17c0f398 109 void zoom(double steps, int offset);
adb4b10c 110
ca46b534
JH
111 void zoom_fit();
112
d1e7d82c
JH
113 void zoom_one_to_one();
114
e2f5223b
JH
115 /**
116 * Sets the scale and offset.
117 * @param scale The new view scale in seconds per pixel.
118 * @param offset The view time offset in seconds.
119 */
adb4b10c
JH
120 void set_scale_offset(double scale, double offset);
121
f9abf97e 122 std::set< std::shared_ptr<pv::data::SignalData> >
1bc6525b
JH
123 get_visible_data() const;
124
125 std::pair<double, double> get_time_extents() const;
126
f76af637
JH
127 /**
128 * Returns true if cursors are displayed. false otherwise.
129 */
130 bool cursors_shown() const;
131
132 /**
133 * Shows or hides the cursors.
134 */
135 void show_cursors(bool show = true);
136
b4d91e56
JH
137 /**
138 * Moves the cursors to a convenient position in the view.
139 */
140 void centre_cursors();
141
f76af637
JH
142 /**
143 * Returns a reference to the pair of cursors.
144 */
b42d25c4 145 CursorPair& cursors();
f76af637 146
58864c5c
JH
147 /**
148 * Returns a reference to the pair of cursors.
149 */
150 const CursorPair& cursors() const;
151
cbd80f64
JH
152 const QPoint& hover_point() const;
153
9cef9567 154 void update_viewport();
7ff0145f
JH
155
156 void restack_all_row_items();
9cef9567 157
e9213170 158Q_SIGNALS:
cbd80f64
JH
159 void hover_point_changed();
160
07204819
JH
161 void signals_moved();
162
8b454527
JH
163 void selection_changed();
164
e0fc5810
JH
165 void scale_offset_changed();
166
adb4b10c 167private:
f25770e2 168 void get_scroll_layout(double &length, double &offset) const;
3925091a
JH
169
170 /**
171 * Simultaneously sets the zoom and offset.
172 * @param scale The scale to set the view to in seconds per pixel. This
173 * value is clamped between MinScale and MaxScale.
174 * @param offset The offset of the left edge of the view in seconds.
175 */
d1e7d82c
JH
176 void set_zoom(double scale, int offset);
177
adb4b10c
JH
178 void update_scroll();
179
d7c0ca4a
JH
180 void update_layout();
181
eae6e30a
JH
182 /**
183 * Satisifies RowItem functionality.
184 * @param p the QPainter to paint into.
185 * @param right the x-coordinate of the right edge of the header
186 * area.
187 * @param hover true if the label is being hovered over by the mouse.
188 */
189 void paint_label(QPainter &p, int right, bool hover);
190
191 /**
192 * Computes the outline rectangle of a label.
193 * @param right the x-coordinate of the right edge of the header
194 * area.
195 * @return Returns the rectangle of the signal label.
196 */
197 QRectF label_rect(int right);
198
448a72cf
JH
199 static bool add_channels_to_owner(
200 const std::vector< std::shared_ptr<sigrok::Channel> > &channels,
201 RowItemOwner *owner, int &offset,
202 std::unordered_map<std::shared_ptr<sigrok::Channel>,
203 std::shared_ptr<Signal> > &signal_map,
204 std::function<bool (std::shared_ptr<RowItem>)> filter_func =
205 std::function<bool (std::shared_ptr<RowItem>)>());
206
207 static void apply_offset(
208 std::shared_ptr<RowItem> row_item, int &offset);
209
adb4b10c 210private:
cbd80f64
JH
211 bool eventFilter(QObject *object, QEvent *event);
212
adb4b10c
JH
213 bool viewportEvent(QEvent *e);
214
215 void resizeEvent(QResizeEvent *e);
216
32218d3e
JH
217public:
218 void appearance_changed(bool label, bool content);
219
220 void extents_changed(bool horz, bool vert);
221
e9213170 222private Q_SLOTS:
cbd80f64 223
b16907d3 224 void h_scroll_value_changed(int value);
adb4b10c
JH
225 void v_scroll_value_changed(int value);
226
69dd2b03 227 void signals_changed();
adb4b10c
JH
228 void data_updated();
229
ca4ec3ea
JH
230 void marker_time_changed();
231
07204819 232 void on_signals_moved();
54401bbb 233
32218d3e 234 void process_sticky_events();
d7c0ca4a 235
33c62f44
JH
236 void on_hover_point_changed();
237
adb4b10c 238private:
8dbbc7f0 239 SigSession &session_;
adb4b10c 240
8dbbc7f0
JH
241 Viewport *viewport_;
242 Ruler *ruler_;
243 CursorHeader *cursorheader_;
244 Header *header_;
adb4b10c 245
e2f5223b 246 /// The view time scale in seconds per pixel.
8dbbc7f0 247 double scale_;
e2f5223b
JH
248
249 /// The view time offset in seconds.
8dbbc7f0 250 double offset_;
adb4b10c 251
8dbbc7f0
JH
252 int v_offset_;
253 bool updating_scroll_;
cbd80f64 254
8dbbc7f0
JH
255 bool show_cursors_;
256 CursorPair cursors_;
f76af637 257
8dbbc7f0 258 QPoint hover_point_;
32218d3e 259
8dbbc7f0
JH
260 unsigned int sticky_events_;
261 QTimer lazy_event_handler_;
adb4b10c
JH
262};
263
cdf7bea7
JH
264} // namespace view
265} // namespace pv
266
640d091b 267#endif // PULSEVIEW_PV_VIEW_VIEW_H