From 3cd970a347d5c3020157b6a956c277a7d765a801 Mon Sep 17 00:00:00 2001
From: mfeemster <matt.feemster@gmail.com>
Date: Wed, 24 Jun 2015 20:49:09 -0700
Subject: [PATCH]  --User changes  Add linked xform support, with new button
 and icon on the xforms tab.

---
 Source/Fractorium/Fractorium.h                |   1 +
 Source/Fractorium/Fractorium.qrc              |   1 +
 Source/Fractorium/Fractorium.ui               |  42 ++++++++++++--
 Source/Fractorium/FractoriumEmberController.h |   2 +
 Source/Fractorium/FractoriumXforms.cpp        |  52 +++++++++++++++++-
 Source/Fractorium/Icons/link-add.png          | Bin 0 -> 4125 bytes
 6 files changed, 92 insertions(+), 6 deletions(-)
 create mode 100644 Source/Fractorium/Icons/link-add.png

diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h
index 6a4d469..ac92fe1 100644
--- a/Source/Fractorium/Fractorium.h
+++ b/Source/Fractorium/Fractorium.h
@@ -190,6 +190,7 @@ public slots:
 	//Xforms.
 	void OnCurrentXformComboChanged(int index);
 	void OnAddXformButtonClicked(bool checked);
+	void OnAddLinkedXformButtonClicked(bool checked);
 	void OnDuplicateXformButtonClicked(bool checked);
 	void OnClearXformButtonClicked(bool checked);
 	void OnDeleteXformButtonClicked(bool checked);
diff --git a/Source/Fractorium/Fractorium.qrc b/Source/Fractorium/Fractorium.qrc
index 4526a6f..7aa53a3 100644
--- a/Source/Fractorium/Fractorium.qrc
+++ b/Source/Fractorium/Fractorium.qrc
@@ -38,6 +38,7 @@
         <file>Icons/infomation.png</file>
         <file>Icons/del.png</file>
         <file>Icons/add.png</file>
+		    <file>Icons/link-add.png</file>
         <file>Icons/eraser.png</file>
         <file>Icons/editraise.png</file>
         <file>Icons/square.png</file>
diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui
index 8ded213..caf978c 100644
--- a/Source/Fractorium/Fractorium.ui
+++ b/Source/Fractorium/Fractorium.ui
@@ -2146,15 +2146,15 @@
     <widget class="QDockWidget" name="XformsDockWidget">
      <property name="geometry">
       <rect>
-       <x>300</x>
+       <x>280</x>
        <y>0</y>
-       <width>240</width>
+       <width>267</width>
        <height>881</height>
       </rect>
      </property>
      <property name="minimumSize">
       <size>
-       <width>240</width>
+       <width>267</width>
        <height>613</height>
       </size>
      </property>
@@ -2261,6 +2261,38 @@
            </property>
           </widget>
          </item>
+         <item>
+          <widget class="QPushButton" name="AddLinkedXformButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>25</width>
+             <height>24</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>16777215</width>
+             <height>24</height>
+            </size>
+           </property>
+           <property name="toolTip">
+            <string>Add linked xform</string>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+           <property name="icon">
+            <iconset resource="Fractorium.qrc">
+             <normaloff>:/Fractorium/Icons/link-add.png</normaloff>:/Fractorium/Icons/link-add.png</iconset>
+           </property>
+          </widget>
+         </item>
          <item>
           <widget class="QPushButton" name="DuplicateXformButton">
            <property name="sizePolicy">
@@ -3252,7 +3284,7 @@ SpinBox
                <rect>
                 <x>0</x>
                 <y>0</y>
-                <width>216</width>
+                <width>237</width>
                 <height>745</height>
                </rect>
               </property>
@@ -4909,7 +4941,7 @@ SpinBox
                   <rect>
                    <x>0</x>
                    <y>0</y>
-                   <width>216</width>
+                   <width>237</width>
                    <height>680</height>
                   </rect>
                  </property>
diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h
index 25cce67..4a6b5af 100644
--- a/Source/Fractorium/FractoriumEmberController.h
+++ b/Source/Fractorium/FractoriumEmberController.h
@@ -62,6 +62,7 @@ public:
 	virtual void SetEmber(size_t index) { }
 	//virtual void Clear() { }
 	virtual void AddXform() { }
+	virtual void AddLinkedXform() { }
 	virtual void DuplicateXform() { }
 	virtual void ClearXform() { }
 	virtual void DeleteXforms() { }
@@ -290,6 +291,7 @@ public:
 	virtual void SetEmber(size_t index) override;
 	//virtual void Clear() override { }
 	virtual void AddXform() override;
+	virtual void AddLinkedXform() override;
 	virtual void DuplicateXform() override;
 	virtual void ClearXform() override;
 	virtual void DeleteXforms() override;
