# HG changeset patch # User Teemu Piippo # Date 1655732636 -10800 # Node ID 5509bec02c81999d95422b52501b11441d6a74bf # Parent 8efa3a33172ebba6896d5d0e126e8d79f8961afd fix various things diff -r 8efa3a33172e -r 5509bec02c81 CMakeLists.txt --- a/CMakeLists.txt Mon Jun 20 02:04:51 2022 +0300 +++ b/CMakeLists.txt Mon Jun 20 16:43:56 2022 +0300 @@ -46,8 +46,7 @@ src/settingseditor/librarieseditor.cpp src/settingseditor/settingseditor.cpp src/types/boundingbox.cpp -# src/ui/canvas.cpp - src/ui/circletooloptions.cpp + src/ui/circletooloptionswidget.cpp src/ui/multiplyfactordialog.cpp src/ui/objecteditor.cpp src/widgets/colorbutton.cpp @@ -89,8 +88,7 @@ src/settingseditor/librarieseditor.h src/settingseditor/settingseditor.h src/types/boundingbox.h -# src/ui/canvas.h - src/ui/circletooloptions.h + src/ui/circletooloptionswidget.h src/ui/multiplyfactordialog.h src/ui/objecteditor.h src/widgets/colorbutton.h diff -r 8efa3a33172e -r 5509bec02c81 src/main.cpp --- a/src/main.cpp Mon Jun 20 02:04:51 2022 +0300 +++ b/src/main.cpp Mon Jun 20 16:43:56 2022 +0300 @@ -14,7 +14,7 @@ #include "settingseditor/settingseditor.h" #include "widgets/colorselectdialog.h" #include "settings.h" -#include "ui/circletooloptions.h" +#include "ui/circletooloptionswidget.h" static const QDir LOCALE_DIR {":/locale"}; diff -r 8efa3a33172e -r 5509bec02c81 src/model.h --- a/src/model.h Mon Jun 20 02:04:51 2022 +0300 +++ b/src/model.h Mon Jun 20 16:43:56 2022 +0300 @@ -78,6 +78,8 @@ glm::mat4 transformation; }; +Q_DECLARE_METATYPE(CircularPrimitive::Type) + struct CircleToolOptions { CircularFraction fraction; diff -r 8efa3a33172e -r 5509bec02c81 src/settings.h --- a/src/settings.h Mon Jun 20 02:04:51 2022 +0300 +++ b/src/settings.h Mon Jun 20 16:43:56 2022 +0300 @@ -5,16 +5,11 @@ #include "libraries.h" #include "gl/common.h" -// SettingType - get type of setting by enumerator -template -struct SettingId{}; - -template +template struct SettingInfo{}; #define SETTING(NAME, DEFVALUE) \ - namespace SettingIdTypes { class NAME; } \ - namespace Setting { constexpr SettingId NAME; } \ + namespace Setting { class NAME; } \ template<> \ struct SettingInfo \ { \ @@ -51,21 +46,21 @@ // ----------------------------------------------------------------------------- #undef SETTING -template +template using SettingType_t = typename SettingInfo::type; static_assert(std::is_same_v, bool>); -template +template const char* settingName = SettingInfo::name; -template +template inline auto settingDefaultValue() { return SettingInfo::defaultValue(); } // get() - get setting by enumerator -template +template inline SettingType_t setting() { static const QVariant defvariant = QVariant::fromValue(settingDefaultValue()); @@ -74,7 +69,7 @@ } // setSetting() - set value of setting -template +template inline void setSetting(const SettingType_t& value) { if (value == settingDefaultValue()) { diff -r 8efa3a33172e -r 5509bec02c81 src/ui/circletooloptionswidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ui/circletooloptionswidget.cpp Mon Jun 20 16:43:56 2022 +0300 @@ -0,0 +1,77 @@ +#include "circletooloptionswidget.h" + +static QString circularPrimitiveTypeName(CircularPrimitive::Type type) +{ + switch (type) { + case CircularPrimitive::Circle: + return CircleToolOptionsWidget::tr("Circle"); + case CircularPrimitive::Disc: + return CircleToolOptionsWidget::tr("Disc"); + case CircularPrimitive::Cylinder: + return CircleToolOptionsWidget::tr("Cylinder"); + case CircularPrimitive::CylinderOpen: + return CircleToolOptionsWidget::tr("Cylinder open"); + case CircularPrimitive::CylinderClosed: + return CircleToolOptionsWidget::tr("Cylinder closed"); + case CircularPrimitive::DiscNegative: + return CircleToolOptionsWidget::tr("Disc negative"); + case CircularPrimitive::Chord: + return CircleToolOptionsWidget::tr("Chord"); + } + return ""; +} + +CircleToolOptionsWidget::CircleToolOptionsWidget(QWidget *parent) : + QWidget{parent} +{ + this->ui.setupUi(this); + for (int i = 0; i < CircularPrimitive::NUM_TYPES; ++i) { + const auto type = static_cast(i); + this->ui.type->addItem(circularPrimitiveTypeName(type), type); + } + connect(ui.segments, qOverload(&QSpinBox::valueChanged), this, &CircleToolOptionsWidget::handleInputChange); + connect(ui.divisions, &QComboBox::currentTextChanged, this, &CircleToolOptionsWidget::handleInputChange); + connect(ui.type, &QComboBox::currentTextChanged, this, &CircleToolOptionsWidget::handleInputChange); +} + +CircleToolOptionsWidget::~CircleToolOptionsWidget() +{ +} + +unsigned int CircleToolOptionsWidget::segments() const +{ + return this->ui.segments->value(); +} + +unsigned int CircleToolOptionsWidget::divisions() const +{ + bool ok; + const int divs = this->ui.divisions->currentText().toInt(&ok); + if (ok) { + return divs; + } + else { + return 16; + } +} + +CircularPrimitive::Type CircleToolOptionsWidget::type() const +{ + return this->ui.type->currentData().value(); +} + +void CircleToolOptionsWidget::handleInputChange() +{ + const int olddivs = this->ui.segments->maximum(); + const int newdivs = this->divisions(); + if (olddivs != newdivs) { + this->ui.segments->setMaximum(newdivs); + this->ui.segments->setValue(this->segments() * newdivs / olddivs); + } + const qreal ratio = static_cast(this->segments()) / newdivs; + this->ui.ratio->setText(QString::number(ratio, 'g', 4)); + Q_EMIT this->optionsChanged(CircleToolOptions{ + .fraction = CircularFraction{this->segments(), this->divisions()}, + .type = this->type(), + }); +} diff -r 8efa3a33172e -r 5509bec02c81 src/ui/circletooloptionswidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ui/circletooloptionswidget.h Mon Jun 20 16:43:56 2022 +0300 @@ -0,0 +1,20 @@ +#pragma once +#include +#include "ui_circletool.h" +#include "model.h" + +class CircleToolOptionsWidget : public QWidget +{ + Q_OBJECT + Ui_CircleToolOptions ui; +public: + CircleToolOptionsWidget(QWidget* parent); + virtual ~CircleToolOptionsWidget(); + unsigned int segments() const; + unsigned int divisions() const; + CircularPrimitive::Type type() const; +Q_SIGNALS: + void optionsChanged(const CircleToolOptions& options); +private: + Q_SLOT void handleInputChange(); +};