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 + + + + +