summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatertools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloatertools.cpp')
-rw-r--r--indra/newview/llfloatertools.cpp931
1 files changed, 931 insertions, 0 deletions
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
new file mode 100644
index 0000000000..6f675236b3
--- /dev/null
+++ b/indra/newview/llfloatertools.cpp
@@ -0,0 +1,931 @@
+/**
+ * @file llfloatertools.cpp
+ * @brief The edit tools, including move, position, land, etc.
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertools.h"
+
+#include "llfontgl.h"
+#include "llcoord.h"
+#include "llgl.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "lldraghandle.h"
+#include "llfloaterbuildoptions.h"
+#include "llfloateropenobject.h"
+#include "llfocusmgr.h"
+#include "llmenugl.h"
+#include "llpanelcontents.h"
+#include "llpanelface.h"
+#include "llpanelland.h"
+#include "llpanelinventory.h"
+#include "llpanelobject.h"
+#include "llpanelvolume.h"
+#include "llpanelpermissions.h"
+#include "llselectmgr.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 "lltoolselect.h"
+#include "lltoolselectland.h"
+#include "llui.h"
+#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerwindow.h"
+#include "llviewercontrol.h"
+#include "llvolumesliderctrl.h"
+#include "viewer.h"
+
+#include "llvieweruictrlfactory.h"
+
+// Globals
+LLFloaterTools *gFloaterTools = NULL;
+
+
+const LLString PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
+{
+ LLString("General"), // PANEL_GENERAL,
+ LLString("Object"), // PANEL_OBJECT,
+ LLString("Features"), // PANEL_FEATURES,
+ LLString("Texture"), // PANEL_FACE,
+ LLString("Content"), // PANEL_CONTENTS,
+};
+
+// Local prototypes
+void commit_select_tool(LLUICtrl *ctrl, void *data);
+void commit_select_component(LLUICtrl *ctrl, void *data);
+void click_show_more(void*);
+void click_popup_info(void*);
+void click_popup_done(void*);
+void click_popup_minimize(void*);
+void click_popup_grab_drag(LLUICtrl *, void*);
+void click_popup_grab_lift(LLUICtrl *, void*);
+void click_popup_grab_spin(LLUICtrl *, void*);
+void click_popup_rotate_left(void*);
+void click_popup_rotate_reset(void*);
+void click_popup_rotate_right(void*);
+void click_popup_dozer_mode(LLUICtrl *, void *user);
+void click_popup_dozer_size(LLUICtrl *, void *user);
+void click_dozer_size(LLUICtrl *, void*);
+void click_apply_to_selection(void*);
+void commit_radio_zoom(LLUICtrl *, void*);
+void commit_radio_orbit(LLUICtrl *, void*);
+void commit_radio_pan(LLUICtrl *, void*);
+void commit_grid_mode(LLUICtrl *, void*);
+void commit_slider_zoom(LLUICtrl *, void*);
+
+
+//static
+void* LLFloaterTools::createPanelPermissions(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelPermissions = new LLPanelPermissions("General");
+ return floater->mPanelPermissions;
+}
+//static
+void* LLFloaterTools::createPanelObject(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelObject = new LLPanelObject("Object");
+ return floater->mPanelObject;
+}
+
+//static
+void* LLFloaterTools::createPanelVolume(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelVolume = new LLPanelVolume("Features");
+ return floater->mPanelVolume;
+}
+
+//static
+void* LLFloaterTools::createPanelFace(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelFace = new LLPanelFace("Texture");
+ return floater->mPanelFace;
+}
+
+//static
+void* LLFloaterTools::createPanelContents(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelContents = new LLPanelContents("Contents");
+ return floater->mPanelContents;
+}
+
+//static
+void* LLFloaterTools::createPanelContentsInventory(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelContents->mPanelInventory = new LLPanelInventory("ContentsInventory", LLRect());
+ return floater->mPanelContents->mPanelInventory;
+}
+
+//static
+void* LLFloaterTools::createPanelLandInfo(void* data)
+{
+ LLFloaterTools* floater = (LLFloaterTools*)data;
+ floater->mPanelLandInfo = new LLPanelLandInfo("land info panel");
+ return floater->mPanelLandInfo;
+}
+
+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);
+
+ mDragHandle->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") );
+
+ LLRect rect;
+ mBtnFocus = LLUICtrlFactory::getButtonByName(this,"button focus");//btn;
+ childSetAction("button focus",select_tool, (void*)gToolCamera);
+ mBtnMove = LLUICtrlFactory::getButtonByName(this,"button move");
+ childSetAction("button move",select_tool, (void*)gToolGrab);
+ mBtnEdit = LLUICtrlFactory::getButtonByName(this,"button edit");
+ childSetAction("button edit",select_tool, (void*)gToolTranslate);
+ mBtnCreate = LLUICtrlFactory::getButtonByName(this,"button create");
+ childSetAction("button create",select_tool, (void*)gToolCreate);
+ mBtnLand = LLUICtrlFactory::getButtonByName(this, "button land" );
+ childSetAction("button land",select_tool, (void*)gToolParcel);
+ mTextStatus = LLUICtrlFactory::getTextBoxByName(this,"text status");
+ mRadioZoom = LLUICtrlFactory::getCheckBoxByName(this,"radio zoom");
+ mSliderZoom = LLViewerUICtrlFactory::getVolumeSliderByName(this,"slider zoom");
+ childSetCommitCallback("slider zoom",commit_slider_zoom,this);
+ mRadioOrbit = LLUICtrlFactory::getCheckBoxByName(this,"radio orbit");
+ childSetCommitCallback("radio orbit",commit_radio_orbit,this);
+ mRadioPan = LLUICtrlFactory::getCheckBoxByName(this,"radio pan");
+ childSetCommitCallback("radio pan",commit_radio_pan,this);
+ mRadioMove = LLUICtrlFactory::getCheckBoxByName(this,"radio move");
+ childSetCommitCallback("radio move",click_popup_grab_drag,this);
+ mRadioLift = LLUICtrlFactory::getCheckBoxByName(this,"radio lift");
+ childSetCommitCallback("radio lift",click_popup_grab_lift,this);
+ mRadioSpin = LLUICtrlFactory::getCheckBoxByName(this,"radio spin");
+ childSetCommitCallback("radio spin",click_popup_grab_spin,NULL);
+ mRadioPosition = LLUICtrlFactory::getCheckBoxByName(this,"radio position");
+ childSetCommitCallback("radio position",commit_select_tool,gToolTranslate);
+ mRadioRotate = LLUICtrlFactory::getCheckBoxByName(this,"radio rotate");
+ childSetCommitCallback("radio rotate",commit_select_tool,gToolRotate);
+ mRadioStretch = LLUICtrlFactory::getCheckBoxByName(this,"radio stretch");
+ childSetCommitCallback("radio stretch",commit_select_tool,gToolStretch);
+ mRadioSelectFace = LLUICtrlFactory::getCheckBoxByName(this,"radio select face");
+ childSetCommitCallback("radio select face",commit_select_tool,gToolFace);
+ mCheckSelectIndividual = LLUICtrlFactory::getCheckBoxByName(this,"checkbox edit linked parts");
+ childSetValue("checkbox edit linked parts",(BOOL)!gSavedSettings.getBOOL("SelectLinkedSet"));
+ childSetCommitCallback("checkbox edit linked parts",commit_select_component,this);
+ mCheckSnapToGrid = LLUICtrlFactory::getCheckBoxByName(this,"checkbox snap to grid");
+ childSetValue("checkbox snap to grid",(BOOL)gSavedSettings.getBOOL("SnapEnabled"));
+ mBtnGridOptions = LLUICtrlFactory::getButtonByName(this,"Options...");
+ childSetAction("Options...",onClickGridOptions, this);
+ mCheckStretchUniform = LLUICtrlFactory::getCheckBoxByName(this,"checkbox uniform");
+ childSetValue("checkbox uniform",(BOOL)gSavedSettings.getBOOL("ScaleUniform"));
+ mCheckStretchTexture = LLUICtrlFactory::getCheckBoxByName(this,"checkbox stretch textures");
+ childSetValue("checkbox stretch textures",(BOOL)gSavedSettings.getBOOL("ScaleStretchTextures"));
+ mTextGridMode = LLUICtrlFactory::getTextBoxByName(this,"text ruler mode");
+ mComboGridMode = LLUICtrlFactory::getComboBoxByName(this,"combobox grid mode");
+ childSetCommitCallback("combobox grid mode",commit_grid_mode, this);
+ //
+ // Create Buttons
+ //
+
+ static const LLString toolNames[]={
+ "ToolCube",
+ "ToolPrism",
+ "ToolPyramid",
+ "ToolTetrahedron",
+ "ToolCylinder",
+ "ToolHemiCylinder",
+ "ToolCone",
+ "ToolHemiCone",
+ "ToolSphere",
+ "ToolHemiSphere",
+ "ToolTorus",
+ "ToolTube",
+ "ToolRing",
+ "ToolTree",
+ "ToolGrass"};
+ void* toolData[]={
+ &LLToolPlacerPanel::sCube,
+ &LLToolPlacerPanel::sPrism,
+ &LLToolPlacerPanel::sPyramid,
+ &LLToolPlacerPanel::sTetrahedron,
+ &LLToolPlacerPanel::sCylinder,
+ &LLToolPlacerPanel::sCylinderHemi,
+ &LLToolPlacerPanel::sCone,
+ &LLToolPlacerPanel::sConeHemi,
+ &LLToolPlacerPanel::sSphere,
+ &LLToolPlacerPanel::sSphereHemi,
+ &LLToolPlacerPanel::sTorus,
+ &LLToolPlacerPanel::sSquareTorus,
+ &LLToolPlacerPanel::sTriangleTorus,
+ &LLToolPlacerPanel::sTree,
+ &LLToolPlacerPanel::sGrass};
+ for(int t=0;t<sizeof(toolNames)/sizeof(toolNames[0]);t++)
+ {
+ LLButton *found = LLViewerUICtrlFactory::getButtonByName(this,toolNames[t]);
+ if(found)
+ {
+ found->setClickedCallback(setObjectType,toolData[t]);
+ mButtons.push_back( found );
+ }else{
+ llwarns << "Tool button not found! DOA Pending." << llendl;
+ }
+ }
+ mCheckCopySelection = LLUICtrlFactory::getCheckBoxByName(this,"checkbox copy selection");
+ childSetValue("checkbox copy selection",(BOOL)gSavedSettings.getBOOL("CreateToolCopySelection"));
+ mCheckSticky = LLUICtrlFactory::getCheckBoxByName(this,"checkbox sticky");
+ childSetValue("checkbox sticky",(BOOL)gSavedSettings.getBOOL("CreateToolKeepSelected"));
+ mCheckCopyCenters = LLUICtrlFactory::getCheckBoxByName(this,"checkbox copy centers");
+ childSetValue("checkbox copy centers",(BOOL)gSavedSettings.getBOOL("CreateToolCopyCenters"));
+ mCheckCopyRotates = LLUICtrlFactory::getCheckBoxByName(this,"checkbox copy rotates");
+ childSetValue("checkbox copy rotates",(BOOL)gSavedSettings.getBOOL("CreateToolCopyRotates"));
+ mRadioSelectLand = LLUICtrlFactory::getCheckBoxByName(this,"radio select land");
+ childSetCommitCallback("radio select land",commit_select_tool, gToolParcel);
+ mRadioDozerFlatten = LLUICtrlFactory::getCheckBoxByName(this,"radio flatten");
+ childSetCommitCallback("radio flatten",click_popup_dozer_mode, (void*)0);
+ mRadioDozerRaise = LLUICtrlFactory::getCheckBoxByName(this,"radio raise");
+ childSetCommitCallback("radio raise",click_popup_dozer_mode, (void*)1);
+ mRadioDozerLower = LLUICtrlFactory::getCheckBoxByName(this,"radio lower");
+ childSetCommitCallback("radio lower",click_popup_dozer_mode, (void*)2);
+ mRadioDozerSmooth = LLUICtrlFactory::getCheckBoxByName(this,"radio smooth");
+ childSetCommitCallback("radio smooth",click_popup_dozer_mode, (void*)3);
+ mRadioDozerNoise = LLUICtrlFactory::getCheckBoxByName(this,"radio noise");
+ childSetCommitCallback("radio noise",click_popup_dozer_mode, (void*)4);
+ mRadioDozerRevert = LLUICtrlFactory::getCheckBoxByName(this,"radio revert");
+ childSetCommitCallback("radio revert",click_popup_dozer_mode, (void*)5);
+ mComboDozerSize = LLUICtrlFactory::getComboBoxByName(this,"combobox brush size");
+ childSetCommitCallback("combobox brush size",click_dozer_size, (void*)0);
+ if(mComboDozerSize) mComboDozerSize->setCurrentByIndex(0);
+ mBtnApplyToSelection = LLUICtrlFactory::getButtonByName(this,"button apply to selection");
+ childSetAction("button apply to selection",click_apply_to_selection, (void*)0);
+ mCheckShowOwners = LLUICtrlFactory::getCheckBoxByName(this,"checkbox show owners");
+ childSetValue("checkbox show owners",gSavedSettings.getBOOL("ShowParcelOwners"));
+ childSetAction("button more", click_show_more, this);
+ childSetAction("button less", click_show_more, this);
+ mTab = LLUICtrlFactory::getTabContainerByName(this,"Object Info Tabs");
+ if(mTab)
+ {
+ mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") );
+ mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
+ mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") );
+ mTab->setBorderVisible(FALSE);
+ }
+ mTab->selectFirstTab();
+ return TRUE;
+}
+
+// Create the popupview with a dummy center. It will be moved into place
+// during LLViewerWindow's per-frame hover processing.
+LLFloaterTools::LLFloaterTools()
+: LLFloater("toolbox floater"),
+ mBtnFocus(NULL),
+ mBtnMove(NULL),
+ mBtnEdit(NULL),
+ mBtnCreate(NULL),
+ mBtnLand(NULL),
+ mTextStatus(NULL),
+
+ mRadioOrbit(NULL),
+ mRadioZoom(NULL),
+ mRadioPan(NULL),
+
+ mRadioMove(NULL),
+ mRadioLift(NULL),
+ mRadioSpin(NULL),
+
+ mRadioPosition(NULL),
+ mRadioRotate(NULL),
+ mRadioStretch(NULL),
+ mRadioSelectFace(NULL),
+ mCheckSelectIndividual(NULL),
+
+ mCheckSnapToGrid(NULL),
+ mBtnGridOptions(NULL),
+ mTextGridMode(NULL),
+ mComboGridMode(NULL),
+ mCheckStretchUniform(NULL),
+ mCheckStretchTexture(NULL),
+
+ mBtnRotateLeft(NULL),
+ mBtnRotateReset(NULL),
+ mBtnRotateRight(NULL),
+
+ mBtnDelete(NULL),
+ mBtnDuplicate(NULL),
+ mBtnDuplicateInPlace(NULL),
+
+ mCheckSticky(NULL),
+ mCheckCopySelection(NULL),
+ mCheckCopyCenters(NULL),
+ mCheckCopyRotates(NULL),
+ mRadioSelectLand(NULL),
+ mRadioDozerFlatten(NULL),
+ mRadioDozerRaise(NULL),
+ mRadioDozerLower(NULL),
+ mRadioDozerSmooth(NULL),
+ mRadioDozerNoise(NULL),
+ mRadioDozerRevert(NULL),
+ mComboDozerSize(NULL),
+ mBtnApplyToSelection(NULL),
+ mCheckShowOwners(NULL),
+
+
+ mTab(NULL),
+ mPanelPermissions(NULL),
+ mPanelObject(NULL),
+ mPanelVolume(NULL),
+ mPanelContents(NULL),
+ mPanelFace(NULL),
+ mPanelLandInfo(NULL),
+
+ mTabLand(NULL),
+ mDirty(TRUE)
+{
+ mAutoFocus = FALSE;
+ LLCallbackMap::map_t factory_map;
+ factory_map["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
+ factory_map["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
+ factory_map["Features"] = LLCallbackMap(createPanelVolume, this);//LLPanelVolume
+ factory_map["Texture"] = LLCallbackMap(createPanelFace, this);//LLPanelFace
+ factory_map["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents
+ factory_map["ContentsInventory"] = LLCallbackMap(createPanelContentsInventory, this);//LLPanelContents
+ factory_map["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo
+
+ gUICtrlFactory->buildFloater(this,"floater_tools.xml",&factory_map);
+
+ mLargeHeight = getRect().getHeight();
+ mSmallHeight = mLargeHeight;
+ if (mTab) mSmallHeight -= mTab->getRect().getHeight();
+
+ gSavedSettings.setBOOL("ToolboxShowMore", TRUE); // force a toggle initially
+ showMore(FALSE);
+}
+
+LLFloaterTools::~LLFloaterTools()
+{
+ showMore(FALSE);
+ // children automatically deleted
+}
+
+
+void LLFloaterTools::setStatusText(const LLString& text)
+{
+ mTextStatus->setText(text);
+}
+
+void LLFloaterTools::refresh()
+{
+ const S32 INFO_WIDTH = mRect.getWidth();
+ const S32 INFO_HEIGHT = 384;
+ LLRect object_info_rect(0, 0, INFO_WIDTH, -INFO_HEIGHT);
+ BOOL all_volume = gSelectMgr->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);
+
+ mPanelPermissions->refresh();
+ mPanelObject->refresh();
+ mPanelVolume->refresh();
+ mPanelFace->refresh();
+ mPanelContents->refresh();
+ mPanelLandInfo->refresh();
+}
+
+void LLFloaterTools::draw()
+{
+ if (mDirty)
+ {
+ refresh();
+ mDirty = FALSE;
+ }
+
+ mCheckSelectIndividual->set(!gSavedSettings.getBOOL("SelectLinkedSet"));
+ LLFloater::draw();
+}
+
+void LLFloaterTools::dirty()
+{
+ mDirty = TRUE;
+ LLFloaterOpenObject::dirty();
+}
+
+// Clean up any tool state that should not persist when the
+// floater is closed.
+void LLFloaterTools::resetToolState()
+{
+ gCameraBtnOrbit = FALSE;
+ gCameraBtnPan = FALSE;
+
+ gGrabBtnSpin = FALSE;
+ gGrabBtnVertical = FALSE;
+}
+
+void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
+{
+ LLTool *tool = gToolMgr->getCurrentTool( mask );
+
+ // 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;
+ }
+
+ // Focus buttons
+ BOOL focus_visible = ( tool == gToolCamera );
+
+ mBtnFocus ->setToggleState( focus_visible );
+
+ mRadioZoom ->setVisible( focus_visible );
+ mRadioOrbit ->setVisible( focus_visible );
+ mRadioPan ->setVisible( focus_visible );
+ mSliderZoom ->setVisible( focus_visible );
+
+ mRadioZoom ->set( !gCameraBtnOrbit &&
+ !gCameraBtnPan &&
+ !(mask == MASK_ORBIT) &&
+ !(mask == (MASK_ORBIT | MASK_ALT)) &&
+ !(mask == MASK_PAN) &&
+ !(mask == (MASK_PAN | MASK_ALT)) );
+
+ mRadioOrbit ->set( gCameraBtnOrbit ||
+ (mask == MASK_ORBIT) ||
+ (mask == (MASK_ORBIT | MASK_ALT)) );
+
+ mRadioPan ->set( gCameraBtnPan ||
+ (mask == MASK_PAN) ||
+ (mask == (MASK_PAN | MASK_ALT)) );
+
+ // multiply by correction factor because volume sliders go [0, 0.5]
+ mSliderZoom ->setValue( gAgent.getCameraZoomFraction() * 0.5f);
+
+ // Move buttons
+ BOOL move_visible = (tool == gToolGrab);
+
+ if (mBtnMove) mBtnMove ->setToggleState( move_visible );
+
+ // HACK - highlight buttons for next click
+ if (mRadioMove)
+ {
+ mRadioMove ->setVisible( move_visible );
+ mRadioMove ->set( !gGrabBtnSpin &&
+ !gGrabBtnVertical &&
+ !(mask == MASK_VERTICAL) &&
+ !(mask == MASK_SPIN) );
+ }
+
+ if (mRadioLift)
+ {
+ mRadioLift ->setVisible( move_visible );
+ mRadioLift ->set( gGrabBtnVertical ||
+ (mask == MASK_VERTICAL) );
+ }
+
+ if (mRadioSpin)
+ {
+ mRadioSpin ->setVisible( move_visible );
+ mRadioSpin ->set( gGrabBtnSpin ||
+ (mask == MASK_SPIN) );
+ }
+
+ // Edit buttons
+ BOOL edit_visible = tool == gToolTranslate ||
+ tool == gToolRotate ||
+ tool == gToolStretch ||
+ tool == gToolFace ||
+ tool == gToolIndividual ||
+ tool == gToolPipette;
+
+ mBtnEdit ->setToggleState( edit_visible );
+
+ mRadioPosition ->setVisible( edit_visible );
+ mRadioRotate ->setVisible( edit_visible );
+ mRadioStretch ->setVisible( edit_visible );
+ if (mRadioSelectFace)
+ {
+ mRadioSelectFace->setVisible( edit_visible );
+ mRadioSelectFace->set( tool == gToolFace );
+ }
+
+ if (mCheckSelectIndividual)
+ {
+ mCheckSelectIndividual->setVisible(edit_visible);
+ mCheckSelectIndividual->set(!gSavedSettings.getBOOL("SelectLinkedSet"));
+ }
+
+ mRadioPosition ->set( tool == gToolTranslate );
+ mRadioRotate ->set( tool == gToolRotate );
+ mRadioStretch ->set( tool == gToolStretch );
+
+ if (mComboGridMode)
+ {
+ mComboGridMode ->setVisible( edit_visible );
+ S32 index = mComboGridMode->getCurrentIndex();
+ mComboGridMode->removeall();
+
+ switch (gSelectMgr->getSelectType())
+ {
+ case SELECT_TYPE_HUD:
+ mComboGridMode->add("Screen");
+ mComboGridMode->add("Local");
+ //mComboGridMode->add("Reference");
+ break;
+ case SELECT_TYPE_WORLD:
+ mComboGridMode->add("World");
+ mComboGridMode->add("Local");
+ mComboGridMode->add("Reference");
+ break;
+ case SELECT_TYPE_ATTACHMENT:
+ mComboGridMode->add("Attachment");
+ mComboGridMode->add("Local");
+ mComboGridMode->add("Reference");
+ break;
+ }
+
+ mComboGridMode->setCurrentByIndex(index);
+ }
+ if (mTextGridMode) mTextGridMode->setVisible( edit_visible );
+
+ // Snap to grid disabled for grab tool - very confusing
+ if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == gToolGrab */ );
+ if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == gToolGrab */ );
+
+ //mCheckSelectLinked ->setVisible( edit_visible );
+ if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
+ if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
+
+ // Create buttons
+ BOOL create_visible = (tool == gToolCreate);
+
+ mBtnCreate ->setToggleState( tool == gToolCreate );
+
+ 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( std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++ )
+ {
+ LLPCode pcode = LLToolPlacer::getObjectType();
+ void *userdata = mButtons[i]->getCallbackUserData();
+ LLPCode *cur = (LLPCode*) userdata;
+
+ BOOL state = (pcode == *cur);
+ mButtons[i]->setToggleState( state );
+ mButtons[i]->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) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+
+ // Land buttons
+ BOOL land_visible = (tool == gToolLand || tool == gToolParcel );
+
+ if (mBtnLand) mBtnLand ->setToggleState( land_visible );
+
+ // mRadioEditLand ->set( tool == gToolLand );
+ if (mRadioSelectLand) mRadioSelectLand->set( tool == gToolParcel );
+
+ // mRadioEditLand ->setVisible( land_visible );
+ if (mRadioSelectLand) mRadioSelectLand->setVisible( land_visible );
+
+ S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
+ S32 dozer_size = gSavedSettings.getS32("RadioLandBrushSize");
+
+ if (mRadioDozerFlatten)
+ {
+ mRadioDozerFlatten ->set( tool == gToolLand && dozer_mode == 0);
+ mRadioDozerFlatten ->setVisible( land_visible );
+ }
+ if (mRadioDozerRaise)
+ {
+ mRadioDozerRaise ->set( tool == gToolLand && dozer_mode == 1);
+ mRadioDozerRaise ->setVisible( land_visible );
+ }
+ if (mRadioDozerLower)
+ {
+ mRadioDozerLower ->set( tool == gToolLand && dozer_mode == 2);
+ mRadioDozerLower ->setVisible( land_visible );
+ }
+ if (mRadioDozerSmooth)
+ {
+ mRadioDozerSmooth ->set( tool == gToolLand && dozer_mode == 3);
+ mRadioDozerSmooth ->setVisible( land_visible );
+ }
+ if (mRadioDozerNoise)
+ {
+ mRadioDozerNoise ->set( tool == gToolLand && dozer_mode == 4);
+ mRadioDozerNoise ->setVisible( land_visible );
+ }
+ if (mRadioDozerRevert)
+ {
+ mRadioDozerRevert ->set( tool == gToolLand && dozer_mode == 5);
+ mRadioDozerRevert ->setVisible( land_visible );
+ }
+ if (mComboDozerSize)
+ {
+ mComboDozerSize ->setCurrentByIndex(dozer_size);
+ mComboDozerSize ->setVisible( land_visible );
+ mComboDozerSize ->setEnabled( tool == gToolLand );
+ }
+ if (mBtnApplyToSelection)
+ {
+ mBtnApplyToSelection->setVisible( land_visible );
+ mBtnApplyToSelection->setEnabled( land_visible && !gParcelMgr->selectionEmpty() && tool != gToolParcel);
+ }
+ if (mCheckShowOwners)
+ {
+ mCheckShowOwners ->setVisible( land_visible );
+ }
+
+ //
+ // More panel visibility
+ //
+ BOOL show_more = gSavedSettings.getBOOL("ToolboxShowMore");
+
+ mTab->setVisible(show_more && tool != gToolLand && tool != gToolParcel);
+ mPanelLandInfo->setVisible(show_more && (tool == gToolLand || tool == gToolParcel));
+}
+
+
+// virtual
+BOOL LLFloaterTools::canClose()
+{
+ // don't close when quitting, so camera will stay put
+ return !gQuit;
+}
+
+// virtual
+void LLFloaterTools::onClose(bool app_quitting)
+{
+ setMinimized(FALSE);
+ setVisible(FALSE);
+ mTab->setVisible(FALSE);
+
+ // Different from handle_reset_view in that it doesn't actually
+ // move the camera if EditCameraMovement is not set.
+ gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
+
+ // exit component selection mode
+ gSelectMgr->promoteSelectionToRoot();
+ gSavedSettings.setBOOL("SelectLinkedSet", TRUE);
+
+ gViewerWindow->showCursor();
+
+ resetToolState();
+
+ // Switch back to basic toolset
+ gCurrentToolset = gBasicToolset;
+ gBasicToolset->selectFirstTool();
+ gToolMgr->useSelectedTool( gBasicToolset );
+}
+
+void LLFloaterTools::showMore(BOOL show_more)
+{
+ BOOL showing_more = gSavedSettings.getBOOL("ToolboxShowMore");
+ if (show_more == showing_more)
+ {
+ return;
+ }
+
+ gSavedSettings.setBOOL("ToolboxShowMore", show_more);
+
+ // Visibility updated next frame - JC
+ // mTab->setVisible(show_more);
+
+ if (show_more)
+ {
+ reshape( mRect.getWidth(), mLargeHeight, TRUE);
+ translate( 0, mSmallHeight - mLargeHeight );
+ childSetVisible("button less", true);
+ childSetVisible("button more", false);
+ }
+ else
+ {
+ reshape( mRect.getWidth(), mSmallHeight, TRUE);
+ translate( 0, mLargeHeight - mSmallHeight );
+ childSetVisible("button less", false);
+ childSetVisible("button more", true);
+ }
+}
+
+void LLFloaterTools::showPanel(EInfoPanel panel)
+{
+ llassert(panel >= 0 && panel < PANEL_COUNT);
+ mTab->selectTabByName(PANEL_NAMES[panel]);
+ showMore(TRUE);
+}
+
+void click_show_more(void *userdata)
+{
+ LLFloaterTools *f = (LLFloaterTools *)userdata;
+ BOOL show_more = !gSavedSettings.getBOOL("ToolboxShowMore");
+ f->showMore( show_more );
+}
+
+void click_popup_info(void*)
+{
+// gBuildView->setPropertiesPanelOpen(TRUE);
+}
+
+void click_popup_done(void*)
+{
+ handle_reset_view();
+}
+
+void click_popup_grab_drag(LLUICtrl*, void*)
+{
+ gGrabBtnVertical = FALSE;
+ gGrabBtnSpin = FALSE;
+}
+
+void click_popup_grab_lift(LLUICtrl*, void*)
+{
+ gGrabBtnVertical = TRUE;
+ gGrabBtnSpin = FALSE;
+}
+
+void click_popup_grab_spin(LLUICtrl*, void*)
+{
+ gGrabBtnVertical = FALSE;
+ gGrabBtnSpin = TRUE;
+}
+
+void commit_radio_zoom(LLUICtrl *, void*)
+{
+ gCameraBtnOrbit = FALSE;
+ gCameraBtnPan = FALSE;
+}
+
+void commit_radio_orbit(LLUICtrl *, void*)
+{
+ gCameraBtnOrbit = TRUE;
+ gCameraBtnPan = FALSE;
+}
+
+void commit_radio_pan(LLUICtrl *, void*)
+{
+ gCameraBtnOrbit = FALSE;
+ gCameraBtnPan = TRUE;
+}
+
+void commit_slider_zoom(LLUICtrl *ctrl, void*)
+{
+ LLVolumeSliderCtrl* slider = (LLVolumeSliderCtrl*)ctrl;
+ // renormalize value, since max "volume" level is 0.5 for some reason
+ F32 zoom_level = (F32)slider->getValue().asReal() * 2.f; // / 0.5f;
+ gAgent.setCameraZoomFraction(zoom_level);
+}
+
+void click_popup_rotate_left(void*)
+{
+ gSelectMgr->selectionRotateAroundZ( 45.f );
+ dialog_refresh_all();
+}
+
+void click_popup_rotate_reset(void*)
+{
+ gSelectMgr->selectionResetRotation();
+ dialog_refresh_all();
+}
+
+void click_popup_rotate_right(void*)
+{
+ gSelectMgr->selectionRotateAroundZ( -45.f );
+ dialog_refresh_all();
+}
+
+
+void click_popup_dozer_mode(LLUICtrl *, void *user)
+{
+ S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
+ S32 mode = (S32)(intptr_t) user;
+ select_tool( gToolLand );
+ gSavedSettings.setS32("RadioLandBrushAction", mode);
+ gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
+}
+
+void click_popup_dozer_size(LLUICtrl *, void *user)
+{
+ S32 size = (S32)(intptr_t) user;
+ gSavedSettings.setS32("RadioLandBrushSize", size);
+}
+
+void click_dozer_size(LLUICtrl *ctrl, void *user)
+{
+ S32 size = ((LLComboBox*) ctrl)->getCurrentIndex();
+ gSavedSettings.setS32("RadioLandBrushSize", size);
+}
+
+void click_apply_to_selection(void* user)
+{
+ gToolLand->modifyLandInSelectionGlobal();
+}
+
+void commit_select_tool(LLUICtrl *ctrl, void *data)
+{
+ S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
+ select_tool(data);
+ gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
+}
+
+void commit_select_component(LLUICtrl *ctrl, void *data)
+{
+ LLFloaterTools* floaterp = (LLFloaterTools*)data;
+
+ //forfeit focus
+ if (gFocusMgr.childHasKeyboardFocus(floaterp))
+ {
+ gFocusMgr.setKeyboardFocus(NULL, NULL);
+ }
+
+ BOOL select_individuals = floaterp->mCheckSelectIndividual->get();
+ gSavedSettings.setBOOL("SelectLinkedSet", !select_individuals);
+ floaterp->dirty();
+
+ if (select_individuals)
+ {
+ gSelectMgr->demoteSelectionToIndividuals();
+ }
+ else
+ {
+ gSelectMgr->promoteSelectionToRoot();
+ }
+}
+
+void commit_grid_mode(LLUICtrl *ctrl, void *data)
+{
+ LLComboBox* combo = (LLComboBox*)ctrl;
+
+ gSelectMgr->setGridMode((EGridMode)combo->getCurrentIndex());
+}
+
+// static
+void LLFloaterTools::setObjectType( void* data )
+{
+ LLPCode pcode = *(LLPCode*) data;
+ LLToolPlacer::setObjectType( pcode );
+ gSavedSettings.setBOOL("CreateToolCopySelection", FALSE);
+ gViewerWindow->setMouseCapture(NULL, NULL);
+}
+
+// static
+void LLFloaterTools::onClickGridOptions(void* data)
+{
+ //LLFloaterTools* floaterp = (LLFloaterTools*)data;
+ LLFloaterBuildOptions::show(NULL);
+ // RN: this makes grid options dependent on build tools window
+ //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
+}