diff options
Diffstat (limited to 'indra/newview/llfloatertelehub.cpp')
| -rw-r--r-- | indra/newview/llfloatertelehub.cpp | 558 | 
1 files changed, 279 insertions, 279 deletions
diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp index 99e737efb5..c56ad266cf 100644 --- a/indra/newview/llfloatertelehub.cpp +++ b/indra/newview/llfloatertelehub.cpp @@ -1,279 +1,279 @@ -/**  - * @file llfloatertelehub.cpp - * @author James Cook - * @brief LLFloaterTelehub class implementation - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "llfloatertelehub.h" - -#include "message.h" -#include "llfontgl.h" - -#include "llagent.h" -#include "llfloaterreg.h" -#include "llfloatertools.h" -#include "llscrolllistctrl.h" -#include "llselectmgr.h" -#include "lltoolcomp.h" -#include "lltoolmgr.h" -#include "llviewerobject.h" -#include "llviewerobjectlist.h" -#include "lluictrlfactory.h" - -LLFloaterTelehub::LLFloaterTelehub(const LLSD& key) -:	LLFloater(key), -	mTelehubObjectID(), -	mTelehubObjectName(), -	mTelehubPos(), -	mTelehubRot(), -	mNumSpawn(0) -{ -} - -bool LLFloaterTelehub::postBuild() -{ -	gMessageSystem->setHandlerFunc("TelehubInfo", processTelehubInfo); - -	getChild<LLUICtrl>("connect_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickConnect, this)); -	getChild<LLUICtrl>("disconnect_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickDisconnect, this)); -	getChild<LLUICtrl>("add_spawn_point_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickAddSpawnPoint, this)); -	getChild<LLUICtrl>("remove_spawn_point_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickRemoveSpawnPoint, this)); - -	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list"); -	if (list) -	{ -		// otherwise you can't walk with arrow keys while floater is up -		list->setAllowKeyboardMovement(false); -	} - -	return true; -} -void LLFloaterTelehub::onOpen(const LLSD& key) -{ -	// Show tools floater by selecting translate (select) tool -	LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); -	LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompTranslate::getInstance() ); - -	sendTelehubInfoRequest(); -	 -	mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); -} - -LLFloaterTelehub::~LLFloaterTelehub() -{ -	// no longer interested in this message -	gMessageSystem->setHandlerFunc("TelehubInfo", NULL); -} - -void LLFloaterTelehub::draw() -{ -	if (!isMinimized()) -	{ -		refresh(); -	} -	LLFloater::draw(); -} - -// Per-frame updates, because we don't have a selection manager observer. -void LLFloaterTelehub::refresh() -{ -	constexpr bool children_ok = true; -	LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok); -	 -	bool have_selection = (object != NULL); -	bool all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); -	getChildView("connect_btn")->setEnabled(have_selection && all_volume); - -	bool have_telehub = mTelehubObjectID.notNull(); -	getChildView("disconnect_btn")->setEnabled(have_telehub); - -	bool space_avail = (mNumSpawn < MAX_SPAWNPOINTS_PER_TELEHUB); -	getChildView("add_spawn_point_btn")->setEnabled(have_selection && all_volume && space_avail); - -	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list"); -	if (list) -	{ -		bool enable_remove = (list->getFirstSelected() != NULL); -		getChildView("remove_spawn_point_btn")->setEnabled(enable_remove); -	} -} - -// static -bool LLFloaterTelehub::renderBeacons() -{ -	// only render if we've got a telehub -	LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs"); -	return floater && floater->mTelehubObjectID.notNull(); -} - -// static -void LLFloaterTelehub::addBeacons() -{ -	LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs"); -	if (!floater) -		return; -	 -	// Find the telehub position, either our cached old position, or -	// an updated one based on the actual object position. -	LLVector3 hub_pos_region = floater->mTelehubPos; -	LLQuaternion hub_rot = floater->mTelehubRot; -	LLViewerObject* obj = gObjectList.findObject(floater->mTelehubObjectID); -	if (obj) -	{ -		hub_pos_region = obj->getPositionRegion(); -		hub_rot = obj->getRotationRegion(); -	} -	// Draw nice thick 3-pixel lines. -	gObjectList.addDebugBeacon(hub_pos_region, "", LLColor4::yellow, LLColor4::white, 4); - -	LLScrollListCtrl* list = floater->getChild<LLScrollListCtrl>("spawn_points_list"); -	if (list) -	{ -		S32 spawn_index = list->getFirstSelectedIndex(); -		if (spawn_index >= 0) -		{ -			LLVector3 spawn_pos = hub_pos_region  + (floater->mSpawnPointPos[spawn_index] * hub_rot); -			gObjectList.addDebugBeacon(spawn_pos, "", LLColor4::orange, LLColor4::white, 4); -		} -	} -} - -void LLFloaterTelehub::sendTelehubInfoRequest() -{ -	LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "info ui"); -} - -void LLFloaterTelehub::onClickConnect() -{ -	LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "connect"); -} - -void LLFloaterTelehub::onClickDisconnect() -{ -	LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "delete"); -} - -void LLFloaterTelehub::onClickAddSpawnPoint() -{ -	LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "spawnpoint add"); -	LLSelectMgr::getInstance()->deselectAll(); -} - -void LLFloaterTelehub::onClickRemoveSpawnPoint() -{ -	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list"); -	if (!list) -		return; - -	S32 spawn_index = list->getFirstSelectedIndex(); -	if (spawn_index < 0) return;  // nothing selected - -	LLMessageSystem* msg = gMessageSystem; - -	// Could be god or estate owner.  If neither, server will reject message. -	if (gAgent.isGodlike()) -	{ -		msg->newMessage("GodlikeMessage"); -	} -	else -	{ -		msg->newMessage("EstateOwnerMessage"); -	} -	msg->nextBlock("AgentData"); -	msg->addUUID("AgentID", gAgent.getID()); -	msg->addUUID("SessionID", gAgent.getSessionID()); -	msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used -	msg->nextBlock("MethodData"); -	msg->addString("Method", "telehub"); -	msg->addUUID("Invoice", LLUUID::null); - -	msg->nextBlock("ParamList"); -	msg->addString("Parameter", "spawnpoint remove"); - -	std::string buffer; -	buffer = llformat("%d", spawn_index); -	msg->nextBlock("ParamList"); -	msg->addString("Parameter", buffer); - -	gAgent.sendReliableMessage(); -} - -// static  -void LLFloaterTelehub::processTelehubInfo(LLMessageSystem* msg, void**) -{ -	LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs"); -	if (floater) -	{ -		floater->unpackTelehubInfo(msg); -	} -} - -void LLFloaterTelehub::unpackTelehubInfo(LLMessageSystem* msg) -{ -	msg->getUUID("TelehubBlock", "ObjectID", mTelehubObjectID); -	msg->getString("TelehubBlock", "ObjectName", mTelehubObjectName); -	msg->getVector3("TelehubBlock", "TelehubPos", mTelehubPos); -	msg->getQuat("TelehubBlock", "TelehubRot", mTelehubRot); - -	mNumSpawn = msg->getNumberOfBlocks("SpawnPointBlock"); -	for (S32 i = 0; i < mNumSpawn; i++) -	{ -		msg->getVector3("SpawnPointBlock", "SpawnPointPos", mSpawnPointPos[i], i); -	} - -	// Update parts of the UI that change only when message received. - -	if (mTelehubObjectID.isNull()) -	{ -		getChildView("status_text_connected")->setVisible( false); -		getChildView("status_text_not_connected")->setVisible( true); -		getChildView("help_text_connected")->setVisible( false); -		getChildView("help_text_not_connected")->setVisible( true); -	} -	else -	{ -		getChild<LLUICtrl>("status_text_connected")->setTextArg("[OBJECT]", mTelehubObjectName); -		getChildView("status_text_connected")->setVisible( true); -		getChildView("status_text_not_connected")->setVisible( false); -		getChildView("help_text_connected")->setVisible( true); -		getChildView("help_text_not_connected")->setVisible( false); -	} - -	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list"); -	if (list) -	{ -		list->deleteAllItems(); -		for (S32 i = 0; i < mNumSpawn; i++) -		{ -			std::string pos = llformat("%.1f, %.1f, %.1f",  -									mSpawnPointPos[i].mV[VX], -									mSpawnPointPos[i].mV[VY], -									mSpawnPointPos[i].mV[VZ]); -			list->addSimpleElement(pos); -		} -		list->selectNthItem(mNumSpawn - 1); -	} -} +/**
 + * @file llfloatertelehub.cpp
 + * @author James Cook
 + * @brief LLFloaterTelehub class implementation
 + *
 + * $LicenseInfo:firstyear=2005&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2010, 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 "llfloatertelehub.h"
 +
 +#include "message.h"
 +#include "llfontgl.h"
 +
 +#include "llagent.h"
 +#include "llfloaterreg.h"
 +#include "llfloatertools.h"
 +#include "llscrolllistctrl.h"
 +#include "llselectmgr.h"
 +#include "lltoolcomp.h"
 +#include "lltoolmgr.h"
 +#include "llviewerobject.h"
 +#include "llviewerobjectlist.h"
 +#include "lluictrlfactory.h"
 +
 +LLFloaterTelehub::LLFloaterTelehub(const LLSD& key)
 +:   LLFloater(key),
 +    mTelehubObjectID(),
 +    mTelehubObjectName(),
 +    mTelehubPos(),
 +    mTelehubRot(),
 +    mNumSpawn(0)
 +{
 +}
 +
 +bool LLFloaterTelehub::postBuild()
 +{
 +    gMessageSystem->setHandlerFunc("TelehubInfo", processTelehubInfo);
 +
 +    getChild<LLUICtrl>("connect_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickConnect, this));
 +    getChild<LLUICtrl>("disconnect_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickDisconnect, this));
 +    getChild<LLUICtrl>("add_spawn_point_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickAddSpawnPoint, this));
 +    getChild<LLUICtrl>("remove_spawn_point_btn")->setCommitCallback(boost::bind(&LLFloaterTelehub::onClickRemoveSpawnPoint, this));
 +
 +    LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list");
 +    if (list)
 +    {
 +        // otherwise you can't walk with arrow keys while floater is up
 +        list->setAllowKeyboardMovement(false);
 +    }
 +
 +    return true;
 +}
 +void LLFloaterTelehub::onOpen(const LLSD& key)
 +{
 +    // Show tools floater by selecting translate (select) tool
 +    LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
 +    LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompTranslate::getInstance() );
 +
 +    sendTelehubInfoRequest();
 +
 +    mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
 +}
 +
 +LLFloaterTelehub::~LLFloaterTelehub()
 +{
 +    // no longer interested in this message
 +    gMessageSystem->setHandlerFunc("TelehubInfo", NULL);
 +}
 +
 +void LLFloaterTelehub::draw()
 +{
 +    if (!isMinimized())
 +    {
 +        refresh();
 +    }
 +    LLFloater::draw();
 +}
 +
 +// Per-frame updates, because we don't have a selection manager observer.
 +void LLFloaterTelehub::refresh()
 +{
 +    constexpr bool children_ok = true;
 +    LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok);
 +
 +    bool have_selection = (object != NULL);
 +    bool all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
 +    getChildView("connect_btn")->setEnabled(have_selection && all_volume);
 +
 +    bool have_telehub = mTelehubObjectID.notNull();
 +    getChildView("disconnect_btn")->setEnabled(have_telehub);
 +
 +    bool space_avail = (mNumSpawn < MAX_SPAWNPOINTS_PER_TELEHUB);
 +    getChildView("add_spawn_point_btn")->setEnabled(have_selection && all_volume && space_avail);
 +
 +    LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list");
 +    if (list)
 +    {
 +        bool enable_remove = (list->getFirstSelected() != NULL);
 +        getChildView("remove_spawn_point_btn")->setEnabled(enable_remove);
 +    }
 +}
 +
 +// static
 +bool LLFloaterTelehub::renderBeacons()
 +{
 +    // only render if we've got a telehub
 +    LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs");
 +    return floater && floater->mTelehubObjectID.notNull();
 +}
 +
 +// static
 +void LLFloaterTelehub::addBeacons()
 +{
 +    LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs");
 +    if (!floater)
 +        return;
 +
 +    // Find the telehub position, either our cached old position, or
 +    // an updated one based on the actual object position.
 +    LLVector3 hub_pos_region = floater->mTelehubPos;
 +    LLQuaternion hub_rot = floater->mTelehubRot;
 +    LLViewerObject* obj = gObjectList.findObject(floater->mTelehubObjectID);
 +    if (obj)
 +    {
 +        hub_pos_region = obj->getPositionRegion();
 +        hub_rot = obj->getRotationRegion();
 +    }
 +    // Draw nice thick 3-pixel lines.
 +    gObjectList.addDebugBeacon(hub_pos_region, "", LLColor4::yellow, LLColor4::white, 4);
 +
 +    LLScrollListCtrl* list = floater->getChild<LLScrollListCtrl>("spawn_points_list");
 +    if (list)
 +    {
 +        S32 spawn_index = list->getFirstSelectedIndex();
 +        if (spawn_index >= 0)
 +        {
 +            LLVector3 spawn_pos = hub_pos_region  + (floater->mSpawnPointPos[spawn_index] * hub_rot);
 +            gObjectList.addDebugBeacon(spawn_pos, "", LLColor4::orange, LLColor4::white, 4);
 +        }
 +    }
 +}
 +
 +void LLFloaterTelehub::sendTelehubInfoRequest()
 +{
 +    LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "info ui");
 +}
 +
 +void LLFloaterTelehub::onClickConnect()
 +{
 +    LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "connect");
 +}
 +
 +void LLFloaterTelehub::onClickDisconnect()
 +{
 +    LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "delete");
 +}
 +
 +void LLFloaterTelehub::onClickAddSpawnPoint()
 +{
 +    LLSelectMgr::getInstance()->sendGodlikeRequest("telehub", "spawnpoint add");
 +    LLSelectMgr::getInstance()->deselectAll();
 +}
 +
 +void LLFloaterTelehub::onClickRemoveSpawnPoint()
 +{
 +    LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list");
 +    if (!list)
 +        return;
 +
 +    S32 spawn_index = list->getFirstSelectedIndex();
 +    if (spawn_index < 0) return;  // nothing selected
 +
 +    LLMessageSystem* msg = gMessageSystem;
 +
 +    // Could be god or estate owner.  If neither, server will reject message.
 +    if (gAgent.isGodlike())
 +    {
 +        msg->newMessage("GodlikeMessage");
 +    }
 +    else
 +    {
 +        msg->newMessage("EstateOwnerMessage");
 +    }
 +    msg->nextBlock("AgentData");
 +    msg->addUUID("AgentID", gAgent.getID());
 +    msg->addUUID("SessionID", gAgent.getSessionID());
 +    msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
 +    msg->nextBlock("MethodData");
 +    msg->addString("Method", "telehub");
 +    msg->addUUID("Invoice", LLUUID::null);
 +
 +    msg->nextBlock("ParamList");
 +    msg->addString("Parameter", "spawnpoint remove");
 +
 +    std::string buffer;
 +    buffer = llformat("%d", spawn_index);
 +    msg->nextBlock("ParamList");
 +    msg->addString("Parameter", buffer);
 +
 +    gAgent.sendReliableMessage();
 +}
 +
 +// static
 +void LLFloaterTelehub::processTelehubInfo(LLMessageSystem* msg, void**)
 +{
 +    LLFloaterTelehub* floater = LLFloaterReg::findTypedInstance<LLFloaterTelehub>("telehubs");
 +    if (floater)
 +    {
 +        floater->unpackTelehubInfo(msg);
 +    }
 +}
 +
 +void LLFloaterTelehub::unpackTelehubInfo(LLMessageSystem* msg)
 +{
 +    msg->getUUID("TelehubBlock", "ObjectID", mTelehubObjectID);
 +    msg->getString("TelehubBlock", "ObjectName", mTelehubObjectName);
 +    msg->getVector3("TelehubBlock", "TelehubPos", mTelehubPos);
 +    msg->getQuat("TelehubBlock", "TelehubRot", mTelehubRot);
 +
 +    mNumSpawn = msg->getNumberOfBlocks("SpawnPointBlock");
 +    for (S32 i = 0; i < mNumSpawn; i++)
 +    {
 +        msg->getVector3("SpawnPointBlock", "SpawnPointPos", mSpawnPointPos[i], i);
 +    }
 +
 +    // Update parts of the UI that change only when message received.
 +
 +    if (mTelehubObjectID.isNull())
 +    {
 +        getChildView("status_text_connected")->setVisible( false);
 +        getChildView("status_text_not_connected")->setVisible( true);
 +        getChildView("help_text_connected")->setVisible( false);
 +        getChildView("help_text_not_connected")->setVisible( true);
 +    }
 +    else
 +    {
 +        getChild<LLUICtrl>("status_text_connected")->setTextArg("[OBJECT]", mTelehubObjectName);
 +        getChildView("status_text_connected")->setVisible( true);
 +        getChildView("status_text_not_connected")->setVisible( false);
 +        getChildView("help_text_connected")->setVisible( true);
 +        getChildView("help_text_not_connected")->setVisible( false);
 +    }
 +
 +    LLScrollListCtrl* list = getChild<LLScrollListCtrl>("spawn_points_list");
 +    if (list)
 +    {
 +        list->deleteAllItems();
 +        for (S32 i = 0; i < mNumSpawn; i++)
 +        {
 +            std::string pos = llformat("%.1f, %.1f, %.1f",
 +                                    mSpawnPointPos[i].mV[VX],
 +                                    mSpawnPointPos[i].mV[VY],
 +                                    mSpawnPointPos[i].mV[VZ]);
 +            list->addSimpleElement(pos);
 +        }
 +        list->selectNthItem(mNumSpawn - 1);
 +    }
 +}
  | 
