]> git.mar77i.info Git - bigintmandel/blobdiff - settingswidget.cpp
make zoom_factor part of MandelSettings
[bigintmandel] / settingswidget.cpp
index 4bb00c9e621ee7f841af620d230b4829c7471cd4..ab7c5e5131297a12b9f55725322437f2edd398a7 100644 (file)
  * This file is covered by the LICENSE file in the root of this project.
  */
 
-#include <gmpxx.h>
-#include <QIntValidator>
 #include <QLabel>
-#include <QMessageBox>
+#include <QLayout>
 #include <QPushButton>
+#include <QMessageBox>
 
 #include "settingswidget.h"
-#include "uint64validator.h"
-
-SettingsWidgetFieldBase::SettingsWidgetFieldBase(
-    const QString &label, QWidget *parent
-) : edit(new QLineEdit("", parent)),
-    label(label)
-{
-    edit->setMinimumWidth(256);
-}
-
-void SettingsWidgetFieldBase::setup(
-    QGridLayout *grid_layout,
-    SettingsWidget *settings_widget,
-    const char *method_name
-) {
-    int row_count = grid_layout->rowCount();
-    grid_layout->addWidget(
-        new QLabel(label, edit->parentWidget()), row_count, 0
-    );
-    grid_layout->addWidget(edit, row_count, 1);
-    QObject::connect(
-        edit, SIGNAL(editingFinished()), settings_widget, method_name
-    );
-}
-
-void SettingsWidgetFieldBase::reset() {
-    edit->setText(orig_value);
-}
-
-SettingsWidgetField<quint64>::SettingsWidgetField(
-    const QString &label, QWidget *parent
-) : SettingsWidgetFieldBase(label, parent) {
-    edit->setValidator(new UInt64Validator(edit));
-}
-
-void SettingsWidgetField<quint64>::set_value(quint64 value) {
-    orig_value = QString::number(value);
-    reset();
-}
-
-SettingsWidgetField<int>::SettingsWidgetField(
-    const QString &label, QWidget *parent
-) : SettingsWidgetFieldBase(label, parent) {
-    edit->setValidator(new QIntValidator(edit));
-}
-
-void SettingsWidgetField<int>::set_value(int value) {
-    orig_value = QString::number(value);
-    reset();
-}
-
-SettingsWidgetField<mpz_class>::SettingsWidgetField(
-    const QString &label, QWidget *parent
-) : SettingsWidgetFieldBase(label, parent) {
-    static QRegularExpression number_re("^\\d+$");
-    edit->setValidator(new QRegularExpressionValidator(number_re));
-}
-
-void SettingsWidgetField<mpz_class>::set_value(const mpz_class &value) {
-    orig_value = QString::QString::fromStdString(value.get_str());
-    reset();
-}
 
