diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llfloatertools.cpp | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llfloatertools.cpp')
-rw-r--r-- | indra/newview/llfloatertools.cpp | 2340 |
1 files changed, 1170 insertions, 1170 deletions
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 31d9ada678..fd27f4e496 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1,1170 +1,1170 @@ -/** - * @file llfloatertools.cpp - * @brief The edit tools, including move, position, land, etc. - * - * $LicenseInfo:firstyear=2002&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 "llfloatertools.h" - -#include "llfontgl.h" -#include "llcoord.h" -//#include "llgl.h" - -#include "llagent.h" -#include "llagentcamera.h" -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" -#include "lldraghandle.h" -#include "llerror.h" -#include "llfloaterbuildoptions.h" -#include "llfloatermediasettings.h" -#include "llfloateropenobject.h" -#include "llfloaterobjectweights.h" -#include "llfloaterreg.h" -#include "llfocusmgr.h" -#include "llmediaentry.h" -#include "llmenugl.h" -#include "llnotificationsutil.h" -#include "llpanelcontents.h" -#include "llpanelface.h" -#include "llpanelland.h" -#include "llpanelobjectinventory.h" -#include "llpanelobject.h" -#include "llpanelvolume.h" -#include "llpanelpermissions.h" -#include "llparcel.h" -#include "llradiogroup.h" -#include "llresmgr.h" -#include "llselectmgr.h" -#include "llslider.h" -#include "llstatusbar.h" -#include "lltabcontainer.h" -#include "lltextbox.h" -#include "lltoolbrush.h" -#include "lltoolcomp.h" -#include "lltooldraganddrop.h" -#include "lltoolface.h" -#include "lltoolfocus.h" -#include "lltoolgrab.h" -#include "lltoolgrab.h" -#include "lltoolindividual.h" -#include "lltoolmgr.h" -#include "lltoolpie.h" -#include "lltoolpipette.h" -#include "lltoolplacer.h" -#include "lltoolselectland.h" -#include "lltrans.h" -#include "llui.h" -#include "llviewercontrol.h" -#include "llviewerjoystick.h" -#include "llviewerregion.h" -#include "llviewermenu.h" -#include "llviewerparcelmgr.h" -#include "llviewerwindow.h" -#include "llvovolume.h" -#include "lluictrlfactory.h" -#include "llmeshrepository.h" - -// Globals -LLFloaterTools *gFloaterTools = NULL; -bool LLFloaterTools::sShowObjectCost = true; -bool LLFloaterTools::sPreviousFocusOnAvatar = false; - -const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] = -{ - std::string("General"), // PANEL_GENERAL, - std::string("Object"), // PANEL_OBJECT, - std::string("Features"), // PANEL_FEATURES, - std::string("Texture"), // PANEL_FACE, - std::string("Content"), // PANEL_CONTENTS, -}; - - -// Local prototypes -void commit_grid_mode(LLUICtrl *ctrl); -void commit_select_component(void *data); -void click_show_more(void*); -void click_popup_info(void*); -void click_popup_done(void*); -void click_popup_minimize(void*); -void commit_slider_dozer_force(LLUICtrl *); -void click_apply_to_selection(void*); -void commit_radio_group_focus(LLUICtrl* ctrl); -void commit_radio_group_move(LLUICtrl* ctrl); -void commit_radio_group_edit(LLUICtrl* ctrl); -void commit_radio_group_land(LLUICtrl* ctrl); -void commit_slider_zoom(LLUICtrl *ctrl); - -/** - * Class LLLandImpactsObserver - * - * An observer class to monitor parcel selection and update - * the land impacts data from a parcel containing the selected object. - */ -class LLLandImpactsObserver : public LLParcelObserver -{ -public: - virtual void changed() - { - LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build"); - if(tools_floater) - { - tools_floater->updateLandImpacts(); - } - } -}; - -//static -void* LLFloaterTools::createPanelPermissions(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelPermissions = new LLPanelPermissions(); - return floater->mPanelPermissions; -} -//static -void* LLFloaterTools::createPanelObject(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelObject = new LLPanelObject(); - return floater->mPanelObject; -} - -//static -void* LLFloaterTools::createPanelVolume(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelVolume = new LLPanelVolume(); - return floater->mPanelVolume; -} - -//static -void* LLFloaterTools::createPanelFace(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelFace = new LLPanelFace(); - return floater->mPanelFace; -} - -//static -void* LLFloaterTools::createPanelContents(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelContents = new LLPanelContents(); - return floater->mPanelContents; -} - -//static -void* LLFloaterTools::createPanelLandInfo(void* data) -{ - LLFloaterTools* floater = (LLFloaterTools*)data; - floater->mPanelLandInfo = new LLPanelLandInfo(); - return floater->mPanelLandInfo; -} - -static const std::string toolNames[]={ - "ToolCube", - "ToolPrism", - "ToolPyramid", - "ToolTetrahedron", - "ToolCylinder", - "ToolHemiCylinder", - "ToolCone", - "ToolHemiCone", - "ToolSphere", - "ToolHemiSphere", - "ToolTorus", - "ToolTube", - "ToolRing", - "ToolTree", - "ToolGrass"}; -LLPCode toolData[]={ - LL_PCODE_CUBE, - LL_PCODE_PRISM, - LL_PCODE_PYRAMID, - LL_PCODE_TETRAHEDRON, - LL_PCODE_CYLINDER, - LL_PCODE_CYLINDER_HEMI, - LL_PCODE_CONE, - LL_PCODE_CONE_HEMI, - LL_PCODE_SPHERE, - LL_PCODE_SPHERE_HEMI, - LL_PCODE_TORUS, - LLViewerObject::LL_VO_SQUARE_TORUS, - LLViewerObject::LL_VO_TRIANGLE_TORUS, - LL_PCODE_LEGACY_TREE, - LL_PCODE_LEGACY_GRASS}; - -bool LLFloaterTools::postBuild() -{ - // Hide until tool selected - setVisible(false); - - // Since we constantly show and hide this during drags, don't - // make sounds on visibility changes. - setSoundFlags(LLView::SILENT); - - getDragHandle()->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") ); - - LLRect rect; - mBtnFocus = getChild<LLButton>("button focus");//btn; - mBtnMove = getChild<LLButton>("button move"); - mBtnEdit = getChild<LLButton>("button edit"); - mBtnCreate = getChild<LLButton>("button create"); - mBtnLand = getChild<LLButton>("button land" ); - mTextStatus = getChild<LLTextBox>("text status"); - mRadioGroupFocus = getChild<LLRadioGroup>("focus_radio_group"); - mRadioGroupMove = getChild<LLRadioGroup>("move_radio_group"); - mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group"); - mBtnGridOptions = getChild<LLButton>("Options..."); - 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")); - mCheckSnapToGrid = getChild<LLCheckBoxCtrl>("checkbox snap to grid"); - getChild<LLUICtrl>("checkbox snap to grid")->setValue((bool)gSavedSettings.getBOOL("SnapEnabled")); - mCheckStretchUniform = getChild<LLCheckBoxCtrl>("checkbox uniform"); - getChild<LLUICtrl>("checkbox uniform")->setValue((bool)gSavedSettings.getBOOL("ScaleUniform")); - mCheckStretchTexture = getChild<LLCheckBoxCtrl>("checkbox stretch textures"); - getChild<LLUICtrl>("checkbox stretch textures")->setValue((bool)gSavedSettings.getBOOL("ScaleStretchTextures")); - mComboGridMode = getChild<LLComboBox>("combobox grid mode"); - - // - // Create Buttons - // - - for(size_t t=0; t<LL_ARRAY_SIZE(toolNames); ++t) - { - LLButton *found = getChild<LLButton>(toolNames[t]); - if(found) - { - found->setClickedCallback(boost::bind(&LLFloaterTools::setObjectType, toolData[t])); - mButtons.push_back( found ); - }else{ - LL_WARNS() << "Tool button not found! DOA Pending." << LL_ENDL; - } - } - mCheckCopySelection = getChild<LLCheckBoxCtrl>("checkbox copy selection"); - getChild<LLUICtrl>("checkbox copy selection")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopySelection")); - mCheckSticky = getChild<LLCheckBoxCtrl>("checkbox sticky"); - getChild<LLUICtrl>("checkbox sticky")->setValue((bool)gSavedSettings.getBOOL("CreateToolKeepSelected")); - mCheckCopyCenters = getChild<LLCheckBoxCtrl>("checkbox copy centers"); - getChild<LLUICtrl>("checkbox copy centers")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopyCenters")); - mCheckCopyRotates = getChild<LLCheckBoxCtrl>("checkbox copy rotates"); - getChild<LLUICtrl>("checkbox copy rotates")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopyRotates")); - - mRadioGroupLand = getChild<LLRadioGroup>("land_radio_group"); - mBtnApplyToSelection = getChild<LLButton>("button apply to selection"); - mSliderDozerSize = getChild<LLSlider>("slider brush size"); - getChild<LLUICtrl>("slider brush size")->setValue(gSavedSettings.getF32("LandBrushSize")); - mSliderDozerForce = getChild<LLSlider>("slider force"); - // the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here - getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce"))); - - mCostTextBorder = getChild<LLViewBorder>("cost_text_border"); - - mTab = getChild<LLTabContainer>("Object Info Tabs"); - if(mTab) - { - mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); - mTab->setBorderVisible(false); - mTab->selectFirstTab(); - } - - mStatusText["rotate"] = getString("status_rotate"); - mStatusText["scale"] = getString("status_scale"); - mStatusText["move"] = getString("status_move"); - mStatusText["modifyland"] = getString("status_modifyland"); - mStatusText["camera"] = getString("status_camera"); - mStatusText["grab"] = getString("status_grab"); - mStatusText["place"] = getString("status_place"); - mStatusText["selectland"] = getString("status_selectland"); - - sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost"); - - return true; -} - -// Create the popupview with a dummy center. It will be moved into place -// during LLViewerWindow's per-frame hover processing. -LLFloaterTools::LLFloaterTools(const LLSD& key) -: LLFloater(key), - mBtnFocus(NULL), - mBtnMove(NULL), - mBtnEdit(NULL), - mBtnCreate(NULL), - mBtnLand(NULL), - mTextStatus(NULL), - - mRadioGroupFocus(NULL), - mRadioGroupMove(NULL), - mRadioGroupEdit(NULL), - - mCheckSelectIndividual(NULL), - - mCheckSnapToGrid(NULL), - mBtnGridOptions(NULL), - mComboGridMode(NULL), - mCheckStretchUniform(NULL), - mCheckStretchTexture(NULL), - mCheckStretchUniformLabel(NULL), - - mBtnRotateLeft(NULL), - mBtnRotateReset(NULL), - mBtnRotateRight(NULL), - - mBtnLink(NULL), - mBtnUnlink(NULL), - - mBtnDelete(NULL), - mBtnDuplicate(NULL), - mBtnDuplicateInPlace(NULL), - - mCheckSticky(NULL), - mCheckCopySelection(NULL), - mCheckCopyCenters(NULL), - mCheckCopyRotates(NULL), - mRadioGroupLand(NULL), - mSliderDozerSize(NULL), - mSliderDozerForce(NULL), - mBtnApplyToSelection(NULL), - - mTab(NULL), - mPanelPermissions(NULL), - mPanelObject(NULL), - mPanelVolume(NULL), - mPanelContents(NULL), - mPanelFace(NULL), - mPanelLandInfo(NULL), - - mCostTextBorder(NULL), - mTabLand(NULL), - - mLandImpactsObserver(NULL), - - mDirty(true), - mHasSelection(true) -{ - gFloaterTools = this; - - setAutoFocus(false); - mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions - mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject - mFactoryMap["Features"] = LLCallbackMap(createPanelVolume, this);//LLPanelVolume - mFactoryMap["Texture"] = LLCallbackMap(createPanelFace, this);//LLPanelFace - mFactoryMap["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents - mFactoryMap["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo - - mCommitCallbackRegistrar.add("BuildTool.setTool", boost::bind(&LLFloaterTools::setTool,this, _2)); - mCommitCallbackRegistrar.add("BuildTool.commitZoom", boost::bind(&commit_slider_zoom, _1)); - mCommitCallbackRegistrar.add("BuildTool.commitRadioFocus", boost::bind(&commit_radio_group_focus, _1)); - mCommitCallbackRegistrar.add("BuildTool.commitRadioMove", boost::bind(&commit_radio_group_move,_1)); - mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit", boost::bind(&commit_radio_group_edit,_1)); - - mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1)); - mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this)); - mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this)); - mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this)); - mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1)); - mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1)); - - mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance())); - mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); - - mLandImpactsObserver = new LLLandImpactsObserver(); - LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver); -} - -LLFloaterTools::~LLFloaterTools() -{ - // children automatically deleted - gFloaterTools = NULL; - - LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); - delete mLandImpactsObserver; -} - -void LLFloaterTools::setStatusText(const std::string& text) -{ - std::map<std::string, std::string>::iterator iter = mStatusText.find(text); - if (iter != mStatusText.end()) - { - mTextStatus->setText(iter->second); - } - else - { - mTextStatus->setText(text); - } -} - -void LLFloaterTools::refresh() -{ - const S32 INFO_WIDTH = getRect().getWidth(); - const S32 INFO_HEIGHT = 384; - LLRect object_info_rect(0, 0, INFO_WIDTH, -INFO_HEIGHT); - bool all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); - - S32 idx_features = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FEATURES]); - S32 idx_face = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FACE]); - S32 idx_contents = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_CONTENTS]); - - S32 selected_index = mTab->getCurrentPanelIndex(); - - if (!all_volume && (selected_index == idx_features || selected_index == idx_face || - selected_index == idx_contents)) - { - mTab->selectFirstTab(); - } - - mTab->enableTabButton(idx_features, all_volume); - mTab->enableTabButton(idx_face, all_volume); - mTab->enableTabButton(idx_contents, all_volume); - - // Refresh object and prim count labels - LLLocale locale(LLLocale::USER_LOCALE); -#if 0 - if (!gMeshRepo.meshRezEnabled()) - { - std::string obj_count_string; - LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); - getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string); - std::string prim_count_string; - LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount()); - getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string); - - // calculate selection rendering cost - if (sShowObjectCost) - { - std::string prim_cost_string; - S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); - LLResMgr::getInstance()->getIntegerString(prim_cost_string, render_cost); - getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string); - } - - // disable the object and prim counts if nothing selected - bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty(); - getChildView("obj_count")->setEnabled(have_selection); - getChildView("prim_count")->setEnabled(have_selection); - getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost); - } - else -#endif - { - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - F32 link_cost = selection->getSelectedLinksetCost(); - S32 link_count = selection->getRootObjectCount(); - S32 object_count = selection->getObjectCount(); - - LLCrossParcelFunctor func; - if (!LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true)) - { - // Unless multiple parcels selected, higlight parcel object is at. - LLViewerObject* selected_object = mObjectSelection->getFirstObject(); - if (selected_object) - { - // Select a parcel at the currently selected object's position. - LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); - } - else - { - LL_WARNS() << "Failed to get selected object" << LL_ENDL; - } - } - - if (object_count == 1) - { - // "selection_faces" shouldn't be visible if not LLToolFace::getInstance() - // But still need to be populated in case user switches - - std::string faces_str = ""; - - for (LLObjectSelection::iterator iter = selection->begin(); iter != selection->end();) - { - LLObjectSelection::iterator nextiter = iter++; // not strictly needed, we have only one object - LLSelectNode* node = *nextiter; - LLViewerObject* object = (*nextiter)->getObject(); - if (!object) - continue; - S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); - for (S32 te = 0; te < num_tes; ++te) - { - if (node->isTESelected(te)) - { - if (!faces_str.empty()) - { - faces_str += ", "; - } - faces_str += llformat("%d", te); - } - } - } - - childSetTextArg("selection_faces", "[FACES_STRING]", faces_str); - } - - bool show_faces = (object_count == 1) - && LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool(); - getChildView("selection_faces")->setVisible(show_faces); - - LLStringUtil::format_map_t selection_args; - selection_args["OBJ_COUNT"] = llformat("%.1d", link_count); - selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost); - - std::ostringstream selection_info; - - selection_info << getString("status_selectcount", selection_args); - - getChild<LLTextBox>("selection_count")->setText(selection_info.str()); - } - - - // Refresh child tabs - mPanelPermissions->refresh(); - mPanelObject->refresh(); - mPanelVolume->refresh(); - mPanelFace->refresh(); - mPanelFace->refreshMedia(); - mPanelContents->refresh(); - mPanelLandInfo->refresh(); - - // Refresh the advanced weights floater - LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights"); - if(object_weights_floater && object_weights_floater->getVisible()) - { - object_weights_floater->refresh(); - } -} - -void LLFloaterTools::draw() -{ - bool has_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); - if(!has_selection && (mHasSelection != has_selection)) - { - mDirty = true; - } - mHasSelection = has_selection; - - if (mDirty) - { - refresh(); - mDirty = false; - } - - // mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts")); - LLFloater::draw(); -} - -void LLFloaterTools::dirty() -{ - mDirty = true; - LLFloaterOpenObject* instance = LLFloaterReg::findTypedInstance<LLFloaterOpenObject>("openobject"); - if (instance) instance->dirty(); -} - -// Clean up any tool state that should not persist when the -// floater is closed. -void LLFloaterTools::resetToolState() -{ - gCameraBtnZoom = true; - gCameraBtnOrbit = false; - gCameraBtnPan = false; - - gGrabBtnSpin = false; - gGrabBtnVertical = false; -} - -void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) -{ - LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); - - // HACK to allow seeing the buttons when you have the app in a window. - // Keep the visibility the same as it - if (tool == gToolNull) - { - return; - } - - if ( isMinimized() ) - { // SL looks odd if we draw the tools while the window is minimized - return; - } - - // Focus buttons - bool focus_visible = ( tool == LLToolCamera::getInstance() ); - - mBtnFocus ->setToggleState( focus_visible ); - - mRadioGroupFocus->setVisible( focus_visible ); - getChildView("slider zoom")->setVisible( focus_visible); - getChildView("slider zoom")->setEnabled(gCameraBtnZoom); - - if (!gCameraBtnOrbit && - !gCameraBtnPan && - !(mask == MASK_ORBIT) && - !(mask == (MASK_ORBIT | MASK_ALT)) && - !(mask == MASK_PAN) && - !(mask == (MASK_PAN | MASK_ALT)) ) - { - mRadioGroupFocus->setValue("radio zoom"); - } - else if ( gCameraBtnOrbit || - (mask == MASK_ORBIT) || - (mask == (MASK_ORBIT | MASK_ALT)) ) - { - mRadioGroupFocus->setValue("radio orbit"); - } - else if ( gCameraBtnPan || - (mask == MASK_PAN) || - (mask == (MASK_PAN | MASK_ALT)) ) - { - mRadioGroupFocus->setValue("radio pan"); - } - - // multiply by correction factor because volume sliders go [0, 0.5] - getChild<LLUICtrl>("slider zoom")->setValue(gAgentCamera.getCameraZoomFraction() * 0.5f); - - // Move buttons - bool move_visible = (tool == LLToolGrab::getInstance()); - - if (mBtnMove) mBtnMove ->setToggleState( move_visible ); - - // HACK - highlight buttons for next click - mRadioGroupMove->setVisible(move_visible); - if (!(gGrabBtnSpin || - gGrabBtnVertical || - (mask == MASK_VERTICAL) || - (mask == MASK_SPIN))) - { - mRadioGroupMove->setValue("radio move"); - } - else if ((mask == MASK_VERTICAL) || - (gGrabBtnVertical && (mask != MASK_SPIN))) - { - mRadioGroupMove->setValue("radio lift"); - } - else if ((mask == MASK_SPIN) || - (gGrabBtnSpin && (mask != MASK_VERTICAL))) - { - mRadioGroupMove->setValue("radio spin"); - } - - // Edit buttons - bool edit_visible = tool == LLToolCompTranslate::getInstance() || - tool == LLToolCompRotate::getInstance() || - tool == LLToolCompScale::getInstance() || - tool == LLToolFace::getInstance() || - tool == LLToolIndividual::getInstance() || - tool == LLToolPipette::getInstance(); - - mBtnEdit ->setToggleState( edit_visible ); - mRadioGroupEdit->setVisible( edit_visible ); - //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); - //mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts")); - } - - if ( tool == LLToolCompTranslate::getInstance() ) - { - mRadioGroupEdit->setValue("radio position"); - } - else if ( tool == LLToolCompRotate::getInstance() ) - { - mRadioGroupEdit->setValue("radio rotate"); - } - else if ( tool == LLToolCompScale::getInstance() ) - { - mRadioGroupEdit->setValue("radio stretch"); - } - else if ( tool == LLToolFace::getInstance() ) - { - mRadioGroupEdit->setValue("radio select face"); - } - - if (mComboGridMode) - { - mComboGridMode->setVisible( edit_visible ); - S32 index = mComboGridMode->getCurrentIndex(); - mComboGridMode->removeall(); - - switch (mObjectSelection->getSelectType()) - { - case SELECT_TYPE_HUD: - mComboGridMode->add(getString("grid_screen_text")); - mComboGridMode->add(getString("grid_local_text")); - break; - case SELECT_TYPE_WORLD: - mComboGridMode->add(getString("grid_world_text")); - mComboGridMode->add(getString("grid_local_text")); - mComboGridMode->add(getString("grid_reference_text")); - break; - case SELECT_TYPE_ATTACHMENT: - mComboGridMode->add(getString("grid_attachment_text")); - mComboGridMode->add(getString("grid_local_text")); - mComboGridMode->add(getString("grid_reference_text")); - break; - } - - mComboGridMode->setCurrentByIndex(index); - } - - // Snap to grid disabled for grab tool - very confusing - if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ ); - if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ ); - - //mCheckSelectLinked ->setVisible( edit_visible ); - if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible ); - if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible ); - if (mCheckStretchUniformLabel) mCheckStretchUniformLabel->setVisible( edit_visible ); - - // Create buttons - bool create_visible = (tool == LLToolCompCreate::getInstance()); - - mBtnCreate ->setToggleState( tool == LLToolCompCreate::getInstance() ); - - if (mCheckCopySelection - && mCheckCopySelection->get()) - { - // don't highlight any placer button - for (std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++) - { - mButtons[i]->setToggleState(false); - mButtons[i]->setVisible( create_visible ); - } - } - else - { - // Highlight the correct placer button - for( S32 t = 0; t < (S32)mButtons.size(); t++ ) - { - LLPCode pcode = LLToolPlacer::getObjectType(); - LLPCode button_pcode = toolData[t]; - bool state = (pcode == button_pcode); - mButtons[t]->setToggleState( state ); - mButtons[t]->setVisible( create_visible ); - } - } - - if (mCheckSticky) mCheckSticky ->setVisible( create_visible ); - if (mCheckCopySelection) mCheckCopySelection ->setVisible( create_visible ); - if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible ); - if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible ); - - if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); - if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); - - // Land buttons - bool land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() ); - - mCostTextBorder->setVisible(!land_visible); - - if (mBtnLand) mBtnLand ->setToggleState( land_visible ); - - mRadioGroupLand->setVisible( land_visible ); - if ( tool == LLToolSelectLand::getInstance() ) - { - mRadioGroupLand->setValue("radio select land"); - } - else if ( tool == LLToolBrushLand::getInstance() ) - { - S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction"); - switch(dozer_mode) - { - case 0: - mRadioGroupLand->setValue("radio flatten"); - break; - case 1: - mRadioGroupLand->setValue("radio raise"); - break; - case 2: - mRadioGroupLand->setValue("radio lower"); - break; - case 3: - mRadioGroupLand->setValue("radio smooth"); - break; - case 4: - mRadioGroupLand->setValue("radio noise"); - break; - case 5: - mRadioGroupLand->setValue("radio revert"); - break; - default: - break; - } - } - - if (mBtnApplyToSelection) - { - mBtnApplyToSelection->setVisible( land_visible ); - mBtnApplyToSelection->setEnabled( land_visible && !LLViewerParcelMgr::getInstance()->selectionEmpty() && tool != LLToolSelectLand::getInstance()); - } - if (mSliderDozerSize) - { - mSliderDozerSize ->setVisible( land_visible ); - getChildView("Bulldozer:")->setVisible( land_visible); - getChildView("Dozer Size:")->setVisible( land_visible); - } - if (mSliderDozerForce) - { - mSliderDozerForce ->setVisible( land_visible ); - getChildView("Strength:")->setVisible( land_visible); - } - - bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); - - getChildView("selection_count")->setVisible(!land_visible && have_selection); - getChildView("selection_faces")->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool() - && LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1); - getChildView("selection_empty")->setVisible(!land_visible && !have_selection); - - mTab->setVisible(!land_visible); - mPanelLandInfo->setVisible(land_visible); -} - - -// virtual -bool LLFloaterTools::canClose() -{ - // don't close when quitting, so camera will stay put - return !LLApp::isExiting(); -} - -// virtual -void LLFloaterTools::onOpen(const LLSD& key) -{ - mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection(); - mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); - - std::string panel = key.asString(); - if (!panel.empty()) - { - mTab->selectTabByName(panel); - } - - LLTool* tool = LLToolMgr::getInstance()->getCurrentTool(); - if (tool == LLToolCompInspect::getInstance() - || tool == LLToolDragAndDrop::getInstance()) - { - // Something called floater up while it was supressed (during drag n drop, inspect), - // so it won't be getting any layout or visibility updates, update once - // further updates will come from updateLayout() - LLCoordGL select_center_screen; - MASK mask = gKeyboard->currentMask(true); - updatePopup(select_center_screen, mask); - } - - //gMenuBarView->setItemVisible("BuildTools", true); -} - -// virtual -void LLFloaterTools::onClose(bool app_quitting) -{ - mTab->setVisible(false); - - LLViewerJoystick::getInstance()->moveAvatar(false); - - // destroy media source used to grab media title - mPanelFace->unloadMedia(); - - // Different from handle_reset_view in that it doesn't actually - // move the camera if EditCameraMovement is not set. - gAgentCamera.resetView(gSavedSettings.getBOOL("EditCameraMovement")); - - // exit component selection mode - LLSelectMgr::getInstance()->promoteSelectionToRoot(); - gSavedSettings.setBOOL("EditLinkedParts", false); - - gViewerWindow->showCursor(); - - resetToolState(); - - mParcelSelection = NULL; - mObjectSelection = NULL; - - // Switch back to basic toolset - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - // we were already in basic toolset, using build tools - // so manually reset tool to default (pie menu tool) - LLToolMgr::getInstance()->getCurrentToolset()->selectFirstTool(); - - //gMenuBarView->setItemVisible("BuildTools", false); - LLFloaterReg::hideInstance("media_settings"); - - // hide the advanced object weights floater - LLFloaterReg::hideInstance("object_weights"); - - // hide gltf material editor - LLFloaterReg::hideInstance("live_material_editor"); - - // prepare content for next call - mPanelContents->clearContents(); - - if(sPreviousFocusOnAvatar) - { - sPreviousFocusOnAvatar = false; - gAgentCamera.setAllowChangeToFollow(true); - } -} - -void click_popup_info(void*) -{ -} - -void click_popup_done(void*) -{ - handle_reset_view(); -} - -void commit_radio_group_move(LLUICtrl* ctrl) -{ - LLRadioGroup* group = (LLRadioGroup*)ctrl; - std::string selected = group->getValue().asString(); - if (selected == "radio move") - { - gGrabBtnVertical = false; - gGrabBtnSpin = false; - } - else if (selected == "radio lift") - { - gGrabBtnVertical = true; - gGrabBtnSpin = false; - } - else if (selected == "radio spin") - { - gGrabBtnVertical = false; - gGrabBtnSpin = true; - } -} - -void commit_radio_group_focus(LLUICtrl* ctrl) -{ - LLRadioGroup* group = (LLRadioGroup*)ctrl; - std::string selected = group->getValue().asString(); - if (selected == "radio zoom") - { - gCameraBtnZoom = true; - gCameraBtnOrbit = false; - gCameraBtnPan = false; - } - else if (selected == "radio orbit") - { - gCameraBtnZoom = false; - gCameraBtnOrbit = true; - gCameraBtnPan = false; - } - else if (selected == "radio pan") - { - gCameraBtnZoom = false; - gCameraBtnOrbit = false; - gCameraBtnPan = true; - } -} - -void commit_slider_zoom(LLUICtrl *ctrl) -{ - // renormalize value, since max "volume" level is 0.5 for some reason - F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f; - gAgentCamera.setCameraZoomFraction(zoom_level); -} - -void commit_slider_dozer_force(LLUICtrl *ctrl) -{ - // the slider is logarithmic, so we exponentiate to get the actual force multiplier - F32 dozer_force = pow(10.f, (F32)ctrl->getValue().asReal()); - gSavedSettings.setF32("LandBrushForce", dozer_force); -} - -void click_apply_to_selection(void*) -{ - LLToolBrushLand::getInstance()->modifyLandInSelectionGlobal(); -} - -void commit_radio_group_edit(LLUICtrl *ctrl) -{ - S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners"); - - LLRadioGroup* group = (LLRadioGroup*)ctrl; - std::string selected = group->getValue().asString(); - if (selected == "radio position") - { - LLFloaterTools::setEditTool( LLToolCompTranslate::getInstance() ); - } - else if (selected == "radio rotate") - { - LLFloaterTools::setEditTool( LLToolCompRotate::getInstance() ); - } - else if (selected == "radio stretch") - { - LLFloaterTools::setEditTool( LLToolCompScale::getInstance() ); - } - else if (selected == "radio select face") - { - LLFloaterTools::setEditTool( LLToolFace::getInstance() ); - } - gSavedSettings.setBOOL("ShowParcelOwners", show_owners); -} - -void commit_radio_group_land(LLUICtrl* ctrl) -{ - LLRadioGroup* group = (LLRadioGroup*)ctrl; - std::string selected = group->getValue().asString(); - if (selected == "radio select land") - { - LLFloaterTools::setEditTool( LLToolSelectLand::getInstance() ); - } - else - { - LLFloaterTools::setEditTool( LLToolBrushLand::getInstance() ); - S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction"); - if (selected == "radio flatten") - dozer_mode = 0; - else if (selected == "radio raise") - dozer_mode = 1; - else if (selected == "radio lower") - dozer_mode = 2; - else if (selected == "radio smooth") - dozer_mode = 3; - else if (selected == "radio noise") - dozer_mode = 4; - else if (selected == "radio revert") - dozer_mode = 5; - gSavedSettings.setS32("RadioLandBrushAction", dozer_mode); - } -} - -void commit_select_component(void *data) -{ - LLFloaterTools* floaterp = (LLFloaterTools*)data; - - //forfeit focus - if (gFocusMgr.childHasKeyboardFocus(floaterp)) - { - gFocusMgr.setKeyboardFocus(NULL); - } - - bool select_individuals = floaterp->mCheckSelectIndividual->get(); - gSavedSettings.setBOOL("EditLinkedParts", select_individuals); - floaterp->dirty(); - - if (select_individuals) - { - LLSelectMgr::getInstance()->demoteSelectionToIndividuals(); - } - else - { - LLSelectMgr::getInstance()->promoteSelectionToRoot(); - } -} - -// static -void LLFloaterTools::setObjectType( LLPCode pcode ) -{ - LLToolPlacer::setObjectType( pcode ); - gSavedSettings.setBOOL("CreateToolCopySelection", false); - gFocusMgr.setMouseCapture(NULL); -} - -void commit_grid_mode(LLUICtrl *ctrl) -{ - LLComboBox* combo = (LLComboBox*)ctrl; - - LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex()); -} - -// static -void LLFloaterTools::setGridMode(S32 mode) -{ - LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build"); - if (!tools_floater || !tools_floater->mComboGridMode) - { - return; - } - - tools_floater->mComboGridMode->setCurrentByIndex(mode); -} - -void LLFloaterTools::onClickGridOptions() -{ - LLFloater* floaterp = LLFloaterReg::showInstance("build_options"); - // position floater next to build tools, not over - floaterp->setShape(gFloaterView->findNeighboringPosition(this, floaterp), true); -} - -// static -void LLFloaterTools::setEditTool(void* tool_pointer) -{ - LLTool *tool = (LLTool *)tool_pointer; - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( tool ); -} - -void LLFloaterTools::setTool(const LLSD& user_data) -{ - std::string control_name = user_data.asString(); - if(control_name == "Focus") - LLToolMgr::getInstance()->getCurrentToolset()->selectTool((LLTool *) LLToolCamera::getInstance() ); - else if (control_name == "Move" ) - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *)LLToolGrab::getInstance() ); - else if (control_name == "Edit" ) - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompTranslate::getInstance()); - else if (control_name == "Create" ) - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompCreate::getInstance()); - else if (control_name == "Land" ) - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolSelectLand::getInstance()); - else - LL_WARNS()<<" no parameter name "<<control_name<<" found!! No Tool selected!!"<< LL_ENDL; -} - -void LLFloaterTools::onFocusReceived() -{ - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - LLFloater::onFocusReceived(); -} - -void LLFloaterTools::updateLandImpacts() -{ - LLParcel *parcel = mParcelSelection->getParcel(); - if (!parcel) - { - return; - } - - // Update land impacts info in the weights floater - LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights"); - if(object_weights_floater) - { - object_weights_floater->updateLandImpacts(parcel); - } -} - +/**
+ * @file llfloatertools.cpp
+ * @brief The edit tools, including move, position, land, etc.
+ *
+ * $LicenseInfo:firstyear=2002&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 "llfloatertools.h"
+
+#include "llfontgl.h"
+#include "llcoord.h"
+//#include "llgl.h"
+
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "lldraghandle.h"
+#include "llerror.h"
+#include "llfloaterbuildoptions.h"
+#include "llfloatermediasettings.h"
+#include "llfloateropenobject.h"
+#include "llfloaterobjectweights.h"
+#include "llfloaterreg.h"
+#include "llfocusmgr.h"
+#include "llmediaentry.h"
+#include "llmenugl.h"
+#include "llnotificationsutil.h"
+#include "llpanelcontents.h"
+#include "llpanelface.h"
+#include "llpanelland.h"
+#include "llpanelobjectinventory.h"
+#include "llpanelobject.h"
+#include "llpanelvolume.h"
+#include "llpanelpermissions.h"
+#include "llparcel.h"
+#include "llradiogroup.h"
+#include "llresmgr.h"
+#include "llselectmgr.h"
+#include "llslider.h"
+#include "llstatusbar.h"
+#include "lltabcontainer.h"
+#include "lltextbox.h"
+#include "lltoolbrush.h"
+#include "lltoolcomp.h"
+#include "lltooldraganddrop.h"
+#include "lltoolface.h"
+#include "lltoolfocus.h"
+#include "lltoolgrab.h"
+#include "lltoolgrab.h"
+#include "lltoolindividual.h"
+#include "lltoolmgr.h"
+#include "lltoolpie.h"
+#include "lltoolpipette.h"
+#include "lltoolplacer.h"
+#include "lltoolselectland.h"
+#include "lltrans.h"
+#include "llui.h"
+#include "llviewercontrol.h"
+#include "llviewerjoystick.h"
+#include "llviewerregion.h"
+#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerwindow.h"
+#include "llvovolume.h"
+#include "lluictrlfactory.h"
+#include "llmeshrepository.h"
+
+// Globals
+LLFloaterTools *gFloaterTools = NULL;
+bool LLFloaterTools::sShowObjectCost = true;
+bool LLFloaterTools::sPreviousFocusOnAvatar = false;
+
+const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
+{
+ std::string("General"), // PANEL_GENERAL,
+ std::string("Object"), // PANEL_OBJECT,
+ std::string("Features"), // PANEL_FEATURES,
+ std::string("Texture"), // PANEL_FACE,
+ std::string("Content"), // PANEL_CONTENTS,
+};
+
+
+// Local prototypes
+void commit_grid_mode(LLUICtrl *ctrl);
+void commit_select_component(void *data);
+void click_show_more(void*);
+void click_popup_info(void*);
+void click_popup_done(void*);
+void click_popup_minimize(void*);
+void commit_slider_dozer_force(LLUICtrl *);
+void click_apply_to_selection(void*);
+void commit_radio_group_focus(LLUICtrl* ctrl);
+void commit_radio_group_move(LLUICtrl* ctrl);
+void commit_radio_group_edit(LLUICtrl* ctrl);
+void commit_radio_group_land(LLUICtrl* ctrl);
+void commit_slider_zoom(LLUICtrl *ctrl);
+
+/**
+ * Class LLLandImpactsObserver
+ *
+ * An observer class to monitor parcel selection and update
+ * the land impacts data from a parcel containing the selected object.
+ */
+class LLLandImpactsObserver : public LLParcelObserver
+{
+public:
+ virtual void changed()
+ {
+ LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build");
+ if(tools_floater)
+ {
+ tools_floater->updateLandImpacts();
+ }
+ }
+};
+
+//static
+void* LLFloaterTools::createPanelPermissions(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelPermissions = new LLPanelPermissions();
+ return floater->mPanelPermissions;
+}
+//static
+void* LLFloaterTools::createPanelObject(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelObject = new LLPanelObject();
+ return floater->mPanelObject;
+}
+
+//static
+void* LLFloaterTools::createPanelVolume(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelVolume = new LLPanelVolume();
+ return floater->mPanelVolume;
+}
+
+//static
+void* LLFloaterTools::createPanelFace(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelFace = new LLPanelFace();
+ return floater->mPanelFace;
+}
+
+//static
+void* LLFloaterTools::createPanelContents(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelContents = new LLPanelContents();
+ return floater->mPanelContents;
+}
+
+//static
+void* LLFloaterTools::createPanelLandInfo(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelLandInfo = new LLPanelLandInfo();
+ return floater->mPanelLandInfo;
+}
+
+static const std::string toolNames[]={
+ "ToolCube",
+ "ToolPrism",
+ "ToolPyramid",
+ "ToolTetrahedron",
+ "ToolCylinder",
+ "ToolHemiCylinder",
+ "ToolCone",
+ "ToolHemiCone",
+ "ToolSphere",
+ "ToolHemiSphere",
+ "ToolTorus",
+ "ToolTube",
+ "ToolRing",
+ "ToolTree",
+ "ToolGrass"};
+LLPCode toolData[]={
+ LL_PCODE_CUBE,
+ LL_PCODE_PRISM,
+ LL_PCODE_PYRAMID,
+ LL_PCODE_TETRAHEDRON,
+ LL_PCODE_CYLINDER,
+ LL_PCODE_CYLINDER_HEMI,
+ LL_PCODE_CONE,
+ LL_PCODE_CONE_HEMI,
+ LL_PCODE_SPHERE,
+ LL_PCODE_SPHERE_HEMI,
+ LL_PCODE_TORUS,
+ LLViewerObject::LL_VO_SQUARE_TORUS,
+ LLViewerObject::LL_VO_TRIANGLE_TORUS,
+ LL_PCODE_LEGACY_TREE,
+ LL_PCODE_LEGACY_GRASS};
+
+bool LLFloaterTools::postBuild()
+{
+ // Hide until tool selected
+ setVisible(false);
+
+ // Since we constantly show and hide this during drags, don't
+ // make sounds on visibility changes.
+ setSoundFlags(LLView::SILENT);
+
+ getDragHandle()->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") );
+
+ LLRect rect;
+ mBtnFocus = getChild<LLButton>("button focus");//btn;
+ mBtnMove = getChild<LLButton>("button move");
+ mBtnEdit = getChild<LLButton>("button edit");
+ mBtnCreate = getChild<LLButton>("button create");
+ mBtnLand = getChild<LLButton>("button land" );
+ mTextStatus = getChild<LLTextBox>("text status");
+ mRadioGroupFocus = getChild<LLRadioGroup>("focus_radio_group");
+ mRadioGroupMove = getChild<LLRadioGroup>("move_radio_group");
+ mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
+ mBtnGridOptions = getChild<LLButton>("Options...");
+ 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"));
+ mCheckSnapToGrid = getChild<LLCheckBoxCtrl>("checkbox snap to grid");
+ getChild<LLUICtrl>("checkbox snap to grid")->setValue((bool)gSavedSettings.getBOOL("SnapEnabled"));
+ mCheckStretchUniform = getChild<LLCheckBoxCtrl>("checkbox uniform");
+ getChild<LLUICtrl>("checkbox uniform")->setValue((bool)gSavedSettings.getBOOL("ScaleUniform"));
+ mCheckStretchTexture = getChild<LLCheckBoxCtrl>("checkbox stretch textures");
+ getChild<LLUICtrl>("checkbox stretch textures")->setValue((bool)gSavedSettings.getBOOL("ScaleStretchTextures"));
+ mComboGridMode = getChild<LLComboBox>("combobox grid mode");
+
+ //
+ // Create Buttons
+ //
+
+ for(size_t t=0; t<LL_ARRAY_SIZE(toolNames); ++t)
+ {
+ LLButton *found = getChild<LLButton>(toolNames[t]);
+ if(found)
+ {
+ found->setClickedCallback(boost::bind(&LLFloaterTools::setObjectType, toolData[t]));
+ mButtons.push_back( found );
+ }else{
+ LL_WARNS() << "Tool button not found! DOA Pending." << LL_ENDL;
+ }
+ }
+ mCheckCopySelection = getChild<LLCheckBoxCtrl>("checkbox copy selection");
+ getChild<LLUICtrl>("checkbox copy selection")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopySelection"));
+ mCheckSticky = getChild<LLCheckBoxCtrl>("checkbox sticky");
+ getChild<LLUICtrl>("checkbox sticky")->setValue((bool)gSavedSettings.getBOOL("CreateToolKeepSelected"));
+ mCheckCopyCenters = getChild<LLCheckBoxCtrl>("checkbox copy centers");
+ getChild<LLUICtrl>("checkbox copy centers")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopyCenters"));
+ mCheckCopyRotates = getChild<LLCheckBoxCtrl>("checkbox copy rotates");
+ getChild<LLUICtrl>("checkbox copy rotates")->setValue((bool)gSavedSettings.getBOOL("CreateToolCopyRotates"));
+
+ mRadioGroupLand = getChild<LLRadioGroup>("land_radio_group");
+ mBtnApplyToSelection = getChild<LLButton>("button apply to selection");
+ mSliderDozerSize = getChild<LLSlider>("slider brush size");
+ getChild<LLUICtrl>("slider brush size")->setValue(gSavedSettings.getF32("LandBrushSize"));
+ mSliderDozerForce = getChild<LLSlider>("slider force");
+ // the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here
+ getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce")));
+
+ mCostTextBorder = getChild<LLViewBorder>("cost_text_border");
+
+ mTab = getChild<LLTabContainer>("Object Info Tabs");
+ if(mTab)
+ {
+ mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
+ mTab->setBorderVisible(false);
+ mTab->selectFirstTab();
+ }
+
+ mStatusText["rotate"] = getString("status_rotate");
+ mStatusText["scale"] = getString("status_scale");
+ mStatusText["move"] = getString("status_move");
+ mStatusText["modifyland"] = getString("status_modifyland");
+ mStatusText["camera"] = getString("status_camera");
+ mStatusText["grab"] = getString("status_grab");
+ mStatusText["place"] = getString("status_place");
+ mStatusText["selectland"] = getString("status_selectland");
+
+ sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
+
+ return true;
+}
+
+// Create the popupview with a dummy center. It will be moved into place
+// during LLViewerWindow's per-frame hover processing.
+LLFloaterTools::LLFloaterTools(const LLSD& key)
+: LLFloater(key),
+ mBtnFocus(NULL),
+ mBtnMove(NULL),
+ mBtnEdit(NULL),
+ mBtnCreate(NULL),
+ mBtnLand(NULL),
+ mTextStatus(NULL),
+
+ mRadioGroupFocus(NULL),
+ mRadioGroupMove(NULL),
+ mRadioGroupEdit(NULL),
+
+ mCheckSelectIndividual(NULL),
+
+ mCheckSnapToGrid(NULL),
+ mBtnGridOptions(NULL),
+ mComboGridMode(NULL),
+ mCheckStretchUniform(NULL),
+ mCheckStretchTexture(NULL),
+ mCheckStretchUniformLabel(NULL),
+
+ mBtnRotateLeft(NULL),
+ mBtnRotateReset(NULL),
+ mBtnRotateRight(NULL),
+
+ mBtnLink(NULL),
+ mBtnUnlink(NULL),
+
+ mBtnDelete(NULL),
+ mBtnDuplicate(NULL),
+ mBtnDuplicateInPlace(NULL),
+
+ mCheckSticky(NULL),
+ mCheckCopySelection(NULL),
+ mCheckCopyCenters(NULL),
+ mCheckCopyRotates(NULL),
+ mRadioGroupLand(NULL),
+ mSliderDozerSize(NULL),
+ mSliderDozerForce(NULL),
+ mBtnApplyToSelection(NULL),
+
+ mTab(NULL),
+ mPanelPermissions(NULL),
+ mPanelObject(NULL),
+ mPanelVolume(NULL),
+ mPanelContents(NULL),
+ mPanelFace(NULL),
+ mPanelLandInfo(NULL),
+
+ mCostTextBorder(NULL),
+ mTabLand(NULL),
+
+ mLandImpactsObserver(NULL),
+
+ mDirty(true),
+ mHasSelection(true)
+{
+ gFloaterTools = this;
+
+ setAutoFocus(false);
+ mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
+ mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
+ mFactoryMap["Features"] = LLCallbackMap(createPanelVolume, this);//LLPanelVolume
+ mFactoryMap["Texture"] = LLCallbackMap(createPanelFace, this);//LLPanelFace
+ mFactoryMap["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents
+ mFactoryMap["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo
+
+ mCommitCallbackRegistrar.add("BuildTool.setTool", boost::bind(&LLFloaterTools::setTool,this, _2));
+ mCommitCallbackRegistrar.add("BuildTool.commitZoom", boost::bind(&commit_slider_zoom, _1));
+ mCommitCallbackRegistrar.add("BuildTool.commitRadioFocus", boost::bind(&commit_radio_group_focus, _1));
+ mCommitCallbackRegistrar.add("BuildTool.commitRadioMove", boost::bind(&commit_radio_group_move,_1));
+ mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit", boost::bind(&commit_radio_group_edit,_1));
+
+ mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1));
+ mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this));
+ mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this));
+ mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
+ mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
+ mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
+
+ mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
+ mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
+
+ mLandImpactsObserver = new LLLandImpactsObserver();
+ LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver);
+}
+
+LLFloaterTools::~LLFloaterTools()
+{
+ // children automatically deleted
+ gFloaterTools = NULL;
+
+ LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver);
+ delete mLandImpactsObserver;
+}
+
+void LLFloaterTools::setStatusText(const std::string& text)
+{
+ std::map<std::string, std::string>::iterator iter = mStatusText.find(text);
+ if (iter != mStatusText.end())
+ {
+ mTextStatus->setText(iter->second);
+ }
+ else
+ {
+ mTextStatus->setText(text);
+ }
+}
+
+void LLFloaterTools::refresh()
+{
+ const S32 INFO_WIDTH = getRect().getWidth();
+ const S32 INFO_HEIGHT = 384;
+ LLRect object_info_rect(0, 0, INFO_WIDTH, -INFO_HEIGHT);
+ bool all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
+
+ S32 idx_features = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FEATURES]);
+ S32 idx_face = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FACE]);
+ S32 idx_contents = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_CONTENTS]);
+
+ S32 selected_index = mTab->getCurrentPanelIndex();
+
+ if (!all_volume && (selected_index == idx_features || selected_index == idx_face ||
+ selected_index == idx_contents))
+ {
+ mTab->selectFirstTab();
+ }
+
+ mTab->enableTabButton(idx_features, all_volume);
+ mTab->enableTabButton(idx_face, all_volume);
+ mTab->enableTabButton(idx_contents, all_volume);
+
+ // Refresh object and prim count labels
+ LLLocale locale(LLLocale::USER_LOCALE);
+#if 0
+ if (!gMeshRepo.meshRezEnabled())
+ {
+ std::string obj_count_string;
+ LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
+ getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string);
+ std::string prim_count_string;
+ LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
+ getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string);
+
+ // calculate selection rendering cost
+ if (sShowObjectCost)
+ {
+ std::string prim_cost_string;
+ S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost();
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, render_cost);
+ getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+ }
+
+ // disable the object and prim counts if nothing selected
+ bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ getChildView("obj_count")->setEnabled(have_selection);
+ getChildView("prim_count")->setEnabled(have_selection);
+ getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
+ }
+ else
+#endif
+ {
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ F32 link_cost = selection->getSelectedLinksetCost();
+ S32 link_count = selection->getRootObjectCount();
+ S32 object_count = selection->getObjectCount();
+
+ LLCrossParcelFunctor func;
+ if (!LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true))
+ {
+ // Unless multiple parcels selected, higlight parcel object is at.
+ LLViewerObject* selected_object = mObjectSelection->getFirstObject();
+ if (selected_object)
+ {
+ // Select a parcel at the currently selected object's position.
+ LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal());
+ }
+ else
+ {
+ LL_WARNS() << "Failed to get selected object" << LL_ENDL;
+ }
+ }
+
+ if (object_count == 1)
+ {
+ // "selection_faces" shouldn't be visible if not LLToolFace::getInstance()
+ // But still need to be populated in case user switches
+
+ std::string faces_str = "";
+
+ for (LLObjectSelection::iterator iter = selection->begin(); iter != selection->end();)
+ {
+ LLObjectSelection::iterator nextiter = iter++; // not strictly needed, we have only one object
+ LLSelectNode* node = *nextiter;
+ LLViewerObject* object = (*nextiter)->getObject();
+ if (!object)
+ continue;
+ S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces());
+ for (S32 te = 0; te < num_tes; ++te)
+ {
+ if (node->isTESelected(te))
+ {
+ if (!faces_str.empty())
+ {
+ faces_str += ", ";
+ }
+ faces_str += llformat("%d", te);
+ }
+ }
+ }
+
+ childSetTextArg("selection_faces", "[FACES_STRING]", faces_str);
+ }
+
+ bool show_faces = (object_count == 1)
+ && LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool();
+ getChildView("selection_faces")->setVisible(show_faces);
+
+ LLStringUtil::format_map_t selection_args;
+ selection_args["OBJ_COUNT"] = llformat("%.1d", link_count);
+ selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost);
+
+ std::ostringstream selection_info;
+
+ selection_info << getString("status_selectcount", selection_args);
+
+ getChild<LLTextBox>("selection_count")->setText(selection_info.str());
+ }
+
+
+ // Refresh child tabs
+ mPanelPermissions->refresh();
+ mPanelObject->refresh();
+ mPanelVolume->refresh();
+ mPanelFace->refresh();
+ mPanelFace->refreshMedia();
+ mPanelContents->refresh();
+ mPanelLandInfo->refresh();
+
+ // Refresh the advanced weights floater
+ LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
+ if(object_weights_floater && object_weights_floater->getVisible())
+ {
+ object_weights_floater->refresh();
+ }
+}
+
+void LLFloaterTools::draw()
+{
+ bool has_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ if(!has_selection && (mHasSelection != has_selection))
+ {
+ mDirty = true;
+ }
+ mHasSelection = has_selection;
+
+ if (mDirty)
+ {
+ refresh();
+ mDirty = false;
+ }
+
+ // mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
+ LLFloater::draw();
+}
+
+void LLFloaterTools::dirty()
+{
+ mDirty = true;
+ LLFloaterOpenObject* instance = LLFloaterReg::findTypedInstance<LLFloaterOpenObject>("openobject");
+ if (instance) instance->dirty();
+}
+
+// Clean up any tool state that should not persist when the
+// floater is closed.
+void LLFloaterTools::resetToolState()
+{
+ gCameraBtnZoom = true;
+ gCameraBtnOrbit = false;
+ gCameraBtnPan = false;
+
+ gGrabBtnSpin = false;
+ gGrabBtnVertical = false;
+}
+
+void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
+{
+ LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
+
+ // HACK to allow seeing the buttons when you have the app in a window.
+ // Keep the visibility the same as it
+ if (tool == gToolNull)
+ {
+ return;
+ }
+
+ if ( isMinimized() )
+ { // SL looks odd if we draw the tools while the window is minimized
+ return;
+ }
+
+ // Focus buttons
+ bool focus_visible = ( tool == LLToolCamera::getInstance() );
+
+ mBtnFocus ->setToggleState( focus_visible );
+
+ mRadioGroupFocus->setVisible( focus_visible );
+ getChildView("slider zoom")->setVisible( focus_visible);
+ getChildView("slider zoom")->setEnabled(gCameraBtnZoom);
+
+ if (!gCameraBtnOrbit &&
+ !gCameraBtnPan &&
+ !(mask == MASK_ORBIT) &&
+ !(mask == (MASK_ORBIT | MASK_ALT)) &&
+ !(mask == MASK_PAN) &&
+ !(mask == (MASK_PAN | MASK_ALT)) )
+ {
+ mRadioGroupFocus->setValue("radio zoom");
+ }
+ else if ( gCameraBtnOrbit ||
+ (mask == MASK_ORBIT) ||
+ (mask == (MASK_ORBIT | MASK_ALT)) )
+ {
+ mRadioGroupFocus->setValue("radio orbit");
+ }
+ else if ( gCameraBtnPan ||
+ (mask == MASK_PAN) ||
+ (mask == (MASK_PAN | MASK_ALT)) )
+ {
+ mRadioGroupFocus->setValue("radio pan");
+ }
+
+ // multiply by correction factor because volume sliders go [0, 0.5]
+ getChild<LLUICtrl>("slider zoom")->setValue(gAgentCamera.getCameraZoomFraction() * 0.5f);
+
+ // Move buttons
+ bool move_visible = (tool == LLToolGrab::getInstance());
+
+ if (mBtnMove) mBtnMove ->setToggleState( move_visible );
+
+ // HACK - highlight buttons for next click
+ mRadioGroupMove->setVisible(move_visible);
+ if (!(gGrabBtnSpin ||
+ gGrabBtnVertical ||
+ (mask == MASK_VERTICAL) ||
+ (mask == MASK_SPIN)))
+ {
+ mRadioGroupMove->setValue("radio move");
+ }
+ else if ((mask == MASK_VERTICAL) ||
+ (gGrabBtnVertical && (mask != MASK_SPIN)))
+ {
+ mRadioGroupMove->setValue("radio lift");
+ }
+ else if ((mask == MASK_SPIN) ||
+ (gGrabBtnSpin && (mask != MASK_VERTICAL)))
+ {
+ mRadioGroupMove->setValue("radio spin");
+ }
+
+ // Edit buttons
+ bool edit_visible = tool == LLToolCompTranslate::getInstance() ||
+ tool == LLToolCompRotate::getInstance() ||
+ tool == LLToolCompScale::getInstance() ||
+ tool == LLToolFace::getInstance() ||
+ tool == LLToolIndividual::getInstance() ||
+ tool == LLToolPipette::getInstance();
+
+ mBtnEdit ->setToggleState( edit_visible );
+ mRadioGroupEdit->setVisible( edit_visible );
+ //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);
+ //mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
+ }
+
+ if ( tool == LLToolCompTranslate::getInstance() )
+ {
+ mRadioGroupEdit->setValue("radio position");
+ }
+ else if ( tool == LLToolCompRotate::getInstance() )
+ {
+ mRadioGroupEdit->setValue("radio rotate");
+ }
+ else if ( tool == LLToolCompScale::getInstance() )
+ {
+ mRadioGroupEdit->setValue("radio stretch");
+ }
+ else if ( tool == LLToolFace::getInstance() )
+ {
+ mRadioGroupEdit->setValue("radio select face");
+ }
+
+ if (mComboGridMode)
+ {
+ mComboGridMode->setVisible( edit_visible );
+ S32 index = mComboGridMode->getCurrentIndex();
+ mComboGridMode->removeall();
+
+ switch (mObjectSelection->getSelectType())
+ {
+ case SELECT_TYPE_HUD:
+ mComboGridMode->add(getString("grid_screen_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ break;
+ case SELECT_TYPE_WORLD:
+ mComboGridMode->add(getString("grid_world_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
+ case SELECT_TYPE_ATTACHMENT:
+ mComboGridMode->add(getString("grid_attachment_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
+ }
+
+ mComboGridMode->setCurrentByIndex(index);
+ }
+
+ // Snap to grid disabled for grab tool - very confusing
+ if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
+ if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
+
+ //mCheckSelectLinked ->setVisible( edit_visible );
+ if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
+ if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
+ if (mCheckStretchUniformLabel) mCheckStretchUniformLabel->setVisible( edit_visible );
+
+ // Create buttons
+ bool create_visible = (tool == LLToolCompCreate::getInstance());
+
+ mBtnCreate ->setToggleState( tool == LLToolCompCreate::getInstance() );
+
+ if (mCheckCopySelection
+ && mCheckCopySelection->get())
+ {
+ // don't highlight any placer button
+ for (std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++)
+ {
+ mButtons[i]->setToggleState(false);
+ mButtons[i]->setVisible( create_visible );
+ }
+ }
+ else
+ {
+ // Highlight the correct placer button
+ for( S32 t = 0; t < (S32)mButtons.size(); t++ )
+ {
+ LLPCode pcode = LLToolPlacer::getObjectType();
+ LLPCode button_pcode = toolData[t];
+ bool state = (pcode == button_pcode);
+ mButtons[t]->setToggleState( state );
+ mButtons[t]->setVisible( create_visible );
+ }
+ }
+
+ if (mCheckSticky) mCheckSticky ->setVisible( create_visible );
+ if (mCheckCopySelection) mCheckCopySelection ->setVisible( create_visible );
+ if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
+ if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
+
+ if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+
+ // Land buttons
+ bool land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
+
+ mCostTextBorder->setVisible(!land_visible);
+
+ if (mBtnLand) mBtnLand ->setToggleState( land_visible );
+
+ mRadioGroupLand->setVisible( land_visible );
+ if ( tool == LLToolSelectLand::getInstance() )
+ {
+ mRadioGroupLand->setValue("radio select land");
+ }
+ else if ( tool == LLToolBrushLand::getInstance() )
+ {
+ S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
+ switch(dozer_mode)
+ {
+ case 0:
+ mRadioGroupLand->setValue("radio flatten");
+ break;
+ case 1:
+ mRadioGroupLand->setValue("radio raise");
+ break;
+ case 2:
+ mRadioGroupLand->setValue("radio lower");
+ break;
+ case 3:
+ mRadioGroupLand->setValue("radio smooth");
+ break;
+ case 4:
+ mRadioGroupLand->setValue("radio noise");
+ break;
+ case 5:
+ mRadioGroupLand->setValue("radio revert");
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (mBtnApplyToSelection)
+ {
+ mBtnApplyToSelection->setVisible( land_visible );
+ mBtnApplyToSelection->setEnabled( land_visible && !LLViewerParcelMgr::getInstance()->selectionEmpty() && tool != LLToolSelectLand::getInstance());
+ }
+ if (mSliderDozerSize)
+ {
+ mSliderDozerSize ->setVisible( land_visible );
+ getChildView("Bulldozer:")->setVisible( land_visible);
+ getChildView("Dozer Size:")->setVisible( land_visible);
+ }
+ if (mSliderDozerForce)
+ {
+ mSliderDozerForce ->setVisible( land_visible );
+ getChildView("Strength:")->setVisible( land_visible);
+ }
+
+ bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+
+ getChildView("selection_count")->setVisible(!land_visible && have_selection);
+ getChildView("selection_faces")->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()
+ && LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1);
+ getChildView("selection_empty")->setVisible(!land_visible && !have_selection);
+
+ mTab->setVisible(!land_visible);
+ mPanelLandInfo->setVisible(land_visible);
+}
+
+
+// virtual
+bool LLFloaterTools::canClose()
+{
+ // don't close when quitting, so camera will stay put
+ return !LLApp::isExiting();
+}
+
+// virtual
+void LLFloaterTools::onOpen(const LLSD& key)
+{
+ mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
+ mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+
+ std::string panel = key.asString();
+ if (!panel.empty())
+ {
+ mTab->selectTabByName(panel);
+ }
+
+ LLTool* tool = LLToolMgr::getInstance()->getCurrentTool();
+ if (tool == LLToolCompInspect::getInstance()
+ || tool == LLToolDragAndDrop::getInstance())
+ {
+ // Something called floater up while it was supressed (during drag n drop, inspect),
+ // so it won't be getting any layout or visibility updates, update once
+ // further updates will come from updateLayout()
+ LLCoordGL select_center_screen;
+ MASK mask = gKeyboard->currentMask(true);
+ updatePopup(select_center_screen, mask);
+ }
+
+ //gMenuBarView->setItemVisible("BuildTools", true);
+}
+
+// virtual
+void LLFloaterTools::onClose(bool app_quitting)
+{
+ mTab->setVisible(false);
+
+ LLViewerJoystick::getInstance()->moveAvatar(false);
+
+ // destroy media source used to grab media title
+ mPanelFace->unloadMedia();
+
+ // Different from handle_reset_view in that it doesn't actually
+ // move the camera if EditCameraMovement is not set.
+ gAgentCamera.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
+
+ // exit component selection mode
+ LLSelectMgr::getInstance()->promoteSelectionToRoot();
+ gSavedSettings.setBOOL("EditLinkedParts", false);
+
+ gViewerWindow->showCursor();
+
+ resetToolState();
+
+ mParcelSelection = NULL;
+ mObjectSelection = NULL;
+
+ // Switch back to basic toolset
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ // we were already in basic toolset, using build tools
+ // so manually reset tool to default (pie menu tool)
+ LLToolMgr::getInstance()->getCurrentToolset()->selectFirstTool();
+
+ //gMenuBarView->setItemVisible("BuildTools", false);
+ LLFloaterReg::hideInstance("media_settings");
+
+ // hide the advanced object weights floater
+ LLFloaterReg::hideInstance("object_weights");
+
+ // hide gltf material editor
+ LLFloaterReg::hideInstance("live_material_editor");
+
+ // prepare content for next call
+ mPanelContents->clearContents();
+
+ if(sPreviousFocusOnAvatar)
+ {
+ sPreviousFocusOnAvatar = false;
+ gAgentCamera.setAllowChangeToFollow(true);
+ }
+}
+
+void click_popup_info(void*)
+{
+}
+
+void click_popup_done(void*)
+{
+ handle_reset_view();
+}
+
+void commit_radio_group_move(LLUICtrl* ctrl)
+{
+ LLRadioGroup* group = (LLRadioGroup*)ctrl;
+ std::string selected = group->getValue().asString();
+ if (selected == "radio move")
+ {
+ gGrabBtnVertical = false;
+ gGrabBtnSpin = false;
+ }
+ else if (selected == "radio lift")
+ {
+ gGrabBtnVertical = true;
+ gGrabBtnSpin = false;
+ }
+ else if (selected == "radio spin")
+ {
+ gGrabBtnVertical = false;
+ gGrabBtnSpin = true;
+ }
+}
+
+void commit_radio_group_focus(LLUICtrl* ctrl)
+{
+ LLRadioGroup* group = (LLRadioGroup*)ctrl;
+ std::string selected = group->getValue().asString();
+ if (selected == "radio zoom")
+ {
+ gCameraBtnZoom = true;
+ gCameraBtnOrbit = false;
+ gCameraBtnPan = false;
+ }
+ else if (selected == "radio orbit")
+ {
+ gCameraBtnZoom = false;
+ gCameraBtnOrbit = true;
+ gCameraBtnPan = false;
+ }
+ else if (selected == "radio pan")
+ {
+ gCameraBtnZoom = false;
+ gCameraBtnOrbit = false;
+ gCameraBtnPan = true;
+ }
+}
+
+void commit_slider_zoom(LLUICtrl *ctrl)
+{
+ // renormalize value, since max "volume" level is 0.5 for some reason
+ F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f;
+ gAgentCamera.setCameraZoomFraction(zoom_level);
+}
+
+void commit_slider_dozer_force(LLUICtrl *ctrl)
+{
+ // the slider is logarithmic, so we exponentiate to get the actual force multiplier
+ F32 dozer_force = pow(10.f, (F32)ctrl->getValue().asReal());
+ gSavedSettings.setF32("LandBrushForce", dozer_force);
+}
+
+void click_apply_to_selection(void*)
+{
+ LLToolBrushLand::getInstance()->modifyLandInSelectionGlobal();
+}
+
+void commit_radio_group_edit(LLUICtrl *ctrl)
+{
+ S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
+
+ LLRadioGroup* group = (LLRadioGroup*)ctrl;
+ std::string selected = group->getValue().asString();
+ if (selected == "radio position")
+ {
+ LLFloaterTools::setEditTool( LLToolCompTranslate::getInstance() );
+ }
+ else if (selected == "radio rotate")
+ {
+ LLFloaterTools::setEditTool( LLToolCompRotate::getInstance() );
+ }
+ else if (selected == "radio stretch")
+ {
+ LLFloaterTools::setEditTool( LLToolCompScale::getInstance() );
+ }
+ else if (selected == "radio select face")
+ {
+ LLFloaterTools::setEditTool( LLToolFace::getInstance() );
+ }
+ gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
+}
+
+void commit_radio_group_land(LLUICtrl* ctrl)
+{
+ LLRadioGroup* group = (LLRadioGroup*)ctrl;
+ std::string selected = group->getValue().asString();
+ if (selected == "radio select land")
+ {
+ LLFloaterTools::setEditTool( LLToolSelectLand::getInstance() );
+ }
+ else
+ {
+ LLFloaterTools::setEditTool( LLToolBrushLand::getInstance() );
+ S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
+ if (selected == "radio flatten")
+ dozer_mode = 0;
+ else if (selected == "radio raise")
+ dozer_mode = 1;
+ else if (selected == "radio lower")
+ dozer_mode = 2;
+ else if (selected == "radio smooth")
+ dozer_mode = 3;
+ else if (selected == "radio noise")
+ dozer_mode = 4;
+ else if (selected == "radio revert")
+ dozer_mode = 5;
+ gSavedSettings.setS32("RadioLandBrushAction", dozer_mode);
+ }
+}
+
+void commit_select_component(void *data)
+{
+ LLFloaterTools* floaterp = (LLFloaterTools*)data;
+
+ //forfeit focus
+ if (gFocusMgr.childHasKeyboardFocus(floaterp))
+ {
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
+
+ bool select_individuals = floaterp->mCheckSelectIndividual->get();
+ gSavedSettings.setBOOL("EditLinkedParts", select_individuals);
+ floaterp->dirty();
+
+ if (select_individuals)
+ {
+ LLSelectMgr::getInstance()->demoteSelectionToIndividuals();
+ }
+ else
+ {
+ LLSelectMgr::getInstance()->promoteSelectionToRoot();
+ }
+}
+
+// static
+void LLFloaterTools::setObjectType( LLPCode pcode )
+{
+ LLToolPlacer::setObjectType( pcode );
+ gSavedSettings.setBOOL("CreateToolCopySelection", false);
+ gFocusMgr.setMouseCapture(NULL);
+}
+
+void commit_grid_mode(LLUICtrl *ctrl)
+{
+ LLComboBox* combo = (LLComboBox*)ctrl;
+
+ LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
+}
+
+// static
+void LLFloaterTools::setGridMode(S32 mode)
+{
+ LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build");
+ if (!tools_floater || !tools_floater->mComboGridMode)
+ {
+ return;
+ }
+
+ tools_floater->mComboGridMode->setCurrentByIndex(mode);
+}
+
+void LLFloaterTools::onClickGridOptions()
+{
+ LLFloater* floaterp = LLFloaterReg::showInstance("build_options");
+ // position floater next to build tools, not over
+ floaterp->setShape(gFloaterView->findNeighboringPosition(this, floaterp), true);
+}
+
+// static
+void LLFloaterTools::setEditTool(void* tool_pointer)
+{
+ LLTool *tool = (LLTool *)tool_pointer;
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool( tool );
+}
+
+void LLFloaterTools::setTool(const LLSD& user_data)
+{
+ std::string control_name = user_data.asString();
+ if(control_name == "Focus")
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool((LLTool *) LLToolCamera::getInstance() );
+ else if (control_name == "Move" )
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *)LLToolGrab::getInstance() );
+ else if (control_name == "Edit" )
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompTranslate::getInstance());
+ else if (control_name == "Create" )
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompCreate::getInstance());
+ else if (control_name == "Land" )
+ LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolSelectLand::getInstance());
+ else
+ LL_WARNS()<<" no parameter name "<<control_name<<" found!! No Tool selected!!"<< LL_ENDL;
+}
+
+void LLFloaterTools::onFocusReceived()
+{
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ LLFloater::onFocusReceived();
+}
+
+void LLFloaterTools::updateLandImpacts()
+{
+ LLParcel *parcel = mParcelSelection->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ // Update land impacts info in the weights floater
+ LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
+ if(object_weights_floater)
+ {
+ object_weights_floater->updateLandImpacts(parcel);
+ }
+}
+
|