paysages: Color gradation editor with curves.
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@281 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
85f4017bf1
commit
decaf96036
7 changed files with 167 additions and 54 deletions
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QGridLayout>
|
||||
#include <QImage>
|
||||
#include <QLabel>
|
||||
#include <QColor>
|
||||
|
@ -18,6 +19,8 @@ DialogColorGradation::DialogColorGradation(QWidget *parent, ColorGradation* grad
|
|||
QDialog(parent)
|
||||
{
|
||||
QWidget* buttons;
|
||||
QWidget* form;
|
||||
QGridLayout* form_layout;
|
||||
|
||||
_base = gradation;
|
||||
_current = colorGradationCreate();
|
||||
|
@ -25,28 +28,38 @@ DialogColorGradation::DialogColorGradation(QWidget *parent, ColorGradation* grad
|
|||
|
||||
setLayout(new QVBoxLayout());
|
||||
|
||||
_curve_editor = new WidgetCurveEditor(this);
|
||||
layout()->addWidget(_curve_editor);
|
||||
form = new QWidget(this);
|
||||
form_layout = new QGridLayout();
|
||||
form->setLayout(form_layout);
|
||||
layout()->addWidget(form);
|
||||
|
||||
form_layout->addWidget(new QLabel(tr("This is the curve editor for color components.\nClick on a component preview below to edit it.\nClick on points and drag them to move them.\nDouble click to add a new point.\nRight click on a point to delete it."), form), 0, 0);
|
||||
_curve_editor = new WidgetCurveEditor(form);
|
||||
form_layout->addWidget(_curve_editor, 0, 1);
|
||||
connect(_curve_editor, SIGNAL(liveChanged()), this, SLOT(updateColors()));
|
||||
|
||||
_preview_red = new PreviewColorGradation(this, _current, COLORGRADATIONBAND_RED);
|
||||
form_layout->addWidget(new QLabel(tr("Red preview, click to edit"), form), 1, 0);
|
||||
_preview_red = new PreviewColorGradation(form, _current, COLORGRADATIONBAND_RED);
|
||||
_preview_red->setMinimumHeight(50);
|
||||
connect(_preview_red, SIGNAL(clicked()), this, SLOT(selectRed()));
|
||||
layout()->addWidget(_preview_red);
|
||||
form_layout->addWidget(_preview_red, 1, 1);
|
||||
|
||||
_preview_green = new PreviewColorGradation(this, _current, COLORGRADATIONBAND_GREEN);
|
||||
form_layout->addWidget(new QLabel(tr("Green preview, click to edit"), form), 2, 0);
|
||||
_preview_green = new PreviewColorGradation(form, _current, COLORGRADATIONBAND_GREEN);
|
||||
_preview_green->setMinimumHeight(50);
|
||||
connect(_preview_green, SIGNAL(clicked()), this, SLOT(selectGreen()));
|
||||
layout()->addWidget(_preview_green);
|
||||
form_layout->addWidget(_preview_green, 2, 1);
|
||||
|
||||
_preview_blue = new PreviewColorGradation(this, _current, COLORGRADATIONBAND_BLUE);
|
||||
form_layout->addWidget(new QLabel(tr("Blue preview, click to edit"), form), 3, 0);
|
||||
_preview_blue = new PreviewColorGradation(form, _current, COLORGRADATIONBAND_BLUE);
|
||||
_preview_blue->setMinimumHeight(50);
|
||||
connect(_preview_blue, SIGNAL(clicked()), this, SLOT(selectBlue()));
|
||||
layout()->addWidget(_preview_blue);
|
||||
form_layout->addWidget(_preview_blue, 3, 1);
|
||||
|
||||
_preview_final = new PreviewColorGradation(this, _current, COLORGRADATIONBAND_FINAL);
|
||||
form_layout->addWidget(new QLabel(tr("Final preview"), form), 4, 0);
|
||||
_preview_final = new PreviewColorGradation(form, _current, COLORGRADATIONBAND_FINAL);
|
||||
_preview_final->setMinimumHeight(50);
|
||||
layout()->addWidget(_preview_final);
|
||||
form_layout->addWidget(_preview_final, 4, 1);
|
||||
|
||||
buttons = new QWidget(this);
|
||||
layout()->addWidget(buttons);
|
||||
|
@ -111,6 +124,7 @@ void DialogColorGradation::selectRed()
|
|||
{
|
||||
colorGradationGetRedCurve(_current, _curve);
|
||||
_curve_editor->setCurve(_curve);
|
||||
_curve_editor->setPenColor(QColor(255, 0, 0));
|
||||
_selected = 1;
|
||||
}
|
||||
|
||||
|
@ -118,6 +132,7 @@ void DialogColorGradation::selectGreen()
|
|||
{
|
||||
colorGradationGetGreenCurve(_current, _curve);
|
||||
_curve_editor->setCurve(_curve);
|
||||
_curve_editor->setPenColor(QColor(0, 200, 0));
|
||||
_selected = 2;
|
||||
}
|
||||
|
||||
|
@ -125,6 +140,7 @@ void DialogColorGradation::selectBlue()
|
|||
{
|
||||
colorGradationGetBlueCurve(_current, _curve);
|
||||
_curve_editor->setCurve(_curve);
|
||||
_curve_editor->setPenColor(QColor(0, 0, 255));
|
||||
_selected = 3;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ DialogWanderer::DialogWanderer(QWidget* parent, CameraDefinition* camera, bool c
|
|||
|
||||
panel = new QWidget(this);
|
||||
panel->setLayout(new QVBoxLayout());
|
||||
panel->setMaximumWidth(200);
|
||||
panel->setMaximumWidth(230);
|
||||
|
||||
button = new QPushButton(tr("Reset camera"), panel);
|
||||
panel->layout()->addWidget(button);
|
||||
|
|
|
@ -8,6 +8,7 @@ WidgetCurveEditor::WidgetCurveEditor(QWidget *parent) : QWidget(parent)
|
|||
{
|
||||
_curve = curveCreate();
|
||||
_dragged = -1;
|
||||
_pen = QColor(0, 0, 0);
|
||||
|
||||
setMinimumSize(500, 500);
|
||||
setMaximumSize(500, 500);
|
||||
|
@ -29,6 +30,12 @@ void WidgetCurveEditor::getCurve(Curve* curve)
|
|||
curveCopy(_curve, curve);
|
||||
}
|
||||
|
||||
void WidgetCurveEditor::setPenColor(QColor color)
|
||||
{
|
||||
_pen = color;
|
||||
update();
|
||||
}
|
||||
|
||||
void WidgetCurveEditor::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
int i, n;
|
||||
|
@ -37,7 +44,7 @@ void WidgetCurveEditor::paintEvent(QPaintEvent* event)
|
|||
|
||||
QPainter painter(this);
|
||||
painter.fillRect(0, 0, 500, 500, QColor(255, 255, 255));
|
||||
painter.setPen(QColor(255, 0, 0));
|
||||
painter.setPen(_pen);
|
||||
|
||||
for (int x = 0; x < 500; x++)
|
||||
{
|
||||
|
@ -56,41 +63,9 @@ void WidgetCurveEditor::paintEvent(QPaintEvent* event)
|
|||
|
||||
void WidgetCurveEditor::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
int i, n;
|
||||
int nearest;
|
||||
double mousex, mousey;
|
||||
double distance, ndistance;
|
||||
CurvePoint point;
|
||||
|
||||
n = curveGetPointCount(_curve);
|
||||
if (n < 1)
|
||||
if (event->button() == Qt::LeftButton && _dragged < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mousex = ((double)event->x()) / 499.0;
|
||||
mousey = 1.0 - ((double)event->y()) / 499.0;
|
||||
nearest = -1;
|
||||
|
||||
// Find nearest point
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
curveGetPoint(_curve, i, &point);
|
||||
ndistance = toolsGetDistance2D(point.position, point.value, mousex, mousey);
|
||||
if (nearest < 0 || ndistance < distance)
|
||||
{
|
||||
distance = ndistance;
|
||||
nearest = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (distance < 0.015)
|
||||
{
|
||||
_dragged = nearest;
|
||||
}
|
||||
else
|
||||
{
|
||||
_dragged = -1;
|
||||
_dragged = getPointAt(event->x(), event->y());
|
||||
}
|
||||
|
||||
event->accept();
|
||||
|
@ -100,7 +75,7 @@ void WidgetCurveEditor::mouseMoveEvent(QMouseEvent* event)
|
|||
{
|
||||
CurvePoint point;
|
||||
|
||||
if (_dragged >= 0)
|
||||
if (_dragged >= 0 && (event->buttons() & Qt::LeftButton))
|
||||
{
|
||||
point.position = ((double)event->x()) / 499.0;
|
||||
point.value = 1.0 - ((double)event->y()) / 499.0;
|
||||
|
@ -122,13 +97,81 @@ void WidgetCurveEditor::mouseMoveEvent(QMouseEvent* event)
|
|||
|
||||
void WidgetCurveEditor::mouseReleaseEvent(QMouseEvent* event)
|
||||
{
|
||||
if (_dragged >= 0)
|
||||
int clicked;
|
||||
|
||||
if (event->button() == Qt::RightButton)
|
||||
{
|
||||
clicked = getPointAt(event->x(), event->y());
|
||||
if (clicked >= 0)
|
||||
{
|
||||
curveRemovePoint(_curve, clicked);
|
||||
update();
|
||||
emit liveChanged();
|
||||
}
|
||||
}
|
||||
else if (event->button() == Qt::LeftButton && _dragged >= 0)
|
||||
{
|
||||
_dragged = -1;
|
||||
curveValidate(_curve);
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void WidgetCurveEditor::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
CurvePoint point;
|
||||
|
||||
if (event->button() == Qt::LeftButton && _dragged < 0)
|
||||
{
|
||||
if (getPointAt(event->x(), event->y()) < 0)
|
||||
{
|
||||
point.position = ((double)event->x()) / 499.0;
|
||||
point.value = 1.0 - ((double)event->y()) / 499.0;
|
||||
|
||||
curveAddPoint(_curve, &point);
|
||||
curveValidate(_curve);
|
||||
update();
|
||||
emit liveChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int WidgetCurveEditor::getPointAt(int x, int y)
|
||||
{
|
||||
int n;
|
||||
int nearest;
|
||||
double distance, ndistance;
|
||||
CurvePoint point;
|
||||
double dx = ((double)x) / 499.0;
|
||||
double dy = 1.0 - ((double)y) / 499.0;
|
||||
|
||||
n = curveGetPointCount(_curve);
|
||||
if (n < 1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Find nearest point
|
||||
nearest = -1;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
curveGetPoint(_curve, i, &point);
|
||||
ndistance = toolsGetDistance2D(point.position, point.value, dx, dy);
|
||||
if (nearest < 0 || ndistance < distance)
|
||||
{
|
||||
distance = ndistance;
|
||||
nearest = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearest >= 0 && distance < 0.015)
|
||||
{
|
||||
return nearest;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define _PAYSAGES_QT_WIDGETCURVEEDITOR_H_
|
||||
|
||||
#include <QWidget>
|
||||
#include <QColor>
|
||||
#include "../lib_paysages/curve.h"
|
||||
|
||||
class WidgetCurveEditor : public QWidget
|
||||
|
@ -15,6 +16,8 @@ public:
|
|||
void setCurve(Curve* curve);
|
||||
void getCurve(Curve* curve);
|
||||
|
||||
void setPenColor(QColor color);
|
||||
|
||||
signals:
|
||||
void liveChanged();
|
||||
|
||||
|
@ -23,10 +26,14 @@ protected:
|
|||
void mousePressEvent(QMouseEvent* event);
|
||||
void mouseMoveEvent(QMouseEvent* event);
|
||||
void mouseReleaseEvent(QMouseEvent* event);
|
||||
void mouseDoubleClickEvent(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
int getPointAt(int x, int y);
|
||||
|
||||
Curve* _curve;
|
||||
int _dragged;
|
||||
QColor _pen;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -37,22 +37,55 @@
|
|||
<context>
|
||||
<name>DialogColorGradation</name>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="55"/>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="36"/>
|
||||
<source>This is the curve editor for color components.
|
||||
Click on a component preview below to edit it.
|
||||
Click on points and drag them to move them.
|
||||
Double click to add a new point.
|
||||
Right click on a point to delete it.</source>
|
||||
<translation>Ceci est l'éditeur de courbes pour les couleurs.
|
||||
Cliquez sur une des couleurs ci-dessous pour l'éditer.
|
||||
Cliquez sur les points pour les déplacer.
|
||||
Double cliquez sur le fond pour ajouter un point.
|
||||
Cliquez avec le bouton droit sur un point pour le supprimer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="41"/>
|
||||
<source>Red preview, click to edit</source>
|
||||
<translation>Aperçu du rouge, cliquer pour éditer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="47"/>
|
||||
<source>Green preview, click to edit</source>
|
||||
<translation>Aperçu du vert, cliquer pour éditer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="53"/>
|
||||
<source>Blue preview, click to edit</source>
|
||||
<translation>Aperçu du bleu, cliquez pour éditer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="59"/>
|
||||
<source>Final preview</source>
|
||||
<translation>Aperçu du gradient final</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="68"/>
|
||||
<source>Validate</source>
|
||||
<translation>Valider</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="59"/>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="72"/>
|
||||
<source>Revert</source>
|
||||
<translation>Recommencer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="63"/>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="76"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Annuler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="69"/>
|
||||
<location filename="../gui_qt/dialogcolorgradation.cpp" line="82"/>
|
||||
<source>Paysages 3D - Color gradation editor</source>
|
||||
<translation>Paysages 3D - Editeur de gradients de couleur</translation>
|
||||
</message>
|
||||
|
@ -143,7 +176,7 @@
|
|||
<message>
|
||||
<location filename="../gui_qt/dialogwanderer.cpp" line="30"/>
|
||||
<source>Validate as render camera</source>
|
||||
<translation>Valider comme caméra de rendu</translation>
|
||||
<translation>Choisir comme caméra de rendu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui_qt/dialogwanderer.cpp" line="35"/>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "curve.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "tools.h"
|
||||
|
||||
#define MAX_NB_POINTS 40
|
||||
|
@ -104,6 +105,18 @@ void curveSetPoint(Curve* curve, int number, CurvePoint* point)
|
|||
}
|
||||
}
|
||||
|
||||
void curveRemovePoint(Curve* curve, int number)
|
||||
{
|
||||
if (number >= 0 && number < curve->nbpoints)
|
||||
{
|
||||
if (curve->nbpoints > 0 && number < curve->nbpoints - 1)
|
||||
{
|
||||
memmove(curve->points + number, curve->points + number + 1, sizeof(CurvePoint) * (curve->nbpoints - number - 1));
|
||||
}
|
||||
curve->nbpoints--;
|
||||
}
|
||||
}
|
||||
|
||||
int _point_compare(const void* part1, const void* part2)
|
||||
{
|
||||
if (((CurvePoint*)part1)->position > ((CurvePoint*)part2)->position)
|
||||
|
|
|
@ -26,6 +26,7 @@ int curveQuickAddPoint(Curve* curve, double position, double value);
|
|||
int curveGetPointCount(Curve* curve);
|
||||
void curveGetPoint(Curve* curve, int number, CurvePoint* point);
|
||||
void curveSetPoint(Curve* curve, int number, CurvePoint* point);
|
||||
void curveRemovePoint(Curve* curve, int number);
|
||||
void curveValidate(Curve* curve);
|
||||
|
||||
double curveGetValue(Curve* curve, double position);
|
||||
|
|
Loading…
Reference in a new issue