From e16c6a825f3996ed3117036b7a9765b117f9e2e5 Mon Sep 17 00:00:00 2001 From: mfeemster Date: Thu, 23 Jul 2015 18:16:36 -0700 Subject: [PATCH] --User changes -Add variations filter/selection dialog. --Bug fixes -Fix summary window not properly indicating the presence of pose affine. -Remove a file named Fractorium.aps which had been erroneously committed a year ago. --Code changes -Use qobject_cast instead of dynamic_cast where appropriate. -Add more override keyword where appropriate. -Add variations list to settings for filter dialog. --- Builds/MSVC/VS2013/Fractorium.vcxproj | 72 ++++++ Builds/MSVC/VS2013/Fractorium.vcxproj.filters | 21 ++ Builds/QtCreator/Fractorium/Fractorium.pro | 5 +- Source/Ember/EmberMotion.h | 4 +- Source/Fractorium/FinalRenderDialog.cpp | 2 +- Source/Fractorium/FinalRenderDialog.h | 6 +- Source/Fractorium/Fractorium.aps | Bin 158048 -> 0 bytes Source/Fractorium/Fractorium.cpp | 14 +- Source/Fractorium/Fractorium.h | 6 + Source/Fractorium/Fractorium.qrc | 3 +- Source/Fractorium/Fractorium.ui | 13 + .../Fractorium/FractoriumEmberController.cpp | 2 +- Source/Fractorium/FractoriumEmberController.h | 2 + Source/Fractorium/FractoriumInfo.cpp | 1 + Source/Fractorium/FractoriumLibrary.cpp | 2 +- Source/Fractorium/FractoriumSettings.cpp | 5 +- Source/Fractorium/FractoriumSettings.h | 5 + Source/Fractorium/FractoriumXaos.cpp | 2 +- Source/Fractorium/FractoriumXformsSelect.cpp | 4 +- .../Fractorium/FractoriumXformsVariations.cpp | 82 ++++-- Source/Fractorium/Icons/table_gear.png | Bin 0 -> 644 bytes Source/Fractorium/OptionsDialog.h | 4 +- Source/Fractorium/VariationsDialog.cpp | 242 ++++++++++++++++++ Source/Fractorium/VariationsDialog.h | 47 ++++ Source/Fractorium/VariationsDialog.ui | 162 ++++++++++++ 25 files changed, 668 insertions(+), 38 deletions(-) delete mode 100644 Source/Fractorium/Fractorium.aps create mode 100644 Source/Fractorium/Icons/table_gear.png create mode 100644 Source/Fractorium/VariationsDialog.cpp create mode 100644 Source/Fractorium/VariationsDialog.h create mode 100644 Source/Fractorium/VariationsDialog.ui 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 2c2f8b4ec9af953520e4b07dbe3a2efd3696f3d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158048 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%0A;Yd@>QTtBE7}g7 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 (Q<{VfQmXM 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

RQtW-Q?Fcne#@&zhfdd&g>^>k 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 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 0000000000000000000000000000000000000000..eda9532e86f0f6e44907ecc3fcef2cbc707f6cd0 GIT binary patch literal 644 zcmV-~0(pF7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHD!e|WdHyI0!c(cR5(wiQp?NXVHAFAcC(!SPO-GGV8K$2P>7OHhWOlzh{*kZ zP2^HSvSU)pLavR?oO#dr<}+$Gra5&wzs~P{p7Wdw1AzZ>R;^aQRw|Y6<#HK{#UkYM zdB|ikkV>T>nM^`F9*1Z&3gK`V0)YT{yNnO$ws3A zTn(wn<#LctrymL;k;p>U539{KNC2O_XOO9_%Cet4R zl=?w{hOInXtJR{2t>SPGhXd&KdQ80&BoYa@Ua!z>Ht8{XyWNIPr$gTe#D7SPMHY(% z%_0~Kej|cdEC!d$g#c*XZkHk&f>)~*)a!KuE|*KdnayT1Fc=J=)9F4lobdU4hF-7t zmm_dGodOn7tJPpM8mW!JU;s9o?Ty!9EEEdC>2#tb+Hg3e`0;SJ+hHZjq467l&1OTZ z##u1G-%kVxe0JPBUgdhd2DjS{{eGVu3Fh-TMX^{6jGrYDjK^cDFqup!-tTu9jYb5* z149y*%LTZ09IjLk=C={?@97@yCs=EpN|Mo4Yq?oREz`X1R#^iJ~4;G z(Xm>s7qi(+L&AQwS}mwlD$r;&AdyHwsZ`SH@PHHw1&BnVp8|oP$b~XGhF4rJmxE9! e +/// 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 + + + + +