From d75e1472c43357114b677ff66c1faffea0b73d27 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Wed, 9 Dec 2009 11:16:25 -0500
Subject: [PATCH] EXT-2819 crash in color picker in appearance editor

Made progress by writing code to match the style we use for the texture picker.
It now should not make a difference if you destroy the color picker floater or
the color swatch control first - either direction it should do sufficient cleanup
and protection. However, still getting this crash. Will investigate further later.

Code reviewed by Seraph

--HG--
branch : avatar-pipeline
---
 indra/newview/llcolorswatch.cpp        | 14 +++++++++++++-
 indra/newview/llcolorswatch.h          |  1 +
 indra/newview/llfloatercolorpicker.cpp | 10 ++++++++++
 indra/newview/llfloatercolorpicker.h   |  2 ++
 4 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 442e9ab27ba..b2399d238bd 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -306,6 +306,18 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
 	}
 }
 
+void LLColorSwatchCtrl::onFloaterClose()
+{
+	LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
+
+	if (pickerp)
+	{
+		pickerp->setSwatch(NULL);
+	}
+
+	mPickerHandle.markDead();
+}
+
 void LLColorSwatchCtrl::setValid(BOOL valid )
 {
 	mValid = valid;
@@ -323,7 +335,7 @@ void LLColorSwatchCtrl::showPicker(BOOL take_focus)
 	if (!pickerp)
 	{
 		pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately);
-		gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
+		//gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
 		mPickerHandle = pickerp->getHandle();
 	}
 
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index e3e267f831e..2f6aec85e86 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -105,6 +105,7 @@ class LLColorSwatchCtrl
 	/*virtual*/ void	setEnabled( BOOL enabled );
 
 	static void		onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE );
+	void			onFloaterClose();
 
 protected:
 	BOOL			mValid;
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 73b79d8e132..56b56dc3d2f 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -241,6 +241,16 @@ BOOL LLFloaterColorPicker::postBuild()
     return TRUE;
 }
 
+/*virtual*/ 
+void LLFloaterColorPicker::onClose(bool app_settings)
+{
+	if (mSwatch)
+	{
+		mSwatch->onFloaterClose();
+	}
+	stopUsingPipette();
+}
+
 //////////////////////////////////////////////////////////////////////////////
 //
 void LLFloaterColorPicker::initUI ( F32 rValIn, F32 gValIn, F32 bValIn )
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index a16cde7f102..b381740acd9 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -56,6 +56,7 @@ class LLFloaterColorPicker
 
 		// overrides
 		virtual BOOL postBuild ();
+		virtual void onClose(bool app_settings);
 		virtual void draw ();
 		virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask );
 		virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask );
@@ -69,6 +70,7 @@ class LLFloaterColorPicker
 		void destroyUI ();
 		void cancelSelection ();
 		LLColorSwatchCtrl* getSwatch () { return mSwatch; };
+		void setSwatch( LLColorSwatchCtrl* swatch) { mSwatch = swatch; }
 
 		// mutator / accessor for original RGB value
 		void setOrigRgb ( F32 origRIn, F32 origGIn, F32 origBIn );
-- 
GitLab