From 9a05c1a8bbac90146698f8eb46be34f18b1d247c Mon Sep 17 00:00:00 2001 From: parker Date: Fri, 18 Jul 2025 04:41:47 +0100 Subject: [PATCH] feat(parameter): add clamp --- src/Engine/Types.h | 2 + src/Gui/Parameters/AbstractSliderParm.cpp | 52 +++++++++++++++++++---- src/Gui/Parameters/AbstractSliderParm.h | 16 +++++-- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/Engine/Types.h b/src/Engine/Types.h index 84ff885..ac835b8 100644 --- a/src/Engine/Types.h +++ b/src/Engine/Types.h @@ -26,6 +26,8 @@ namespace enzo // basic types types namespace bt { + using floatT = double; + using intT = int64_t; using Vector3 = Eigen::Vector3d; using Vector4 = Eigen::Vector4d; } diff --git a/src/Gui/Parameters/AbstractSliderParm.cpp b/src/Gui/Parameters/AbstractSliderParm.cpp index 90ccc0b..d839615 100644 --- a/src/Gui/Parameters/AbstractSliderParm.cpp +++ b/src/Gui/Parameters/AbstractSliderParm.cpp @@ -1,37 +1,73 @@ #include "Gui/Parameters/AbstractSliderParm.h" +#include "Engine/Types.h" #include #include +#include #include +#include +#include +#include +#include enzo::ui::AbstractSliderParm::AbstractSliderParm(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { - setFixedHeight(20); + setFixedHeight(24); value_ = defaultValue_; + + mainLayout_ = new QVBoxLayout(); + setLayout(mainLayout_); + valueLabel_ = new QLabel(); + valueLabel_->setAlignment(Qt::AlignCenter); + valueLabel_->setStyleSheet("background-color: transparent;"); + setStyleSheet("border-radius: 6px;"); + mainLayout_->addWidget(valueLabel_); + + setValue(value_); } void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); - painter.setPen(Qt::black); - painter.setBrush(Qt::red); + painter.setPen(Qt::NoPen); + painter.setBrush(QColor("#383838")); QRectF fillRect = event->rect(); float fillPercent = value_/maxValue_; std::cout << "fill percent" << fillPercent << "\n"; - fillRect.adjust(0, 0, -fillRect.width()*(1-fillPercent), 0); - painter.drawRoundedRect(fillRect, 8, 8); + float margin = 3; + fillRect.adjust(margin, margin, std::max(-fillRect.width()+margin, -fillRect.width()*(1-fillPercent)-margin), -margin); + painter.drawRoundedRect(fillRect, 6, 6); + +} + +void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) +{ + if(value_==value) + return; + + if(clampMin_ && valuemaxValue_) { value = maxValue_; } + + value_ = value; + update(); + QString valStr = QString::number(value); + valStr.truncate(4); + valueLabel_->setText(valStr); } void enzo::ui::AbstractSliderParm::mouseMoveEvent(QMouseEvent *event) { - value_ = static_cast(event->pos().x())/rect().width() * maxValue_; - update(); - // std::cout << "pos x: " << fillPercent << "\n"; + setValue(static_cast(event->pos().x())/rect().width() * maxValue_); +} + +void enzo::ui::AbstractSliderParm::mousePressEvent(QMouseEvent *event) +{ + setValue(static_cast(event->pos().x())/rect().width() * maxValue_); } diff --git a/src/Gui/Parameters/AbstractSliderParm.h b/src/Gui/Parameters/AbstractSliderParm.h index c1418fe..df18579 100644 --- a/src/Gui/Parameters/AbstractSliderParm.h +++ b/src/Gui/Parameters/AbstractSliderParm.h @@ -1,5 +1,8 @@ #pragma once +#include "Engine/Types.h" #include +#include +#include namespace enzo::ui { @@ -11,14 +14,21 @@ public: AbstractSliderParm(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); private: - float value_; + void setValue(bt::floatT value); + + QVBoxLayout* mainLayout_; + QLabel* valueLabel_; + bt::floatT value_; float defaultValue_=0; - float minValue_; - float maxValue_=10; + bool clampMin_ = true; + bool clampMax_ = true; + bt::floatT minValue_=-5; + bt::floatT maxValue_=10; protected: void paintEvent(QPaintEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; +void mousePressEvent(QMouseEvent *event) override; };