widgets/colorbutton.cpp

Sat, 08 Apr 2023 15:08:19 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Sat, 08 Apr 2023 15:08:19 +0300
changeset 346
3e3784c4cd3e
parent 345
81cd5dee6d77
child 347
5c655cc006de
permissions
-rw-r--r--

Change color edit coloring to use only stylesheets to colorise the line edit only

#include <QColorDialog>
#include <QHBoxLayout>
#include "widgets/colorbutton.h"

ColorButton::ColorButton(const QColor& color, QWidget* parent) :
	ColorButton{parent}
{
	this->setColor(color);
}

ColorButton::ColorButton(QWidget* parent) :
	QWidget{parent},
	lineEdit{new QLineEdit{this}},
	button{new QPushButton{"…", this}}
{
	auto*const layout = new QHBoxLayout{};
	layout->addWidget(this->lineEdit);
	layout->addWidget(this->button);
	layout->setStretch(0, 1);
	layout->setStretch(1, 0);
	this->setLayout(layout);
	connect(this->button, &QPushButton::clicked, [&](){
		const QColor color = QColorDialog::getColor(this->color(), this->parentWidget());
		if (color.isValid()) {
			this->setColor(color);
		}
	});
	connect(this->lineEdit, &QLineEdit::textChanged, [&]{
		const QColor color = this->color();
		const qreal lightness = color.lightnessF();
		const QColor foreground = lightness < 0.4 ? Qt::white : Qt::black;
		this->setStyleSheet(
			QStringLiteral("QLineEdit{background-color: %1; color: %2;}")
				.arg(color.name())
				.arg(foreground.name()));
		Q_EMIT this->colorChanged(this->color());
	});
	this->setColor(Qt::black);
}

QColor ColorButton::color() const
{
	return QColor{this->lineEdit->text()};
}

void ColorButton::setColor(const QColor& color)
{
	if (color.isValid() and this->color() != color) {
		this->lineEdit->setText(color.name());
	}
}

mercurial