Files

173 lines
3.9 KiB
C++
Raw Permalink Normal View History

2026-05-24 23:21:33 +02:00
#include "colorlabel.h"
#include <QPainter>
#include <QDebug>
#include <QApplication>
#include <QImage>
#include <cmath>
//#include "utils/baseutils.h"
const QSize COLOR_TIPS_SIZE = QSize(50, 50);
ColorLabel::ColorLabel(QWidget *parent)
: QLabel(parent)
, m_picking(true)
, m_pressed(false)
, m_tipPoint(this->rect().center())
, m_workToPick(false)
{
setMouseTracking(true);
connect(this, &ColorLabel::clicked, this, [=]{
if (m_picking && m_workToPick)
{
qDebug() << "clickedPos:" << m_clickedPos;
pickColor(m_clickedPos, true);
}
});
}
//h∈(0, 360), s∈(0, 1), v∈(0, 1)
QColor ColorLabel::getColor(qreal h, qreal s, qreal v)
{
int hi = int(h/60)%6;
qreal f = h/60 - hi;
qreal p = v*(1 - s);
qreal q = v*(1 - f*s);
qreal t = v*(1 - (1 - f)*s);
if (hi == 0)
{
return QColor(std::min(int(255*v), 255), std::min(int(255*t), 255), std::min(int(255*p), 255));
} else if (hi == 1)
{
return QColor(std::min(int(255*q), 255), std::min(int(255*v), 255), std::min(int(255*p), 255));
} else if(hi == 2)
{
return QColor(std::min(int(255*p), 255), std::min(int(255*v), 255), std::min(int(255*t), 255));
} else if (hi == 3)
{
return QColor(std::min(int(255*p), 255), std::min(int(255*q), 255), std::min(int(255*v), 255));
} else if(hi == 4)
{
return QColor(std::min(int(255*t), 255), std::min(int(255*p), 255), std::min(int(255*v), 255));
} else
{
return QColor(std::min(int(255*v), 255), std::min(int(255*p), 255), int(255*q));
}
}
void ColorLabel::setHue(int hue)
{
m_hue = hue;
update();
}
void ColorLabel::pickColor(QPoint pos, bool picked)
{
QPixmap pickPixmap;
pickPixmap = this->grab(QRect(0, 0, this->width(), this->height()));
QImage pickImg = pickPixmap.toImage();
if (!pickImg.isNull())
{
QRgb pickRgb = pickImg.pixel(pos);
m_pickedColor = QColor(qRed(pickRgb), qGreen(pickRgb), qBlue(pickRgb));
} else
{
m_pickedColor = QColor(0, 0, 0);
}
if (picked)
emit pickedColor(m_pickedColor);
}
QColor ColorLabel::getPickedColor()
{
return m_pickedColor;
}
void ColorLabel::setPickColor(bool picked)
{
m_workToPick = picked;
}
void ColorLabel::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
QImage backgroundImage(this->width(), this->height(), QImage::Format_ARGB32);
for(qreal s = 0; s < this->width(); s++)
{
for(qreal v = 0; v < this->height(); v++)
{
QColor penColor = getColor(m_hue, s/this->width(), v/this->height());
backgroundImage.setPixelColor(int(s), this->height() - 1 - int(v), penColor);
}
}
painter.drawImage(this->rect(), backgroundImage);
}
void ColorLabel::enterEvent(QEvent *e)
{
if (!m_workToPick)
return;
m_lastCursor = this->cursor();
//qApp->setOverrideCursor(pickColorCursor());
QLabel::enterEvent(e);
}
void ColorLabel::leaveEvent(QEvent *e)
{
if (!m_workToPick)
return;
qApp->setOverrideCursor(m_lastCursor);
QLabel::leaveEvent(e);
}
void ColorLabel::mousePressEvent(QMouseEvent *e)
{
if (!m_workToPick)
return ;
m_pressed = true;
m_tipPoint = this->mapFromGlobal(cursor().pos());
pickColor(m_tipPoint, true);
QLabel::mousePressEvent(e);
}
void ColorLabel::mouseMoveEvent(QMouseEvent *e)
{
if (!m_workToPick)
return;
if (m_pressed)
{
m_tipPoint = this->mapFromGlobal(cursor().pos());
pickColor(m_tipPoint, true);
}
update();
QLabel::mouseMoveEvent(e);
}
void ColorLabel::mouseReleaseEvent(QMouseEvent *e)
{
if (m_pressed)
{
m_clickedPos = e->pos();
emit clicked();
}
m_pressed = false;
QLabel::mouseReleaseEvent(e);
}
ColorLabel::~ColorLabel()
{
}