From decaf960368953264ed34a214f6a5b3f57730ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Sat, 31 Mar 2012 11:32:03 +0000 Subject: [PATCH] paysages: Color gradation editor with curves. git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@281 b1fd45b6-86a6-48da-8261-f70d1f35bdcc --- gui_qt/dialogcolorgradation.cpp | 36 +++++++--- gui_qt/dialogwanderer.cpp | 2 +- gui_qt/widgetcurveeditor.cpp | 119 ++++++++++++++++++++++---------- gui_qt/widgetcurveeditor.h | 7 ++ i18n/paysages_fr.ts | 43 ++++++++++-- lib_paysages/curve.c | 13 ++++ lib_paysages/curve.h | 1 + 7 files changed, 167 insertions(+), 54 deletions(-) diff --git a/gui_qt/dialogcolorgradation.cpp b/gui_qt/dialogcolorgradation.cpp index 7b5d965..c1b443f 100644 --- a/gui_qt/dialogcolorgradation.cpp +++ b/gui_qt/dialogcolorgradation.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -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; } diff --git a/gui_qt/dialogwanderer.cpp b/gui_qt/dialogwanderer.cpp index 74c6b43..9b66180 100644 --- a/gui_qt/dialogwanderer.cpp +++ b/gui_qt/dialogwanderer.cpp @@ -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); diff --git a/gui_qt/widgetcurveeditor.cpp b/gui_qt/widgetcurveeditor.cpp index 8693295..31b1242 100644 --- a/gui_qt/widgetcurveeditor.cpp +++ b/gui_qt/widgetcurveeditor.cpp @@ -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; + } +} diff --git a/gui_qt/widgetcurveeditor.h b/gui_qt/widgetcurveeditor.h index 8844510..34724a6 100644 --- a/gui_qt/widgetcurveeditor.h +++ b/gui_qt/widgetcurveeditor.h @@ -2,6 +2,7 @@ #define _PAYSAGES_QT_WIDGETCURVEEDITOR_H_ #include +#include #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 diff --git a/i18n/paysages_fr.ts b/i18n/paysages_fr.ts index 96b01b6..b10e705 100644 --- a/i18n/paysages_fr.ts +++ b/i18n/paysages_fr.ts @@ -37,22 +37,55 @@ DialogColorGradation - + + 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. + 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. + + + + Red preview, click to edit + Aperçu du rouge, cliquer pour éditer + + + + Green preview, click to edit + Aperçu du vert, cliquer pour éditer + + + + Blue preview, click to edit + Aperçu du bleu, cliquez pour éditer + + + + Final preview + Aperçu du gradient final + + + Validate Valider - + Revert Recommencer - + Cancel Annuler - + Paysages 3D - Color gradation editor Paysages 3D - Editeur de gradients de couleur @@ -143,7 +176,7 @@ Validate as render camera - Valider comme caméra de rendu + Choisir comme caméra de rendu diff --git a/lib_paysages/curve.c b/lib_paysages/curve.c index b3c19ce..fd25197 100644 --- a/lib_paysages/curve.c +++ b/lib_paysages/curve.c @@ -1,6 +1,7 @@ #include "curve.h" #include +#include #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) diff --git a/lib_paysages/curve.h b/lib_paysages/curve.h index fb89786..c4836fc 100644 --- a/lib_paysages/curve.h +++ b/lib_paysages/curve.h @@ -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);