Skip to content

Commit 4b4c5fa

Browse files
committed
Use QCustomPlot interactions (Zoom, Drag) instead of implementation
1 parent ebe088d commit 4b4c5fa

File tree

5 files changed

+202
-223
lines changed

5 files changed

+202
-223
lines changed

depend/qcustomplottpb.cpp

+29-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
11
#include "qcustomplottpb.h"
22

33
QCustomPlotTPB::QCustomPlotTPB(QWidget *parent) :
4-
QCustomPlot(parent){}
4+
QCustomPlot(parent){
55

6-
QCustomPlotTPB::~QCustomPlotTPB()
7-
{
6+
// Enable dark mode
7+
xAxis->setBasePen(QPen(Qt::white, 1));
8+
yAxis->setBasePen(QPen(Qt::white, 1));
9+
xAxis->setTickPen(QPen(Qt::white, 1));
10+
yAxis->setTickPen(QPen(Qt::white, 1));
11+
xAxis->setSubTickPen(QPen(Qt::white, 1));
12+
yAxis->setSubTickPen(QPen(Qt::white, 1));
13+
xAxis->setTickLabelColor(Qt::white);
14+
yAxis->setTickLabelColor(Qt::white);
15+
xAxis->grid()->setPen(QPen(QColor(140, 140, 140), 1, Qt::DotLine));
16+
yAxis->grid()->setPen(QPen(QColor(140, 140, 140), 1, Qt::DotLine));
17+
xAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::DotLine));
18+
yAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::DotLine));
19+
xAxis->grid()->setSubGridVisible(true);
20+
yAxis->grid()->setSubGridVisible(true);
21+
xAxis->grid()->setZeroLinePen(Qt::NoPen);
22+
yAxis->grid()->setZeroLinePen(Qt::NoPen);
23+
xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
24+
yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
25+
26+
setBackground(QColor(53, 53, 53));
27+
axisRect()->setBackground(QColor(53, 53, 53));
828

29+
// Set Dragging and Zoom interaction
30+
setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
31+
axisRect(0)->setRangeDrag(Qt::Vertical);
32+
axisRect(0)->setRangeZoom(Qt::Vertical);
933
}
1034

11-
void QCustomPlotTPB::mousePressEvent(QMouseEvent *event)
35+
QCustomPlotTPB::~QCustomPlotTPB()
1236
{
13-
// if (event->button() == Qt::RightButton) {
14-
// QPoint pos = this->mapFromGlobal(this->cursor().pos());
15-
// // Do not convert to coord
16-
// emit removeEvent(QVector2D(float(pos.x()),
17-
// float(pos.y())));
18-
// }
37+
1938
}
2039

2140
void QCustomPlotTPB::keyPressEvent(QKeyEvent *event)

depend/qcustomplottpb.h

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class QCustomPlotTPB : public QCustomPlot
1111

1212
~QCustomPlotTPB() override;
1313

14-
void mousePressEvent(QMouseEvent * event) override;
1514
void keyPressEvent(QKeyEvent * event) override;
1615

1716
protected:

include/function/twopointbezier.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ private slots:
3333
void on_bpmRadio_clicked();
3434
void on_svRadio_clicked();
3535
void on_interval_editingFinished();
36-
void on_vertZoom_valueChanged(int value);
3736
void on_startOffset_valueChanged(int arg1);
3837
void on_endOffset_valueChanged(int arg1);
3938
void on_startValue_valueChanged(double arg1);
@@ -79,10 +78,10 @@ private slots:
7978
QVector<QVector2D> anchorPts;
8079
Ui::TwoPointBezier *ui;
8180

82-
const int ZOOM_DEFAULT = 50;
83-
const double ZOOM_LIMIT = 10.0;
84-
const double ZOOM_SV_BUFFER = 2.0;
85-
const double ZOOM_BPM_BUFFER = 100;
81+
const double RANGE_MIN_SV = 0.0;
82+
const double RANGE_MAX_SV = 2.0;
83+
const double RANGE_MIN_BPM = 0.0;
84+
const double RANGE_MAX_BPM = 300.0;
8685
const int BEZIER_MAX_PTS = 66;
8786
const int BEZIER_MIN_PTS = 2;
8887
const double REMOVE_DISTANCE_MAX = 35;

