diff --git a/CMakeLists.txt b/CMakeLists.txt index f151d34..fb6d7f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,9 +51,9 @@ set(GUI_SOURCES src/Gui/Network/NodeIconGraphic.cpp src/Gui/Network/TabMenu.cpp src/Gui/ParametersPanel/ParametersPanel.cpp - src/Gui/Parameters/AbstractSliderParm.cpp - src/Gui/Parameters/AbstractFormParm.cpp - src/Gui/Parameters/FloatParm.cpp + src/Gui/Parameters/FloatSliderParm.cpp + src/Gui/Parameters/IntSliderParm.cpp + src/Gui/Parameters/FormParm.cpp src/Gui/Parameters/StringParm.cpp ) set(ENGINE_INCLUDE_DIRECTORIES diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 6a34501..5fd69ec 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -9,18 +9,18 @@ enzo::prm::Parameter::Parameter(Template prmTemplate) : template_{prmTemplate} { - floatValues_ = std::vector(); - floatValues_.reserve(prmTemplate.getSize()); - - stringValues_ = std::vector(prmTemplate.getSize(), prmTemplate.getDefault().getString()); - stringValues_.reserve(prmTemplate.getSize()); - const unsigned int templateSize = prmTemplate.getSize(); const unsigned int numDefaults = prmTemplate.getNumDefaults(); + floatValues_.reserve(templateSize); + stringValues_.reserve(templateSize); + intValues_.reserve(templateSize); + + if(numDefaults==1) { floatValues_ = std::vector(templateSize, prmTemplate.getDefault().getFloat()); + intValues_ = std::vector(templateSize, prmTemplate.getDefault().getInt()); stringValues_ = std::vector(templateSize, prmTemplate.getDefault().getString()); } @@ -33,6 +33,7 @@ enzo::prm::Parameter::Parameter(Template prmTemplate) } floatValues_.push_back(prmDefault.getFloat()); stringValues_.push_back(prmDefault.getString()); + intValues_.push_back(prmDefault.getInt()); } @@ -51,6 +52,13 @@ enzo::bt::floatT enzo::prm::Parameter::evalFloat(unsigned int index) const return floatValues_[index]; } +enzo::bt::intT enzo::prm::Parameter::evalInt(unsigned int index) const +{ + if(index >= intValues_.size()) + throw std::out_of_range("Cannot access index: " + std::to_string(index) + " for parameter: " + getName()); + return intValues_[index]; +} + enzo::bt::String enzo::prm::Parameter::evalString(unsigned int index) const { if(index >= stringValues_.size()) @@ -66,6 +74,14 @@ enzo::prm::Type enzo::prm::Parameter::getType() const } +void enzo::prm::Parameter::setInt(bt::intT value, unsigned int index) +{ + if(index >= intValues_.size()) + throw std::out_of_range("Cannot access index: " + std::to_string(index) + " for parameter: " + getName()); + intValues_[index] = value; + valueChanged(); +} + void enzo::prm::Parameter::setFloat(bt::floatT value, unsigned int index) { if(index >= floatValues_.size()) diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h index ec25093..29b055d 100644 --- a/src/Engine/Parameter/Parameter.h +++ b/src/Engine/Parameter/Parameter.h @@ -14,7 +14,9 @@ public: bt::floatT evalFloat(unsigned int index=0) const; bt::String evalString(unsigned int index=0) const; + bt::intT evalInt(unsigned int index=0) const; + void setInt(bt::intT value, unsigned int index=0); void setFloat(bt::floatT value, unsigned int index=0); void setString(bt::String value, unsigned int index=0); @@ -23,6 +25,7 @@ private: Template template_; std::vector floatValues_; std::vector stringValues_; + std::vector intValues_; }; } diff --git a/src/Gui/Parameters/FloatParm.cpp b/src/Gui/Parameters/FloatParm.cpp deleted file mode 100644 index 476c7fa..0000000 --- a/src/Gui/Parameters/FloatParm.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "Gui/Parameters/FloatParm.h" - - diff --git a/src/Gui/Parameters/FloatParm.h b/src/Gui/Parameters/FloatParm.h deleted file mode 100644 index 64e513f..0000000 --- a/src/Gui/Parameters/FloatParm.h +++ /dev/null @@ -1,13 +0,0 @@ -#include "Gui/Parameters/AbstractSliderParm.h" - -namespace enzo::ui -{ - -class FloatParm -: public AbstractSliderParm -{ - using AbstractSliderParm = AbstractSliderParm; - -}; - -} diff --git a/src/Gui/Parameters/AbstractSliderParm.cpp b/src/Gui/Parameters/FloatSliderParm.cpp similarity index 55% rename from src/Gui/Parameters/AbstractSliderParm.cpp rename to src/Gui/Parameters/FloatSliderParm.cpp index 8405193..a039c89 100644 --- a/src/Gui/Parameters/AbstractSliderParm.cpp +++ b/src/Gui/Parameters/FloatSliderParm.cpp @@ -1,4 +1,4 @@ -#include "Gui/Parameters/AbstractSliderParm.h" +#include "Gui/Parameters/FloatSliderParm.h" #include "Engine/Types.h" #include #include @@ -10,7 +10,7 @@ #include -enzo::ui::AbstractSliderParm::AbstractSliderParm(bt::floatT value, QWidget *parent, Qt::WindowFlags f) +enzo::ui::FloatSliderParm::FloatSliderParm(bt::floatT value, QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { // tells qt to style the widget even though it's a Q_OBJECT @@ -37,23 +37,26 @@ enzo::ui::AbstractSliderParm::AbstractSliderParm(bt::floatT value, QWidget *pare setValueImpl(value); } -void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event) +void enzo::ui::FloatSliderParm::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(Qt::NoPen); painter.setBrush(QColor("#383838")); - QRectF fillRect = event->rect(); - float fillPercent = value_/maxValue_; - std::cout << "fill percent" << fillPercent << "\n"; - float margin = 3; - fillRect.adjust(margin, margin, std::max(-fillRect.width()+margin, -fillRect.width()*(1-fillPercent)-margin), -margin); + const int valueRange = maxValue_-minValue_; + float fillPercent = static_cast(value_-minValue_)/valueRange; + + constexpr float margin = 3; + float fillWidth = rect().width()-margin*2; + fillWidth *= fillPercent; + + QRectF fillRect = {rect().left()+margin, rect().top()+margin, fillWidth, rect().height()-margin*2}; painter.drawRoundedRect(fillRect, 6, 6); } -void enzo::ui::AbstractSliderParm::setValueImpl(bt::floatT value) +void enzo::ui::FloatSliderParm::setValueImpl(bt::floatT value) { if(clampMin_ && valuemaxValue_) { value = maxValue_; } @@ -66,7 +69,7 @@ void enzo::ui::AbstractSliderParm::setValueImpl(bt::floatT value) } -void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) +void enzo::ui::FloatSliderParm::setValue(bt::floatT value) { setValueImpl(value); @@ -76,13 +79,21 @@ void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) } -void enzo::ui::AbstractSliderParm::mouseMoveEvent(QMouseEvent *event) +void enzo::ui::FloatSliderParm::mouseMoveEvent(QMouseEvent *event) { - setValue(static_cast(event->pos().x())/rect().width() * maxValue_); + // normalized + float value = static_cast(event->pos().x())/rect().width(); + //remap + value = minValue_+(maxValue_-minValue_)*value; + setValue(value); } -void enzo::ui::AbstractSliderParm::mousePressEvent(QMouseEvent *event) +void enzo::ui::FloatSliderParm::mousePressEvent(QMouseEvent *event) { - setValue(static_cast(event->pos().x())/rect().width() * maxValue_); + // normalized + float value = static_cast(event->pos().x())/rect().width(); + //remap + value = minValue_+(maxValue_-minValue_)*value; + setValue(value); } diff --git a/src/Gui/Parameters/AbstractSliderParm.h b/src/Gui/Parameters/FloatSliderParm.h similarity index 83% rename from src/Gui/Parameters/AbstractSliderParm.h rename to src/Gui/Parameters/FloatSliderParm.h index 097c4b3..f6c9691 100644 --- a/src/Gui/Parameters/AbstractSliderParm.h +++ b/src/Gui/Parameters/FloatSliderParm.h @@ -7,12 +7,12 @@ namespace enzo::ui { -class AbstractSliderParm +class FloatSliderParm : public QWidget { Q_OBJECT public: - AbstractSliderParm(bt::floatT value, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + FloatSliderParm(bt::floatT value, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); void setValue(bt::floatT value); Q_SIGNALS: diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/FormParm.cpp similarity index 54% rename from src/Gui/Parameters/AbstractFormParm.cpp rename to src/Gui/Parameters/FormParm.cpp index dd16549..164a482 100644 --- a/src/Gui/Parameters/AbstractFormParm.cpp +++ b/src/Gui/Parameters/FormParm.cpp @@ -1,6 +1,7 @@ -#include "Gui/Parameters/AbstractFormParm.h" +#include "Gui/Parameters/FormParm.h" +#include "Gui/Parameters/IntSliderParm.h" #include "Engine/Types.h" -#include "Gui/Parameters/AbstractSliderParm.h" +#include "Gui/Parameters/FloatSliderParm.h" #include "Gui/Parameters/StringParm.h" #include #include @@ -9,7 +10,7 @@ #include -enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr parameter) +enzo::ui::FormParm::FormParm(std::weak_ptr parameter) : parameter_{parameter} { if(auto sharedParameter=parameter_.lock()) @@ -27,25 +28,31 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param { case prm::Type::FLOAT: { - AbstractSliderParm* slider; - slider = new AbstractSliderParm(sharedParameter->evalFloat()); + FloatSliderParm* slider = new FloatSliderParm(sharedParameter->evalFloat()); mainLayout_->addWidget(slider); - connect(slider, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);}); + connect(slider, &FloatSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);}); + break; + } + case prm::Type::INT: + { + IntSliderParm* slider = new IntSliderParm(sharedParameter->evalInt()); + mainLayout_->addWidget(slider); + connect(slider, &IntSliderParm::valueChanged, this, [this](bt::intT value){this->changeValue(value, 0);}); break; } case prm::Type::XYZ: { - AbstractSliderParm* slider1 = new AbstractSliderParm(sharedParameter->evalFloat(0)); - AbstractSliderParm* slider2 = new AbstractSliderParm(sharedParameter->evalFloat(1)); - AbstractSliderParm* slider3 = new AbstractSliderParm(sharedParameter->evalFloat(2)); + FloatSliderParm* slider1 = new FloatSliderParm(sharedParameter->evalFloat(0)); + FloatSliderParm* slider2 = new FloatSliderParm(sharedParameter->evalFloat(1)); + FloatSliderParm* slider3 = new FloatSliderParm(sharedParameter->evalFloat(2)); QHBoxLayout* vectorLayout = new QHBoxLayout(); vectorLayout->addWidget(slider1); vectorLayout->addWidget(slider2); vectorLayout->addWidget(slider3); mainLayout_->addLayout(vectorLayout); - connect(slider1, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);}); - connect(slider2, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 1);}); - connect(slider3, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 2);}); + connect(slider1, &FloatSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);}); + connect(slider2, &FloatSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 1);}); + connect(slider3, &FloatSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 2);}); break; } case prm::Type::STRING: @@ -61,7 +68,7 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param } default: - throw std::runtime_error("Parameter panel: paremeter type not accounted for " + std::to_string(static_cast(sharedParameter->getType()))); + throw std::runtime_error("Form parm: paremeter type not accounted for " + std::to_string(static_cast(sharedParameter->getType()))); } @@ -77,20 +84,20 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param } -int enzo::ui::AbstractFormParm::getLeftPadding() +int enzo::ui::FormParm::getLeftPadding() { return label_->minimumSizeHint().width(); } -void enzo::ui::AbstractFormParm::setLeftPadding(int padding) +void enzo::ui::FormParm::setLeftPadding(int padding) { label_->setFixedWidth(padding); } -void enzo::ui::AbstractFormParm::changeValue(enzo::bt::floatT value, unsigned int index) +void enzo::ui::FormParm::changeValue(enzo::bt::floatT value, unsigned int index) { if(auto sharedParameter=parameter_.lock()) { @@ -104,7 +111,7 @@ void enzo::ui::AbstractFormParm::changeValue(enzo::bt::floatT value, unsigned in } -void enzo::ui::AbstractFormParm::changeValue(enzo::bt::String value, unsigned int index) +void enzo::ui::FormParm::changeValue(enzo::bt::String value, unsigned int index) { if(auto sharedParameter=parameter_.lock()) { diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/FormParm.h similarity index 85% rename from src/Gui/Parameters/AbstractFormParm.h rename to src/Gui/Parameters/FormParm.h index 2f33178..5cf489a 100644 --- a/src/Gui/Parameters/AbstractFormParm.h +++ b/src/Gui/Parameters/FormParm.h @@ -8,12 +8,12 @@ namespace enzo::ui { -class AbstractFormParm +class FormParm : public QWidget { Q_OBJECT public: - AbstractFormParm(std::weak_ptr parameter); + FormParm(std::weak_ptr parameter); int getLeftPadding(); void setLeftPadding(int padding); diff --git a/src/Gui/Parameters/IntSliderParm.cpp b/src/Gui/Parameters/IntSliderParm.cpp new file mode 100644 index 0000000..865dc4e --- /dev/null +++ b/src/Gui/Parameters/IntSliderParm.cpp @@ -0,0 +1,117 @@ +#include "Gui/Parameters/IntSliderParm.h" +#include "Engine/Types.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +enzo::ui::IntSliderParm::IntSliderParm(bt::intT value, QWidget *parent, Qt::WindowFlags f) +: QWidget(parent, f) +{ + // tells qt to style the widget even though it's a Q_OBJECT + setAttribute(Qt::WA_StyledBackground, true); + setFixedHeight(24); + + notchPen_ = QPen(QColor("#383838"), notchWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); + + + + mainLayout_ = new QVBoxLayout(); + setLayout(mainLayout_); + + valueLabel_ = new QLabel(); + valueLabel_->setAlignment(Qt::AlignCenter); + valueLabel_->setStyleSheet("background-color: none;"); + setProperty("type", "SliderParm"); + setStyleSheet(R"( + QWidget[type="SliderParm"] + { + border-radius: 6px; + border: 1px solid #383838; + } + )"); + mainLayout_->addWidget(valueLabel_); + + setValueImpl(value); +} + +void enzo::ui::IntSliderParm::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + + const int valueRange = maxValue_-minValue_; + float fillPercent = static_cast(value_-minValue_)/valueRange; + IC(value_, fillPercent); + float margin = 3; + float fillWidth = rect().width()-margin*2; + fillWidth *= fillPercent; + + QRectF fillRect = {rect().left()+margin, rect().top()+margin, fillWidth, rect().height()-margin*2}; + + painter.setPen(notchPen_); + QRectF markerLinesRect = rect(); + markerLinesRect.adjust(margin, margin, -margin, -margin); + for(int i=minValue_+1;imaxValue_) { value = maxValue_; } + + value_ = value; + QString valStr = QString::number(value_); + valStr.truncate(4); + valueLabel_->setText(valStr); + + +} + +void enzo::ui::IntSliderParm::setValue(bt::intT value) +{ + + setValueImpl(value); + update(); + valueChanged(value_); + +} + + +void enzo::ui::IntSliderParm::mouseMoveEvent(QMouseEvent *event) +{ + // normalized + float value = static_cast(event->pos().x())/rect().width(); + //remap + value = minValue_+(maxValue_-minValue_)*value; + setValue(rint(value)); +} + +void enzo::ui::IntSliderParm::mousePressEvent(QMouseEvent *event) +{ + // normalized + float value = static_cast(event->pos().x())/rect().width(); + //remap + value = minValue_+(maxValue_-minValue_)*value; + setValue(rint(value)); +} + diff --git a/src/Gui/Parameters/IntSliderParm.h b/src/Gui/Parameters/IntSliderParm.h new file mode 100644 index 0000000..60f4297 --- /dev/null +++ b/src/Gui/Parameters/IntSliderParm.h @@ -0,0 +1,45 @@ +#pragma once +#include "Engine/Types.h" +#include +#include +#include +#include + +namespace enzo::ui +{ + +class IntSliderParm +: public QWidget +{ + Q_OBJECT +public: + IntSliderParm(bt::intT value, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + void setValue(bt::intT value); + +Q_SIGNALS: + void valueChanged(bt::intT value); + +private: + + QVBoxLayout* mainLayout_; + QLabel* valueLabel_; + bt::intT value_; + bool clampMin_ = true; + bool clampMax_ = true; + bt::intT minValue_=-5; + bt::intT maxValue_=10; + + QPen notchPen_; + static constexpr int notchWidth = 2; + + void setValueImpl(bt::intT value); + +protected: +void paintEvent(QPaintEvent *event) override; +void mouseMoveEvent(QMouseEvent *event) override; +void mousePressEvent(QMouseEvent *event) override; + +}; + +} + diff --git a/src/Gui/ParametersPanel/ParametersPanel.cpp b/src/Gui/ParametersPanel/ParametersPanel.cpp index 518a939..db592a6 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.cpp +++ b/src/Gui/ParametersPanel/ParametersPanel.cpp @@ -1,9 +1,8 @@ #include "Gui/ParametersPanel/ParametersPanel.h" #include "Engine/Operator/GeometryOperator.h" #include "Engine/Types.h" -#include "Gui/Parameters/AbstractSliderParm.h" -#include "Gui/Parameters/AbstractFormParm.h" -#include "Gui/Parameters/FloatParm.h" +#include "Gui/Parameters/FloatSliderParm.h" +#include "Gui/Parameters/FormParm.h" #include "Engine/Network/NetworkManager.h" #include #include @@ -52,7 +51,7 @@ void ParametersPanel::selectionChanged(enzo::nt::OpId opId) enzo::nt::GeometryOperator& displayOp = nm.getGeoOperator(displayOpId); auto parameters = displayOp.getParameters(); - std::vector parameterWidgets; + std::vector parameterWidgets; parameterWidgets.reserve(parameters.size()); int maxLeftPadding = 0; @@ -62,7 +61,7 @@ void ParametersPanel::selectionChanged(enzo::nt::OpId opId) auto parameterShared = parameter.lock(); if(!parameterShared) throw std::runtime_error("Failed to lock parameter"); - enzo::ui::AbstractFormParm* parameterWidget = new enzo::ui::AbstractFormParm(parameter); + enzo::ui::FormParm* parameterWidget = new enzo::ui::FormParm(parameter); int leftPadding = parameterWidget->getLeftPadding(); if(leftPadding > maxLeftPadding) maxLeftPadding = leftPadding; diff --git a/src/OpDefs/GopGrid.cpp b/src/OpDefs/GopGrid.cpp index 3fdfe7b..8044fbc 100644 --- a/src/OpDefs/GopGrid.cpp +++ b/src/OpDefs/GopGrid.cpp @@ -59,7 +59,7 @@ enzo::prm::Template GopGrid::parameterList[] = { enzo::prm::Template(enzo::prm::Type::FLOAT, "width", enzo::prm::Default(1)), enzo::prm::Template(enzo::prm::Type::FLOAT, "height", enzo::prm::Default(1)), - enzo::prm::Template(enzo::prm::Type::FLOAT, "rows", enzo::prm::Default(10)), - enzo::prm::Template(enzo::prm::Type::FLOAT, "columns", enzo::prm::Default(10)), + enzo::prm::Template(enzo::prm::Type::INT, "rows", enzo::prm::Default(10)), + enzo::prm::Template(enzo::prm::Type::INT, "columns", enzo::prm::Default(10)), enzo::prm::Terminator };