widgets/colorbutton.cpp

changeset 344
a24da8de2a3b
parent 264
76a025db4948
child 345
81cd5dee6d77
--- a/widgets/colorbutton.cpp	Sat Apr 08 12:55:11 2023 +0300
+++ b/widgets/colorbutton.cpp	Sat Apr 08 15:03:54 2023 +0300
@@ -1,5 +1,6 @@
 #include <QColorDialog>
 #include <QStyleFactory>
+#include <QHBoxLayout>
 #include "widgets/colorbutton.h"
 
 ColorButton::ColorButton(const QColor& color, QWidget* parent) :
@@ -9,33 +10,52 @@
 }
 
 ColorButton::ColorButton(QWidget* parent) :
-	QPushButton{parent}
+	QWidget{parent},
+	lineEdit{new QLineEdit{this}},
+	button{new QPushButton{"…", this}}
 {
-	connect(this, &QPushButton::clicked, [&](){
-		const QColor color = QColorDialog::getColor(this->storedSelectedColor, this->parentWidget());
+	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();
+		QPalette palette{color};
+		const qreal lightness = color.lightnessF();
+		const QColor foreground = lightness < 0.4 ? Qt::white : Qt::black;
+		const auto style = QStyleFactory::create("Fusion");
+		this->setStyle(style);
+		this->setStyleSheet(QStringLiteral(
+			"*{background-color: %1; color: %2;}"
+		).arg(color.name()).arg(foreground.name()));
+		/*
+		palette.setColor(QPalette::ButtonText, foreground);
+		for (QWidget* widget : {(QWidget*)this->lineEdit, (QWidget*)this->button}) {
+			widget->setPalette(palette);
+			widget->setStyle(style);
+		}
+		*/
+		Q_EMIT this->colorChanged(this->color());
+	});
 	this->setColor(Qt::black);
 }
 
-const QColor& ColorButton::color() const
+QColor ColorButton::color() const
 {
-	return this->storedSelectedColor;
+	return QColor{this->lineEdit->text()};
 }
 
 void ColorButton::setColor(const QColor& color)
 {
-	if (this->storedSelectedColor != color) {
-		this->storedSelectedColor = color;
-		this->setText(color.name());
-		QPalette palette{color};
-		const qreal lightness = color.lightnessF();
-		const QColor foreground = lightness < 0.4 ? Qt::white : Qt::black;
-		palette.setColor(QPalette::ButtonText, foreground);
-		this->setPalette(palette);
-		this->setStyle(QStyleFactory::create("Fusion"));
-		Q_EMIT this->colorChanged(this->storedSelectedColor);
+	if (color.isValid() and this->color() != color) {
+		this->lineEdit->setText(color.name());
 	}
 }

mercurial