/**
* \file
*
* \author Mattia Basaglia
*
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
#ifndef COLOR_WHEEL_HPP
#define COLOR_WHEEL_HPP
#include
#include "colorwidgets_global.hpp"
namespace color_widgets {
/**
* \brief Display an analog widget that allows the selection of a HSV color
*
* It has an outer wheel to select the Hue and an intenal square to select
* Saturation and Lightness.
*/
class QCP_EXPORT ColorWheel : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged DESIGNABLE true STORED false )
Q_PROPERTY(qreal hue READ hue WRITE setHue DESIGNABLE false )
Q_PROPERTY(qreal saturation READ saturation WRITE setSaturation DESIGNABLE false )
Q_PROPERTY(qreal value READ value WRITE setValue DESIGNABLE false )
Q_PROPERTY(unsigned wheelWidth READ wheelWidth WRITE setWheelWidth NOTIFY wheelWidthChanged DESIGNABLE true )
Q_PROPERTY(ShapeEnum selectorShape READ selectorShape WRITE setSelectorShape NOTIFY selectorShapeChanged DESIGNABLE true )
Q_PROPERTY(bool rotatingSelector READ rotatingSelector WRITE setRotatingSelector NOTIFY rotatingSelectorChanged DESIGNABLE true )
Q_PROPERTY(ColorSpaceEnum colorSpace READ colorSpace WRITE setColorSpace NOTIFY colorSpaceChanged DESIGNABLE true )
public:
enum ShapeEnum
{
ShapeTriangle, ///< A triangle
ShapeSquare, ///< A square
};
enum AngleEnum
{
AngleFixed, ///< The inner part doesn't rotate
AngleRotating, ///< The inner part follows the hue selector
};
enum ColorSpaceEnum
{
ColorHSV, ///< Use the HSV color space
ColorHSL, ///< Use the HSL color space
ColorLCH, ///< Use Luma Chroma Hue (Y_601')
};
Q_ENUM(ShapeEnum);
Q_ENUM(AngleEnum);
Q_ENUM(ColorSpaceEnum);
explicit ColorWheel(QWidget *parent = 0);
~ColorWheel();
/// Get current color
QColor color() const;
virtual QSize sizeHint() const Q_DECL_OVERRIDE;
/// Get current hue in the range [0-1]
qreal hue() const;
/// Get current saturation in the range [0-1]
qreal saturation() const;
/// Get current value in the range [0-1]
qreal value() const;
/// Get the width in pixels of the outer wheel
unsigned int wheelWidth() const;
/// Set the width in pixels of the outer wheel
void setWheelWidth(unsigned int w);
/// Shape of the internal selector
ShapeEnum selectorShape() const;
/// Whether the internal selector should rotare in accordance with the hue
bool rotatingSelector() const;
/// Color space used to preview/edit the color
ColorSpaceEnum colorSpace() const;
public Q_SLOTS:
/// Set current color
void setColor(QColor c);
/**
* @param h Hue [0-1]
*/
void setHue(qreal h);
/**
* @param s Saturation [0-1]
*/
void setSaturation(qreal s);
/**
* @param v Value [0-1]
*/
void setValue(qreal v);
/// Sets the shape of the internal selector
void setSelectorShape(ShapeEnum shape);
/// Sets whether the internal selector should rotare in accordance with the hue
void setRotatingSelector(bool rotating);
/// Sets the color space used to preview/edit the color
void setColorSpace(ColorSpaceEnum space);
Q_SIGNALS:
/**
* Emitted when the user selects a color or setColor is called
*/
void colorChanged(QColor);
/**
* Emitted when the user selects a color
*/
void colorSelected(QColor);
void wheelWidthChanged(unsigned);
void selectorShapeChanged(ShapeEnum shape);
void rotatingSelectorChanged(bool rotating);
void colorSpaceChanged(ColorSpaceEnum space);
/**
* Emitted when the user releases from dragging
*/
void editingFinished();
protected:
void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE;
void dragEnterEvent(QDragEnterEvent* event) Q_DECL_OVERRIDE;
void dropEvent(QDropEvent* event) Q_DECL_OVERRIDE;
protected:
class Private;
ColorWheel(QWidget *parent, Private* data);
Private* data() const { return p; }
private:
Private * const p;
};
} // namespace color_widgets
#endif // COLOR_WHEEL_HPP