]> sigrok.org Git - pulseview.git/blame - pv/view/timemarker.cpp
Cursor: Moved paint_label into TimeMarker
[pulseview.git] / pv / view / timemarker.cpp
CommitLineData
cd6c8ee2
JH
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
4fabd61a
JH
21#include <algorithm>
22
23#include <extdef.h>
24
2acdb232 25#include "timemarker.hpp"
cd6c8ee2 26
2acdb232 27#include "view.hpp"
cd6c8ee2 28
b213ef09 29#include <QFormLayout>
cd6c8ee2
JH
30#include <QPainter>
31
4fabd61a 32#include <pv/util.hpp>
2acdb232 33#include <pv/widgets/popup.hpp>
a28a212c 34
4fabd61a
JH
35using std::max;
36using std::min;
37
cd6c8ee2
JH
38namespace pv {
39namespace view {
40
4fabd61a
JH
41const int TimeMarker::ArrowSize = 4;
42const int TimeMarker::Offset = 1;
43
8debe10d 44TimeMarker::TimeMarker(View &view, const QColor &colour, double time) :
8dbbc7f0
JH
45 view_(view),
46 colour_(colour),
47 time_(time),
48 value_action_(NULL),
49 value_widget_(NULL),
50 updating_value_widget_(false)
cd6c8ee2 51{
ef8311a4
JH
52}
53
cd6c8ee2
JH
54double TimeMarker::time() const
55{
8dbbc7f0 56 return time_;
cd6c8ee2
JH
57}
58
509727eb
JH
59float TimeMarker::get_x() const
60{
8dbbc7f0 61 return (time_ - view_.offset()) / view_.scale();
509727eb
JH
62}
63
0dda6fe5
JH
64QPoint TimeMarker::point() const
65{
66 return QPoint(get_x(), 0);
67}
68
cd6c8ee2
JH
69void TimeMarker::set_time(double time)
70{
8dbbc7f0 71 time_ = time;
317008ba 72
8dbbc7f0
JH
73 if (value_widget_) {
74 updating_value_widget_ = true;
75 value_widget_->setValue(time);
76 updating_value_widget_ = false;
317008ba
JH
77 }
78
ca4ec3ea 79 time_changed();
cd6c8ee2
JH
80}
81
82void TimeMarker::paint(QPainter &p, const QRect &rect)
83{
509727eb 84 const float x = get_x();
4fabd61a 85 p.setPen(colour_.darker());
cd6c8ee2
JH
86 p.drawLine(QPointF(x, rect.top()), QPointF(x, rect.bottom()));
87}
88
4fabd61a
JH
89void TimeMarker::paint_label(QPainter &p, const QRect &rect)
90{
91 const qreal x = (time_ - view_.offset()) / view_.scale();
92 const QRectF r(get_label_rect(rect));
93
94 const QPointF points[] = {
95 r.topLeft(),
96 r.bottomLeft(),
97 QPointF(max(r.left(), x - ArrowSize), r.bottom()),
98 QPointF(x, rect.bottom()),
99 QPointF(min(r.right(), x + ArrowSize), r.bottom()),
100 r.bottomRight(),
101 r.topRight()
102 };
103
104 const QPointF highlight_points[] = {
105 QPointF(r.left() + 1, r.top() + 1),
106 QPointF(r.left() + 1, r.bottom() - 1),
107 QPointF(max(r.left() + 1, x - ArrowSize), r.bottom() - 1),
108 QPointF(min(max(r.left() + 1, x), r.right() - 1),
109 rect.bottom() - 1),
110 QPointF(min(r.right() - 1, x + ArrowSize), r.bottom() - 1),
111 QPointF(r.right() - 1, r.bottom() - 1),
112 QPointF(r.right() - 1, r.top() + 1),
113 };
114
115 if (selected()) {
116 p.setPen(highlight_pen());
117 p.setBrush(Qt::transparent);
118 p.drawPolygon(points, countof(points));
119 }
120
121 p.setPen(Qt::transparent);
122 p.setBrush(colour_);
123 p.drawPolygon(points, countof(points));
124
125 p.setPen(colour_.lighter());
126 p.setBrush(Qt::transparent);
127 p.drawPolygon(highlight_points, countof(highlight_points));
128
129 p.setPen(colour_.darker());
130 p.setBrush(Qt::transparent);
131 p.drawPolygon(points, countof(points));
132
133 p.setPen(select_text_colour(colour_));
134 p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter,
135 pv::util::format_time(time_, view_.tick_prefix(), 2));
136}
137
a28a212c
JH
138pv::widgets::Popup* TimeMarker::create_popup(QWidget *parent)
139{
140 using pv::widgets::Popup;
141
142 Popup *const popup = new Popup(parent);
143 QFormLayout *const form = new QFormLayout(popup);
144 popup->setLayout(form);
145
8dbbc7f0
JH
146 value_widget_ = new QDoubleSpinBox(parent);
147 value_widget_->setDecimals(9);
148 value_widget_->setSuffix("s");
149 value_widget_->setSingleStep(1e-6);
bccef542 150 value_widget_->setRange(-1.0e9, 1.0e9);
8dbbc7f0 151 value_widget_->setValue(time_);
a28a212c 152
8dbbc7f0 153 connect(value_widget_, SIGNAL(valueChanged(double)),
a28a212c
JH
154 this, SLOT(on_value_changed(double)));
155
8dbbc7f0 156 form->addRow(tr("Time"), value_widget_);
a28a212c
JH
157
158 return popup;
159}
160
1e256e16
JH
161void TimeMarker::on_value_changed(double value)
162{
8dbbc7f0
JH
163 if (!updating_value_widget_) {
164 time_ = value;
1e256e16
JH
165 time_changed();
166 }
167}
168
cd6c8ee2
JH
169} // namespace view
170} // namespace pv