11 #include <QColorDialog>
12 #include <QHBoxLayout>
13 #include <QMouseEvent>
15 #include <QVBoxLayout>
33 Qt::Orientation orientation )
37 m_orientation(orientation) {
47 QPainter painter(
this);
69 painter.drawRect(box);
70 painter.drawPolygon(pointyHead, Qt::OddEvenFill);
92 back()->setParent(
nullptr);
99 if (i < 0 || i >=
size()) {
106 slider->setParent(
nullptr);
111 QList<ColorScaleElementSlider*>::removeAt(i);
115 for (
int i = 0; i <
size(); ++i)
116 if (
at(i)->isSelected())
return i;
122 for (
int i = 0; i <
size(); ++i)
123 if (
at(i) == slider)
return i;
134 Qt::Orientation orientation )
136 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
137 setContentsMargins(0, 0, 0, 0);
142 if (e->button() == Qt::LeftButton) {
143 QRect contentRect = contentsRect();
149 if (contentRect.contains(e->pos(),
true)) {
150 double relativePos = -1.0;
153 static_cast<double>(e->pos().x() - contentRect.left()) /
157 static_cast<double>(e->pos().y() - contentRect.top()) /
158 contentRect.height();
172 QPainter painter(
this);
175 QRect contentRect = contentsRect();
181 assert(
m_sliders->front()->getRelativePos() == 0.0 &&
182 m_sliders->back()->getRelativePos() == 1.0);
186 QLinearGradient gradient;
188 gradient = QLinearGradient(contentRect.left(), 0,
189 contentRect.right(), 0);
191 gradient = QLinearGradient(0, contentRect.bottom(), 0,
196 for (
int i = 0; i <
m_sliders->size(); i++) {
197 gradient.setColorAt(
m_sliders->at(i)->getRelativePos(),
202 painter.fillRect(contentRect, gradient);
203 painter.drawRect(contentRect);
209 QPoint A = contentRect.topLeft();
210 QPoint B = contentRect.bottomRight();
212 for (
int i = 0; i <
m_sliders->size(); i++) {
213 double relativePos =
m_sliders->at(i)->getRelativePos();
217 static_cast<int>(relativePos * contentRect.width());
221 int pos = contentRect.top() +
222 static_cast<int>(relativePos *
223 contentRect.height());
228 painter.drawLine(A, B);
233 QWidget::paintEvent(e);
242 Qt::Orientation orientation )
244 setContentsMargins(0, 0, 0, 0);
246 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
249 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
258 int activeSliderIndex =
m_sliders->selected();
260 if (index == activeSliderIndex)
264 if (activeSliderIndex >= 0)
265 m_sliders->at(activeSliderIndex)->setSelected(
false);
268 if (index >= 0)
m_sliders->at(index)->setSelected(
true);
283 int pos =
static_cast<int>(
length() * relativePos);
287 slider->move(pos, 0);
290 slider->move(0, pos);
292 slider->setVisible(
true);
302 int rectLength =
length();
304 for (ColorScaleElementSliders::iterator it =
m_sliders->begin();
307 int pos =
static_cast<int>(slider->
getRelativePos() * rectLength);
311 slider->move(pos, 0);
314 slider->move(0, pos);
328 slider->move(pos, 0);
331 slider->move(0, pos);
336 if (e->button() == Qt::LeftButton) {
339 for (
int i = 0; i <
m_sliders->size(); i++) {
341 if (
rect.contains(e->pos(),
true)) {
353 int pos = (
m_orientation == Qt::Horizontal ? e->pos().x() : e->pos().y());
355 static_cast<double>(
length());
357 if (relativePos > 0.0 && relativePos < 1.0) {
358 int activeSliderIndex =
m_sliders->selected();
360 if (activeSliderIndex > 0 &&
361 activeSliderIndex + 1 <
368 slider->move(pos - slider->width() / 2, 0);
370 slider->move(0, pos - slider->height() / 2);
390 if (e->button() == Qt::LeftButton) {
391 for (
int i = 0; i <
m_sliders->size(); i++) {
393 if (
rect.contains(e->pos(),
true)) {
400 QColor newColor = QColorDialog::getColor(
402 if (newColor.isValid() && newColor != slider->
getColor()) {
420 Qt::Orientation orientation )
422 m_textColor(Qt::
black),
424 setContentsMargins(0, 0, 0, 0);
429 QPainter painter(
this);
431 QFont font = painter.font();
432 font.setPixelSize(8);
433 painter.setFont(font);
438 QFontMetrics fm(font);
444 setMinimumSize(0, labelHeight);
446 for (
int i = 0; i <
m_sliders->size(); i++) {
449 double val =
m_sliders->at(i)->getRelativePos();
450 QString label = QString(
"%1 %").arg(
456 int labelWidth = fm.horizontalAdvance(label);
458 if (pos + labelWidth >
width())
459 pos -= (labelWidth -
m_sliders->at(i)->width());
461 painter.drawText(pos, labelHeight, label);
466 QString firstLabel = QString::number(
468 QString lastLabel = QString::number(
472 int labelWidth =
std::max(fm.horizontalAdvance(firstLabel),
473 fm.horizontalAdvance(lastLabel)) +
475 setMinimumSize(labelWidth, 0);
478 for (
int i = 0; i <
m_sliders->size(); i++) {
481 double val =
m_sliders->at(i)->getRelativePos();
482 QString label = QString(
"%1 %").arg(
488 pos +
m_sliders->at(i)->height(), label);
493 QWidget::paintEvent(e);
501 QWidget* parent , Qt::Orientation orientation )
508 setMinimumSize(40, 40);
509 setContentsMargins(0, 0, 0, 0);
513 ?
static_cast<QLayout*
>(
new QVBoxLayout())
514 :
static_cast<QLayout*
>(
new QHBoxLayout()));
515 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
516 layout()->setMargin(0);
518 layout()->setSpacing(0);
519 layout()->setContentsMargins(0, 0, 0, 0);
525 QSizePolicy::Expanding);
558 QSizePolicy::Expanding);
567 assert(relativePos >= 0.0 && relativePos <= 1.0);
575 for (
int i = 0; i <
m_sliders->size(); ++i) {
576 if (
fabs(
m_sliders->at(i)->getRelativePos() - relativePos) < maxDist) {
585 QLinearGradient gradient(0, 0, 256, 0);
587 for (
int i = 0; i <
m_sliders->size(); i++) {
588 gradient.setColorAt(
m_sliders->at(i)->getRelativePos(),
593 QPainter painter(&pix);
594 painter.fillRect(pix.rect(), gradient);
595 color = pix.toImage().pixel(
static_cast<int>(relativePos * 255), 0);
612 if (sliderIndex < 0) {
632 for (
int i = 0; i < sliders->size(); ++i)
634 sliders->at(i)->getColor());
649 assert(scale->stepCount() >= 2);
650 for (
int i = 0; i < scale->stepCount(); ++i) {
651 double relativePos = scale->step(i).getRelativePos();
652 const QColor&
color = scale->step(i).getColor();
662 if (!destScale)
return;
666 for (
int i = 0; i <
m_sliders->size(); ++i)
667 destScale->insert(*
m_sliders->at(i),
false);
710 if (index < 0)
return;
717 double relativePos) {
718 if (index < 0)
return;
720 m_sliders->at(index)->setRelativePos(relativePos);
723 if (index == 0 || index + 1 ==
m_sliders->size()) {
Color scale element as a widget.
Qt::Orientation m_orientation
Widget orientation.
static bool IsSmaller(const ColorScaleElementSlider *e1, const ColorScaleElementSlider *e2)
Comparison operator between two (pointers on) color scale elements.
void paintEvent(QPaintEvent *e) override
bool m_selected
Selection state.
bool isSelected() const
Returns selection state.
ColorScaleElementSlider(double relativePos=0.0, QColor color=Qt::black, QWidget *parent=nullptr, Qt::Orientation orientation=Qt::Horizontal)
Default constructor.
Set of color scale elements (widgets)
void addSlider(ColorScaleElementSlider *slider)
Adds a slider element and sort the whole set.
void clear()
Remove all sliders.
void removeAt(int i)
Remove a given slider.
int selected() const
Returns the currently selected slider index (or -1 if none)
int indexOf(ColorScaleElementSlider *slider)
Returns the index of a given slider.
void sort()
Sorts the set.
Color scale element: one value + one color.
const QColor & getColor() const
Returns color.
double getRelativePos() const
Returns step position (relative to scale boundaries)
void setRelativePos(double pos)
Sets associated value (relative to scale boundaries)
void setColor(QColor color)
Sets color.
QSharedPointer< ccColorScale > Shared
Shared pointer type.
__host__ __device__ float2 fabs(float2 v)
constexpr Rgb black(0, 0, 0)
constexpr Rgb white(MAX, MAX, MAX)
constexpr Rgb red(MAX, 0, 0)
constexpr Rgb blue(0, 0, MAX)