summaryrefslogtreecommitdiff
path: root/indra/newview/llpreviewanim.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpreviewanim.cpp')
-rwxr-xr-x[-rw-r--r--]indra/newview/llpreviewanim.cpp202
1 files changed, 89 insertions, 113 deletions
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 604faf8eb4..35ac0537a3 100644..100755
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -2,31 +2,25 @@
* @file llpreviewanim.cpp
* @brief LLPreviewAnim class implementation
*
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 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.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * 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.
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * 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$
*/
@@ -49,20 +43,7 @@ extern LLAgent gAgent;
LLPreviewAnim::LLPreviewAnim(const LLSD& key)
: LLPreview( key )
{
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_animation.xml", FALSE);
-}
-
-// static
-void LLPreviewAnim::endAnimCallback( void *userdata )
-{
- LLHandle<LLFloater>* handlep = ((LLHandle<LLFloater>*)userdata);
- LLFloater* self = handlep->get();
- delete handlep; // done with the handle
- if (self)
- {
- self->childSetValue("Anim play btn", FALSE);
- self->childSetValue("Anim audition btn", FALSE);
- }
+ mCommitCallbackRegistrar.add("PreviewAnim.Play", boost::bind(&LLPreviewAnim::play, this, _2));
}
// virtual
@@ -71,131 +52,126 @@ BOOL LLPreviewAnim::postBuild()
const LLInventoryItem* item = getItem();
if(item)
{
- gAgent.getAvatarObject()->createMotion(item->getAssetUUID()); // preload the animation
- childSetText("desc", item->getDescription());
+ gAgentAvatarp->createMotion(item->getAssetUUID()); // preload the animation
+ getChild<LLUICtrl>("desc")->setValue(item->getDescription());
}
- childSetAction("Anim play btn",playAnim, this);
- childSetAction("Anim audition btn",auditionAnim, this);
-
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
-
+ getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
+
return LLPreview::postBuild();
}
-void LLPreviewAnim::activate(e_activation_type type)
+// static
+// llinventorybridge also calls into here
+void LLPreviewAnim::play(const LLSD& param)
{
- switch ( type )
+ const LLInventoryItem *item = getItem();
+
+ if(item)
{
- case PLAY:
+ LLUUID itemID=item->getAssetUUID();
+
+ std::string btn_name = param.asString();
+ LLButton* btn_inuse;
+ LLButton* btn_other;
+
+ if ("Inworld" == btn_name)
{
- playAnim( (void *) this );
- break;
+ btn_inuse = getChild<LLButton>("Inworld");
+ btn_other = getChild<LLButton>("Locally");
}
- case AUDITION:
+ else if ("Locally" == btn_name)
{
- auditionAnim( (void *) this );
- break;
+ btn_inuse = getChild<LLButton>("Locally");
+ btn_other = getChild<LLButton>("Inworld");
}
- default:
+ else
{
- //do nothing
+ return;
}
- }
-}
-
-// static
-void LLPreviewAnim::playAnim( void *userdata )
-{
- LLPreviewAnim* self = (LLPreviewAnim*) userdata;
- const LLInventoryItem *item = self->getItem();
- if(item)
- {
- LLUUID itemID=item->getAssetUUID();
+ if (btn_inuse)
+ {
+ btn_inuse->toggleState();
+ }
- LLButton* btn = self->getChild<LLButton>("Anim play btn");
- if (btn)
+ if (btn_other)
{
- btn->toggleState();
+ btn_other->setEnabled(false);
}
- if (self->childGetValue("Anim play btn").asBoolean() )
+ if (getChild<LLUICtrl>(btn_name)->getValue().asBoolean() )
{
- self->mPauseRequest = NULL;
- gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START);
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(itemID);
-
+ if("Inworld" == btn_name)
+ {
+ gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START);
+ }
+ else
+ {
+ gAgentAvatarp->startMotion(item->getAssetUUID());
+ }
+
+ LLMotion* motion = gAgentAvatarp->findMotion(itemID);
if (motion)
{
- motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle())));
+ mItemID = itemID;
+ mDidStart = false;
}
}
else
{
- gAgent.getAvatarObject()->stopMotion(itemID);
+ gAgentAvatarp->stopMotion(itemID);
gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
+
+ if (btn_other)
+ {
+ btn_other->setEnabled(true);
+ }
}
}
}
-// static
-void LLPreviewAnim::auditionAnim( void *userdata )
+// virtual
+void LLPreviewAnim::draw()
{
- LLPreviewAnim* self = (LLPreviewAnim*) userdata;
- const LLInventoryItem *item = self->getItem();
-
- if(item)
+ LLPreview::draw();
+ if (!this->mItemID.isNull())
{
- LLUUID itemID=item->getAssetUUID();
-
- LLButton* btn = self->getChild<LLButton>("Anim audition btn");
- if (btn)
- {
- btn->toggleState();
- }
-
- if (self->childGetValue("Anim audition btn").asBoolean() )
+ LLMotion* motion = gAgentAvatarp->findMotion(this->mItemID);
+ if (motion)
{
- self->mPauseRequest = NULL;
- gAgent.getAvatarObject()->startMotion(item->getAssetUUID());
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(itemID);
-
- if (motion)
+ if (motion->isStopped() && this->mDidStart)
{
- motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle())));
+ cleanup();
+ }
+ if(gAgentAvatarp->isMotionActive(this->mItemID) && !this->mDidStart)
+ {
+ this->mDidStart = true;
}
- }
- else
- {
- gAgent.getAvatarObject()->stopMotion(itemID);
- gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
}
}
}
// virtual
+void LLPreviewAnim::cleanup()
+{
+ this->mItemID = LLUUID::null;
+ this->mDidStart = false;
+ getChild<LLUICtrl>("Inworld")->setValue(FALSE);
+ getChild<LLUICtrl>("Locally")->setValue(FALSE);
+ getChild<LLUICtrl>("Inworld")->setEnabled(true);
+ getChild<LLUICtrl>("Locally")->setEnabled(true);
+}
+
+// virtual
void LLPreviewAnim::onClose(bool app_quitting)
{
const LLInventoryItem *item = getItem();
if(item)
{
- gAgent.getAvatarObject()->stopMotion(item->getAssetUUID());
+ gAgentAvatarp->stopMotion(item->getAssetUUID());
gAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP);
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(item->getAssetUUID());
-
- if (motion)
- {
- // *TODO: minor memory leak here, user data is never deleted (Use real callbacks)
- motion->setDeactivateCallback(NULL, (void *)NULL);
- }
}
}