#include "FractoriumPch.h" #include "Fractorium.h" /// /// Initialize the xforms xaos UI. /// void Fractorium::InitXaosUI() { ui.XaosTable->verticalHeader()->setVisible(true); ui.XaosTable->horizontalHeader()->setVisible(true); ui.XaosTable->verticalHeader()->setSectionsClickable(true); ui.XaosTable->horizontalHeader()->setSectionsClickable(true); connect(ui.ClearXaosButton, SIGNAL(clicked(bool)), this, SLOT(OnClearXaosButtonClicked(bool)), Qt::QueuedConnection); connect(ui.RandomXaosButton, SIGNAL(clicked(bool)), this, SLOT(OnRandomXaosButtonClicked(bool)), Qt::QueuedConnection); connect(ui.XaosTable->verticalHeader(), SIGNAL(sectionDoubleClicked(int)), this, SLOT(OnXaosRowDoubleClicked(int)), Qt::QueuedConnection); connect(ui.XaosTable->horizontalHeader(), SIGNAL(sectionDoubleClicked(int)), this, SLOT(OnXaosColDoubleClicked(int)), Qt::QueuedConnection); } /// /// Fill the xaos table with the values from the ember. /// template void FractoriumEmberController::FillXaos() { for (int i = 0, count = int(XformCount()); i < count; i++) { auto* xform = m_Ember.GetXform(i); for (int j = 0; j < count; j++) if (auto* spinBox = dynamic_cast(m_Fractorium->ui.XaosTable->cellWidget(i, j))) spinBox->SetValueStealth(xform->Xaos(j)); } } /// /// Create and return a xaos name string. /// /// The index of the xform whose xaos will be used /// The xaos name string template QString FractoriumEmberController::MakeXaosNameString(uint i) { Xform* xform = m_Ember.GetXform(i); QString name; //if (xform) //{ // int indexPlus1 = m_Ember.GetXformIndex(xform) + 1;//GUI is 1 indexed to avoid confusing the user. // int curr = m_Fractorium->ui.CurrentXformCombo->currentIndex() + 1; // // if (indexPlus1 != -1) // { // if (m_Fractorium->ui.XaosToRadio->isChecked()) // name = QString("From ") + ToString(curr) + QString(" To ") + ToString(indexPlus1); // else // name = QString("From ") + ToString(indexPlus1) + QString(" To ") + ToString(curr); // // //if (xform->m_Name != "") // // name = name + " (" + QString::fromStdString(xform->m_Name) + ")"; // } //} return name; } /// /// Set the xaos value. /// Called when any xaos spinner is changed. /// Resets the rendering process. /// /// The DoubleSpinBox that triggered this event template void FractoriumEmberController::XaosChanged(DoubleSpinBox* sender) { auto p = sender->property("tableindex").toPoint(); if (auto* xform = m_Ember.GetXform(p.x())) Update([&] { xform->SetXaos(p.y(), sender->value()); }); } void Fractorium::OnXaosChanged(double d) { if (auto* senderSpinBox = dynamic_cast(this->sender())) m_Controller->XaosChanged(senderSpinBox); } /// /// Clear xaos table, recreate all spinners based on the xaos used in the current ember. /// void Fractorium::FillXaosTable() { int spinHeight = 20; int count = int(m_Controller->XformCount()); QWidget* w = nullptr; QString lbl("lbl"); ui.XaosTable->blockSignals(true); ui.XaosTable->setRowCount(count);//This will grow or shrink the number of rows and call the destructor for previous DoubleSpinBoxes. ui.XaosTable->setColumnCount(count); for (int i = 0; i < count; i++) { for (int j = 0; j < count; j++) { QPoint p(i, j); DoubleSpinBox* spinBox = new DoubleSpinBox(ui.XaosTable, spinHeight, 0.1); spinBox->setFixedWidth(35); spinBox->DoubleClick(true); spinBox->DoubleClickZero(1); spinBox->DoubleClickNonZero(0); spinBox->setProperty("tableindex", p); ui.XaosTable->setCellWidget(i, j, spinBox); auto wp = ui.XaosTable->item(i, j); if (wp) wp->setTextAlignment(Qt::AlignCenter); connect(spinBox, SIGNAL(valueChanged(double)), this, SLOT(OnXaosChanged(double)), Qt::QueuedConnection); if (i == 0 && j == 0) w = spinBox; else w = SetTabOrder(this, w, spinBox); } } for (int i = 0; i < count; i++) { ui.XaosTable->setHorizontalHeaderItem(i, new QTableWidgetItem("F" + QString::number(i + 1))); ui.XaosTable->setVerticalHeaderItem(i, new QTableWidgetItem("T" + QString::number(i + 1))); ui.XaosTable->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents); ui.XaosTable->verticalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents); } ui.XaosTable->resizeRowsToContents(); ui.XaosTable->resizeColumnsToContents(); w = SetTabOrder(this, w, ui.ClearXaosButton); w = SetTabOrder(this, w, ui.RandomXaosButton); ui.XaosTable->blockSignals(false); } /// /// Clear all xaos from the current ember. /// template void FractoriumEmberController::ClearXaos() { Update([&] { m_Ember.ClearXaos(); }); FillXaos(); } void Fractorium::OnClearXaosButtonClicked(bool checked) { m_Controller->ClearXaos(); } /// /// Set all xaos values to random numbers. /// There is a 50% chance they're set to 0 or 1, and /// 50% that they're 0-3. /// Resets the rendering process. /// template void FractoriumEmberController::RandomXaos() { Update([&] { for (size_t i = 0; i < m_Ember.XformCount(); i++) { if (auto* xform = m_Ember.GetXform(i)) { for (size_t j = 0; j < m_Ember.XformCount(); j++) { if (m_Rand.RandBit()) xform->SetXaos(j, T(m_Rand.RandBit())); else xform->SetXaos(j, m_Rand.Frand(0, 3)); } } } }); FillXaos(); } void Fractorium::OnRandomXaosButtonClicked(bool checked) { m_Controller->RandomXaos(); } /// /// Toggle all xaos values in one row. /// Resets the rendering process. /// /// The index of the row that was double clicked void Fractorium::OnXaosRowDoubleClicked(int logicalIndex) { ToggleTableRow(ui.XaosTable, logicalIndex); } /// /// Toggle all xaos values in one column. /// Resets the rendering process. /// /// The index of the column that was double clicked void Fractorium::OnXaosColDoubleClicked(int logicalIndex) { ToggleTableCol(ui.XaosTable, logicalIndex); } template class FractoriumEmberController; #ifdef DO_DOUBLE template class FractoriumEmberController; #endif