src/function/twopointbezier.cpp

+29-42
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ TwoPointBezier::TwoPointBezier(QWidget *parent) :
1818

1919
// Initializes IO
2020
ui->input->hideKeyWidget();
21-
ui->input->setTitle("input");
21+
ui->input->setTitle("Input");
2222
ui->input->setPlaceholderText("Variant Input (2 Offsets)");
2323

2424
// Initializes CustomPlots
@@ -39,7 +39,6 @@ TwoPointBezier::TwoPointBezier(QWidget *parent) :
3939
connect(ui->customPlot, SIGNAL(addBezierEvent(QVector2D)),
4040
this, SLOT (addBezier(QVector2D)));
4141

42-
4342
// Activate SV to initialize as SV
4443
useSV();
4544
resetSettings();
@@ -66,7 +65,6 @@ void TwoPointBezier::initToolTips() {
6665
"Hover your mouse over and press keys indicated at the top of the plot to create points.\n"
6766
"If it isn't working, click on the plot to focus it.");
6867
ui->customPlot->setToolTipDuration(1000);
69-
ui->vertZoom->setToolTip("Adjusts the zoom of the plot");
7068
}
7169

7270
QVector<QVector2D> TwoPointBezier::createPlot() {
@@ -119,15 +117,20 @@ void TwoPointBezier::plotFunction() {
119117

120118
customPlot->graph(0)->setData(x, y, false);
121119
// Set color based on SV or BPM
122-
customPlot->graph(0)->setPen(ui->svRadio->isChecked() ?
123-
Color::GREEN : Color::RED);
124-
125-
// Update range
120+
QPen pen;
121+
pen.setColor(ui->svRadio->isChecked() ? Color::GREEN : Color::RED);
122+
pen.setWidth(2);
123+
customPlot->graph(0)->setPen(pen);
124+
customPlot->graph(0)->setBrush(ui->svRadio->isChecked() ?
125+
ColorFade::GREEN : ColorFade::RED);
126+
127+
// Updates domain
126128
auto xMinMax = std::minmax_element(x.begin(), x.end());
127-
auto yMinMax = std::minmax_element(y.begin(), y.end());
128-
// qDebug() << *xMinMax.first << "," << *xMinMax.second;
129129
updatePlotDomain(*xMinMax.first,*xMinMax.second);
130-
updatePlotRange(*yMinMax.first, *yMinMax.second);
130+
131+
// Updates range
132+
// auto yMinMax = std::minmax_element(y.begin(), y.end());
133+
// updatePlotRange(*yMinMax.first, *yMinMax.second);
131134
}
132135
void TwoPointBezier::plotBezier() {
133136
auto customPlot = ui->customPlot;
@@ -141,9 +144,13 @@ void TwoPointBezier::plotBezier() {
141144
}
142145

143146
customPlot->graph(1)->setData(xs, ys, false);
144-
customPlot->graph(1)->setPen(Color::PURPLE);
147+
148+
QPen pen;
149+
pen.setColor(Color::WHITE);
150+
pen.setWidth(1);
151+
customPlot->graph(1)->setPen(pen);
145152
customPlot->graph(1)->setLineStyle(QCPGraph::lsNone);
146-
customPlot->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssPlusCircle, 5));
153+
customPlot->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 10));
147154
customPlot->replot();
148155
}
149156
void TwoPointBezier::plotAnchor() {
@@ -158,20 +165,23 @@ void TwoPointBezier::plotAnchor() {
158165
}
159166

160167
customPlot->graph(2)->setData(xs, ys, false);
161-
customPlot->graph(2)->setPen(ColorFade::BLUE);
168+
QPen pen;
169+
pen.setColor(Color::BLUE);
170+
pen.setWidth(1);
171+
customPlot->graph(2)->setPen(pen);
162172
customPlot->graph(2)->setLineStyle(QCPGraph::lsImpulse);
163-
customPlot->graph(2)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssTriangleInverted, 5));
173+
customPlot->graph(2)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 10));
164174
customPlot->replot();
165175
}
166176

