From d220657d8525ccfa246e0f49904e18cc36458b28 Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Tue, 25 Feb 2014 21:54:09 -0800
Subject: [PATCH] ACME-1327 : WIP : Added big preview to the Flickr photo
 panel, uses the thumbnail for the moment

---
 indra/newview/CMakeLists.txt                  |   2 +
 indra/newview/llfloaterbigpreview.cpp         | 109 ++++++++++++++++++
 indra/newview/llfloaterbigpreview.h           |  56 +++++++++
 indra/newview/llfloaterflickr.cpp             |  36 +++++-
 indra/newview/llfloaterflickr.h               |   2 +
 indra/newview/llsnapshotlivepreview.h         |   2 +-
 indra/newview/llviewerfloaterreg.cpp          |   2 +
 .../default/xui/en/floater_big_preview.xml    |  25 ++++
 .../default/xui/en/panel_flickr_photo.xml     |  17 ++-
 9 files changed, 247 insertions(+), 4 deletions(-)
 create mode 100644 indra/newview/llfloaterbigpreview.cpp
 create mode 100644 indra/newview/llfloaterbigpreview.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_big_preview.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 793d972e1c6..6d8d6b75a24 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -208,6 +208,7 @@ set(viewer_SOURCE_FILES
     llfloateravatarpicker.cpp
     llfloateravatartextures.cpp
     llfloaterbeacons.cpp
+    llfloaterbigpreview.cpp
     llfloaterbuildoptions.cpp
     llfloaterbulkpermission.cpp
     llfloaterbump.cpp
@@ -802,6 +803,7 @@ set(viewer_HEADER_FILES
     llfloateravatarpicker.h
     llfloateravatartextures.h
     llfloaterbeacons.h
+    llfloaterbigpreview.h
     llfloaterbuildoptions.h
     llfloaterbulkpermission.h
     llfloaterbump.h
diff --git a/indra/newview/llfloaterbigpreview.cpp b/indra/newview/llfloaterbigpreview.cpp
new file mode 100644
index 00000000000..84a1523e7c0
--- /dev/null
+++ b/indra/newview/llfloaterbigpreview.cpp
@@ -0,0 +1,109 @@
+/** 
+* @file llfloaterbigpreview.cpp
+* @brief Display of extended (big) preview for snapshots and SL Share
+* @author merov@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterbigpreview.h"
+
+#include "llfloaterreg.h"
+#include "llsnapshotlivepreview.h"
+
+///////////////////////
+//LLFloaterBigPreview//
+///////////////////////
+
+LLFloaterBigPreview::LLFloaterBigPreview(const LLSD& key) : LLFloater(key),
+    mPreviewPlaceholder(NULL),
+    mFloaterOwner(NULL)
+{
+}
+
+LLFloaterBigPreview::~LLFloaterBigPreview()
+{
+	if (mPreviewHandle.get())
+	{
+		mPreviewHandle.get()->die();
+	}
+}
+
+void LLFloaterBigPreview::onCancel()
+{
+    closeFloater();
+}
+
+void LLFloaterBigPreview::closeOnFloaterOwnerClosing(LLFloater* floaterp)
+{
+    if (floaterp == mFloaterOwner)
+    {
+        closeFloater();
+    }
+}
+
+BOOL LLFloaterBigPreview::postBuild()
+{
+	mPreviewPlaceholder = getChild<LLUICtrl>("big_preview_placeholder");
+	return LLFloater::postBuild();
+}
+
+void LLFloaterBigPreview::draw()
+{
+	LLFloater::draw();
+
+	LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get());
+    
+    // Display the preview if one is available
+    // HACK!!! We use the puny thumbnail image for the moment
+    // *TODO : Use the real large preview
+	if (previewp && previewp->getThumbnailImage())
+	{
+		const LLRect& preview_rect = mPreviewPlaceholder->getRect();
+//		const S32 thumbnail_w = previewp->getThumbnailWidth();
+//		const S32 thumbnail_h = previewp->getThumbnailHeight();
+        
+		// calc preview offset within the preview rect
+//		const S32 local_offset_x = (preview_rect.getWidth()  - thumbnail_w) / 2 ;
+//		const S32 local_offset_y = (preview_rect.getHeight() - thumbnail_h) / 2 ;
+		const S32 local_offset_x = 0 ;
+		const S32 local_offset_y = 0 ;
+        
+		// calc preview offset within the floater rect
+		S32 offset_x = preview_rect.mLeft   + local_offset_x;
+		S32 offset_y = preview_rect.mBottom + local_offset_y;
+        
+        //llinfos << "Merov : draw, offset x = " << offset_x  << ", y = " <<  offset_y << ", thumbnail w = " <<  thumbnail_w << ", h = " <<  thumbnail_h << ", rect w = " << preview_rect.getWidth() << ", h = " << preview_rect.getHeight() << llendl;
+        
+		gGL.matrixMode(LLRender::MM_MODELVIEW);
+		// Apply floater transparency to the texture unless the floater is focused.
+		F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+		LLColor4 color = LLColor4::white;
+		gl_draw_scaled_image(offset_x, offset_y,
+                             //thumbnail_w, thumbnail_h,
+                             preview_rect.getWidth(), preview_rect.getHeight(),
+                             previewp->getThumbnailImage(), color % alpha);
+	}
+}
+
diff --git a/indra/newview/llfloaterbigpreview.h b/indra/newview/llfloaterbigpreview.h
new file mode 100644
index 00000000000..91b0968e885
--- /dev/null
+++ b/indra/newview/llfloaterbigpreview.h
@@ -0,0 +1,56 @@
+/** 
+* @file   llfloaterbigpreview.h
+* @brief  Display of extended (big) preview for snapshots and SL Share
+* @author merov@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLFLOATERBIGPREVIEW_H
+#define LL_LLFLOATERBIGPREVIEW_H
+
+#include "llfloater.h"
+#include "llviewertexture.h"
+
+//class LLSnapshotLivePreview;
+
+class LLFloaterBigPreview : public LLFloater
+{
+public:
+	LLFloaterBigPreview(const LLSD& key);
+    ~LLFloaterBigPreview();
+    
+	BOOL postBuild();
+	void draw();
+	void onCancel();
+
+    void setPreview(LLView* previewp) { mPreviewHandle = previewp->getHandle(); }
+    void setFloaterOwner(LLFloater* floaterp) { mFloaterOwner = floaterp; }
+    void closeOnFloaterOwnerClosing(LLFloater* floaterp);
+	
+private:
+	LLHandle<LLView> mPreviewHandle;
+	LLUICtrl*  mPreviewPlaceholder;
+    LLFloater* mFloaterOwner;
+};
+
+#endif // LL_LLFLOATERBIGPREVIEW_H
+
diff --git a/indra/newview/llfloaterflickr.cpp b/indra/newview/llfloaterflickr.cpp
index 61f1487d4bc..21c619730cf 100644
--- a/indra/newview/llfloaterflickr.cpp
+++ b/indra/newview/llfloaterflickr.cpp
@@ -44,6 +44,7 @@
 #include "llslurl.h"
 #include "lltrans.h"
 #include "llsnapshotlivepreview.h"
+#include "llfloaterbigpreview.h"
 #include "llviewerregion.h"
 #include "llviewercontrol.h"
 #include "llviewermedia.h"
@@ -76,6 +77,7 @@ mPostButton(NULL)
 {
 	mCommitCallbackRegistrar.add("SocialSharing.SendPhoto", boost::bind(&LLFlickrPhotoPanel::onSend, this));
 	mCommitCallbackRegistrar.add("SocialSharing.RefreshPhoto", boost::bind(&LLFlickrPhotoPanel::onClickNewSnapshot, this));
+	mCommitCallbackRegistrar.add("SocialSharing.BigPreview", boost::bind(&LLFlickrPhotoPanel::onClickBigPreview, this));
 }
 
 LLFlickrPhotoPanel::~LLFlickrPhotoPanel()
@@ -227,7 +229,7 @@ void LLFlickrPhotoPanel::onVisibilityChange(const LLSD& new_visibility)
 			LLSnapshotLivePreview::Params p;
 			p.rect(full_screen_rect);
 			LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p);
-			mPreviewHandle = previewp->getHandle();	
+			mPreviewHandle = previewp->getHandle();
 
             previewp->setContainer(this);
 			previewp->setSnapshotType(previewp->SNAPSHOT_WEB);
@@ -251,6 +253,18 @@ void LLFlickrPhotoPanel::onClickNewSnapshot()
 	}
 }
 
+void LLFlickrPhotoPanel::onClickBigPreview()
+{
+	LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview"));
+	if (big_preview_floater)
+	{
+        LLSnapshotLivePreview* previewp = getPreviewView();
+		big_preview_floater->setPreview(previewp);
+        big_preview_floater->setFloaterOwner(getParentByType<LLFloater>());
+	}
+	LLFloaterReg::showInstance("big_preview");
+}
+
 void LLFlickrPhotoPanel::onSend()
 {
 	LLEventPumps::instance().obtain("FlickrConnectState").stopListening("LLFlickrPhotoPanel"); // just in case it is already listening
@@ -340,6 +354,11 @@ void LLFlickrPhotoPanel::clearAndClose()
 	LLFloater* floater = getParentByType<LLFloater>();
 	if (floater)
 	{
+        LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview"));
+        if (big_preview_floater)
+        {
+            big_preview_floater->closeOnFloaterOwnerClosing(floater);
+        }
 		floater->closeFloater();
 	}
 }
@@ -615,8 +634,23 @@ LLFloaterFlickr::LLFloaterFlickr(const LLSD& key) : LLFloater(key),
 	mCommitCallbackRegistrar.add("SocialSharing.Cancel", boost::bind(&LLFloaterFlickr::onCancel, this));
 }
 
+void LLFloaterFlickr::onClose(bool app_quitting)
+{
+    LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview"));
+    if (big_preview_floater)
+    {
+        big_preview_floater->closeOnFloaterOwnerClosing(this);
+    }
+	LLFloater::onClose(app_quitting);
+}
+
 void LLFloaterFlickr::onCancel()
 {
+    LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview"));
+    if (big_preview_floater)
+    {
+        big_preview_floater->closeOnFloaterOwnerClosing(this);
+    }
     closeFloater();
 }
 
diff --git a/indra/newview/llfloaterflickr.h b/indra/newview/llfloaterflickr.h
index 319ab1278fe..9fa4a258e2b 100644
--- a/indra/newview/llfloaterflickr.h
+++ b/indra/newview/llfloaterflickr.h
@@ -48,6 +48,7 @@ class LLFlickrPhotoPanel : public LLPanel
 	LLSnapshotLivePreview* getPreviewView();
 	void onVisibilityChange(const LLSD& new_visibility);
 	void onClickNewSnapshot();
+    void onClickBigPreview();
 	void onSend();
 	bool onFlickrConnectStateChange(const LLSD& data);
 
@@ -111,6 +112,7 @@ class LLFloaterFlickr : public LLFloater
 	LLFloaterFlickr(const LLSD& key);
 	BOOL postBuild();
 	void draw();
+	void onClose(bool app_quitting);
 	void onCancel();
 	
 	void showPhotoPanel();
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 7f3e7a080b6..1b7b5290f87 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -113,7 +113,7 @@ class LLSnapshotLivePreview : public LLView
 	LLPointer<LLImageFormatted>	getFormattedImage();
 	LLPointer<LLImageRaw>		getEncodedImage();
 
-	/// Sets size of preview thumbnail image and thhe surrounding rect.
+	/// Sets size of preview thumbnail image and the surrounding rect.
 	void setThumbnailPlaceholderRect(const LLRect& rect) {mThumbnailPlaceholderRect = rect; }
 	BOOL setThumbnailImageSize() ;
 	void generateThumbnailImage(BOOL force_update = FALSE) ;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 1f25110aa38..982522955cc 100755
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -38,6 +38,7 @@
 #include "llfloateravatar.h"
 #include "llfloateravatarpicker.h"
 #include "llfloateravatartextures.h"
+#include "llfloaterbigpreview.h"
 #include "llfloaterbeacons.h"
 #include "llfloaterbuildoptions.h"
 #include "llfloaterbuy.h"
@@ -324,6 +325,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("facebook", "floater_facebook.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFacebook>);
 	LLFloaterReg::add("flickr", "floater_flickr.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFlickr>);
 	LLFloaterReg::add("twitter", "floater_twitter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTwitter>);
+	LLFloaterReg::add("big_preview", "floater_big_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBigPreview>);
 	
 	LLFloaterUIPreviewUtil::registerFloater();
 	LLFloaterReg::add("upload_anim_bvh", "floater_animation_bvh_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBvhPreview>, "upload");
diff --git a/indra/newview/skins/default/xui/en/floater_big_preview.xml b/indra/newview/skins/default/xui/en/floater_big_preview.xml
new file mode 100644
index 00000000000..23698ccc40a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_big_preview.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<floater
+  positioning="cascading"
+  can_close="true"
+  can_resize="false"
+  can_minimize="false"
+  help_topic="floater_big_preview"
+  layout="topleft"
+  name="floater_big_preview"
+  save_rect="true"
+  single_instance="true"
+  reuse_instance="true"
+  title="PREVIEW"
+  height="465"
+  width="770">
+  <panel
+   height="450"
+   width="750"
+   visible="true"
+   name="big_preview_placeholder"
+   top="5"
+   follows="all"
+   left="10">
+  </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_flickr_photo.xml b/indra/newview/skins/default/xui/en/panel_flickr_photo.xml
index 4516c016705..350c385cc35 100644
--- a/indra/newview/skins/default/xui/en/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/en/panel_flickr_photo.xml
@@ -82,7 +82,7 @@
                 text_color="EmphasisColor"
                 height="14"
                 top_pad="-19"
-                left_pad="-20"
+                left_pad="-30"
                 length="1"
                 halign="center"
                 name="working_lbl"
@@ -92,6 +92,19 @@
                 width="150">
                 Refreshing...
             </text>
+            <button
+                follows="right|top"
+                height="23"
+                label="Big Preview"
+                left="200"
+                top_pad="-19"
+                name="big_preview_btn"
+                tool_tip="Click to open big preview"
+                visible="true"
+                width="100" >
+                <button.commit_callback
+                function="SocialSharing.BigPreview" />
+            </button>
             <text
              length="1"
              follows="top|left|right"
@@ -99,7 +112,7 @@
              height="16"
              left="9"
              name="title_label"
-             top_pad="20"
+             top_pad="15"
              type="string">
               Title:
             </text>
-- 
GitLab