STORM-889 : pull into viewer-development

master
Merov Linden 2011-03-01 11:58:12 -08:00
commit 0a974abcff
6 changed files with 168 additions and 124 deletions

View File

@ -220,6 +220,8 @@ BOOL LLFloaterTools::postBuild()
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
mBtnGridOptions = getChild<LLButton>("Options...");
mTitleMedia = getChild<LLMediaCtrl>("title_media");
mBtnLink = getChild<LLButton>("link_btn");
mBtnUnlink = getChild<LLButton>("unlink_btn");
mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
getChild<LLUICtrl>("checkbox edit linked parts")->setValue((BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
@ -315,6 +317,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mBtnRotateReset(NULL),
mBtnRotateRight(NULL),
mBtnLink(NULL),
mBtnUnlink(NULL),
mBtnDelete(NULL),
mBtnDuplicate(NULL),
mBtnDuplicateInPlace(NULL),
@ -341,7 +346,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mNeedMediaTitle(TRUE)
{
gFloaterTools = this;
setAutoFocus(FALSE);
mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
@ -366,6 +371,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
}
LLFloaterTools::~LLFloaterTools()
@ -566,6 +574,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
mBtnLink->setVisible(edit_visible);
mBtnUnlink->setVisible(edit_visible);
mBtnLink->setEnabled(LLSelectMgr::instance().enableLinkObjects());
mBtnUnlink->setEnabled(LLSelectMgr::instance().enableUnlinkObjects());
if (mCheckSelectIndividual)
{
mCheckSelectIndividual->setVisible(edit_visible);

View File

@ -135,6 +135,8 @@ public:
LLRadioGroup* mRadioGroupEdit;
LLCheckBoxCtrl *mCheckSelectIndividual;
LLButton* mBtnLink;
LLButton* mBtnUnlink;
LLCheckBoxCtrl* mCheckSnapToGrid;
LLButton* mBtnGridOptions;

View File

@ -65,6 +65,7 @@
#include "llinventorymodel.h"
#include "llmenugl.h"
#include "llmutelist.h"
#include "llnotificationsutil.h"
#include "llsidepaneltaskinfo.h"
#include "llslurl.h"
#include "llstatusbar.h"
@ -562,6 +563,103 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
return object_found;
}
bool LLSelectMgr::linkObjects()
{
if (!LLSelectMgr::getInstance()->selectGetAllRootsValid())
{
LLNotificationsUtil::add("UnableToLinkWhileDownloading");
return true;
}
S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
if (object_count > MAX_CHILDREN_PER_TASK + 1)
{
LLSD args;
args["COUNT"] = llformat("%d", object_count);
int max = MAX_CHILDREN_PER_TASK+1;
args["MAX"] = llformat("%d", max);
LLNotificationsUtil::add("UnableToLinkObjects", args);
return true;
}
if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
{
LLNotificationsUtil::add("CannotLinkIncompleteSet");
return true;
}
if (!LLSelectMgr::getInstance()->selectGetRootsModify())
{
LLNotificationsUtil::add("CannotLinkModify");
return true;
}
LLUUID owner_id;
std::string owner_name;
if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
{
// we don't actually care if you're the owner, but novices are
// the most likely to be stumped by this one, so offer the
// easiest and most likely solution.
LLNotificationsUtil::add("CannotLinkDifferentOwners");
return true;
}
LLSelectMgr::getInstance()->sendLink();
return true;
}
bool LLSelectMgr::unlinkObjects()
{
LLSelectMgr::getInstance()->sendDelink();
return true;
}
// in order to link, all objects must have the same owner, and the
// agent must have the ability to modify all of the objects. However,
// we're not answering that question with this method. The question
// we're answering is: does the user have a reasonable expectation
// that a link operation should work? If so, return true, false
// otherwise. this allows the handle_link method to more finely check
// the selection and give an error message when the uer has a
// reasonable expectation for the link to work, but it will fail.
bool LLSelectMgr::enableLinkObjects()
{
bool new_value = false;
// check if there are at least 2 objects selected, and that the
// user can modify at least one of the selected objects.
// in component mode, can't link
if (!gSavedSettings.getBOOL("EditLinkedParts"))
{
if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
{
struct f : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
return object->permModify();
}
} func;
const bool firstonly = true;
new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
}
}
return new_value;
}
bool LLSelectMgr::enableUnlinkObjects()
{
LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
first_editable_object &&
!first_editable_object->isAttachment();
return new_value;
}
void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)
{
// bail if nothing selected or if object wasn't selected in the first place

View File

@ -439,6 +439,17 @@ public:
BOOL removeObjectFromSelections(const LLUUID &id);
////////////////////////////////////////////////////////////////
// Selection editing
////////////////////////////////////////////////////////////////
bool linkObjects();
bool unlinkObjects();
bool enableLinkObjects();
bool enableUnlinkObjects();
////////////////////////////////////////////////////////////////
// Selection accessors
////////////////////////////////////////////////////////////////

View File

@ -4781,110 +4781,6 @@ class LLToolsSelectNextPart : public view_listener_t
}
};
// in order to link, all objects must have the same owner, and the
// agent must have the ability to modify all of the objects. However,
// we're not answering that question with this method. The question
// we're answering is: does the user have a reasonable expectation
// that a link operation should work? If so, return true, false
// otherwise. this allows the handle_link method to more finely check
// the selection and give an error message when the uer has a
// reasonable expectation for the link to work, but it will fail.
class LLToolsEnableLink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
bool new_value = false;
// check if there are at least 2 objects selected, and that the
// user can modify at least one of the selected objects.
// in component mode, can't link
if (!gSavedSettings.getBOOL("EditLinkedParts"))
{
if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
{
struct f : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
return object->permModify();
}
} func;
const bool firstonly = true;
new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
}
}
return new_value;
}
};
class LLToolsLink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
{
LLNotificationsUtil::add("UnableToLinkWhileDownloading");
return true;
}
S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
if (object_count > MAX_CHILDREN_PER_TASK + 1)
{
LLSD args;
args["COUNT"] = llformat("%d", object_count);
int max = MAX_CHILDREN_PER_TASK+1;
args["MAX"] = llformat("%d", max);
LLNotificationsUtil::add("UnableToLinkObjects", args);
return true;
}
if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
{
LLNotificationsUtil::add("CannotLinkIncompleteSet");
return true;
}
if(!LLSelectMgr::getInstance()->selectGetRootsModify())
{
LLNotificationsUtil::add("CannotLinkModify");
return true;
}
LLUUID owner_id;
std::string owner_name;
if(!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
{
// we don't actually care if you're the owner, but novices are
// the most likely to be stumped by this one, so offer the
// easiest and most likely solution.
LLNotificationsUtil::add("CannotLinkDifferentOwners");
return true;
}
LLSelectMgr::getInstance()->sendLink();
return true;
}
};
class LLToolsEnableUnlink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
first_editable_object &&
!first_editable_object->isAttachment();
return new_value;
}
};
class LLToolsUnlink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLSelectMgr::getInstance()->sendDelink();
return true;
}
};
class LLToolsStopAllAnimations : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -7902,8 +7798,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");
view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");
view_listener_t::addMenu(new LLToolsSelectNextPart(), "Tools.SelectNextPart");
view_listener_t::addMenu(new LLToolsLink(), "Tools.Link");
view_listener_t::addMenu(new LLToolsUnlink(), "Tools.Unlink");
commit.add("Tools.Link", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");
view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys");
view_listener_t::addMenu(new LLToolsEnableReleaseKeys(), "Tools.EnableReleaseKeys");
@ -7916,8 +7812,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnableToolNotPie(), "Tools.EnableToolNotPie");
view_listener_t::addMenu(new LLToolsEnableSelectNextPart(), "Tools.EnableSelectNextPart");
view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink");
view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
enable.add("Tools.EnableLink", boost::bind(&LLSelectMgr::enableLinkObjects, LLSelectMgr::getInstance()));
enable.add("Tools.EnableUnlink", boost::bind(&LLSelectMgr::enableUnlinkObjects, LLSelectMgr::getInstance()));
view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object));

