]> sigrok.org Git - pulseview.git/blob - pv/view/view.h
Make member variable underscores a suffix instead of a prefix
[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 <unordered_map>
29 #include <vector>
30
31 #include <QAbstractScrollArea>
32 #include <QSizeF>
33 #include <QTimer>
34
35 #include <pv/data/signaldata.h>
36
37 #include "cursorpair.h"
38 #include "rowitemowner.h"
39
40 namespace pv {
41
42 class SigSession;
43
44 namespace view {
45
46 class CursorHeader;
47 class Header;
48 class Ruler;
49 class Viewport;
50
51 class View : public QAbstractScrollArea, public RowItemOwner {
52         Q_OBJECT
53
54 private:
55         enum StickyEvents {
56                 SelectableItemHExtentsChanged = 1,
57                 SelectableItemVExtentsChanged = 2
58         };
59
60 private:
61         static const double MaxScale;
62         static const double MinScale;
63
64         static const int MaxScrollValue;
65
66 public:
67         static const QColor CursorAreaColour;
68
69         static const QSizeF LabelPadding;
70
71 public:
72         explicit View(SigSession &session, QWidget *parent = 0);
73
74         SigSession& session();
75         const SigSession& session() const;
76
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
87         Viewport* viewport();
88
89         const Viewport* viewport() const;
90
91         /**
92          * Returns the view time scale in seconds per pixel.
93          */
94         double scale() const;
95
96         /**
97          * Returns the time offset of the left edge of the view in
98          * seconds.
99          */
100         double offset() const;
101         int owner_visual_v_offset() const;
102
103         /**
104          * Returns the number of nested parents that this row item owner has.
105          */
106         unsigned int depth() const;
107
108         void zoom(double steps);
109         void zoom(double steps, int offset);
110
111         void zoom_fit();
112
113         void zoom_one_to_one();
114
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          */
120         void set_scale_offset(double scale, double offset);
121
122         std::set< std::shared_ptr<pv::data::SignalData> >
123                 get_visible_data() const;
124
125         std::pair<double, double> get_time_extents() const;
126
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
137         /**
138          * Moves the cursors to a convenient position in the view.
139          */
140         void centre_cursors();
141
142         /**
143          * Returns a reference to the pair of cursors.
144          */
145         CursorPair& cursors();
146
147         /**
148          * Returns a reference to the pair of cursors.
149          */
150         const CursorPair& cursors() const;
151
152         const QPoint& hover_point() const;
153
154         void update_viewport();
155
156         void restack_all_row_items();
157
158 Q_SIGNALS:
159         void hover_point_changed();
160
161         void signals_moved();
162
163         void selection_changed();
164
165         void scale_offset_changed();
166
167 private:
168         void get_scroll_layout(double &length, double &offset) const;
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          */
176         void set_zoom(double scale, int offset);
177
178         void update_scroll();
179
180         void update_layout();
181
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
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
210 private:
211         bool eventFilter(QObject *object, QEvent *event);
212
213         bool viewportEvent(QEvent *e);
214
215         void resizeEvent(QResizeEvent *e);
216
217 public:
218         void appearance_changed(bool label, bool content);
219
220         void extents_changed(bool horz, bool vert);
221
222 private Q_SLOTS:
223
224         void h_scroll_value_changed(int value);
225         void v_scroll_value_changed(int value);
226
227         void signals_changed();
228         void data_updated();
229
230         void marker_time_changed();
231
232         void on_signals_moved();
233
234         void process_sticky_events();
235
236         void on_hover_point_changed();
237
238 private:
239         SigSession &session_;
240
241         Viewport *viewport_;
242         Ruler *ruler_;
243         CursorHeader *cursorheader_;
244         Header *header_;
245
246         /// The view time scale in seconds per pixel.
247         double scale_;
248
249         /// The view time offset in seconds.
250         double offset_;
251
252         int v_offset_;
253         bool updating_scroll_;
254
255         bool show_cursors_;
256         CursorPair cursors_;
257
258         QPoint hover_point_;
259
260         unsigned int sticky_events_;
261         QTimer lazy_event_handler_;
262 };
263
264 } // namespace view
265 } // namespace pv
266
267 #endif // PULSEVIEW_PV_VIEW_VIEW_H