]> sigrok.org Git - pulseview.git/blame - pv/views/trace/signal.cpp
TabularDecView: Allow return/enter press and don't change scale
[pulseview.git] / pv / views / trace / signal.cpp
CommitLineData
28a4c9c5 1/*
b3f22de0 2 * This file is part of the PulseView project.
28a4c9c5
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
efdec55a 17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
28a4c9c5
JH
18 */
19
cef18fc6 20#include <extdef.h>
28a4c9c5 21
eb8269e3 22#include <cassert>
d9e71737 23#include <cmath>
b47d951e 24
e3374498 25#include <QApplication>
b213ef09 26#include <QFormLayout>
3c100123 27#include <QKeyEvent>
b9b7854e 28#include <QLineEdit>
b213ef09 29#include <QMenu>
e3374498 30
fe3a1c21 31#include <libsigrokcxx/libsigrokcxx.hpp>
8d3e0764 32
bf0edd2b
SA
33#include "pv/data/signalbase.hpp"
34
2acdb232
JH
35#include "signal.hpp"
36#include "view.hpp"
3e46726a 37
f9abf97e 38using std::shared_ptr;
8d3e0764 39
51e77110 40namespace pv {
f4e57597 41namespace views {
1573bf16 42namespace trace {
51e77110 43
6ac6242b 44const char *const ChannelNames[] = {
9e40e83d
JH
45 "CLK",
46 "DATA",
7d5a9c3e 47 "EN",
9e40e83d
JH
48 "IN",
49 "OUT",
50 "RST",
fae4a2e6
UH
51 "TX",
52 "RX",
7d5a9c3e
SA
53 "SDA",
54 "SCL"
9e40e83d
JH
55 "SCLK",
56 "MOSI",
57 "MISO",
7d5a9c3e
SA
58 "/CS",
59 "nCS",
9e40e83d 60 "/SS",
7d5a9c3e
SA
61 "nSS",
62 "/RST",
63 "nRST",
9e40e83d
JH
64};
65
2b81ae46 66Signal::Signal(pv::Session &session,
6f925ba9 67 shared_ptr<data::SignalBase> channel) :
bf0edd2b 68 Trace(channel),
8dbbc7f0 69 session_(session),
2749b858 70 name_widget_(nullptr)
28a4c9c5 71{
73a25a6e 72 assert(base_);
a45b9b9e
SA
73
74 connect(base_.get(), SIGNAL(enabled_changed(bool)),
75 this, SLOT(on_enabled_changed(bool)));
ef8311a4
JH
76}
77
49f8ff3f
JH
78void Signal::set_name(QString name)
79{
0acf629d 80 base_->set_name(name);
fcb97d77
SA
81
82 if (name != name_widget_->currentText())
83 name_widget_->setEditText(name);
49f8ff3f
JH
84}
85
931f20b0 86bool Signal::enabled() const
2e575351 87{
73a25a6e 88 return base_->enabled();
a29bb7fb
JH
89}
90
73a25a6e 91shared_ptr<data::SignalBase> Signal::base() const
632ba77e 92{
73a25a6e 93 return base_;
632ba77e
JH
94}
95
3a21afa6
SA
96void Signal::save_settings(QSettings &settings) const
97{
0a952555
SA
98 std::map<QString, QVariant> settings_map = save_settings();
99
100 for (auto& entry : settings_map)
101 settings.setValue(entry.first, entry.second);
102}
103
104std::map<QString, QVariant> Signal::save_settings() const
105{
106 return std::map<QString, QVariant>();
3a21afa6
SA
107}
108
109void Signal::restore_settings(QSettings &settings)
0a952555
SA
110{
111 std::map<QString, QVariant> settings_map;
112
113 QStringList keys = settings.allKeys();
114 for (int i = 0; i < keys.size(); i++)
115 settings_map[keys.at(i)] = settings.value(keys.at(i));
116
117 restore_settings(settings_map);
118}
119
120void Signal::restore_settings(std::map<QString, QVariant> settings)
3a21afa6
SA
121{
122 (void)settings;
123}
124
0a952555 125
60938e04 126void Signal::paint_back(QPainter &p, ViewItemPaintParams &pp)
99af6802 127{
73a25a6e 128 if (base_->enabled())
99af6802
SA
129 Trace::paint_back(p, pp);
130}
131
0c0218fd
JH
132void Signal::populate_popup_form(QWidget *parent, QFormLayout *form)
133{
8dbbc7f0
JH
134 name_widget_ = new QComboBox(parent);
135 name_widget_->setEditable(true);
f74015db 136 name_widget_->setCompleter(nullptr);
0c0218fd 137
f3290553 138 for (unsigned int i = 0; i < countof(ChannelNames); i++)
8dbbc7f0 139 name_widget_->insertItem(i, ChannelNames[i]);
3c100123 140
73a25a6e 141 const int index = name_widget_->findText(base_->name(), Qt::MatchExactly);
3c100123
SA
142
143 if (index == -1) {
73a25a6e 144 name_widget_->insertItem(0, base_->name());
8dbbc7f0 145 name_widget_->setCurrentIndex(0);
3c100123 146 } else {
8dbbc7f0 147 name_widget_->setCurrentIndex(index);
3c100123
SA
148 }
149
8dbbc7f0 150 connect(name_widget_, SIGNAL(editTextChanged(const QString&)),
bf0edd2b 151 this, SLOT(on_nameedit_changed(const QString&)));
0c0218fd 152
8dbbc7f0 153 form->addRow(tr("Name"), name_widget_);
91e8bf08 154
641574bc 155 add_color_option(parent, form);
0c0218fd
JH
156}
157
9e773fec 158QMenu* Signal::create_header_context_menu(QWidget *parent)
86e823ca 159{
9e773fec 160 QMenu *const menu = Trace::create_header_context_menu(parent);
86e823ca
JH
161
162 menu->addSeparator();
163
164 QAction *const disable = new QAction(tr("Disable"), this);
a2d21018 165 disable->setShortcuts(QKeySequence::Delete);
86e823ca
JH
166 connect(disable, SIGNAL(triggered()), this, SLOT(on_disable()));
167 menu->addAction(disable);
168
169 return menu;
170}
171
5ed1adf5
JH
172void Signal::delete_pressed()
173{
174 on_disable();
175}
176
bf0edd2b
SA
177void Signal::on_name_changed(const QString &text)
178{
aecae05c
SA
179 // On startup, this event is fired when a session restores signal
180 // names. However, the name widget hasn't yet been created.
181 if (!name_widget_)
182 return;
183
bf0edd2b
SA
184 if (text != name_widget_->currentText())
185 name_widget_->setEditText(text);
186
187 Trace::on_name_changed(text);
188}
189
86e823ca
JH
190void Signal::on_disable()
191{
a45b9b9e
SA
192 base_->set_enabled(false);
193}
194
195void Signal::on_enabled_changed(bool enabled)
196{
197 (void)enabled;
198
199 if (owner_)
200 owner_->extents_changed(true, true);
86e823ca
JH
201}
202
1573bf16 203} // namespace trace
f4e57597 204} // namespace views
51e77110 205} // namespace pv