diff --git a/Source/Fractorium/FractoriumXforms.cpp b/Source/Fractorium/FractoriumXforms.cpp
index b2105aa..85dda72 100644
--- a/Source/Fractorium/FractoriumXforms.cpp
+++ b/Source/Fractorium/FractoriumXforms.cpp
@@ -9,6 +9,7 @@ void Fractorium::InitXformsUI()
 	int spinHeight = 20, row = 0;
 
 	connect(ui.AddXformButton,		 SIGNAL(clicked(bool)),			   this, SLOT(OnAddXformButtonClicked(bool)),	    Qt::QueuedConnection);
+	connect(ui.AddLinkedXformButton, SIGNAL(clicked(bool)),			   this, SLOT(OnAddLinkedXformButtonClicked(bool)),	Qt::QueuedConnection);
 	connect(ui.DuplicateXformButton, SIGNAL(clicked(bool)),			   this, SLOT(OnDuplicateXformButtonClicked(bool)),	Qt::QueuedConnection);
 	connect(ui.ClearXformButton,	 SIGNAL(clicked(bool)),			   this, SLOT(OnClearXformButtonClicked(bool)),	    Qt::QueuedConnection);
 	connect(ui.DeleteXformButton,	 SIGNAL(clicked(bool)),			   this, SLOT(OnDeleteXformButtonClicked(bool)),    Qt::QueuedConnection);
@@ -86,6 +87,7 @@ void FractoriumEmberController<T>::CurrentXformComboChanged(int index)
 		m_Fractorium->ui.DuplicateXformButton->setEnabled(enable);
 		m_Fractorium->m_XformWeightSpin->setEnabled(enable);
 		m_Fractorium->ui.SoloXformCheckBox->setEnabled(enable);
+		m_Fractorium->ui.AddLinkedXformButton->setEnabled(enable);
 		m_Fractorium->ui.AddFinalXformButton->setEnabled(enable);
 	}
 }
@@ -104,7 +106,6 @@ void FractoriumEmberController<T>::AddXform()
 	Update([&]()
 	{
 		Xform<T> newXform;
-		QComboBox* combo = m_Fractorium->ui.CurrentXformCombo;
 
 		newXform.m_Weight = 0.25;
 		newXform.m_ColorX = m_Rand.Frand01<T>();
@@ -116,6 +117,55 @@ void FractoriumEmberController<T>::AddXform()
 
 void Fractorium::OnAddXformButtonClicked(bool checked) { m_Controller->AddXform(); }
 
+/// <summary>
+/// Add a new linked xform in the current ember and set it as the current xform.
+/// Linked means:
+///
+/// Called when the add xform button is clicked.
+/// Resets the rendering process.
+/// </summary>
+/// <param name="checked">Ignored</param>
+template <typename T>
+void FractoriumEmberController<T>::AddLinkedXform()
+{
+	UpdateXform([&](Xform<T>* xform)
+	{
+		size_t i, count = m_Ember.XformCount();
+		Xform<T> newXform;
+
+		newXform.m_Weight = 0.5;
+		newXform.m_Opacity = 1;
+		newXform.m_ColorSpeed = 1;
+		newXform.m_ColorX = xform->m_ColorX;
+		//newXform.m_ColorY = xform->m_ColorY;
+
+		//Set all of the new xform's xaos values to the selected xform's xaos values,
+		//then set the selected xform's xaos values to 0.
+		for (i = 0; i < count; i++)
+		{
+			newXform.SetXaos(i, xform->Xaos(i));
+			xform->SetXaos(i, 0);
+		}
+
+		//Add the new xform and update the total count.
+		m_Ember.AddXform(newXform);
+		count = m_Ember.XformCount();
+
+		//Set the xaos for all xforms pointing to the new one to zero.
+		for (i = 0; i < count; i++)
+			if (auto* xf = m_Ember.GetXform(i))
+				xf->SetXaos(count - 1, 0);
+
+		xform->SetXaos(count - 1, 1);//Set the xaos value for the previous xform pointing to the new one to one.
+		xform->m_Opacity = 0;//Clear the opacity of the previous xform.
+		int index = m_Ember.TotalXformCount() - (m_Ember.UseFinalXform() ? 2 : 1);//Set index to the last item before final.
+		FillXforms(index);
+		FillXaos();
+	}, eXformUpdate::UPDATE_CURRENT);
+}
+
+void Fractorium::OnAddLinkedXformButtonClicked(bool checked) { m_Controller->AddLinkedXform(); }
+
 /// <summary>
 /// Duplicate the specified xforms in the current ember, and set the last one as the current xform.
 /// Called when the duplicate xform button is clicked.
diff --git a/Source/Fractorium/Icons/link-add.png b/Source/Fractorium/Icons/link-add.png
new file mode 100644
index 0000000000000000000000000000000000000000..8dfce00b380226de65bba244748f4e52291921d3
GIT binary patch
literal 4125
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
bZnx`C8)wZj<^`Mh00000NkvXXu0mjfTbADU

literal 0
HcmV?d00001