/**
* \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_WIDGETS_SWATCH_HPP
#define COLOR_WIDGETS_SWATCH_HPP
#include
#include
#include "color_palette.hpp"
namespace color_widgets {
/**
* \brief A widget drawing a palette
*/
class QCP_EXPORT Swatch : public QWidget
{
Q_OBJECT
/**
* \brief Palette shown by the widget
*/
Q_PROPERTY(const ColorPalette& palette READ palette WRITE setPalette NOTIFY paletteChanged)
/**
* \brief Currently selected color (-1 if no color is selected)
*/
Q_PROPERTY(int selected READ selected WRITE setSelected NOTIFY selectedChanged)
/**
* \brief Preferred size for a color square
*/
Q_PROPERTY(QSize colorSize READ colorSize WRITE setColorSize NOTIFY colorSizeChanged)
Q_PROPERTY(ColorSizePolicy colorSizePolicy READ colorSizePolicy WRITE setColorSizePolicy NOTIFY colorSizePolicyChanged)
/**
* \brief Border around the colors
*/
Q_PROPERTY(QPen border READ border WRITE setBorder NOTIFY borderChanged)
/**
* \brief Forces the Swatch to display that many rows of colors
*
* If there are too few elements, the widget will display less than this
* many rows.
*
* A value of0 means that the number of rows is automatic.
*
* \note Conflicts with forcedColumns
*/
Q_PROPERTY(int forcedRows READ forcedRows WRITE setForcedRows NOTIFY forcedRowsChanged)
/**
* \brief Forces the Swatch to display that many columns of colors
*
* If there are too few elements, the widget will display less than this
* many columns.
*
* A value of 0 means that the number of columns is automatic.
*
* \note Conflicts with forcedRows
*/
Q_PROPERTY(int forcedColumns READ forcedColumns WRITE setForcedColumns NOTIFY forcedColumnsChanged)
/**
* \brief Whether the palette can be modified via user interaction
* \note Even when this is \b false, it can still be altered programmatically
*/
Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly NOTIFY readOnlyChanged)
/**
* \brief Maximum size a color square can have
*/
Q_PROPERTY(QSize maxColorSize READ maxColorSize WRITE setMaxColorSize NOTIFY maxColorSizeChanged)
/**
* \brief Whether to show an extra color to perform a "clear" operation.
*
* Clicking on this extra pseudo-color will emit signals like clicked() etc with an index of -1.
*/
Q_PROPERTY(bool showClearColor READ showClearColor WRITE setShowClearColor NOTIFY showClearColorChanged)
public:
enum ColorSizePolicy
{
Hint, ///< The size is just a hint
Minimum, ///< Can expand but not contract
Fixed ///< Must be exactly as specified
};
Q_ENUMS(ColorSizePolicy)
Swatch(QWidget* parent = 0);
~Swatch();
QSize sizeHint() const Q_DECL_OVERRIDE;
QSize minimumSizeHint() const Q_DECL_OVERRIDE;
const ColorPalette& palette() const;
ColorPalette& palette();
int selected() const;
/**
* \brief Color at the currently selected index
*/
QColor selectedColor() const;
/**
* \brief Color index at the given position within the widget
* \param p Point in local coordinates
* \returns -1 if the position doesn't represent any color
*/
int indexAt(const QPoint& p);
/**
* \brief Color at the given position within the widget
* \param p Point in local coordinates
*/
QColor colorAt(const QPoint& p);
QSize colorSize() const;
QSize maxColorSize() const;
ColorSizePolicy colorSizePolicy() const;
QPen border() const;
int forcedRows() const;
int forcedColumns() const;
bool readOnly() const;
bool showClearColor() const;
public Q_SLOTS:
void setPalette(const ColorPalette& palette);
void setSelected(int selected);
void clearSelection();
void setColorSize(const QSize& colorSize);
void setMaxColorSize(const QSize& colorSize);
void setColorSizePolicy(ColorSizePolicy colorSizePolicy);
void setBorder(const QPen& border);
void setForcedRows(int forcedRows);
void setForcedColumns(int forcedColumns);
void setReadOnly(bool readOnly);
/**
* \brief Remove the currently seleceted color
**/
void removeSelected();
void setShowClearColor(bool show);
Q_SIGNALS:
void paletteChanged(const ColorPalette& palette);
void selectedChanged(int selected);
void colorSelected(const QColor& color);
void colorSizeChanged(const QSize& colorSize);
void maxColorSizeChanged(const QSize& colorSize);
void colorSizePolicyChanged(ColorSizePolicy colorSizePolicy);
void doubleClicked(int index, Qt::KeyboardModifiers modifiers);
void rightClicked(int index, Qt::KeyboardModifiers modifiers);
void clicked(int index, Qt::KeyboardModifiers modifiers);
void forcedRowsChanged(int forcedRows);
void forcedColumnsChanged(int forcedColumns);
void readOnlyChanged(bool readOnly);
void borderChanged(const QPen& border);
void showClearColorChanged(bool show);
protected:
bool event(QEvent* event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;
void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void wheelEvent(QWheelEvent* event) Q_DECL_OVERRIDE;
void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;
void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE;
void dragLeaveEvent(QDragLeaveEvent *event) Q_DECL_OVERRIDE;
void dropEvent(QDropEvent* event) Q_DECL_OVERRIDE;
protected Q_SLOTS:
/**
* \brief Connected to the internal palette object to keep eveything consistent
*/
void paletteModified();
private:
class Private;
Private* p;
};
} // namespace color_widgets
#endif // COLOR_WIDGETS_SWATCH_HPP