STORM-889 : pull into viewer-development
commit
0a974abcff
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,8 @@ public:
|
|||
LLRadioGroup* mRadioGroupEdit;
|
||||
|
||||
LLCheckBoxCtrl *mCheckSelectIndividual;
|
||||
LLButton* mBtnLink;
|
||||
LLButton* mBtnUnlink;
|
||||
|
||||
LLCheckBoxCtrl* mCheckSnapToGrid;
|
||||
LLButton* mBtnGridOptions;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -439,6 +439,17 @@ public:
|
|||
|
||||
BOOL removeObjectFromSelections(const LLUUID &id);
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Selection editing
|
||||
////////////////////////////////////////////////////////////////
|
||||
bool linkObjects();
|
||||
|
||||
bool unlinkObjects();
|
||||
|
||||
bool enableLinkObjects();
|
||||
|
||||
bool enableUnlinkObjects();
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Selection accessors
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue