src/ui/circletooloptionswidget.cpp

changeset 233
5509bec02c81
child 250
2837b549e616
--- /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<CircularPrimitive::Type>(i);
+		this->ui.type->addItem(circularPrimitiveTypeName(type), type);
+	}
+	connect(ui.segments, qOverload<int>(&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<CircularPrimitive::Type>();
+}
+
+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<qreal>(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(),
+	});
+}

mercurial