diff --git a/Builds/MSVC/VS2013/Fractorium.vcxproj b/Builds/MSVC/VS2013/Fractorium.vcxproj
index d23e04d..5170ca0 100644
--- a/Builds/MSVC/VS2013/Fractorium.vcxproj
+++ b/Builds/MSVC/VS2013/Fractorium.vcxproj
@@ -343,6 +343,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"
Create
Create
+
true
true
@@ -421,6 +422,12 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"
true
true
+
+ true
+ true
+ true
+ true
+
@@ -513,6 +520,12 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"
true
true
+
+ true
+ true
+ true
+ true
+
true
true
@@ -591,8 +604,41 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"
true
true
+
+ true
+ true
+ true
+ true
+
+
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing VariationsDialog.h...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\."
+
+
$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)
Moc%27ing OptionsDialog.h...
@@ -1207,6 +1253,32 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"
+
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+
diff --git a/Builds/MSVC/VS2013/Fractorium.vcxproj.filters b/Builds/MSVC/VS2013/Fractorium.vcxproj.filters
index 7729f24..c17006a 100644
--- a/Builds/MSVC/VS2013/Fractorium.vcxproj.filters
+++ b/Builds/MSVC/VS2013/Fractorium.vcxproj.filters
@@ -256,6 +256,18 @@
Generated Files\ReleaseNvidia
+
+ Dialogs
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\ReleaseNvidia
+
@@ -300,6 +312,9 @@
Widgets
+
+ Generated Files
+
@@ -362,6 +377,12 @@
Widgets
+
+ Form Files
+
+
+ Dialogs
+
diff --git a/Builds/QtCreator/Fractorium/Fractorium.pro b/Builds/QtCreator/Fractorium/Fractorium.pro
index 486cae4..4d30cee 100644
--- a/Builds/QtCreator/Fractorium/Fractorium.pro
+++ b/Builds/QtCreator/Fractorium/Fractorium.pro
@@ -47,6 +47,7 @@ SOURCES += \
../../../Source/Fractorium/GLWidget.cpp \
../../../Source/Fractorium/Main.cpp \
../../../Source/Fractorium/OptionsDialog.cpp \
+ ../../../Source/Fractorium/VariationsDialog.cpp \
../../../Source/Fractorium/SpinBox.cpp
HEADERS += \
@@ -75,12 +76,14 @@ HEADERS += \
../../../Source/EmberCommon/EmberCommonPch.h \
../../../Source/Fractorium/FractoriumCommon.h \
../../../Source/Fractorium/DoubleSpinBoxTableItemDelegate.h \
- ../../../Source/Fractorium/PaletteTableWidgetItem.h
+ ../../../Source/Fractorium/PaletteTableWidgetItem.h \
+ ../../../Source/Fractorium/VariationsDialog.h
FORMS += \
../../../Source/Fractorium/AboutDialog.ui \
../../../Source/Fractorium/FinalRenderDialog.ui \
../../../Source/Fractorium/Fractorium.ui \
+ ../../../Source/Fractorium/VariationsDialog.ui \
../../../Source/Fractorium/OptionsDialog.ui
OTHER_FILES += \
diff --git a/Source/Ember/EmberMotion.h b/Source/Ember/EmberMotion.h
index eb101b6..f3ae001 100644
--- a/Source/Ember/EmberMotion.h
+++ b/Source/Ember/EmberMotion.h
@@ -70,8 +70,8 @@ public:
template
MotionParam &operator = (const MotionParam& other)
{
- first = other.first;
- second = T(other.second);
+ this->first = other.first;
+ this->second = T(other.second);
return *this;
}
diff --git a/Source/Fractorium/FinalRenderDialog.cpp b/Source/Fractorium/FinalRenderDialog.cpp
index 4ecd453..5fa02bd 100644
--- a/Source/Fractorium/FinalRenderDialog.cpp
+++ b/Source/Fractorium/FinalRenderDialog.cpp
@@ -21,7 +21,7 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set
QTableWidget* table = ui.FinalRenderParamsTable;
QTableWidgetItem* item = nullptr;
- m_Fractorium = dynamic_cast(p);
+ m_Fractorium = qobject_cast(p);
m_Settings = settings;
ui.FinalRenderThreadCountSpin->setRange(1, Timing::ProcessorCount());
connect(ui.FinalRenderEarlyClipCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnEarlyClipCheckBoxStateChanged(int)), Qt::QueuedConnection);
diff --git a/Source/Fractorium/FinalRenderDialog.h b/Source/Fractorium/FinalRenderDialog.h
index 732febc..57f1eb5 100644
--- a/Source/Fractorium/FinalRenderDialog.h
+++ b/Source/Fractorium/FinalRenderDialog.h
@@ -77,7 +77,7 @@ public:
uint Strips();
FinalRenderGuiState State();
-public Q_SLOTS:
+public slots:
void MoveCursorToEnd();
void OnEarlyClipCheckBoxStateChanged(int state);
void OnYAxisUpCheckBoxStateChanged(int state);
@@ -104,10 +104,10 @@ public Q_SLOTS:
void OnFinalRenderSuffixChanged(const QString& s);
void OnRenderClicked(bool checked);
void OnCancelRenderClicked(bool checked);
+ virtual void reject() override;
protected:
- virtual void reject();
- virtual void showEvent(QShowEvent* e);
+ virtual void showEvent(QShowEvent* e) override;
private:
bool CreateControllerFromGUI(bool createRenderer);
diff --git a/Source/Fractorium/Fractorium.aps b/Source/Fractorium/Fractorium.aps
deleted file mode 100644
index 2c2f8b4..0000000
Binary files a/Source/Fractorium/Fractorium.aps and /dev/null differ
diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp
index d47e530..5dbef14 100644
--- a/Source/Fractorium/Fractorium.cpp
+++ b/Source/Fractorium/Fractorium.cpp
@@ -51,6 +51,7 @@ Fractorium::Fractorium(QWidget* p)
m_FolderDialog = nullptr;
m_FinalRenderDialog = new FractoriumFinalRenderDialog(m_Settings, this);
m_OptionsDialog = new FractoriumOptionsDialog(m_Settings, this);
+ m_VarDialog = new FractoriumVariationsDialog(m_Settings, this);
m_AboutDialog = new FractoriumAboutDialog(this);
//Put the about dialog in the screen center.
@@ -198,6 +199,7 @@ Fractorium::Fractorium(QWidget* p)
///
Fractorium::~Fractorium()
{
+ m_VarDialog->SyncSettings();
m_Settings->setValue("windowState", saveState());
m_Settings->sync();
}
@@ -776,13 +778,13 @@ void Fractorium::ToggleTableRow(QTableView* table, int logicalIndex)
auto model = table->model();
int cols = model->columnCount();
bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier);
- auto tableWidget = dynamic_cast(table);
+ auto tableWidget = qobject_cast(table);
if (tableWidget)
{
for (int i = 0; i < cols; i++)
{
- if (auto* spinBox = dynamic_cast(tableWidget->cellWidget(logicalIndex, i)))
+ if (auto* spinBox = qobject_cast(tableWidget->cellWidget(logicalIndex, i)))
{
if (!IsNearZero(spinBox->value()))
{
@@ -798,7 +800,7 @@ void Fractorium::ToggleTableRow(QTableView* table, int logicalIndex)
double val = allZero ? 1.0 : 0.0;
for (int i = 0; i < cols; i++)
- if (auto* spinBox = dynamic_cast(tableWidget->cellWidget(logicalIndex, i)))
+ if (auto* spinBox = qobject_cast(tableWidget->cellWidget(logicalIndex, i)))
spinBox->setValue(val);
}
else
@@ -838,13 +840,13 @@ void Fractorium::ToggleTableCol(QTableView* table, int logicalIndex)
int rows = model->rowCount();
bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier);
- auto tableWidget = dynamic_cast(table);
+ auto tableWidget = qobject_cast(table);
if (tableWidget)
{
for (int i = 0; i < rows; i++)
{
- if (auto* spinBox = dynamic_cast(tableWidget->cellWidget(i, logicalIndex)))
+ if (auto* spinBox = qobject_cast(tableWidget->cellWidget(i, logicalIndex)))
{
if (!IsNearZero(spinBox->value()))
{
@@ -860,7 +862,7 @@ void Fractorium::ToggleTableCol(QTableView* table, int logicalIndex)
double val = allZero ? 1.0 : 0.0;
for (int i = 0; i < rows; i++)
- if (auto* spinBox = dynamic_cast(tableWidget->cellWidget(i, logicalIndex)))
+ if (auto* spinBox = qobject_cast(tableWidget->cellWidget(i, logicalIndex)))
spinBox->setValue(val);
}
else
diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h
index 9f5fc9f..d311b68 100644
--- a/Source/Fractorium/Fractorium.h
+++ b/Source/Fractorium/Fractorium.h
@@ -9,6 +9,7 @@
#include "TableWidget.h"
#include "FinalRenderDialog.h"
#include "OptionsDialog.h"
+#include "VariationsDialog.h"
#include "AboutDialog.h"
#include "CurvesGraphicsView.h"
#include "DoubleSpinBoxTableItemDelegate.h"
@@ -19,6 +20,7 @@
class GLWidget;
class FractoriumOptionsDialog;
+class FractoriumVariationsDialog;
class FractoriumFinalRenderDialog;
class FractoriumAboutDialog;
class GLEmberControllerBase;
@@ -138,6 +140,7 @@ public slots:
void OnActionFinalRender(bool checked);
void OnFinalRenderClose(int result);
void OnActionOptions(bool checked);
+ void OnActionVariationsDialog(bool checked);
void OnActionAbout(bool checked);//Help.
@@ -333,6 +336,8 @@ private:
//Xforms Affine.
//Xforms Variations.
+ void Filter();
+ void Filter(const QString& text);
//Xforms Selection.
void ClearXformsSelections();
@@ -364,6 +369,7 @@ private:
QColorDialog* m_ColorDialog;
FractoriumFinalRenderDialog* m_FinalRenderDialog;
FractoriumOptionsDialog* m_OptionsDialog;
+ FractoriumVariationsDialog* m_VarDialog;
FractoriumAboutDialog* m_AboutDialog;
//Params.
diff --git a/Source/Fractorium/Fractorium.qrc b/Source/Fractorium/Fractorium.qrc
index 7aa53a3..d73965c 100644
--- a/Source/Fractorium/Fractorium.qrc
+++ b/Source/Fractorium/Fractorium.qrc
@@ -38,10 +38,11 @@
Icons/infomation.png
Icons/del.png
Icons/add.png
- Icons/link-add.png
+ Icons/link-add.png
Icons/eraser.png
Icons/editraise.png
Icons/square.png
Icons/cube.png
+ Icons/table_gear.png
diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui
index d2af808..763b6b6 100644
--- a/Source/Fractorium/Fractorium.ui
+++ b/Source/Fractorium/Fractorium.ui
@@ -6198,6 +6198,7 @@ SpinBox
+
@@ -6528,6 +6529,18 @@ SpinBox
&Reset Workspace
+
+
+
+ :/Fractorium/Icons/table_gear.png:/Fractorium/Icons/table_gear.png
+
+
+ Variations
+
+
+ Show variations filter window
+
+
diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp
index 76774bb..a7f0e55 100644
--- a/Source/Fractorium/FractoriumEmberController.cpp
+++ b/Source/Fractorium/FractoriumEmberController.cpp
@@ -256,7 +256,7 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu
{
if (QLayoutItem* child = m_Fractorium->m_XformsSelectionLayout->itemAt(i))
{
- if (auto* w = dynamic_cast(child->widget()))
+ if (auto* w = qobject_cast(child->widget()))
{
if (w->isChecked())
{
diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h
index 07f7207..8b7bff4 100644
--- a/Source/Fractorium/FractoriumEmberController.h
+++ b/Source/Fractorium/FractoriumEmberController.h
@@ -181,6 +181,7 @@ public:
virtual QColor ColorIndexToQColor(double d) { return QColor(); }
//Xforms Variations.
+ virtual void Filter(const QString& text) { }
virtual void SetupVariationTree() { }
virtual void ClearVariationsTree() { }
virtual void VariationSpinBoxValueChanged(double d) { }
@@ -418,6 +419,7 @@ public:
void FillColorWithXform(Xform* xform);
//Xforms Variations.
+ virtual void Filter(const QString& text) override;
virtual void SetupVariationTree() override;
virtual void ClearVariationsTree() override;
virtual void VariationSpinBoxValueChanged(double d) override;
diff --git a/Source/Fractorium/FractoriumInfo.cpp b/Source/Fractorium/FractoriumInfo.cpp
index 6066c02..69374a3 100644
--- a/Source/Fractorium/FractoriumInfo.cpp
+++ b/Source/Fractorium/FractoriumInfo.cpp
@@ -107,6 +107,7 @@ void FractoriumEmberController::FillSummary()
QString linked = (linkedIndex != -1) ? (" Linked to " + QString::number(linkedIndex + 1)) : "";
auto index = m_Ember.GetXformIndex(xform);
m_Ember.CalcNormalizedWeights(m_NormalizedWeights);
+ xform->SetPrecalcFlags();//Needed for HasPost() below.
if (!m_Ember.IsFinalXform(xform) && index != -1)
{
diff --git a/Source/Fractorium/FractoriumLibrary.cpp b/Source/Fractorium/FractoriumLibrary.cpp
index b780518..592d846 100644
--- a/Source/Fractorium/FractoriumLibrary.cpp
+++ b/Source/Fractorium/FractoriumLibrary.cpp
@@ -230,7 +230,7 @@ void FractoriumEmberController::EmberTreeItemChanged(QTreeWidgetItem* item, i
tree->blockSignals(false);
FillSummary();
}
- else if (QTreeWidgetItem* parentItem = dynamic_cast(item))
+ else if (auto parentItem = dynamic_cast(item))
{
QString text = parentItem->text(0);
diff --git a/Source/Fractorium/FractoriumSettings.cpp b/Source/Fractorium/FractoriumSettings.cpp
index 2770861..227f61e 100644
--- a/Source/Fractorium/FractoriumSettings.cpp
+++ b/Source/Fractorium/FractoriumSettings.cpp
@@ -249,4 +249,7 @@ QString FractoriumSettings::SaveImageExt() { return value(SAVEIMAGEEXT).to
void FractoriumSettings::SaveImageExt(const QString& s) { setValue(SAVEIMAGEEXT, s); }
bool FractoriumSettings::SaveAutoUnique() { return value(AUTOUNIQUE).toBool(); }
-void FractoriumSettings::SaveAutoUnique(bool b) { setValue(AUTOUNIQUE, b); }
\ No newline at end of file
+void FractoriumSettings::SaveAutoUnique(bool b) { setValue(AUTOUNIQUE, b); }
+
+QMap FractoriumSettings::Variations() { return value(UIVARIATIONS).toMap(); }
+void FractoriumSettings::Variations(const QMap& m) { setValue(UIVARIATIONS, m); }
\ No newline at end of file
diff --git a/Source/Fractorium/FractoriumSettings.h b/Source/Fractorium/FractoriumSettings.h
index 35ec9cc..7c2e250 100644
--- a/Source/Fractorium/FractoriumSettings.h
+++ b/Source/Fractorium/FractoriumSettings.h
@@ -60,6 +60,8 @@
#define IDENTITYURL "identity/url"
#define IDENTITYNICK "identity/nick"
+#define UIVARIATIONS "ui/variations"
+
///
/// Class for preserving various program options between
/// runs of Fractorium. Each of these generally corresponds
@@ -209,4 +211,7 @@ public:
QString Nick();
void Nick(const QString& s);
+
+ QMap Variations();
+ void Variations(const QMap& m);
};
diff --git a/Source/Fractorium/FractoriumXaos.cpp b/Source/Fractorium/FractoriumXaos.cpp
index 3235056..a9066ff 100644
--- a/Source/Fractorium/FractoriumXaos.cpp
+++ b/Source/Fractorium/FractoriumXaos.cpp
@@ -97,7 +97,7 @@ void FractoriumEmberController::XaosChanged(int x, int y, double val)
void Fractorium::OnXaosChanged(double d)
{
- if (auto* senderSpinBox = dynamic_cast(this->sender()))
+ if (auto* senderSpinBox = qobject_cast(this->sender()))
{
auto p = senderSpinBox->property("tableindex").toPoint();
diff --git a/Source/Fractorium/FractoriumXformsSelect.cpp b/Source/Fractorium/FractoriumXformsSelect.cpp
index 3b1e2cc..1072e53 100644
--- a/Source/Fractorium/FractoriumXformsSelect.cpp
+++ b/Source/Fractorium/FractoriumXformsSelect.cpp
@@ -77,7 +77,7 @@ void Fractorium::ForEachXformCheckbox(std::function func)
while (QLayoutItem* child = m_XformsSelectionLayout->itemAt(i))
{
- if (auto* w = dynamic_cast(child->widget()))
+ if (auto* w = qobject_cast(child->widget()))
{
func(i, w);
}
@@ -97,7 +97,7 @@ bool FractoriumEmberController::XformCheckboxAt(int i, std::functionm_XformsSelectionLayout->itemAt(i))
{
- if (auto* w = dynamic_cast(child->widget()))
+ if (auto* w = qobject_cast(child->widget()))
{
func(w);
return true;
diff --git a/Source/Fractorium/FractoriumXformsVariations.cpp b/Source/Fractorium/FractoriumXformsVariations.cpp
index 02843e3..1fddc41 100644
--- a/Source/Fractorium/FractoriumXformsVariations.cpp
+++ b/Source/Fractorium/FractoriumXformsVariations.cpp
@@ -13,12 +13,70 @@ void Fractorium::InitXformsVariationsUI()
connect(tree->header(), SIGNAL(sectionClicked(int)), this, SLOT(OnTreeHeaderSectionClicked(int)));
connect(ui.VariationsFilterLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnVariationsFilterLineEditTextChanged(const QString&)));
connect(ui.VariationsFilterClearButton, SIGNAL(clicked(bool)), this, SLOT(OnVariationsFilterClearButtonClicked(bool)));
+ connect(ui.ActionVariationsDialog, SIGNAL(triggered(bool)), this, SLOT(OnActionVariationsDialog(bool)), Qt::QueuedConnection);
//Setting dimensions in the designer with a layout is futile, so must hard code here.
tree->setColumnWidth(0, 160);
tree->setColumnWidth(1, 23);
}
+///
+/// Show the variations filter dialog.
+///
+/// Ignored
+void Fractorium::OnActionVariationsDialog(bool checked)
+{
+ if (m_VarDialog->exec())
+ Filter();
+}
+
+///
+/// Apply the text passed in, in conjuction with the selections from
+/// the variations filter dialog to only show variations whose names
+/// contain the substring and are selected.
+/// Called when the user types in the variation filter text box and
+/// when the variations dialog exits.
+///
+/// The text to filter on
+template
+void FractoriumEmberController::Filter(const QString& text)
+{
+ auto& ids = m_Fractorium->m_VarDialog->Map();
+ auto tree = m_Fractorium->ui.VariationsTree;
+ auto xform = CurrentXform();
+
+ tree->setUpdatesEnabled(false);
+
+ for (uint i = 0; i < uint(tree->topLevelItemCount()); i++)
+ {
+ if (auto item = dynamic_cast(tree->topLevelItem(i)))
+ {
+ auto varName = item->text(0);
+
+ if (xform && xform->GetVariationById(item->Id()))//If it's present then show it no matter what the filter is.
+ {
+ item->setHidden(false);
+ }
+ else if (ids.contains(varName))//If the varation is the map of all variations, which is should always be, consider it as well as the filter text.
+ {
+ item->setHidden(!varName.contains(text, Qt::CaseInsensitive) || !ids[varName].toBool());
+ }
+ else//Wasn't present, which should never happen, so just consider filter text.
+ {
+ item->setHidden(!varName.contains(text, Qt::CaseInsensitive));
+ }
+ }
+ }
+
+ m_Fractorium->OnTreeHeaderSectionClicked(m_Fractorium->m_VarSortMode);//Must re-sort every time the filter changes.
+ tree->setUpdatesEnabled(true);
+}
+
+void Fractorium::Filter()
+{
+ m_Controller->Filter(ui.VariationsFilterLineEdit->text());
+}
+
///
/// Dynamically populate the variation tree widget with VariationTreeWidgetItem and VariationTreeDoubleSpinBox
/// templated with the correct type.
@@ -33,7 +91,7 @@ void FractoriumEmberController::SetupVariationTree()
QSize hint0(75, 16);
QSize hint1(30, 16);
auto tree = m_Fractorium->ui.VariationsTree;
-
+
tree->clear();
tree->blockSignals(true);
@@ -85,7 +143,7 @@ void FractoriumEmberController::SetupVariationTree()
varSpinBox->Step(1);
varSpinBox->SmallStep(1);
}
-
+
varSpinBox->setDecimals(4);
tree->setItemWidget(paramWidget, 1, varSpinBox);
m_Fractorium->connect(varSpinBox, SIGNAL(valueChanged(double)), SLOT(OnVariationSpinBoxValueChanged(double)), Qt::QueuedConnection);
@@ -94,6 +152,7 @@ void FractoriumEmberController::SetupVariationTree()
}
}
+ Filter("");
tree->blockSignals(false);
}
@@ -223,6 +282,7 @@ void FractoriumEmberController::FillVariationTreeWithXform(Xform* xform)
auto tree = m_Fractorium->ui.VariationsTree;
tree->blockSignals(true);
+ m_Fractorium->Filter();
for (uint i = 0; i < tree->topLevelItemCount(); i++)
{
@@ -233,6 +293,9 @@ void FractoriumEmberController::FillVariationTreeWithXform(Xform* xform)
if (auto spinBox = dynamic_cast(tree->itemWidget(item, 1)))//Get the widget for the item, and cast the widget to the VariationTreeDoubleSpinBox type.
{
+ if (var)//Ensure it's visible, even if it's supposed to be filtered.
+ item->setHidden(false);
+
spinBox->SetValueStealth(var ? var->m_Weight : 0);//If the variation was present, set the spin box to its weight, else zero.
item->setBackgroundColor(0, var ? QColor(200, 200, 200) : QColor(255, 255, 255));//Ensure background is always white if the value goes to zero, else gray if var present.
@@ -290,20 +353,7 @@ void Fractorium::OnTreeHeaderSectionClicked(int logicalIndex)
/// The text to filter on
void Fractorium::OnVariationsFilterLineEditTextChanged(const QString& text)
{
- QTreeWidget* tree = ui.VariationsTree;
-
- tree->setUpdatesEnabled(false);
-
- for (uint i = 0; i < uint(tree->topLevelItemCount()); i++)
- {
- QTreeWidgetItem* item = tree->topLevelItem(i);
- QString varName = item->text(0);
-
- item->setHidden(!varName.contains(text, Qt::CaseInsensitive));
- }
-
- OnTreeHeaderSectionClicked(m_VarSortMode);//Must re-sort every time the filter changes.
- tree->setUpdatesEnabled(true);
+ Filter();
}
///
diff --git a/Source/Fractorium/Icons/table_gear.png b/Source/Fractorium/Icons/table_gear.png
new file mode 100644
index 0000000..eda9532
Binary files /dev/null and b/Source/Fractorium/Icons/table_gear.png differ
diff --git a/Source/Fractorium/OptionsDialog.h b/Source/Fractorium/OptionsDialog.h
index 6385fd7..de74bb1 100644
--- a/Source/Fractorium/OptionsDialog.h
+++ b/Source/Fractorium/OptionsDialog.h
@@ -29,8 +29,8 @@ public:
public slots:
void OnOpenCLCheckBoxStateChanged(int state);
void OnPlatformComboCurrentIndexChanged(int index);
- virtual void accept();
- virtual void reject();
+ virtual void accept() override;
+ virtual void reject() override;
private:
bool EarlyClip();
diff --git a/Source/Fractorium/VariationsDialog.cpp b/Source/Fractorium/VariationsDialog.cpp
new file mode 100644
index 0000000..5092d7c
--- /dev/null
+++ b/Source/Fractorium/VariationsDialog.cpp
@@ -0,0 +1,242 @@
+#include "FractoriumPch.h"
+#include "VariationsDialog.h"
+
+///
+/// Constructor that takes a parent widget and passes it to the base, then
+/// sets up the GUI.
+///
+/// Pointer to the global settings object to use
+/// The parent widget. Default: nullptr.
+/// The window flags. Default: 0.
+FractoriumVariationsDialog::FractoriumVariationsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f)
+ : QDialog(p, f),
+ m_Settings(settings)
+{
+ ui.setupUi(this);
+
+ auto table = ui.VariationsTable;
+
+ m_Vars = m_Settings->Variations();
+ Populate();
+ OnSelectAllButtonClicked(true);
+ table->verticalHeader()->setSectionsClickable(true);
+ table->horizontalHeader()->setSectionsClickable(true);
+ table->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+ connect(table, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(OnVariationsTableItemChanged(QTableWidgetItem*)), Qt::QueuedConnection);
+ connect(ui.SelectAllButton, SIGNAL(clicked(bool)), this, SLOT(OnSelectAllButtonClicked(bool)), Qt::QueuedConnection);
+ connect(ui.InvertSelectionButton, SIGNAL(clicked(bool)), this, SLOT(OnInvertSelectionButtonClicked(bool)), Qt::QueuedConnection);
+ connect(ui.SelectNoneButton, SIGNAL(clicked(bool)), this, SLOT(OnSelectNoneButtonClicked(bool)), Qt::QueuedConnection);
+ connect(ui.ButtonBox, SIGNAL(accepted()), this, SLOT(Accept()));
+}
+
+///
+/// Copy the values of the checkboxes to the map.
+///
+void FractoriumVariationsDialog::SyncSettings()
+{
+ QMap m;
+
+ ForEachCell([&](QTableWidgetItem* cb)
+ {
+ if (!cb->text().isEmpty())
+ m[cb->text()] = cb->checkState() == Qt::CheckState::Checked;
+ });
+
+ m_Settings->Variations(m);
+}
+
+///
+/// A wrapper to iterate over every table widget item and perform the passed in function on it.
+///
+/// Function to call on each object
+void FractoriumVariationsDialog::ForEachCell(std::function func)
+{
+ auto table = ui.VariationsTable;
+ auto rows = table->rowCount();
+ auto cols = table->columnCount();
+
+ table->model()->blockSignals(true);
+
+ for (auto row = 0; row < rows; row++)
+ for (auto col = 0; col < cols; col++)
+ if (auto cb = table->item(row, col))
+ func(cb);
+
+ table->model()->blockSignals(false);
+ table->model()->layoutChanged();
+}
+
+///
+/// A wrapper to iterate over every selected table widget item and perform the passed in function on it.
+///
+/// Function to call on each object
+void FractoriumVariationsDialog::ForEachSelectedCell(std::function func)
+{
+ auto table = ui.VariationsTable;
+ QList selectedItems = table->selectedItems();
+
+ table->model()->blockSignals(true);
+
+ foreach(QTableWidgetItem* item, selectedItems)
+ if (item)
+ func(item);
+
+ table->model()->blockSignals(false);
+ table->model()->layoutChanged();
+}
+
+///
+/// Check all of the checkboxes.
+///
+/// Ignored
+void FractoriumVariationsDialog::OnSelectAllButtonClicked(bool checked)
+{
+ ForEachCell([&](QTableWidgetItem* cb) { cb->setCheckState(Qt::CheckState::Checked); });
+}
+
+///
+/// Invert the selection state of the checkboxes.
+///
+/// Ignored
+void FractoriumVariationsDialog::OnInvertSelectionButtonClicked(bool checked)
+{
+ ForEachCell([&](QTableWidgetItem* cb)
+ {
+ if (cb->checkState() != Qt::CheckState::Checked)
+ cb->setCheckState(Qt::CheckState::Checked);
+ else
+ cb->setCheckState(Qt::CheckState::Unchecked);
+ });
+}
+
+///
+/// Uncheck all of the checkboxes.
+///
+/// Ignored
+void FractoriumVariationsDialog::OnSelectNoneButtonClicked(bool checked)
+{
+ ForEachCell([&](QTableWidgetItem* cb) { cb->setCheckState(Qt::CheckState::Unchecked); });
+}
+
+///
+/// Create all checkboxes and check them according to the map.
+///
+void FractoriumVariationsDialog::Populate()
+{
+ auto table = ui.VariationsTable;
+ auto size = std::max(std::max(m_VariationList.RegSize(), m_VariationList.PreSize()), m_VariationList.PostSize());
+
+ table->setRowCount(size);
+
+ for (size_t i = 0; i < size; i++)
+ {
+ if (auto pre = m_VariationList.GetVariation(i, eVariationType::VARTYPE_PRE))
+ {
+ auto cb = new QTableWidgetItem(pre->Name().c_str());
+ table->setItem(i, 0, cb);
+ SetCheckFromMap(cb, pre);
+ }
+
+ if (auto reg = m_VariationList.GetVariation(i, eVariationType::VARTYPE_REG))
+ {
+ auto cb = new QTableWidgetItem(reg->Name().c_str());
+ table->setItem(i, 1, cb);
+ SetCheckFromMap(cb, reg);
+ }
+
+ if (auto post = m_VariationList.GetVariation(i, eVariationType::VARTYPE_POST))
+ {
+ auto cb = new QTableWidgetItem(post->Name().c_str());
+ table->setItem(i, 2, cb);
+ SetCheckFromMap(cb, post);
+ }
+ }
+}
+
+///
+/// Called when a checkbox changes state.
+/// There is a slight hack here to apply the change to all selected checkboxes
+/// if ctrl is pressed.
+/// Otherwise it will only apply to the checkbox that was clicked.
+///
+///
+void FractoriumVariationsDialog::OnVariationsTableItemChanged(QTableWidgetItem* item)
+{
+ bool ctrl = QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier);
+
+ if (ctrl)
+ ForEachSelectedCell([&](QTableWidgetItem* cb) { cb->setCheckState(item->checkState()); });
+}
+
+///
+/// Called when the user clicks ok.
+/// Copy the state of the checkboxes to the map.
+///
+void FractoriumVariationsDialog::Accept()
+{
+ CheckBoxesToMap();
+}
+
+///
+/// Return a const reference to the map.
+/// This will contains the state of the checkboxes after
+/// the user clicks ok.
+///
+const QMap& FractoriumVariationsDialog::Map()
+{
+ return m_Vars;
+}
+
+///
+/// Copy the state of the map to the checkboxes and show the dialog.
+///
+/// Event, passed to base.
+void FractoriumVariationsDialog::showEvent(QShowEvent* e)
+{
+ MapToCheckBoxes();
+ QDialog::showEvent(e);
+}
+
+///
+/// Set the state of the passed in table item checkbox based on the boolean contained
+/// in the map for the passed in variation.
+///
+/// The checkbox to check
+/// That variation to be looked up in the map
+void FractoriumVariationsDialog::SetCheckFromMap(QTableWidgetItem* cb, const Variation* var)
+{
+ if (!m_Vars.contains(var->Name().c_str()))
+ {
+ cb->setCheckState(Qt::Checked);
+ }
+ else
+ {
+ bool chk = m_Vars[var->Name().c_str()].toBool();
+
+ cb->setCheckState(chk ? Qt::Checked : Qt::Unchecked);
+ }
+}
+
+///
+/// Copy the values in the map to the state of the checkboxes.
+///
+void FractoriumVariationsDialog::MapToCheckBoxes()
+{
+ ForEachCell([&](QTableWidgetItem* cb)
+ {
+ if (auto var = m_VariationList.GetVariation(cb->text().toStdString()))
+ SetCheckFromMap(cb, var);
+ });
+}
+
+///
+/// Copy the state of the checkboxes to the map.
+///
+void FractoriumVariationsDialog::CheckBoxesToMap()
+{
+ ForEachCell([&](QTableWidgetItem* cb)
+ {
+ if (auto var = m_VariationList.GetVariation(cb->text().toStdString()))
+ m_Vars[cb->text()] = (cb->checkState() == Qt::Checked);
+ });
+}
diff --git a/Source/Fractorium/VariationsDialog.h b/Source/Fractorium/VariationsDialog.h
new file mode 100644
index 0000000..cb3f337
--- /dev/null
+++ b/Source/Fractorium/VariationsDialog.h
@@ -0,0 +1,47 @@
+#pragma once
+
+#include "ui_VariationsDialog.h"
+#include "FractoriumSettings.h"
+
+///
+/// FractoriumVariationsDialog class.
+///
+
+///
+/// The variations filter dialog displays several columns
+/// with the different types of variations shown as checkboxes.
+/// This is used to filter the variations that are shown in the main window
+/// because the list is very long.
+/// The results are stored in a map and returned.
+/// These are used in conjunction with the filter edit box to filter what's shown.
+///
+class FractoriumVariationsDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ FractoriumVariationsDialog(FractoriumSettings* settings, QWidget* p = nullptr, Qt::WindowFlags f = nullptr);
+ const QMap& Map();
+ void ForEachCell(std::function func);
+ void ForEachSelectedCell(std::function func);
+ void SyncSettings();
+
+public slots:
+ void OnSelectAllButtonClicked(bool checked);
+ void OnInvertSelectionButtonClicked(bool checked);
+ void OnSelectNoneButtonClicked(bool checked);
+ void Accept();
+ void OnVariationsTableItemChanged(QTableWidgetItem* item);
+
+protected:
+ virtual void showEvent(QShowEvent* e) override;
+
+private:
+ void MapToCheckBoxes();
+ void CheckBoxesToMap();
+ void Populate();
+ void SetCheckFromMap(QTableWidgetItem* cb, const Variation* var);
+ VariationList m_VariationList;
+ QMap m_Vars;
+ FractoriumSettings* m_Settings;
+ Ui::VariationsDialog ui;
+};
diff --git a/Source/Fractorium/VariationsDialog.ui b/Source/Fractorium/VariationsDialog.ui
new file mode 100644
index 0000000..2da42a0
--- /dev/null
+++ b/Source/Fractorium/VariationsDialog.ui
@@ -0,0 +1,162 @@
+
+
+ VariationsDialog
+
+
+
+ 0
+ 0
+ 585
+ 517
+
+
+
+ Variations Filter
+
+
+
+ 5
+
+
+ 4
+
+
+ 5
+
+
+ 5
+
+
+ 4
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
+
+
+ false
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+ false
+
+
+ true
+
+
+ QAbstractItemView::ExtendedSelection
+
+
+ 3
+
+
+ true
+
+
+ true
+
+
+ 190
+
+
+ false
+
+
+ true
+
+
+ true
+
+
+ 19
+
+
+
+ Pre
+
+
+
+
+ Regular
+
+
+
+
+ Post
+
+
+
+
+ -
+
+
-
+
+
+ Select All
+
+
+
+ -
+
+
+ Invert Selection
+
+
+
+ -
+
+
+ Select None
+
+
+
+
+
+
+
+
+
+
+ ButtonBox
+ accepted()
+ VariationsDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ ButtonBox
+ rejected()
+ VariationsDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+