View File

@ -248,30 +248,53 @@
function="BuildTool.commitRadioEdit"/>
</radio_group>
<check_box
left="10"
left="5"
follows="left|top"
height="28"
control_name="EditLinkedParts"
label="Edit linked"
layout="topleft"
name="checkbox edit linked parts"
top_pad="2">
top_pad="-10">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
<text
text_color="LtGray_50"
follows="top|left"
halign="left"
left="13"
name="RenderingCost"
tool_tip="Shows the rendering cost calculated for this object"
top_pad="0"
type="string"
width="100">
þ: [COUNT]
</text>
<button
follows="left|top"
height="23"
label="Link"
top_pad="2"
layout="topleft"
left="5"
name="link_btn"
width="50">
<button.commit_callback
function="BuildTool.LinkObjects"/>
</button>
<button
follows="left|top"
height="23"
label="Unlink"
layout="topleft"
left_pad="2"
name="unlink_btn"
width="50">
<button.commit_callback
function="BuildTool.UnlinkObjects"/>
</button>
<text
text_color="LtGray_50"
follows="top|left"
halign="left"
left_pad="3"
name="RenderingCost"
tool_tip="Shows the rendering cost calculated for this object"
top_delta="11"
type="string"
width="100">
þ: [COUNT]
</text>
<check_box
control_name="ScaleUniform"
height="19"
@ -299,7 +322,7 @@
layout="topleft"
left="143"
name="checkbox stretch textures"
top_pad="7"
top_pad="-6"
width="134" />
<check_box
control_name="SnapEnabled"