Header, Viewport: Don't manually invoke on_signals_changed on construction
[pulseview.git] / pv / view / logicsignal.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_LOGICSIGNAL_H
22 #define PULSEVIEW_PV_VIEW_LOGICSIGNAL_H
23
24 #include "signal.h"
25
26 #include <memory>
27
28 class QToolBar;
29
30 namespace sigrok {
31         class Device;
32         class TriggerMatchType;
33 }
34
35 namespace pv {
36
37 namespace data {
38 class Logic;
39 }
40
41 namespace view {
42
43 class LogicSignal : public Signal
44 {
45         Q_OBJECT
46
47 private:
48         static const float Oversampling;
49
50         static const QColor EdgeColour;
51         static const QColor HighColour;
52         static const QColor LowColour;
53
54         static const QColor SignalColours[10];
55
56 public:
57         LogicSignal(pv::SigSession &session,
58                 std::shared_ptr<sigrok::Device> device,
59                 std::shared_ptr<sigrok::Channel> channel,
60                 std::shared_ptr<pv::data::Logic> data);
61
62         virtual ~LogicSignal();
63
64         std::shared_ptr<pv::data::SignalData> data() const;
65
66         std::shared_ptr<pv::data::Logic> logic_data() const;
67
68         /**
69          * Paints the background layer of the signal with a QPainter
70          * @param p the QPainter to paint into.
71          * @param left the x-coordinate of the left edge of the signal.
72          * @param right the x-coordinate of the right edge of the signal.
73          **/
74         void paint_back(QPainter &p, int left, int right);
75
76         /**
77          * Paints the mid-layer of the signal with a QPainter
78          * @param p the QPainter to paint into.
79          * @param left the x-coordinate of the left edge of the signal.
80          * @param right the x-coordinate of the right edge of the signal.
81          **/
82         void paint_mid(QPainter &p, int left, int right);
83
84 private:
85         void paint_caps(QPainter &p, QLineF *const lines,
86                 std::vector< std::pair<int64_t, bool> > &edges,
87                 bool level, double samples_per_pixel, double pixels_offset,
88                 float x_offset, float y_offset);
89
90         void init_trigger_actions(QWidget *parent);
91
92         QAction* match_action(const sigrok::TriggerMatchType *match);
93         const sigrok::TriggerMatchType *action_match(QAction *action);
94         void populate_popup_form(QWidget *parent, QFormLayout *form);
95         void modify_trigger();
96
97 private Q_SLOTS:
98         void on_trigger();
99
100 private:
101         std::shared_ptr<sigrok::Device> _device;
102         std::shared_ptr<pv::data::Logic> _data;
103
104         const sigrok::TriggerMatchType *_trigger_match;
105         QToolBar *_trigger_bar;
106         QAction *_trigger_none;
107         QAction *_trigger_rising;
108         QAction *_trigger_high;
109         QAction *_trigger_falling;
110         QAction *_trigger_low;
111         QAction *_trigger_change;
112 };
113
114 } // namespace view
115 } // namespace pv
116
117 #endif // PULSEVIEW_PV_VIEW_LOGICSIGNAL_H