|
@@ -17,18 +17,16 @@ Almond::Almond(QWidget* parent) :
|
|
mandelContext{ mnd::initializeContext() }
|
|
mandelContext{ mnd::initializeContext() }
|
|
{
|
|
{
|
|
ui.setupUi(this);
|
|
ui.setupUi(this);
|
|
- //mw = std::make_unique<MandelWidget>(mandelContext,
|
|
|
|
- // &mandelContext.getDefaultGenerator(),
|
|
|
|
- // ui.centralWidget);
|
|
|
|
fractalWidget = new FractalWidget(this);
|
|
fractalWidget = new FractalWidget(this);
|
|
fractalWidget->setGenerator(&mandelContext.getDefaultGenerator());
|
|
fractalWidget->setGenerator(&mandelContext.getDefaultGenerator());
|
|
fractalWidget->setGradient(Gradient::defaultGradient());
|
|
fractalWidget->setGradient(Gradient::defaultGradient());
|
|
|
|
+ fractalWidget->setSmoothColoring(ui.smooth->isChecked());
|
|
|
|
+
|
|
customGeneratorDialog = std::make_unique<CustomGenerator>(mandelContext);
|
|
customGeneratorDialog = std::make_unique<CustomGenerator>(mandelContext);
|
|
customGenerator = nullptr;
|
|
customGenerator = nullptr;
|
|
customViewSave = mnd::MandelViewport::centerView();
|
|
customViewSave = mnd::MandelViewport::centerView();
|
|
|
|
|
|
on_maxIterations_editingFinished();
|
|
on_maxIterations_editingFinished();
|
|
- fractalWidget->setSmoothColoring(ui.smooth->isChecked());
|
|
|
|
|
|
|
|
currentView = MANDELBROT;
|
|
currentView = MANDELBROT;
|
|
mandelGenerator = &mandelContext.getDefaultGenerator();
|
|
mandelGenerator = &mandelContext.getDefaultGenerator();
|
|
@@ -57,34 +55,11 @@ Almond::Almond(QWidget* parent) :
|
|
connect(imageSm, &AlmondSubMenu::accepted, this, &Almond::imageExportOk);
|
|
connect(imageSm, &AlmondSubMenu::accepted, this, &Almond::imageExportOk);
|
|
connect(videoSm, &AlmondSubMenu::accepted, this, &Almond::videoExportOk);
|
|
connect(videoSm, &AlmondSubMenu::accepted, this, &Almond::videoExportOk);
|
|
connect(gradientSm, &AlmondSubMenu::accepted, this, &Almond::gradientEditOk);
|
|
connect(gradientSm, &AlmondSubMenu::accepted, this, &Almond::gradientEditOk);
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ connect(gradientSm, &AlmondSubMenu::cancelled, [this] () {
|
|
|
|
+ fractalWidget->setGradient(gradientMenu->getGradientBefore());
|
|
|
|
+ });
|
|
connect(gradientMenu, &GradientMenu::gradientChanged, [this] () {
|
|
connect(gradientMenu, &GradientMenu::gradientChanged, [this] () {
|
|
-
|
|
|
|
- std::vector<std::pair<RGBColor, float>> np;
|
|
|
|
- const auto& points = gradientMenu->getGradient();
|
|
|
|
- std::transform(points.begin(), points.end(), std::back_inserter(np),
|
|
|
|
- [](auto& qp) -> std::pair<RGBColor, float> {
|
|
|
|
- auto& [pos, col] = qp;
|
|
|
|
- return { RGBColor{ uint8_t(col.red()), uint8_t(col.green()), uint8_t(col.blue()) },
|
|
|
|
- pos };
|
|
|
|
- });
|
|
|
|
- std::sort(np.begin(), np.end(), [](auto& a, auto& b) { return a.second < b.second; });
|
|
|
|
- if (!np.empty()) {
|
|
|
|
- auto& first = np.at(0);
|
|
|
|
- if (first.second > 0) {
|
|
|
|
- np.insert(np.begin(), { first.first, 0.0f });
|
|
|
|
- }
|
|
|
|
- auto& last = np.at(np.size() - 1);
|
|
|
|
- if (last.second < 1) {
|
|
|
|
- np.insert(np.begin(), { last.first, 1.0f });
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- std::for_each(np.begin(), np.end(), [](auto& x) { x.second *= 300; });
|
|
|
|
-
|
|
|
|
- Gradient grad{ np, true };
|
|
|
|
- fractalWidget->setGradient(grad);
|
|
|
|
|
|
+ fractalWidget->setGradient(gradientMenu->getGradient());
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -131,13 +106,14 @@ void Almond::submitBackgroundTask(BackgroundTask* task)
|
|
{
|
|
{
|
|
QObject::connect(task, &BackgroundTask::finished, this, &Almond::backgroundTaskFinished);
|
|
QObject::connect(task, &BackgroundTask::finished, this, &Almond::backgroundTaskFinished);
|
|
QObject::connect(task, &BackgroundTask::progress, this, &Almond::backgroundTaskProgress);
|
|
QObject::connect(task, &BackgroundTask::progress, this, &Almond::backgroundTaskProgress);
|
|
|
|
+ int running = backgroundTasks.activeThreadCount();
|
|
backgroundTasks.start(task);
|
|
backgroundTasks.start(task);
|
|
- //if (taken) {
|
|
|
|
|
|
+ if (running == 0) {
|
|
ui.backgroundProgress->setRange(0, 0);
|
|
ui.backgroundProgress->setRange(0, 0);
|
|
ui.backgroundProgress->setFormat("");
|
|
ui.backgroundProgress->setFormat("");
|
|
ui.backgroundProgress->setEnabled(true);
|
|
ui.backgroundProgress->setEnabled(true);
|
|
ui.cancelProgress->setEnabled(true);
|
|
ui.cancelProgress->setEnabled(true);
|
|
- //}
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -174,24 +150,25 @@ void Almond::imageExportOk(void)
|
|
{
|
|
{
|
|
mnd::MandelInfo mi;
|
|
mnd::MandelInfo mi;
|
|
mi.maxIter = eim->getMaxIterations();
|
|
mi.maxIter = eim->getMaxIterations();
|
|
- mi.view = mnd::MandelViewport{};// mw->getViewport(); // TODO update
|
|
|
|
|
|
+ mi.view = fractalWidget->getViewport();
|
|
mi.bWidth = eim->getWidth();
|
|
mi.bWidth = eim->getWidth();
|
|
mi.bHeight = eim->getHeight();
|
|
mi.bHeight = eim->getHeight();
|
|
mi.view.adjustAspectRatio(mi.bWidth, mi.bHeight);
|
|
mi.view.adjustAspectRatio(mi.bWidth, mi.bHeight);
|
|
- mi.smooth = true; // TODO update
|
|
|
|
- /*if (currentView == JULIA) {
|
|
|
|
- mi.julia = mw->getMandelInfo().julia;
|
|
|
|
- mi.juliaX = mw->getJuliaX();
|
|
|
|
- mi.juliaY = mw->getJuliaY();
|
|
|
|
- }*/
|
|
|
|
|
|
+ mi.smooth = true;
|
|
|
|
+ if (currentView == JULIA) {
|
|
|
|
+ mi.julia = fractalWidget->getMandelInfo().julia;
|
|
|
|
+ mi.juliaX = fractalWidget->getMandelInfo().juliaX;
|
|
|
|
+ mi.juliaY = fractalWidget->getMandelInfo().juliaY;
|
|
|
|
+ }
|
|
|
|
|
|
- mnd::MandelGenerator* currentGenerator = nullptr;// mw->getGenerator();// TODO update
|
|
|
|
- mnd::MandelGenerator& g = currentGenerator ? *currentGenerator : mandelContext.getDefaultGenerator();
|
|
|
|
|
|
+ mnd::MandelGenerator* currentGenerator = fractalWidget->getGenerator();
|
|
|
|
+ if (currentGenerator == nullptr)
|
|
|
|
+ currentGenerator = &mandelContext.getDefaultGenerator();
|
|
|
|
|
|
alm::ImageExportInfo iei;
|
|
alm::ImageExportInfo iei;
|
|
iei.drawInfo = mi;
|
|
iei.drawInfo = mi;
|
|
- iei.generator = &g;
|
|
|
|
- iei.gradient = Gradient::defaultGradient(); // mw->getGradient();// TODO update
|
|
|
|
|
|
+ iei.generator = currentGenerator;
|
|
|
|
+ iei.gradient = fractalWidget->getGradient();
|
|
iei.path = eim->getPath().toStdString();
|
|
iei.path = eim->getPath().toStdString();
|
|
iei.options.jpegQuality = 95;
|
|
iei.options.jpegQuality = 95;
|
|
submitBackgroundTask(new ImageExportTask(iei, [this] () { return stoppingBackgroundTasks; }));
|
|
submitBackgroundTask(new ImageExportTask(iei, [this] () { return stoppingBackgroundTasks; }));
|
|
@@ -202,14 +179,13 @@ void Almond::imageExportOk(void)
|
|
|
|
|
|
void Almond::videoExportOk(void)
|
|
void Almond::videoExportOk(void)
|
|
{
|
|
{
|
|
- /*
|
|
|
|
ExportVideoInfo evi = evm->getInfo();
|
|
ExportVideoInfo evi = evm->getInfo();
|
|
- evi.gradient = mw->getGradient();
|
|
|
|
- evi.mi.smooth = mw->getSmoothColoring();
|
|
|
|
|
|
+ evi.gradient = fractalWidget->getGradient();
|
|
|
|
+ evi.mi.smooth = fractalWidget->getMandelInfo().smooth;
|
|
if (currentView == JULIA) {
|
|
if (currentView == JULIA) {
|
|
- evi.mi.julia = mw->getMandelInfo().julia;
|
|
|
|
- evi.mi.juliaX = mw->getMandelInfo().juliaX;
|
|
|
|
- evi.mi.juliaY = mw->getMandelInfo().juliaY;
|
|
|
|
|
|
+ evi.mi.julia = fractalWidget->getMandelInfo().julia;
|
|
|
|
+ evi.mi.juliaX = fractalWidget->getMandelInfo().juliaX;
|
|
|
|
+ evi.mi.juliaY = fractalWidget->getMandelInfo().juliaY;
|
|
}
|
|
}
|
|
if (evi.path == "") {
|
|
if (evi.path == "") {
|
|
QMessageBox errMsg = QMessageBox(QMessageBox::Icon::Critical, "Error", "No path specified.");
|
|
QMessageBox errMsg = QMessageBox(QMessageBox::Icon::Critical, "Error", "No path specified.");
|
|
@@ -217,45 +193,18 @@ void Almond::videoExportOk(void)
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
MandelVideoGenerator mvg(evi);
|
|
MandelVideoGenerator mvg(evi);
|
|
- mnd::MandelGenerator& g = *mw->getGenerator();
|
|
|
|
- printf("wii: %ld\n", evi.mi.bWidth);
|
|
|
|
|
|
+ mnd::MandelGenerator& g = *fractalWidget->getGenerator();
|
|
|
|
+ //printf("wii: %ld\n", evi.mi.bWidth);
|
|
fflush(stdout);
|
|
fflush(stdout);
|
|
submitBackgroundTask(new VideoExportTask(std::move(mvg), g));
|
|
submitBackgroundTask(new VideoExportTask(std::move(mvg), g));
|
|
amw->showMainMenu();
|
|
amw->showMainMenu();
|
|
}
|
|
}
|
|
- */
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void Almond::gradientEditOk(void)
|
|
void Almond::gradientEditOk(void)
|
|
{
|
|
{
|
|
- const auto& points = gradientMenu->getGradient();
|
|
|
|
-
|
|
|
|
- // convert from QVector<QPair<float, QColor>> to
|
|
|
|
- // -> std::vector<std::pair<RGBColor, float>>
|
|
|
|
- std::vector<std::pair<RGBColor, float>> np;
|
|
|
|
- std::transform(points.begin(), points.end(), std::back_inserter(np),
|
|
|
|
- [](auto& qp) -> std::pair<RGBColor, float> {
|
|
|
|
- auto& [pos, col] = qp;
|
|
|
|
- return { RGBColor{ uint8_t(col.red()), uint8_t(col.green()), uint8_t(col.blue()) },
|
|
|
|
- pos };
|
|
|
|
- });
|
|
|
|
- std::sort(np.begin(), np.end(), [](auto& a, auto& b) { return a.second < b.second; });
|
|
|
|
- if (!np.empty()) {
|
|
|
|
- auto& first = np.at(0);
|
|
|
|
- if (first.second > 0) {
|
|
|
|
- np.insert(np.begin(), { first.first, 0.0f });
|
|
|
|
- }
|
|
|
|
- auto& last = np.at(np.size() - 1);
|
|
|
|
- if (last.second < 1) {
|
|
|
|
- np.insert(np.begin(), { last.first, 1.0f });
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- std::for_each(np.begin(), np.end(), [](auto& x) { x.second *= 300; });
|
|
|
|
-
|
|
|
|
- Gradient g{ np, true };
|
|
|
|
- fractalWidget->setGradient(std::move(g));
|
|
|
|
|
|
+ fractalWidget->setGradient(gradientMenu->getGradient());
|
|
amw->showMainMenu();
|
|
amw->showMainMenu();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -342,7 +291,7 @@ void Almond::on_maxIterations_editingFinished()
|
|
|
|
|
|
void Almond::on_chooseGradient_clicked()
|
|
void Almond::on_chooseGradient_clicked()
|
|
{
|
|
{
|
|
- const auto& gradient = fractalWidget->getGradient(); // TODO update
|
|
|
|
|
|
+ /*const auto& gradient = fractalWidget->getGradient(); // TODO update
|
|
auto points = gradient.getPoints();
|
|
auto points = gradient.getPoints();
|
|
std::for_each(points.begin(), points.end(), [](auto& x) { x.second /= 300; });
|
|
std::for_each(points.begin(), points.end(), [](auto& x) { x.second /= 300; });
|
|
|
|
|
|
@@ -351,8 +300,8 @@ void Almond::on_chooseGradient_clicked()
|
|
[](auto& qp) -> QPair<float, QColor> {
|
|
[](auto& qp) -> QPair<float, QColor> {
|
|
auto& [col, pos] = qp;
|
|
auto& [col, pos] = qp;
|
|
return { pos, QColor{ (col.r), (col.g), (col.b) } };
|
|
return { pos, QColor{ (col.r), (col.g), (col.b) } };
|
|
- });
|
|
|
|
- this->gradientMenu->setGradient(std::move(np));
|
|
|
|
|
|
+ });*/
|
|
|
|
+ this->gradientMenu->setGradient(fractalWidget->getGradient());
|
|
emit this->amw->showSubMenu(2);
|
|
emit this->amw->showSubMenu(2);
|
|
//gcd.exec();
|
|
//gcd.exec();
|
|
//auto gradient = gcd.getGradient();
|
|
//auto gradient = gcd.getGradient();
|
|
@@ -413,7 +362,7 @@ void Almond::on_resetZoom_clicked()
|
|
|
|
|
|
void Almond::on_displayInfo_stateChanged(int checked)
|
|
void Almond::on_displayInfo_stateChanged(int checked)
|
|
{
|
|
{
|
|
- // TODO update this->mw->setDisplayInfo(checked != Qt::Unchecked);
|
|
|
|
|
|
+ this->fractalWidget->setDisplayInfo(checked != Qt::Unchecked);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|