From 1fdebe6f0505acb3f63fbe543ac336c0060387a5 Mon Sep 17 00:00:00 2001 From: Michel Mastriani Date: Wed, 22 Jan 2020 20:24:15 -0300 Subject: [PATCH] --User changes -Add pre/post in Toolbar --- Source/Fractorium/Fractorium.cpp | 2 +- Source/Fractorium/Fractorium.h | 13 +- Source/Fractorium/Fractorium.qrc | 1 + Source/Fractorium/Fractorium.ui | 395 ++++++++++--------- Source/Fractorium/FractoriumMenus.cpp | 17 +- Source/Fractorium/FractoriumToolbar.cpp | 102 +++-- Source/Fractorium/FractoriumXformsAffine.cpp | 12 +- Source/Fractorium/GLWidget.cpp | 8 +- Source/Fractorium/Icons/grid.png | Bin 8150 -> 2329 bytes Source/Fractorium/Icons/pic.png | Bin 3401 -> 1939 bytes Source/Fractorium/Icons/reset_scale.png | Bin 0 -> 11235 bytes 11 files changed, 328 insertions(+), 222 deletions(-) mode change 100644 => 100755 Source/Fractorium/Icons/grid.png mode change 100644 => 100755 Source/Fractorium/Icons/pic.png create mode 100755 Source/Fractorium/Icons/reset_scale.png diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index 7f8419b..a75172c 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -234,7 +234,7 @@ Fractorium::~Fractorium() { SyncSequenceSettings(); m_VarDialog->SyncSettings(); - m_Settings->ShowXforms(ui.ActionDrawXforms->isChecked()); + m_Settings->ShowXforms(ui.ActionDrawPreAffines->isChecked() || ui.ActionDrawPostAffines->isChecked()); m_Settings->ShowGrid(ui.ActionDrawGrid->isChecked()); m_Settings->setValue("windowState", saveState()); m_Settings->sync(); diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index 1116193..51a6455 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -15,6 +15,11 @@ #include "DoubleSpinBoxTableItemDelegate.h" #include "PaletteEditor/PaletteEditor.h" +/// +/// An enum representing the type of edit being done. +/// +enum class eAffineState : int { PRE, ALL_PRE, POST, ALL_POST }; + /// /// Fractorium class. /// @@ -116,6 +121,8 @@ public: void CurrentXform(uint i); //Xforms Affine. + bool DrawPreAffines(); + bool DrawPostAffines(); bool DrawSelectedPre(); bool DrawAllPre(); bool DrawSelectedPost(); @@ -174,7 +181,8 @@ public slots: void OnActionDP(bool checked); void OnActionStyle(bool checked); void OnActionStartStopRenderer(bool checked); - void OnActionDrawXforms(bool checked); + void OnActionDrawAffines(bool checked); + void OnActionDrawAllAffines(bool checked); void OnActionDrawImage(bool checked); void OnActionDrawGrid(bool checked); @@ -412,6 +420,8 @@ private: bool HaveFinal(); //Toolbar. + void SaveAffineState(); + void SyncAffineStateToToolbar(); void SyncOptionsToToolbar(); //Library. @@ -592,6 +602,7 @@ private: QColor m_VariationTreeBgColorNonZero, m_VariationTreeBgColorZero; vector m_Docks; + bool m_PreviousAffineState[4]; int m_FontSize; int m_VarSortMode; int m_PaletteSortMode; diff --git a/Source/Fractorium/Fractorium.qrc b/Source/Fractorium/Fractorium.qrc index 667eb37..f8c2893 100644 --- a/Source/Fractorium/Fractorium.qrc +++ b/Source/Fractorium/Fractorium.qrc @@ -50,5 +50,6 @@ Icons/Function-512.png Icons/pic.png Icons/grid.png + Icons/reset_scale.png diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui index cf2c070..6d66ea7 100644 --- a/Source/Fractorium/Fractorium.ui +++ b/Source/Fractorium/Fractorium.ui @@ -80,8 +80,8 @@ 0 0 - 1277 - 985 + 1213 + 978 @@ -173,7 +173,7 @@ 0 0 230 - 934 + 928 @@ -263,30 +263,30 @@ false + + 35 + 145 false - - 35 - true false + + 22 + 22 false - - 22 - false @@ -453,7 +453,10 @@ false - true + false + + + 15 15 @@ -461,24 +464,21 @@ false - - 15 - true false + + 15 + 15 false - - 15 - Geometry @@ -534,7 +534,10 @@ false - true + false + + + 15 15 @@ -542,24 +545,21 @@ false - - 15 - true false + + 15 + 15 false - - 15 - Iteration @@ -631,35 +631,35 @@ false - true + false false + + 15 + 15 false - - 15 - true false + + 15 + 15 false - - 15 - Filter @@ -773,30 +773,30 @@ false + + 35 + 120 false - - 35 - true false + + 22 + 22 false - - 22 - false @@ -1123,30 +1123,30 @@ false + + 35 + 145 false - - 35 - true false + + 22 + 22 false - - 22 - false @@ -1297,7 +1297,10 @@ 1 - true + false + + + 15 15 @@ -1305,24 +1308,21 @@ false - - 15 - true false + + 15 + 15 false - - 15 - Animation @@ -1408,30 +1408,30 @@ false + + 35 + 145 false - - 35 - true false + + 22 + 22 false - - 22 - Interpolation @@ -1572,30 +1572,30 @@ false + + 35 + 120 false - - 35 - true false + + 22 + 22 false - - 22 - false @@ -1819,7 +1819,10 @@ false - true + false + + + 15 15 @@ -1827,24 +1830,21 @@ false - - 15 - true false + + 16 + 16 false - - 16 - Color @@ -1867,7 +1867,7 @@ 550 0 - 240 + 252 881 @@ -1879,8 +1879,8 @@ - 240 - 392 + 252 + 409 @@ -2093,27 +2093,27 @@ false + + 35 + 35 false - - 35 - false + + 22 + 22 false - - 22 - @@ -2211,30 +2211,30 @@ 0 - true + false false - + 35 - + 35 false - true + false false - + 22 - + 22 @@ -2290,14 +2290,17 @@ true + + 35 + 35 false - - 35 + + 22 22 @@ -2305,9 +2308,6 @@ false - - 22 - @@ -2370,8 +2370,8 @@ 0 0 - 285 - 675 + 389 + 690 @@ -2474,10 +2474,10 @@ false - + 62 - + 62 @@ -2486,15 +2486,15 @@ false + + 22 + 22 false - - 22 - @@ -2713,10 +2713,10 @@ false - + 20 - + 20 @@ -2825,15 +2825,15 @@ false + + 16 + 16 false - - 16 - false @@ -3059,8 +3059,8 @@ 0 0 - 291 - 876 + 277 + 880 @@ -3407,7 +3407,10 @@ 2 - true + false + + + 27 110 @@ -3415,24 +3418,21 @@ false - - 27 - true false + + 21 + 21 false - - 21 - @@ -3502,7 +3502,7 @@ QTabWidget::Triangular - 2 + 1 @@ -3627,27 +3627,27 @@ false - - false - 27 + + false + true false + + 21 + 21 false - - 21 - false @@ -3753,7 +3753,7 @@ false - 19 + 21 false @@ -3963,30 +3963,30 @@ false + + 27 + 125 false - - 27 - true false + + 22 + 22 false - - 22 - false @@ -4141,7 +4141,7 @@ false - true + false @@ -4230,15 +4230,15 @@ false + + 40 + 100 false - - 40 - true @@ -4248,15 +4248,15 @@ false + + 22 + 22 false - - 22 - false @@ -4996,10 +4996,10 @@ false - true + false - true + false @@ -5091,15 +5091,15 @@ false + + 40 + 100 false - - 40 - true @@ -5109,15 +5109,15 @@ false + + 22 + 22 false - - 22 - false @@ -6061,15 +6061,15 @@ 3 + + 10 + 70 true - - 10 - true @@ -6293,8 +6293,8 @@ 0 0 - 267 - 670 + 253 + 646 @@ -6424,7 +6424,7 @@ 0 0 291 - 856 + 854 @@ -6554,10 +6554,10 @@ false - + 22 - + 22 @@ -6569,10 +6569,10 @@ false - + 21 - + 21 @@ -6678,23 +6678,23 @@ true - false + true 2 - true + false false - - 100 - 30 + + 100 + false @@ -7093,30 +7093,30 @@ false + + 27 + 110 false - - 27 - true false + + 22 + 22 false - - 22 - false @@ -7302,7 +7302,7 @@ 0 0 1712 - 20 + 22 @@ -7533,8 +7533,8 @@ 0 0 - 424 - 574 + 488 + 643 @@ -8223,8 +8223,14 @@ - + + + + + + + @@ -8709,21 +8715,6 @@ Show/Hide grid - - - true - - - - :/Fractorium/Icons/Function-512.png:/Fractorium/Icons/Function-512.png - - - Show/Hide xforms - - - Show/Hide xforms - - Alternate editor/image @@ -8733,6 +8724,10 @@ + + + :/Fractorium/Icons/reset_scale.png:/Fractorium/Icons/reset_scale.png + Reset scale @@ -8748,6 +8743,50 @@ Ctrl+K + + + true + + + Pre + + + Show/Hide Pre Affines + + + + + true + + + All + + + Show All Pre Affines + + + + + true + + + Post + + + Show/Hide Post Affines + + + + + true + + + All + + + Show All Post Affines + + diff --git a/Source/Fractorium/FractoriumMenus.cpp b/Source/Fractorium/FractoriumMenus.cpp index 836cdc6..46d9976 100644 --- a/Source/Fractorium/FractoriumMenus.cpp +++ b/Source/Fractorium/FractoriumMenus.cpp @@ -766,17 +766,20 @@ void Fractorium::OnActionResetWorkspace(bool checked) /// Ignored void Fractorium::OnActionAlternateEditorImage(bool checked) { - if (DrawImage()) + if (DrawPreAffines() || DrawPostAffines()) { - ui.ActionDrawImage->setChecked(false); - ui.ActionDrawXforms->setChecked(true); - ui.ActionDrawGrid->setChecked(true); + ui.ActionDrawPreAffines->setChecked(false); + ui.ActionDrawAllPreAffines->setChecked(false); + ui.ActionDrawPostAffines->setChecked(false); + ui.ActionDrawAllPostAffines->setChecked(false); + ui.ActionDrawGrid->setChecked(false); + ui.ActionDrawImage->setChecked(true); } else { - ui.ActionDrawXforms->setChecked(false); - ui.ActionDrawGrid->setChecked(false); - ui.ActionDrawImage->setChecked(true); + ui.ActionDrawImage->setChecked(false); + ui.ActionDrawGrid->setChecked(true); + SyncAffineStateToToolbar(); } ui.GLDisplay->update(); diff --git a/Source/Fractorium/FractoriumToolbar.cpp b/Source/Fractorium/FractoriumToolbar.cpp index 8cd5a7a..684c10f 100644 --- a/Source/Fractorium/FractoriumToolbar.cpp +++ b/Source/Fractorium/FractoriumToolbar.cpp @@ -15,24 +15,37 @@ void Fractorium::InitToolbarUI() spGroup->addAction(ui.ActionDP); SyncOptionsToToolbar(); ui.ActionDrawImage->setChecked(true); - connect(ui.ActionCpu, SIGNAL(triggered(bool)), this, SLOT(OnActionCpu(bool)), Qt::QueuedConnection); - connect(ui.ActionCL, SIGNAL(triggered(bool)), this, SLOT(OnActionCL(bool)), Qt::QueuedConnection); - connect(ui.ActionSP, SIGNAL(triggered(bool)), this, SLOT(OnActionSP(bool)), Qt::QueuedConnection); - connect(ui.ActionDP, SIGNAL(triggered(bool)), this, SLOT(OnActionDP(bool)), Qt::QueuedConnection); - connect(ui.ActionStyle, SIGNAL(triggered(bool)), this, SLOT(OnActionStyle(bool)), Qt::QueuedConnection); - connect(ui.ActionStartStopRenderer, SIGNAL(triggered(bool)), this, SLOT(OnActionStartStopRenderer(bool)), Qt::QueuedConnection); - connect(ui.ActionDrawXforms, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawXforms(bool)), Qt::QueuedConnection); - connect(ui.ActionDrawImage, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawImage(bool)), Qt::QueuedConnection); - connect(ui.ActionDrawGrid, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawGrid(bool)), Qt::QueuedConnection); + m_PreviousAffineState[(int)eAffineState::PRE] = true; + m_PreviousAffineState[(int)eAffineState::ALL_PRE] = true; + m_PreviousAffineState[(int)eAffineState::POST] = false; + m_PreviousAffineState[(int)eAffineState::ALL_POST] = false; + connect(ui.ActionCpu, SIGNAL(triggered(bool)), this, SLOT(OnActionCpu(bool)), Qt::QueuedConnection); + connect(ui.ActionCL, SIGNAL(triggered(bool)), this, SLOT(OnActionCL(bool)), Qt::QueuedConnection); + connect(ui.ActionSP, SIGNAL(triggered(bool)), this, SLOT(OnActionSP(bool)), Qt::QueuedConnection); + connect(ui.ActionDP, SIGNAL(triggered(bool)), this, SLOT(OnActionDP(bool)), Qt::QueuedConnection); + connect(ui.ActionStyle, SIGNAL(triggered(bool)), this, SLOT(OnActionStyle(bool)), Qt::QueuedConnection); + connect(ui.ActionStartStopRenderer, SIGNAL(triggered(bool)), this, SLOT(OnActionStartStopRenderer(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawImage, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawImage(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawPreAffines, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawAffines(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawPostAffines, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawAffines(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawAllPreAffines, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawAllAffines(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawAllPostAffines, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawAllAffines(bool)), Qt::QueuedConnection); + connect(ui.ActionDrawGrid, SIGNAL(triggered(bool)), this, SLOT(OnActionDrawGrid(bool)), Qt::QueuedConnection); } /// /// GUI wrapper functions, getters only. /// -bool Fractorium::DrawXforms() { return ui.ActionDrawXforms->isChecked(); } -bool Fractorium::DrawImage() { return ui.ActionDrawImage->isChecked(); } -bool Fractorium::DrawGrid() { return ui.ActionDrawGrid->isChecked(); } +bool Fractorium::DrawPreAffines() { return ui.ActionDrawPreAffines->isChecked(); } +bool Fractorium::DrawPostAffines() { return ui.ActionDrawPostAffines->isChecked(); } +bool Fractorium::DrawSelectedPre() { return !ui.ActionDrawAllPreAffines->isChecked(); } +bool Fractorium::DrawAllPre() { return ui.ActionDrawAllPreAffines->isChecked(); } +bool Fractorium::DrawSelectedPost() { return !ui.ActionDrawAllPostAffines->isChecked(); } +bool Fractorium::DrawAllPost() { return ui.ActionDrawAllPostAffines->isChecked(); } +bool Fractorium::DrawXforms() { return ui.ActionDrawPreAffines->isChecked() || ui.ActionDrawPostAffines->isChecked(); } +bool Fractorium::DrawImage() { return ui.ActionDrawImage->isChecked(); } +bool Fractorium::DrawGrid() { return ui.ActionDrawGrid->isChecked(); } /// /// Called when the CPU render option on the toolbar is clicked. @@ -122,18 +135,30 @@ void Fractorium::OnActionStartStopRenderer(bool checked) } /// -/// Toggle whether to show the affines. -/// Called when the editor image button is clicked. +/// Called when the pre affine button is clicked. /// -/// Check state, show editor if true, else hide. -void Fractorium::OnActionDrawXforms(bool checked) +/// Check state, show pre affines if true, else hide. +void Fractorium::OnActionDrawAffines(bool checked) { - m_Settings->ShowXforms(checked); + m_Settings->ShowXforms(checked); - if (!ui.ActionDrawImage->isChecked() && !ui.ActionDrawXforms->isChecked()) - ui.ActionDrawImage->setChecked(true); + if (!ui.ActionDrawImage->isChecked() && !(ui.ActionDrawPreAffines->isChecked() || ui.ActionDrawPostAffines->isChecked())) + ui.ActionDrawImage->setChecked(true); - ui.GLDisplay->update(); + SaveAffineState(); + + ui.GLDisplay->update(); +} + +/// +/// Toggle whether to show selected/all post affines. +/// Called when the show all post affine button is clicked. +/// +/// Check state, show all pre affines if true, else show selected. +void Fractorium::OnActionDrawAllAffines(bool checked) +{ + SaveAffineState(); + ui.GLDisplay->update(); } /// @@ -143,8 +168,8 @@ void Fractorium::OnActionDrawXforms(bool checked) /// Check state, show image if true, else hide. void Fractorium::OnActionDrawImage(bool checked) { - if (!ui.ActionDrawImage->isChecked() && !ui.ActionDrawXforms->isChecked()) - ui.ActionDrawXforms->setChecked(true); + if (!ui.ActionDrawImage->isChecked()) + SyncAffineStateToToolbar(); ui.GLDisplay->update(); } @@ -160,6 +185,32 @@ void Fractorium::OnActionDrawGrid(bool checked) ui.GLDisplay->update(); } +/// +/// Keep previous state of the affines to switch between Editor and Image +/// +void Fractorium::SaveAffineState() +{ + if(!ui.ActionDrawPreAffines->isChecked() && !ui.ActionDrawPostAffines->isChecked()) + return; + + m_PreviousAffineState[(int)eAffineState::PRE] = ui.ActionDrawPreAffines->isChecked(); + m_PreviousAffineState[(int)eAffineState::ALL_PRE] = ui.ActionDrawAllPreAffines->isChecked(); + m_PreviousAffineState[(int)eAffineState::POST] = ui.ActionDrawPostAffines->isChecked(); + m_PreviousAffineState[(int)eAffineState::ALL_POST] = ui.ActionDrawAllPostAffines->isChecked(); +} + +/// +/// Sync affine state data to the check state of the toolbar buttons. +/// This does not trigger a clicked() event. +/// +void Fractorium::SyncAffineStateToToolbar() +{ + ui.ActionDrawPreAffines->setChecked(m_PreviousAffineState[(int)eAffineState::PRE]); + ui.ActionDrawAllPreAffines->setChecked(m_PreviousAffineState[(int)eAffineState::ALL_PRE]); + ui.ActionDrawPostAffines->setChecked(m_PreviousAffineState[(int)eAffineState::POST]); + ui.ActionDrawAllPostAffines->setChecked(m_PreviousAffineState[(int)eAffineState::ALL_POST]); +} + /// /// Sync options data to the check state of the toolbar buttons. /// This does not trigger a clicked() event. @@ -196,5 +247,8 @@ void Fractorium::SyncOptionsToToolbar() } ui.ActionDrawGrid->setChecked(m_Settings->ShowGrid()); - ui.ActionDrawXforms->setChecked(m_Settings->ShowXforms()); -} \ No newline at end of file + ui.ActionDrawPreAffines->setChecked(m_Settings->ShowXforms()); + ui.ActionDrawAllPreAffines->setChecked(m_Settings->ShowXforms()); + + SaveAffineState(); +} diff --git a/Source/Fractorium/FractoriumXformsAffine.cpp b/Source/Fractorium/FractoriumXformsAffine.cpp index 82d6e0d..fdafc1a 100644 --- a/Source/Fractorium/FractoriumXformsAffine.cpp +++ b/Source/Fractorium/FractoriumXformsAffine.cpp @@ -154,8 +154,10 @@ void Fractorium::InitXformsAffineUI() m_PostSpins[5] = m_PostO2Spin; ui.PreAffineGroupBox->setChecked(false);//Flip both once to force enabling/disabling the disabling of the group boxes and the corner buttons. ui.PreAffineGroupBox->setChecked(true);//Pre affine enabled. - ui.PostAffineGroupBox->setChecked(true); - ui.PostAffineGroupBox->setChecked(false);//Post affine disabled. + ui.PostAffineGroupBox->setChecked(false); + ui.PostAffineGroupBox->setChecked(true);//Post affine enabled. + ui.PreAffineShowGroupBox->setVisible(false); // michel - to delete + ui.PostAffineShowGroupBox->setVisible(false); // michel - to delete } /// @@ -791,13 +793,9 @@ void Fractorium::SetupAffineSpinner(QTableWidget* table, const QObject* receiver } /// -/// GUI wrapper functions, getters only. +/// GUI wrapper function, getter only. /// -bool Fractorium::DrawSelectedPre() { return ui.ShowPreAffineSelectedRadio->isChecked(); } -bool Fractorium::DrawAllPre() { return ui.ShowPreAffineAllRadio->isChecked(); } -bool Fractorium::DrawSelectedPost() { return ui.ShowPostAffineSelectedRadio->isChecked(); } -bool Fractorium::DrawAllPost() { return ui.ShowPostAffineAllRadio->isChecked(); } bool Fractorium::LocalPivot() { return ui.LocalPivotRadio->isChecked(); } template class FractoriumEmberController; diff --git a/Source/Fractorium/GLWidget.cpp b/Source/Fractorium/GLWidget.cpp index 34a2d22..830ed4c 100644 --- a/Source/Fractorium/GLWidget.cpp +++ b/Source/Fractorium/GLWidget.cpp @@ -523,8 +523,8 @@ void GLWidget::paintGL() } //Affine drawing. - bool pre = m_Fractorium->ui.PreAffineGroupBox->isChecked(); - bool post = m_Fractorium->ui.PostAffineGroupBox->isChecked(); + bool pre = m_Fractorium->DrawPreAffines(); + bool post = m_Fractorium->DrawPostAffines(); this->glEnable(GL_BLEND); this->glEnable(GL_LINE_SMOOTH); this->glEnable(GL_POINT_SMOOTH); @@ -1757,8 +1757,8 @@ void GLWidget::DrawAffineHelper(int index, float circleWidth, float lineWidth, b template int GLEmberController::UpdateHover(v3T& glCoords) { - bool pre = m_Fractorium->ui.PreAffineGroupBox->isChecked(); - bool post = m_Fractorium->ui.PostAffineGroupBox->isChecked(); + bool pre = m_Fractorium->DrawPreAffines(); + bool post = m_Fractorium->DrawPostAffines(); int i = 0, bestIndex = -1; T bestDist = 10; auto ember = m_FractoriumEmberController->CurrentEmber(); diff --git a/Source/Fractorium/Icons/grid.png b/Source/Fractorium/Icons/grid.png old mode 100644 new mode 100755 index 51692590f27312b6a7b8f3c85c32cd7c8dd502ce..6ef219b702084194cd0b1faaa1e283f352172aee GIT binary patch literal 2329 zcmV+!3Fh{RP)kdg000IcdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@mLn$&{Ld+Jghn6)$Kmt6+#ttK3Fvm)W6#cJ zW5!0%0;DQQ&6xhr-^2Wc54m(0&k{ol;lRfypD06!$NHrCYY#tv=ZE$qjGyMs^?)$t z(7QF1y!A8Y`LWK$GJUlnivAIup0ZNUb<%qho?wG%RS>V<;<7@Ft(1F=5LiSD!I()Vz0OZNNvpkHrciOk7cQYli6xa>5kA#duAxeeHPzgx zxrQ>)LX#F-YPnm}Q7O9b+(VZhd+K>0)`lB?@CZXj9BJf>wax06_8Y9(%^FRnR8KC} zFl$84Ev%LkR?ff}c?-rx89+dja&|=PJt=d_*^vlI!2}~&xiQTuW1!G?OFZnw-GjLw z@n$&wh&TEbb4IEAKbSM1?kjI^SZn&8tCO*ng^KCnkbTg}6b-(|fuBF^|7atJs+&g{ zy>!IUlAm-Br`D)~=2j;B{(~fP#eXs$#IdG|&b3}I!J}f>dxal!v zz2hagh6;g(D_R{6_rP}W8b+P&!>v)Xf`_$R9v(Wl2{Ha2y_i@V^lO`=w*&4@uSmK; zihHYu-ON<^xELh^tGVeTX($N2r={q0V^)eZ=SMa+PmfbuW7pR(BWO@>=nmfnV^q8b zQh5vDNUt@g+8IR?Y2|MtJ!WXob7U*Y8gbWJb6-rkU3jYCQSN0-2q5;OvCpVnx#>vJ zzu|3^5jF0Gg^P`i+3p8#Y^GaunYLEZ6fZB%p8$j6~}aR9hi>54r}%`~QQ6*oMf^*#gC zwdV=-;qHsNp-!w~^2i*!yqrj?6XwhhsaUKmsDOuz=*mi&z8dmVh$ial#mW`eYj`dG zAKz<_calcQ6lQ!PD0FHjps{N3EZfhL-k-E)XmF9n*sdRkB7Sb6txP~X;)ov#Y0ZN{ zMPThbB*EPSmmI+T2IbwG8_IT;WJUo~t`RN0DX7}tVAjfK&o@s4Bj-ju2%I$KmXsLO zpTVHIVs3=vX%8qpB4w0xOJwtXt@&DeP%GL9vtG>NHIotL#Ps+~tzIG7muEX>4Tx04R~2kiAO7U=)U*R8jF~vUCuK46X&2 zW^$}zUQ6N7@x12R=jkLR`cASu@c2)sJc*QVO~^V z9f+NIl^a&lz8(5U;s>!ErCB6?67NN6WZ3NbX)+6cG|e@eadvTT`pR8gP8i@}GiJt= zgo>_erp_@AJyn;2fO|?p)r45Rxn?SEM5UBm4n;$eu4(Ywsr@{;jHNM^mT|Zvm8S8- z{O|YL$638;bryM01a)gk*_uq?{SmfCu>B0{*9~54zu(p{FUR%( z0007FOGiWi0IH26G5`Po32;bRa{vGf6951U69E94oEQKA00(qQO+^Rf0Tv4|9k~W) z3;+NDPf0{UR7l6gRXa|^Fc5uS?I~Pv0d7IFEd^)TW*fM|7Eo+Ky(@774#O?x072R* z#*!)g$vAQ1KtMQ3@@!@7=l5nDi) zB)M9vyW)Pe-(Zl!p{7s_plk&8c8CNA3ji;~INI4fm|EXt4OZm=S6pa_7#sEU|&%z3|801OAtV~md} z5mR{2BJ@I7@+C9$#dW4L1@uhEh#qMl(LLRfA4F`X>rS$CTrg?4ATveW$i$R3oRdaN z7M@)c5@39mB8nnjmTVs$-cpqFK$4S^?hw%f?IOCRo0f=DIsZ6|=-OwZQ{HoBtm#7k ziK}uMGuVb&@T1jO6%)rV0!rFd%lW^4u4~#C%0C^dM@V=O00000NkvXXu0mjfuc}$; literal 8150 zcmdT}dpy)z*WcrkQmKg!o!rh4sYIuaNSHc9(0H?CYMB$%eW2WGR!>tH-o1-Pw#u)_w&AgJp1#R*=z5$_S$Q&-*2z| z{jGh`#>#xL^taLgfW;O&2(|!-K~fCNp9iav({CnWwcx~#eSQEeltq6SkU&v@ovLm- zY%Ku@S_J_48~_snSbqe-c0Rx?-wVK&cmU*m=s&6a3V_N13&OTNr;uMwJJK`-swDUWBxLi=1ci5F>i>u&xv{G zyq<5T+Tu%pSz11*Js!hQ(f@~TWd05dE+c~O{$V=U*EpE_q$bITrB^o9rL)rF%1GlM z=Tt40fgM-W!LRBTK-J<3z+X|vkku{3fW;LFa7BFqQ2%=Z|0ChAPWQi>dQMxWc=^gi zR|Ts+9^VO@TRgy9(p{}hJ++PQ?|v^kTbaJcI4diw(%&i2jMyz!Oycwwd0V%Q4Sajy z9qog*o~NfL6W392EhhZ^yXt`_6i&9QfVlG9=Zna6fMbYtdffVXWDnr7vu5Im6#Gz+F?D3o8|q zae|ri&1az+m!JQ9_>9iEM9bSO-6lF?~ae1jjllQS{34y={{j~K@d?H%jABtg4O@SXSj zHQ@8w^V&&}VMg=g+E!Pm0~;}b>o_KL$bPd#zv9HQ`@9`J-I-^N9f}%_GrI?m>oH}( zVbIQ$d6`)hM2j7H``)>s5|A91f>L))d!_wZz-Atpy5!(weeb6ER3x`Iz{Xx`;pB?$ z3hwTPYBF8C{H68)KM>#8(4r>R9-%BKg0JM8?P0`bG zXgxv42w?otpQAra*6uQ=MX+xbg~9Np3YNk+g_ik1LPWs8h7nO@fQJIGES=>-78&h; zWrhVQlq)I{a4f129ViTvLKaHHB4R;;41c1zR3U{SE5U!LL8K5)Ewn_$f*iDbZ7$SK zbS_m?XwFDTf3^ga37`yWm^gM;+ouyjwy=rH;o(mVB}5A;f4>ABi`ohQpxGilLRus? z!-74tmOyIGm|2hEMFUZ(S!Y7(t9C-(tTQ1=7B=CZ$P$zgc}z$_Gv@p(R5<5Mlr3Zl z<%9}_6kJRBdX$>83iY{gIgo`H%FL`(NPqEe%<0E`^01(wu!#=9!=F%_$cHn{&y9p4 z!e@upU(Ur9_Wi|mb4Eh;*WN=s+qY&(q(0mF;eKwd0m)n8!hJh~-8w$4MK$gP&;8YL-qi*J$27LU z)8!sgsEs@Lur@X5dz`V+qKZFqm`Xry5!rED`xH_rE^%o*p^ZNgQtFne*$Y?W#6O@r zKT`0FWL`5dm40O(|7nV0Vusm(P0d7A4y#8U>;fQX7c)PDMaj8{?8kK^A^K^zo5PXu zZN%;iNR#2Bii>%adl9bs8>pua*G#-X#^bvL4K*>|Ceg@#-x_)+#oBXCB0Nm?wyF$9 zA%*nTm{(_dc-UMMRtUpqcxM{W{SGL&MQ-qEgj)j=!mR__umxNqH=uAAL~eM2R^$yY zP=pI~Unq#9^$P_zv?^C{TZGo4!H|je!Xch( z_6iOncArI>TE?a$Mm}8g3xlYNm7SB5e1K=+5*j+)SvpYb#7|}mEVFxyjI^i=oAZrI zJQB2huFA(lV06W=^{Q=A3S>o}zg@?J_`zM_0vp(D03SFL(Q&rXh@o1?3BuI&%6pY+ z9gRZAH{MOY9^u-QU|aM(btDSWcPXoUT!B65PSmPpag_2(J{EWtZ)9yH&`eArs0iH^ zya~r&1HF#!MPP#g7hF#V6W(^d+OsRBlft9(B-VQ9ZQdLcgLtZSV1w7CvTz;g`Cfrm z)8|cCPuAl2-{X=B=(wQO)HgB}55$11B%bJ@jZ5-{FtEglo@jJc_7vgCW?cWH0$lJK z>SMhIc>!|WoVJm>7otLvCzG3qKI`LfHzxb>7fPLAbWxUM#2M>_%Z?a3{;F|u>-6&v zA3hA(O|I5rg*<9m-nJ2&D-Se)2sjoP9M!D0bShcnE5>1``Ec2d6X{`~?T>C)Wli9MB=qOo7d6a4r6r(w+Lg zR}{_-DkX)*nb?ONN-NowA1YZk9?0FuP+ocA9rV5e@U6)(rPa&4wg}w6O|#pFQJH2q zZdS$&-K0r9b%e0h(>nuNQeeq`O+Cr5S zFJ_=P{yQ{+GDD-%6Joh+$tS$BiuFB(!NGbrm-{VuQMh0iT3eQoBNZkNq%nBH0d~qg zBK`LCgPm~y6%XZPX0QL~M)hRhPDo0GS}-Y#z}tQ@6zNqvnCitYUrxO(K`!n~%jCSN zM45&Ai?d_7bn_<`y*V(Z%PjYuAU&@pHDKE3L41cab-UclE;bK|=lVeOx8|LXWLjLS zhkV1R6Xe3T)nB!7EJEK*f^0Hk*JhZ`qZD)|vTlPkV{@}fIScz}}8`mgW+cK)B8 zya7;|>a4>5XJjQq_;(Y*KHI%&&f7$xeIdF>r(F>FHS^h?>lc%*hBS;}k=(S6TrR3b`1Fg|txECn1D= z$&UvDA?!i z6u#vy-%a5{EYWaxffp|yB9btThIeswl9umevGQg#4)=$=Mtm6i7$)Pg*s_LQ$0tioHsh2ZmZjF(IVVGm zO={qyX^M4iCG3|5Z3F^CDYoaUG9xSUx*Ixda%@j2+{~)m7ROHxp=1 zL&MHt^?&yADI7L-=sATW72&$~Zr34*H;IG;aki5c$T+WS)lox}q812izN3!hGLGk$ z+&$Gur(0WTg>I#uvLl4FwZ`zztihEg+D>k#`v-@`u8sYV2ZOWV6e2|wvZBBiRuGad z0#B}DUgxvB4OpJIj%!GvCQb(8A9I?{NILugQbZ7yv^Z}BDS?Tgy;ZU#g$uIqz4}1$ zi9|^I_|D1sW4G(xA^LLIf8pw^QB!Jf(MI1IFG7eKuHT8@mY5N3Wv!iD+!ljO8?dU5 zJYqP2JM)17i=);N4HI5u6(va?L_5(7$_A6a#qvs;Vp@Mg3e{L4VWv7$WwO}7E!I)3 zwK~#W!SgkqD-tNqhb6AZawZt-2 z(8J>^0ULcN?^xIgzipK+xH^VwessbPU7z07s}@e-ESEh!BuLxIuV2HOYS&$qA%?#N zJ{I*W#@A~w%b>YllA-I1wQ*sGbYlBh5WCv-TqePC|d02B)ywnQ3#KHw9aWEj1sB`m8DoCWg3N#e%&dk zZLaKOI<{MqlJnwU1)dN>`T5}50Kesq{WdM?N@;zIwnOsvBjv*H;wR(i2la!gKUWmr z2qU30tK!xN;vM|Dxr5Ek%}2+?9((ch%4GK0$IFi}1ez!UY$UrRayaiAB(fn7Rz1`54JOWMP+)^CW zzm5rg(_jP@RH-za&~0o8huH_kk#R?QznC|8LR0SHon8RU*0ZKCQa}3}{eS~W!;onz z8NwI1!USTn@XUq>r?7kl1PBlHS%`q1*{U=0U&$`b;3{D%@Lv!Ljv>RJXf9Pq!Kq;p zre<8EAoZ_<`AhVG%6(-nJj$Dc2(w1QzR$4*Dm8;++VRkY&$CgVq83zc#&SqOQB^QF z4v~q_PF2_i&Hnp%3ti)!$IwZkLSgxet3}Mu^^1n6LKdoR#u6d*1wa%vMGK#GrcmxH zunArUz%pkQG>MFM;Ng-*IkK6RqMhIigJ<>QXIcM^55IUBL`I@|zcLpY;;(<_x>+M3 z6SY%RzIZo;bKxQDQzK`a=m;|Wed1M7(^MWS1bdw*7&PKH_`hpHFDs5MX&7A!^XPPc zmj2S-;Gd&Tr-n7XcXld+NU9(Z7Uj^p>U})O{kz_yIep6X!3Nd;y8D^YZAzKqf zPA?%%q)q>FE;k9Hgcvl7NNSPE>~XOxUk7hnC>&Sbos77;QS_$3+Yj#`Nw$tUE!lp| z@J=Q(VY>!(B!;_tImnhEe-GNzoUC>7y$qXIG4s8wW8l}fjiqC}7`z8UZzCA+a92X} zdGJ<38C$ErI_o1>%<4^G(~rxIHr}kxhk{+x#9GGAf8ogjG?_H>ZB*dU7{(*Sf2;qPJ3;z#^Ea zBPc$;Z83J$k-Gp5)@SNkdlQ+5f;X{3e$vwH=_&y+jH*L9>TECRM5M{xJho)p#8X6H z5=cvw55F2+A=T5FvyKkMGeGBksVu0 z@~qxIAKP1VW=x{>K06wzWM}o|#H7bHANlFgDx7hzTh%Zr;mH8ckJKQBLE)Z>OyOIf zVtJTN(<%gB}CvlHm+)A3+9o3*T!XEMl#rc>;DWL1-0@+9CqBl>KAvlC!o1-nBP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvmgFc5{O1&N1SAm4aaiB$8_e-XV5D4J)zw`! z>1U$^QVK-~aGLS&uWA0_587;vrO8NqZMiRa_ct;onme+J3@c=dxnj`FySkW+kyTJdVznYf{x z+r{l#oviQXxx+_hsT0p~h{J)i`{^$P?z#)#z)$2k4BMq`d$SujNSKh9^prsROwbF- zVwrdL)p{cz%jtJ-T!zCD8y^k;eN6tQ_$jbcMEE)|y|}uQJZDdHjw`$312Y;4 zY$vlHR#CF_Q<}2A^8;jFzvz4y~8IV<(20U~qFk$SrL1Ty>2S#oY8!NH; zl8czJZN>b$U}ALHbyf{s!(p7`Zd5F=R@O9<}AR&W`61x7Vrw z6Z>(%6me`~FyL4L8^93+un{o=Fpr4^DvX@h16Ec5h_EwA^v(q|5!2e23jZd;o{NM5 zS2yoXECjjWB5RXfVX?d?uAk@=*H9rxo`?cPN`^9(;DQenLWp5)awWRxBgGJ7Ofkoj zT=I!hNHL|9Q^}Ye?}3ygOP+?z%=NIm&SY7p%YN)ZMnrmrXKFv33p~aS3 zZlz;)owtb|dhDs^UIv)KJH_yWMi_CVkw=+aYtv0XX@(hRnt2vg?WlUY{z5f4s^L~@ z&5NoU_nH{R1+49amS(INdSJ!lQh*B@mu5DB_qdc>n%RuJCY9IFHwSuyaN!DXpj>M7=~s8CX?!Xgb_m{p2p z456_n8Fk^UjtvGG^O}Y-K~<3nBGl!kx;1`d@n)Ol13*n;Du-TxO|R2}z&2UySYc{`g9;qdTBB_y#!z5x)XkWKhf*|j(?2Uix&++&=9%9%7hNLuou%8ki|q23bY-u;VbNiOHoYJ$^S%5^d6gSh(!L$~N8$&u9i>?$eiH9RX=K>! z`e`x?e>BZCn{jq=Zu-hyTuvC^VKZjNl!S_|YNpOH4n0+uf`EHULe+#=y}4#8ZbYS& zTn}HPPy}^rN!glA;QbM{MzH-1 z>(>olYro&tFyquS|9s;Y{A5sX(J#mL00002VoOIv0063uBQgL0010qNS#tmY3ljhU z3ljkVnw%H_000McNliru6XwrL-y9M>~VCjcr1T7DB7i%zu&M>zn;T505@NJ4UI&CDndEAy_Xzk>-$ zawd#Ru0q!&3KBwSNdi@_nASDcbIY#pvMM!s<-#zfV@lt1kKA#nYMXP?fTC^2H7~WT zJ9XP#U7J=_S7o?i-dh7-YceAH4BX-;!gSK3aC(fak8_iA5_oHlb(W zo^u<`g>GfY5{3-2gCm*iATbLYCQPrl&P%z9#+ws4- Ze*r!8UeZzT{SyEH002ovPDHLkV1ks^qZI%E literal 3401 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 diff --git a/Source/Fractorium/Icons/reset_scale.png b/Source/Fractorium/Icons/reset_scale.png new file mode 100755 index 0000000000000000000000000000000000000000..9189258dda8215ef82cc8fe609ea28953b134bc6 GIT binary patch literal 11235 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 N002ovPDHLkV1kx?b@~7R literal 0 HcmV?d00001