-inline void SettingsWidget::setup_button(
+static inline void setup_button(
     QLayout *layout, QPushButton *button, const char *method_name
 ) {
-    connect(
+    QObject::connect(
         button,
         SIGNAL(clicked()),
-        this,
+        button->parentWidget(),
         method_name
     );
     layout->addWidget(button);
 }
 
+static inline void setup_edit(
+    SettingsWidget *parent,
+    QGridLayout *layout,
+    const QString &label,
+    QLineEdit *edit,
+    int y
+) {
+    layout->addWidget(new QLabel(label, parent), y, 0);
+    edit->setMinimumWidth(256);
+    QObject::connect(
+        edit,
+        &QLineEdit::editingFinished,
+        parent,
+        &SettingsWidget::update_form
+    );
+    layout->addWidget(edit, y, 1);
+}
+
 SettingsWidget::SettingsWidget(QWidget *parent)
 :   QDialog(parent),
-    max_iter("max_iter", this),
-    width("width", this),
-    height("height", this),
-    center_f_x("x", this),
-    center_f_y("y", this),
-    one("one", this),
-    clear_image_checkbox(new QCheckBox("Clear image", this)),
+    max_iter(new TypedLineEdit<quint64>(this)),
+    width(new TypedLineEdit<int>(this)),
+    height(new TypedLineEdit<int>(this)),
+    center_f_x(new TypedLineEdit<mpz_class>(this)),
+    center_f_y(new TypedLineEdit<mpz_class>(this)),
+    one(new TypedLineEdit<mpz_class>(this)),
+    clear_image(new QCheckBox("Clear image", this)),
     updating(false)
 {
     QGridLayout *grid_layout = new QGridLayout(this);
     QBoxLayout *button_row = new QBoxLayout(QBoxLayout::Direction::RightToLeft);
-    int i;
-    max_iter.setup(grid_layout, this, SLOT(update_form()));
-    width.setup(grid_layout, this, SLOT(update_form()));
-    height.setup(grid_layout, this, SLOT(update_form()));
-    center_f_x.setup(grid_layout, this, SLOT(update_form()));
-    center_f_y.setup(grid_layout, this, SLOT(update_form()));
-    one.setup(grid_layout, this, SLOT(update_form()));
+    setup_edit(this, grid_layout, "max_iter", max_iter, 0);
+    setup_edit(this, grid_layout, "width", width, 1);
+    setup_edit(this, grid_layout, "height", height, 2);
+    setup_edit(this, grid_layout, "x", center_f_x, 3);
+    setup_edit(this, grid_layout, "y", center_f_y, 4);
+    setup_edit(this, grid_layout, "one", one, 5);
+
     connect(
-        clear_image_checkbox,
+        clear_image,
         &QCheckBox::clicked,
         this,
         &SettingsWidget::update_form
     );
-    grid_layout->addWidget(clear_image_checkbox, grid_layout->rowCount(), 1);
+    grid_layout->addWidget(clear_image, grid_layout->rowCount(), 1);
     setup_button(
         button_row, new QPushButton("C&alculate", this), SLOT(accept())
     );
@@ -124,24 +79,50 @@ SettingsWidget::SettingsWidget(QWidget *parent)
     grid_layout->addLayout(button_row, grid_layout->rowCount(), 0, 1, 2);
 }
 
-void SettingsWidget::update_fields(const MandelParams &params) {
-    QSize size = params.get_size();
-    MpzPoint center_f = params.get_center_f();
-    max_iter.set_value(params.get_max_iter());
-    width.set_value(size.width());
-    height.set_value(size.height());
-    center_f_x.set_value(center_f.get_x());
-    center_f_y.set_value(center_f.get_y());
-    one.set_value(params.get_one());
-    clear_image_checkbox->setChecked(false);
+void SettingsWidget::update_params(const MandelParams &params) {
+    max_iter->set_value(params.get_max_iter());
+    orig = params;
+    reset_params_fields();
+    clear_image->setChecked(false);
+}
+
+void SettingsWidget::reset_params_fields() {
+    QSize size = orig.get_size();
+    MpzPoint center_f = orig.get_center_f();
+    width->set_value(size.width());
+    height->set_value(size.height());
+    center_f_x->set_value(center_f.get_x());
+    center_f_y->set_value(center_f.get_y());
+    one->set_value(orig.get_one());
+}
+
+bool SettingsWidget::are_params_fields_changed() {
+    const QSize size = orig.get_size();
+    const MpzPoint center_f = orig.get_center_f();
+    return (
+        width->get_value() != size.width()
+        || height->get_value() != size.height()
+        || center_f_x->get_value() != center_f.get_x()
+        || center_f_y->get_value() != center_f.get_y()
+        || one->get_value() != orig.get_one()
+    );
+}
+
+MandelParams SettingsWidget::get_params() const {
+    return MandelParams(
+        max_iter->get_value(),
+        QSize(width->get_value(), height->get_value()),
+        MpzPoint(center_f_x->get_value(), center_f_y->get_value()),
+        one->get_value()
+    );
 }
 
 void SettingsWidget::update_form() {
     bool params_fields_changed = are_params_fields_changed();
-    bool max_iter_is_less = max_iter.get_value() < max_iter.get_orig_value();
+    bool max_iter_is_less = max_iter->get_value() < orig.get_max_iter();
     if (
         updating
-        || clear_image_checkbox->isChecked()
+        || clear_image->isChecked()
         || (!params_fields_changed && !max_iter_is_less)
     )
         return;
@@ -154,18 +135,18 @@ void SettingsWidget::update_form() {
             "Choosing no will undo your change."
         )
     ) == QMessageBox::StandardButton::Yes)
-        clear_image_checkbox->setChecked(true);
+        clear_image->setChecked(true);
     else {
         if (params_fields_changed)
             reset_params_fields();
         if (max_iter_is_less)
-            max_iter.reset();
+            max_iter->set_value(orig.get_max_iter());
     }
     updating = false;
 }
 
 void SettingsWidget::reset_form() {
-    max_iter.reset();
+    max_iter->set_value(orig.get_max_iter());
     reset_params_fields();
-    clear_image_checkbox->setChecked(false);
+    clear_image->setChecked(false);
 }