167177
void TwoPointBezier::warning() {
168178
if (ui->endOffset->value() - ui->startOffset->value() <= 0)
169179
ui->startOffset->setStyleSheet(ColorStyleSheet::RED);
170-
else ui->startOffset->setStyleSheet(ColorStyleSheet::BLACK);
180+
else ui->startOffset->setStyleSheet(ColorStyleSheet::WHITE);
171181

172182
if (ui->endOffset->value() - ui->startOffset->value() <= ui->interval->value())
173183
ui->interval->setStyleSheet(ColorStyleSheet::RED);
174-
else ui->interval->setStyleSheet(ColorStyleSheet::BLACK);
184+
else ui->interval->setStyleSheet(ColorStyleSheet::WHITE);
175185
}
176186

177187
void TwoPointBezier::updateAverage(QVector<QVector2D> & pts) {
@@ -185,31 +195,7 @@ void TwoPointBezier::updateAverage(QVector<QVector2D> & pts) {
185195
}
186196

187197
void TwoPointBezier::updatePlotRange(double min, double max){
188-
// Zoom from 10 % to 1000 %
189-
double mean = (max - min) / 2 + min;
190-
191-
// This calculates zoom, zoom [0.1, 10.0]
192-
double zoom = pow(ZOOM_LIMIT, - double(ui->vertZoom->value() - ZOOM_DEFAULT) / ZOOM_DEFAULT);
193-
ui->vertZoomLabel->setText(QString::number(1.0 / zoom, 'f', 2) + "x");
194-
195-
// Normalizes the range and multiplies the ends respectively
196-
// A buffer is used to prevent too small of a range
197-
double minRange;
198-
double maxRange;
199-
if (ui->svRadio->isChecked()){
200-
minRange = (min - mean - ZOOM_SV_BUFFER) * zoom + mean;
201-
maxRange = (max - mean + ZOOM_SV_BUFFER) * zoom + mean;
202-
} else {
203-
minRange = (min - mean - ZOOM_BPM_BUFFER) * zoom + mean;
204-
maxRange = (max - mean + ZOOM_BPM_BUFFER) * zoom + mean;
205-
}
206-
207-
// Allow negative for easier bezier bending
208-
// minRange = minRange < 0 ? 0 : minRange;
209-
// if (ui->svRadio->isChecked())
210-
// maxRange = maxRange > SV_MAX ? SV_MAX : maxRange;
211-
212-
ui->customPlot->yAxis->setRange(minRange, maxRange);
198+
ui->customPlot->yAxis->setRange(min, max);
213199
}
214200
void TwoPointBezier::updatePlotDomain(double min, double max) {
215201
ui->customPlot->xAxis->setRange(min, max);
@@ -353,15 +339,16 @@ void TwoPointBezier::on_generateButton_clicked() {
353339
}
354340
ui->output->write(generateCode(offsets, values, ui->bpmRadio->isChecked()));
355341
}
356-
void TwoPointBezier::on_vertZoom_valueChanged(int /* unused */){ plot(); }
357342
void TwoPointBezier::on_bpmRadio_clicked() {
358343
resetSettings();
359344
useBPM();
345+
updatePlotRange(RANGE_MIN_BPM, RANGE_MAX_BPM);
360346
plot();
361347
}
362348
void TwoPointBezier::on_svRadio_clicked() {
363349
resetSettings();
364350
useSV();
351+
updatePlotRange(RANGE_MIN_SV, RANGE_MAX_SV);
365352
plot();
366353
}
367354
void TwoPointBezier::on_startOffset_valueChanged(int arg1) {

0 commit comments

Comments
 (0)