}
void BigintWidget::finished() {
+ settings_widget->set_finished(true);
update_img();
}
void BigintWidget::mousePressEvent(QMouseEvent *event) {
QSize size(settings.get_current().get_size());
- QPoint pos(img_label->mapFromParent(event->pos()));
+ QPoint pos(event->pos());
+ QWidget *w;
+ for (w = img_label; w != this; w = w->parentWidget())
+ pos = w->mapFromParent(pos);
if (event->button() != Qt::MouseButton::LeftButton
|| !fw->isFinished()
|| pos.x() < 0
|| pos.y() < 0
|| pos.y() >= size.height())
return;
-/*
settings.zoom(scroll_area->viewport()->size(), pos);
fw->setFuture(
QtConcurrent::mapped(settings.get_cells(), MandelSettings::iterate)
);
-*/
- // paint a small circle at point pos
update_img();
}
}
void BigintWidget::exec_settings_widget() {
- if (!fw->isFinished())
- return;
- settings_widget->update_fields(settings.get_current());
+ settings_widget->update_fields(settings.get_current(), fw->isFinished());
settings_widget->exec();
}
#include <QVector>
#include <QColor>
-static QVector<QColor> colors = {
+QVector<QColor> colors = {
"#3868b8",
"#3468b4",
"#3468b4",
}
static inline QImage *setup_image(QImage *img, const QSize &size) {
- delete img;
- img = new QImage(size, QImage::Format_RGB888);
+ if(!img || img->size() != size) {
+ delete img;
+ img = new QImage(size, QImage::Format_RGB888);
+ }
img->fill(Qt::GlobalColor::black);
return img;
}
cells[num].set_result(result);
if (!img)
return;
- img->setPixelColor(
- cells[num].get_pos(),
- iter < current.get_max_iter()
- ? colors[iter % colors.size()]
- : Qt::GlobalColor::black
- );
+ img->setPixelColor(cells[num].get_pos(), cells[num].get_color());
}
MandelResultCell MandelSettings::iterate(const MandelCell &cell) {
this->pos = pos;
rpos0 = MpzPoint(
center_f.get_x() + (pos.x() - size.width() / 2.),
- center_f.get_y() + (pos.y() - size.height() / 2.)
+ center_f.get_y() - (pos.y() - size.height() / 2.)
);
result = MandelResultCell();
}
void reset(size_t max_iter, QSize size);
};
+extern QVector<QColor> colors;
+
class MandelCell {
const MandelParams *params;
QPoint pos;
inline const QPoint get_pos() const { return pos; }
inline const size_t get_iter() const { return result.iter; }
inline const MpzPoint get_rpos0() const { return rpos0; }
+ inline const QColor get_color() const {
+ return result.iter < params->get_max_iter()
+ ? colors[result.iter % colors.size()]
+ : Qt::GlobalColor::black;
+ }
void setup(const QPoint pos);
- void set_result(const MandelResultCell &result) { this->result = result; }
+ inline void set_result(const MandelResultCell &result) {
+ this->result = result;
+ }
MandelResultCell iterate() const;
};
apply_button,
&QPushButton::clicked,
this,
- &QDialog::accept
+ &SettingsWidget::apply
);
grid_layout->addWidget(apply_button, i, 1);
}
-void SettingsWidget::update_fields(const MandelParams ¶ms) {
+void SettingsWidget::update_fields(
+ const MandelParams ¶ms, const bool is_finished
+) {
QSize size = params.get_size();
MpzPoint center_f = params.get_center_f();
max_iter->setText(QString::number(params.get_max_iter()));
center_f_x->setText(QString::fromStdString(center_f.get_x().get_str()));
center_f_y->setText(QString::fromStdString(center_f.get_y().get_str()));
one->setText(QString::fromStdString(params.get_one().get_str()));
+ set_finished(is_finished);
+}
+
+void SettingsWidget::apply() {
+ if (is_finished)
+ accept();
+ else
+ reject();
}
Q_OBJECT
QLineEdit *max_iter, *width, *height, *center_f_x, *center_f_y, *one;
+ bool is_finished;
public:
SettingsWidget(QWidget *parent = nullptr);
- void update_fields(const MandelParams ¶ms);
+ void update_fields(const MandelParams ¶ms, const bool is_finished);
inline const QString get_max_iter() const { return max_iter->text(); };
+
+ inline void set_finished(const bool is_finished) {
+ this->is_finished = is_finished;
+ max_iter->setReadOnly(!is_finished);
+ }
+
+public Q_SLOTS:
+ void apply();
};
#endif // SETTINGSWIDGET_H