Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Companion curve enhancements #5947

Merged
merged 3 commits into from Jun 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
93 changes: 89 additions & 4 deletions companion/src/modeledit/curves.cpp
Expand Up @@ -122,8 +122,10 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet
ui->curveNameLabel->hide();
}

QGraphicsScene *scene = new QGraphicsScene(ui->curvePreview);
scene = new CustomScene(ui->curvePreview);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
connect(scene, SIGNAL(newPoint(int, int)), this, SLOT(onSceneNewPoint(int, int)));

ui->curvePreview->setScene(scene);
int numcurves=firmware->getCapability(NumCurves);
int limit;
Expand Down Expand Up @@ -212,6 +214,11 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet
addTemplate(tr("Symmetrical f(x)=-f(-x)"), CURVE_COEFF_ENABLE, curveSymmetricalY);
addTemplate(tr("Symmetrical f(x)=f(-x)"), CURVE_COEFF_ENABLE | CURVE_YMID_ENABLE, curveSymmetricalX);

ui->pointSize->setValue(10);
ui->pointSize->setMinimum(3);
ui->pointSize->setMaximum(20);
connect(ui->pointSize, SIGNAL(valueChanged(int)), this, SLOT(onPointSizeEdited()));

disableMouseScrolling();

lock = false;
Expand Down Expand Up @@ -292,14 +299,13 @@ void Curves::updateCurve()
Node * nodex = 0;
QColor color;

QGraphicsScene *scene = ui->curvePreview->scene();
scene->clear();

qreal width = scene->sceneRect().width();
qreal height = scene->sceneRect().height();

qreal centerX = scene->sceneRect().left() + width/2; //center X
qreal centerY = scene->sceneRect().top() + height/2; //center Y
qreal centerX = scene->sceneRect().left() + width/2;
qreal centerY = scene->sceneRect().top() + height/2;

QGraphicsSimpleTextItem *ti = scene->addSimpleText(tr("Editing curve %1").arg(currentCurve+1));
ti->setPos(3, 3);
Expand Down Expand Up @@ -331,6 +337,8 @@ void Curves::updateCurve()
nodex = new Node();
nodex->setProperty("index", i);
nodex->setColor(colors[currentCurve]);
nodex->setBallSize(ui->pointSize->value());
nodex->setBallHeight(0);
if (model->curves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) {
if (i>0 && i<numpoints-1) {
nodex->setFixedX(false);
Expand All @@ -349,6 +357,7 @@ void Curves::updateCurve()
connect(nodex, SIGNAL(moved(int, int)), this, SLOT(onNodeMoved(int, int)));
connect(nodex, SIGNAL(focus()), this, SLOT(onNodeFocus()));
connect(nodex, SIGNAL(unfocus()), this, SLOT(onNodeUnfocus()));
connect(nodex, SIGNAL(deleteMe()), this, SLOT(onNodeDelete()));
scene->addItem(nodex);
if (i>0) scene->addItem(new Edge(nodel, nodex));
}
Expand Down Expand Up @@ -642,3 +651,79 @@ void Curves::ShowContextMenu(const QPoint& pos) // this is a slot
}
}
}

void Curves::onPointSizeEdited()
{
if (!lock) {
update();
}
}

void Curves::onNodeDelete()
{
int index = sender()->property("index").toInt();
int numpoints = model->curves[currentCurve].count;
if ((model->curves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) && (index > 0) && (index < numpoints-1)) {
spny[index]->clearFocus();
for (int i=index+1; i<numpoints; i++) {
model->curves[currentCurve].points[i-1] = model->curves[currentCurve].points[i];
}
numpoints--;
model->curves[currentCurve].points[numpoints].x = 0;
model->curves[currentCurve].points[numpoints].y = 0;
model->curves[currentCurve].count = numpoints;
update();
emit modified();
}
}

void Curves::onSceneNewPoint(int x, int y)
{
if ((model->curves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) && (model->curves[currentCurve].count < CPN_MAX_POINTS)) {
int newidx;
int numpoints = model->curves[currentCurve].count;
if (x < model->curves[currentCurve].points[0].x) {
newidx = 0;
}
else if (x > model->curves[currentCurve].points[numpoints - 1].x) {
newidx = numpoints;
}
else {
for (int i=0; i<numpoints; i++) {
if (x < model->curves[currentCurve].points[i].x) {
newidx = i;
break;
}
}
}
numpoints++;
model->curves[currentCurve].count = numpoints;
for (int idx=(numpoints-1); idx>(newidx); idx--) {
model->curves[currentCurve].points[idx] = model->curves[currentCurve].points[idx-1];
}
model->curves[currentCurve].points[newidx].x = x;
model->curves[currentCurve].points[newidx].y = y;
update();
emit modified();
}
}

CustomScene::CustomScene(QGraphicsView * view) :
QGraphicsScene(view)
{
}

void CustomScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
{
if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) {
QRectF rect = sceneRect();
QPointF pos = event->scenePos();
QPointF p;
p.setX(-100 + ((pos.x() - rect.left()) * 200) / rect.width());
p.setY(100 + (rect.top() - pos.y()) * 200 / rect.height());
QGraphicsScene::mouseReleaseEvent(event);
emit newPoint((int)p.x(), (int)p.y());
}
else
QGraphicsScene::mouseReleaseEvent(event);
}
21 changes: 20 additions & 1 deletion companion/src/modeledit/curves.h
Expand Up @@ -23,6 +23,8 @@

#include "modeledit.h"
#include "eeprominterface.h"
#include <QGraphicsScene>
#include <QGraphicsView>

enum CopyAction {
CURVE_COPY,
Expand All @@ -43,6 +45,20 @@ struct CurveCreatorTemplate {
curveFunction function;
};

class CustomScene : public QGraphicsScene
{
Q_OBJECT

public:
CustomScene(QGraphicsView * view);

signals:
void newPoint(int, int);

protected:
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * event) override;
};

class Curves : public ModelPanel
{
Q_OBJECT
Expand All @@ -67,6 +83,9 @@ class Curves : public ModelPanel
void onNodeUnfocus();
void on_curveType_currentIndexChanged(int index);
void on_curveApply_clicked();
void onSceneNewPoint(int x, int y);
void onPointSizeEdited();
void onNodeDelete();

protected:
virtual void resizeEvent(QResizeEvent *event);
Expand All @@ -85,7 +104,7 @@ class Curves : public ModelPanel
void updateCurvePoints();
bool allowCurveType(int points, CurveData::CurveType type);
void setPointY(int i, int x, int y);

CustomScene * scene;
};

#endif // _CURVES_H_
129 changes: 73 additions & 56 deletions companion/src/modeledit/curves.ui
Expand Up @@ -132,18 +132,18 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QGridLayout" name="pointsLayout">
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>2</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>2</number>
</property>
</layout>
</item>
<item>
Expand Down Expand Up @@ -175,17 +175,41 @@
<property name="title">
<string>Curve Creator</string>
</property>
<layout class="QGridLayout" name="gridLayout_76" rowstretch="0,0,0,0,0,0,0,0">
<item row="0" column="1" colspan="3">
<widget class="QComboBox" name="curveType"/>
<layout class="QGridLayout" name="gridLayout_76" rowstretch="0,0,0,0,0,0,0,0,0,0">
<item row="1" column="0">
<widget class="QLabel" name="curveCoeffLabel">
<property name="text">
<string>Coefficient</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="yMidLabel">
<item row="0" column="0">
<widget class="QLabel" name="curveTypeLabel_2">
<property name="text">
<string>Y at X=0</string>
<string>Curve type</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="curveSideLabel">
<property name="text">
<string>Side</string>
</property>
</widget>
</item>
<item row="9" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="1" colspan="3">
<widget class="QSpinBox" name="yMax">
<property name="sizePolicy">
Expand All @@ -202,15 +226,8 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="yMaxLabel">
<property name="text">
<string>Y at X=100</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QSpinBox" name="curveCoeff">
<item row="3" column="1" colspan="3">
<widget class="QSpinBox" name="yMid">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
Expand All @@ -225,6 +242,13 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="yMinLabel">
<property name="text">
<string>Y at X=-100</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="3">
<widget class="QComboBox" name="curveSide">
<item>
Expand All @@ -244,8 +268,15 @@
</item>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QSpinBox" name="yMin">
<item row="4" column="0">
<widget class="QLabel" name="yMaxLabel">
<property name="text">
<string>Y at X=100</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QSpinBox" name="curveCoeff">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
Expand All @@ -267,28 +298,25 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="curveSideLabel">
<item row="0" column="1" colspan="3">
<widget class="QComboBox" name="curveType"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="yMidLabel">
<property name="text">
<string>Side</string>
<string>Y at X=0</string>
</property>
</widget>
</item>
<item row="7" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
<item row="8" column="0">
<widget class="QLabel" name="pointSizeLabel">
<property name="text">
<string>Point size</string>
</property>
</spacer>
</widget>
</item>
<item row="3" column="1" colspan="3">
<widget class="QSpinBox" name="yMid">
<item row="2" column="1" colspan="3">
<widget class="QSpinBox" name="yMin">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
Expand All @@ -303,24 +331,13 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="curveTypeLabel_2">
<property name="text">
<string>Curve type</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="yMinLabel">
<property name="text">
<string>Y at X=-100</string>
</property>
</widget>
<item row="8" column="1" colspan="3">
<widget class="QSpinBox" name="pointSize"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="curveCoeffLabel">
<property name="text">
<string>Coefficient</string>
<item row="7" column="0" colspan="4">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
Expand Down