00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llfloatertools.h"
00035
00036 #include "llfontgl.h"
00037 #include "llcoord.h"
00038 #include "llgl.h"
00039
00040 #include "llagent.h"
00041 #include "llbutton.h"
00042 #include "llcheckboxctrl.h"
00043 #include "llcombobox.h"
00044 #include "lldraghandle.h"
00045 #include "llfloaterbuildoptions.h"
00046 #include "llfloateropenobject.h"
00047 #include "llfocusmgr.h"
00048 #include "llmenugl.h"
00049 #include "llpanelcontents.h"
00050 #include "llpanelface.h"
00051 #include "llpanelland.h"
00052 #include "llpanelinventory.h"
00053 #include "llpanelobject.h"
00054 #include "llpanelvolume.h"
00055 #include "llpanelpermissions.h"
00056 #include "llselectmgr.h"
00057 #include "llstatusbar.h"
00058 #include "lltabcontainer.h"
00059 #include "lltextbox.h"
00060 #include "lltoolbrush.h"
00061 #include "lltoolcomp.h"
00062 #include "lltooldraganddrop.h"
00063 #include "lltoolface.h"
00064 #include "lltoolfocus.h"
00065 #include "lltoolgrab.h"
00066 #include "lltoolgrab.h"
00067 #include "lltoolindividual.h"
00068 #include "lltoolmgr.h"
00069 #include "lltoolpie.h"
00070 #include "lltoolpipette.h"
00071 #include "lltoolplacer.h"
00072 #include "lltoolselectland.h"
00073 #include "llui.h"
00074 #include "llviewermenu.h"
00075 #include "llviewerparcelmgr.h"
00076 #include "llviewerwindow.h"
00077 #include "llviewercontrol.h"
00078 #include "llviewerjoystick.h"
00079 #include "lluictrlfactory.h"
00080
00081
00082 LLFloaterTools *gFloaterTools = NULL;
00083
00084
00085 const LLString PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
00086 {
00087 LLString("General"),
00088 LLString("Object"),
00089 LLString("Features"),
00090 LLString("Texture"),
00091 LLString("Content"),
00092 };
00093
00094
00095 void commit_select_tool(LLUICtrl *ctrl, void *data);
00096 void commit_select_component(LLUICtrl *ctrl, void *data);
00097 void click_show_more(void*);
00098 void click_popup_info(void*);
00099 void click_popup_done(void*);
00100 void click_popup_minimize(void*);
00101 void click_popup_grab_drag(LLUICtrl *, void*);
00102 void click_popup_grab_lift(LLUICtrl *, void*);
00103 void click_popup_grab_spin(LLUICtrl *, void*);
00104 void click_popup_rotate_left(void*);
00105 void click_popup_rotate_reset(void*);
00106 void click_popup_rotate_right(void*);
00107 void click_popup_dozer_mode(LLUICtrl *, void *user);
00108 void click_popup_dozer_size(LLUICtrl *, void *user);
00109 void click_dozer_size(LLUICtrl *, void*);
00110 void click_apply_to_selection(void*);
00111 void commit_radio_zoom(LLUICtrl *, void*);
00112 void commit_radio_orbit(LLUICtrl *, void*);
00113 void commit_radio_pan(LLUICtrl *, void*);
00114 void commit_grid_mode(LLUICtrl *, void*);
00115 void commit_slider_zoom(LLUICtrl *, void*);
00116
00117
00118
00119 void* LLFloaterTools::createPanelPermissions(void* data)
00120 {
00121 LLFloaterTools* floater = (LLFloaterTools*)data;
00122 floater->mPanelPermissions = new LLPanelPermissions("General");
00123 return floater->mPanelPermissions;
00124 }
00125
00126 void* LLFloaterTools::createPanelObject(void* data)
00127 {
00128 LLFloaterTools* floater = (LLFloaterTools*)data;
00129 floater->mPanelObject = new LLPanelObject("Object");
00130 return floater->mPanelObject;
00131 }
00132
00133
00134 void* LLFloaterTools::createPanelVolume(void* data)
00135 {
00136 LLFloaterTools* floater = (LLFloaterTools*)data;
00137 floater->mPanelVolume = new LLPanelVolume("Features");
00138 return floater->mPanelVolume;
00139 }
00140
00141
00142 void* LLFloaterTools::createPanelFace(void* data)
00143 {
00144 LLFloaterTools* floater = (LLFloaterTools*)data;
00145 floater->mPanelFace = new LLPanelFace("Texture");
00146 return floater->mPanelFace;
00147 }
00148
00149
00150 void* LLFloaterTools::createPanelContents(void* data)
00151 {
00152 LLFloaterTools* floater = (LLFloaterTools*)data;
00153 floater->mPanelContents = new LLPanelContents("Contents");
00154 return floater->mPanelContents;
00155 }
00156
00157
00158 void* LLFloaterTools::createPanelContentsInventory(void* data)
00159 {
00160 LLFloaterTools* floater = (LLFloaterTools*)data;
00161 floater->mPanelContents->mPanelInventory = new LLPanelInventory("ContentsInventory", LLRect());
00162 return floater->mPanelContents->mPanelInventory;
00163 }
00164
00165
00166 void* LLFloaterTools::createPanelLandInfo(void* data)
00167 {
00168 LLFloaterTools* floater = (LLFloaterTools*)data;
00169 floater->mPanelLandInfo = new LLPanelLandInfo("land info panel");
00170 return floater->mPanelLandInfo;
00171 }
00172
00173 BOOL LLFloaterTools::postBuild()
00174 {
00175
00176
00177 setVisible(FALSE);
00178
00179
00180
00181 setSoundFlags(LLView::SILENT);
00182
00183 getDragHandle()->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") );
00184
00185 LLRect rect;
00186 mBtnFocus = getChild<LLButton>("button focus");
00187 childSetAction("button focus",LLFloaterTools::setEditTool, (void*)LLToolCamera::getInstance());
00188 mBtnMove = getChild<LLButton>("button move");
00189 childSetAction("button move",LLFloaterTools::setEditTool, (void*)LLToolGrab::getInstance());
00190 mBtnEdit = getChild<LLButton>("button edit");
00191 childSetAction("button edit",LLFloaterTools::setEditTool, (void*)LLToolCompTranslate::getInstance());
00192 mBtnCreate = getChild<LLButton>("button create");
00193 childSetAction("button create",LLFloaterTools::setEditTool, (void*)LLToolCompCreate::getInstance());
00194 mBtnLand = getChild<LLButton>("button land" );
00195 childSetAction("button land",LLFloaterTools::setEditTool, (void*)LLToolSelectLand::getInstance());
00196 mTextStatus = getChild<LLTextBox>("text status");
00197
00198 childSetCommitCallback("slider zoom",commit_slider_zoom,this);
00199
00200 mRadioZoom = getChild<LLCheckBoxCtrl>("radio zoom");
00201 childSetCommitCallback("radio zoom",commit_radio_zoom,this);
00202 mRadioOrbit = getChild<LLCheckBoxCtrl>("radio orbit");
00203 childSetCommitCallback("radio orbit",commit_radio_orbit,this);
00204 mRadioPan = getChild<LLCheckBoxCtrl>("radio pan");
00205 childSetCommitCallback("radio pan",commit_radio_pan,this);
00206
00207 mRadioMove = getChild<LLCheckBoxCtrl>("radio move");
00208 childSetCommitCallback("radio move",click_popup_grab_drag,this);
00209 mRadioLift = getChild<LLCheckBoxCtrl>("radio lift");
00210 childSetCommitCallback("radio lift",click_popup_grab_lift,this);
00211 mRadioSpin = getChild<LLCheckBoxCtrl>("radio spin");
00212 childSetCommitCallback("radio spin",click_popup_grab_spin,NULL);
00213 mRadioPosition = getChild<LLCheckBoxCtrl>("radio position");
00214 childSetCommitCallback("radio position",commit_select_tool,LLToolCompTranslate::getInstance());
00215 mRadioRotate = getChild<LLCheckBoxCtrl>("radio rotate");
00216 childSetCommitCallback("radio rotate",commit_select_tool,LLToolCompRotate::getInstance());
00217 mRadioStretch = getChild<LLCheckBoxCtrl>("radio stretch");
00218 childSetCommitCallback("radio stretch",commit_select_tool,LLToolCompScale::getInstance());
00219 mRadioSelectFace = getChild<LLCheckBoxCtrl>("radio select face");
00220 childSetCommitCallback("radio select face",commit_select_tool,LLToolFace::getInstance());
00221 mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
00222 childSetValue("checkbox edit linked parts",(BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
00223 childSetCommitCallback("checkbox edit linked parts",commit_select_component,this);
00224 mCheckSnapToGrid = getChild<LLCheckBoxCtrl>("checkbox snap to grid");
00225 childSetValue("checkbox snap to grid",(BOOL)gSavedSettings.getBOOL("SnapEnabled"));
00226 mBtnGridOptions = getChild<LLButton>("Options...");
00227 childSetAction("Options...",onClickGridOptions, this);
00228 mCheckStretchUniform = getChild<LLCheckBoxCtrl>("checkbox uniform");
00229 childSetValue("checkbox uniform",(BOOL)gSavedSettings.getBOOL("ScaleUniform"));
00230 mCheckStretchTexture = getChild<LLCheckBoxCtrl>("checkbox stretch textures");
00231 childSetValue("checkbox stretch textures",(BOOL)gSavedSettings.getBOOL("ScaleStretchTextures"));
00232 mTextGridMode = getChild<LLTextBox>("text ruler mode");
00233 mComboGridMode = getChild<LLComboBox>("combobox grid mode");
00234 childSetCommitCallback("combobox grid mode",commit_grid_mode, this);
00235
00236
00237
00238
00239 static const LLString toolNames[]={
00240 "ToolCube",
00241 "ToolPrism",
00242 "ToolPyramid",
00243 "ToolTetrahedron",
00244 "ToolCylinder",
00245 "ToolHemiCylinder",
00246 "ToolCone",
00247 "ToolHemiCone",
00248 "ToolSphere",
00249 "ToolHemiSphere",
00250 "ToolTorus",
00251 "ToolTube",
00252 "ToolRing",
00253 "ToolTree",
00254 "ToolGrass"};
00255 void* toolData[]={
00256 &LLToolPlacerPanel::sCube,
00257 &LLToolPlacerPanel::sPrism,
00258 &LLToolPlacerPanel::sPyramid,
00259 &LLToolPlacerPanel::sTetrahedron,
00260 &LLToolPlacerPanel::sCylinder,
00261 &LLToolPlacerPanel::sCylinderHemi,
00262 &LLToolPlacerPanel::sCone,
00263 &LLToolPlacerPanel::sConeHemi,
00264 &LLToolPlacerPanel::sSphere,
00265 &LLToolPlacerPanel::sSphereHemi,
00266 &LLToolPlacerPanel::sTorus,
00267 &LLToolPlacerPanel::sSquareTorus,
00268 &LLToolPlacerPanel::sTriangleTorus,
00269 &LLToolPlacerPanel::sTree,
00270 &LLToolPlacerPanel::sGrass};
00271 for(size_t t=0; t<sizeof(toolNames)/sizeof(toolNames[0]); ++t)
00272 {
00273 LLButton *found = getChild<LLButton>(toolNames[t]);
00274 if(found)
00275 {
00276 found->setClickedCallback(setObjectType,toolData[t]);
00277 mButtons.push_back( found );
00278 }else{
00279 llwarns << "Tool button not found! DOA Pending." << llendl;
00280 }
00281 }
00282 mCheckCopySelection = getChild<LLCheckBoxCtrl>("checkbox copy selection");
00283 childSetValue("checkbox copy selection",(BOOL)gSavedSettings.getBOOL("CreateToolCopySelection"));
00284 mCheckSticky = getChild<LLCheckBoxCtrl>("checkbox sticky");
00285 childSetValue("checkbox sticky",(BOOL)gSavedSettings.getBOOL("CreateToolKeepSelected"));
00286 mCheckCopyCenters = getChild<LLCheckBoxCtrl>("checkbox copy centers");
00287 childSetValue("checkbox copy centers",(BOOL)gSavedSettings.getBOOL("CreateToolCopyCenters"));
00288 mCheckCopyRotates = getChild<LLCheckBoxCtrl>("checkbox copy rotates");
00289 childSetValue("checkbox copy rotates",(BOOL)gSavedSettings.getBOOL("CreateToolCopyRotates"));
00290 mRadioSelectLand = getChild<LLCheckBoxCtrl>("radio select land");
00291 childSetCommitCallback("radio select land",commit_select_tool, LLToolSelectLand::getInstance());
00292 mRadioDozerFlatten = getChild<LLCheckBoxCtrl>("radio flatten");
00293 childSetCommitCallback("radio flatten",click_popup_dozer_mode, (void*)0);
00294 mRadioDozerRaise = getChild<LLCheckBoxCtrl>("radio raise");
00295 childSetCommitCallback("radio raise",click_popup_dozer_mode, (void*)1);
00296 mRadioDozerLower = getChild<LLCheckBoxCtrl>("radio lower");
00297 childSetCommitCallback("radio lower",click_popup_dozer_mode, (void*)2);
00298 mRadioDozerSmooth = getChild<LLCheckBoxCtrl>("radio smooth");
00299 childSetCommitCallback("radio smooth",click_popup_dozer_mode, (void*)3);
00300 mRadioDozerNoise = getChild<LLCheckBoxCtrl>("radio noise");
00301 childSetCommitCallback("radio noise",click_popup_dozer_mode, (void*)4);
00302 mRadioDozerRevert = getChild<LLCheckBoxCtrl>("radio revert");
00303 childSetCommitCallback("radio revert",click_popup_dozer_mode, (void*)5);
00304 mComboDozerSize = getChild<LLComboBox>("combobox brush size");
00305 childSetCommitCallback("combobox brush size",click_dozer_size, (void*)0);
00306 if(mComboDozerSize) mComboDozerSize->setCurrentByIndex(0);
00307 mBtnApplyToSelection = getChild<LLButton>("button apply to selection");
00308 childSetAction("button apply to selection",click_apply_to_selection, (void*)0);
00309 mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners");
00310 childSetValue("checkbox show owners",gSavedSettings.getBOOL("ShowParcelOwners"));
00311 childSetAction("button more", click_show_more, this);
00312 childSetAction("button less", click_show_more, this);
00313 mTab = getChild<LLTabContainer>("Object Info Tabs");
00314 if(mTab)
00315 {
00316 mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") );
00317 mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
00318 mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") );
00319 mTab->setBorderVisible(FALSE);
00320 mTab->selectFirstTab();
00321 }
00322
00323 mStatusText["rotate"] = getString("status_rotate");
00324 mStatusText["scale"] = getString("status_scale");
00325 mStatusText["move"] = getString("status_move");
00326 mStatusText["modifyland"] = getString("status_modifyland");
00327 mStatusText["camera"] = getString("status_camera");
00328 mStatusText["grab"] = getString("status_grab");
00329 mStatusText["place"] = getString("status_place");
00330 mStatusText["selectland"] = getString("status_selectland");
00331
00332 return TRUE;
00333 }
00334
00335
00336
00337 LLFloaterTools::LLFloaterTools()
00338 : LLFloater("toolbox floater"),
00339 mBtnFocus(NULL),
00340 mBtnMove(NULL),
00341 mBtnEdit(NULL),
00342 mBtnCreate(NULL),
00343 mBtnLand(NULL),
00344 mTextStatus(NULL),
00345
00346 mRadioOrbit(NULL),
00347 mRadioZoom(NULL),
00348 mRadioPan(NULL),
00349
00350 mRadioMove(NULL),
00351 mRadioLift(NULL),
00352 mRadioSpin(NULL),
00353
00354 mRadioPosition(NULL),
00355 mRadioRotate(NULL),
00356 mRadioStretch(NULL),
00357 mRadioSelectFace(NULL),
00358 mCheckSelectIndividual(NULL),
00359
00360 mCheckSnapToGrid(NULL),
00361 mBtnGridOptions(NULL),
00362 mTextGridMode(NULL),
00363 mComboGridMode(NULL),
00364 mCheckStretchUniform(NULL),
00365 mCheckStretchTexture(NULL),
00366
00367 mBtnRotateLeft(NULL),
00368 mBtnRotateReset(NULL),
00369 mBtnRotateRight(NULL),
00370
00371 mBtnDelete(NULL),
00372 mBtnDuplicate(NULL),
00373 mBtnDuplicateInPlace(NULL),
00374
00375 mCheckSticky(NULL),
00376 mCheckCopySelection(NULL),
00377 mCheckCopyCenters(NULL),
00378 mCheckCopyRotates(NULL),
00379 mRadioSelectLand(NULL),
00380 mRadioDozerFlatten(NULL),
00381 mRadioDozerRaise(NULL),
00382 mRadioDozerLower(NULL),
00383 mRadioDozerSmooth(NULL),
00384 mRadioDozerNoise(NULL),
00385 mRadioDozerRevert(NULL),
00386 mComboDozerSize(NULL),
00387 mBtnApplyToSelection(NULL),
00388 mCheckShowOwners(NULL),
00389
00390
00391 mTab(NULL),
00392 mPanelPermissions(NULL),
00393 mPanelObject(NULL),
00394 mPanelVolume(NULL),
00395 mPanelContents(NULL),
00396 mPanelFace(NULL),
00397 mPanelLandInfo(NULL),
00398
00399 mTabLand(NULL),
00400 mDirty(TRUE)
00401 {
00402 setAutoFocus(FALSE);
00403 LLCallbackMap::map_t factory_map;
00404 factory_map["General"] = LLCallbackMap(createPanelPermissions, this);
00405 factory_map["Object"] = LLCallbackMap(createPanelObject, this);
00406 factory_map["Features"] = LLCallbackMap(createPanelVolume, this);
00407 factory_map["Texture"] = LLCallbackMap(createPanelFace, this);
00408 factory_map["Contents"] = LLCallbackMap(createPanelContents, this);
00409 factory_map["ContentsInventory"] = LLCallbackMap(createPanelContentsInventory, this);
00410 factory_map["land info panel"] = LLCallbackMap(createPanelLandInfo, this);
00411
00412 LLUICtrlFactory::getInstance()->buildFloater(this,"floater_tools.xml",&factory_map,FALSE);
00413
00414 mLargeHeight = getRect().getHeight();
00415 mSmallHeight = mLargeHeight;
00416 if (mTab) mSmallHeight -= mTab->getRect().getHeight();
00417
00418
00419
00420
00421
00422 BOOL show_more = gSavedSettings.getBOOL("ToolboxShowMore");
00423 gSavedSettings.setBOOL("ToolboxShowMore", show_more);
00424 showMore( !show_more );
00425 showMore( show_more );
00426 }
00427
00428 LLFloaterTools::~LLFloaterTools()
00429 {
00430
00431 }
00432
00433 void LLFloaterTools::setStatusText(const std::string& text)
00434 {
00435 std::map<std::string, std::string>::iterator iter = mStatusText.find(text);
00436 if (iter != mStatusText.end())
00437 {
00438 mTextStatus->setText(iter->second);
00439 }
00440 else
00441 {
00442 mTextStatus->setText(text);
00443 }
00444 }
00445
00446 void LLFloaterTools::refresh()
00447 {
00448 const S32 INFO_WIDTH = getRect().getWidth();
00449 const S32 INFO_HEIGHT = 384;
00450 LLRect object_info_rect(0, 0, INFO_WIDTH, -INFO_HEIGHT);
00451 BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
00452
00453 S32 idx_features = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FEATURES]);
00454 S32 idx_face = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FACE]);
00455 S32 idx_contents = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_CONTENTS]);
00456
00457 S32 selected_index = mTab->getCurrentPanelIndex();
00458
00459 if (!all_volume && (selected_index == idx_features || selected_index == idx_face ||
00460 selected_index == idx_contents))
00461 {
00462 mTab->selectFirstTab();
00463 }
00464
00465 mTab->enableTabButton(idx_features, all_volume);
00466 mTab->enableTabButton(idx_face, all_volume);
00467 mTab->enableTabButton(idx_contents, all_volume);
00468
00469 mPanelPermissions->refresh();
00470 mPanelObject->refresh();
00471 mPanelVolume->refresh();
00472 mPanelFace->refresh();
00473 mPanelContents->refresh();
00474 mPanelLandInfo->refresh();
00475 }
00476
00477 void LLFloaterTools::draw()
00478 {
00479 if (mDirty)
00480 {
00481 refresh();
00482 mDirty = FALSE;
00483 }
00484
00485
00486 LLFloater::draw();
00487 }
00488
00489 void LLFloaterTools::dirty()
00490 {
00491 mDirty = TRUE;
00492 LLFloaterOpenObject::dirty();
00493 }
00494
00495
00496
00497 void LLFloaterTools::resetToolState()
00498 {
00499 gCameraBtnZoom = TRUE;
00500 gCameraBtnOrbit = FALSE;
00501 gCameraBtnPan = FALSE;
00502
00503 gGrabBtnSpin = FALSE;
00504 gGrabBtnVertical = FALSE;
00505 }
00506
00507 void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
00508 {
00509 LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
00510
00511
00512
00513 if (tool == gToolNull)
00514 {
00515 return;
00516 }
00517
00518 if ( isMinimized() )
00519 {
00520 return;
00521 }
00522
00523
00524 BOOL focus_visible = ( tool == LLToolCamera::getInstance() );
00525
00526 mBtnFocus ->setToggleState( focus_visible );
00527
00528 mRadioZoom ->setVisible( focus_visible );
00529 mRadioOrbit ->setVisible( focus_visible );
00530 mRadioPan ->setVisible( focus_visible );
00531 childSetVisible("slider zoom", focus_visible);
00532 childSetEnabled("slider zoom", gCameraBtnZoom);
00533
00534 mRadioZoom ->set( !gCameraBtnOrbit &&
00535 !gCameraBtnPan &&
00536 !(mask == MASK_ORBIT) &&
00537 !(mask == (MASK_ORBIT | MASK_ALT)) &&
00538 !(mask == MASK_PAN) &&
00539 !(mask == (MASK_PAN | MASK_ALT)) );
00540
00541 mRadioOrbit ->set( gCameraBtnOrbit ||
00542 (mask == MASK_ORBIT) ||
00543 (mask == (MASK_ORBIT | MASK_ALT)) );
00544
00545 mRadioPan ->set( gCameraBtnPan ||
00546 (mask == MASK_PAN) ||
00547 (mask == (MASK_PAN | MASK_ALT)) );
00548
00549
00550 childSetValue( "slider zoom", gAgent.getCameraZoomFraction() * 0.5f);
00551
00552
00553 BOOL move_visible = (tool == LLToolGrab::getInstance());
00554
00555 if (mBtnMove) mBtnMove ->setToggleState( move_visible );
00556
00557
00558 if (mRadioMove)
00559 {
00560 mRadioMove ->setVisible( move_visible );
00561 mRadioMove ->set( !gGrabBtnSpin &&
00562 !gGrabBtnVertical &&
00563 !(mask == MASK_VERTICAL) &&
00564 !(mask == MASK_SPIN) );
00565 }
00566
00567 if (mRadioLift)
00568 {
00569 mRadioLift ->setVisible( move_visible );
00570 mRadioLift ->set( gGrabBtnVertical ||
00571 (mask == MASK_VERTICAL) );
00572 }
00573
00574 if (mRadioSpin)
00575 {
00576 mRadioSpin ->setVisible( move_visible );
00577 mRadioSpin ->set( gGrabBtnSpin ||
00578 (mask == MASK_SPIN) );
00579 }
00580
00581
00582 BOOL edit_visible = tool == LLToolCompTranslate::getInstance() ||
00583 tool == LLToolCompRotate::getInstance() ||
00584 tool == LLToolCompScale::getInstance() ||
00585 tool == LLToolFace::getInstance() ||
00586 tool == LLToolIndividual::getInstance() ||
00587 tool == LLToolPipette::getInstance();
00588
00589 mBtnEdit ->setToggleState( edit_visible );
00590
00591 mRadioPosition ->setVisible( edit_visible );
00592 mRadioRotate ->setVisible( edit_visible );
00593 mRadioStretch ->setVisible( edit_visible );
00594 if (mRadioSelectFace)
00595 {
00596 mRadioSelectFace->setVisible( edit_visible );
00597 mRadioSelectFace->set( tool == LLToolFace::getInstance() );
00598 }
00599
00600 if (mCheckSelectIndividual)
00601 {
00602 mCheckSelectIndividual->setVisible(edit_visible);
00603
00604 }
00605
00606 mRadioPosition ->set( tool == LLToolCompTranslate::getInstance() );
00607 mRadioRotate ->set( tool == LLToolCompRotate::getInstance() );
00608 mRadioStretch ->set( tool == LLToolCompScale::getInstance() );
00609
00610 if (mComboGridMode)
00611 {
00612 mComboGridMode->setVisible( edit_visible );
00613 S32 index = mComboGridMode->getCurrentIndex();
00614 mComboGridMode->removeall();
00615
00616 switch (mObjectSelection->getSelectType())
00617 {
00618 case SELECT_TYPE_HUD:
00619 mComboGridMode->add(getString("grid_screen_text"));
00620 mComboGridMode->add(getString("grid_local_text"));
00621
00622 break;
00623 case SELECT_TYPE_WORLD:
00624 mComboGridMode->add(getString("grid_world_text"));
00625 mComboGridMode->add(getString("grid_local_text"));
00626 mComboGridMode->add(getString("grid_reference_text"));
00627 break;
00628 case SELECT_TYPE_ATTACHMENT:
00629 mComboGridMode->add(getString("grid_attachment_text"));
00630 mComboGridMode->add(getString("grid_local_text"));
00631 mComboGridMode->add(getString("grid_reference_text"));
00632 break;
00633 }
00634
00635 mComboGridMode->setCurrentByIndex(index);
00636 }
00637 if (mTextGridMode) mTextGridMode->setVisible( edit_visible );
00638
00639
00640 if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible );
00641 if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible );
00642
00643
00644 if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
00645 if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
00646
00647
00648 BOOL create_visible = (tool == LLToolCompCreate::getInstance());
00649
00650 mBtnCreate ->setToggleState( tool == LLToolCompCreate::getInstance() );
00651
00652 if (mCheckCopySelection
00653 && mCheckCopySelection->get())
00654 {
00655
00656 for (std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++)
00657 {
00658 mButtons[i]->setToggleState(FALSE);
00659 mButtons[i]->setVisible( create_visible );
00660 }
00661 }
00662 else
00663 {
00664
00665 for( std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++ )
00666 {
00667 LLPCode pcode = LLToolPlacer::getObjectType();
00668 void *userdata = mButtons[i]->getCallbackUserData();
00669 LLPCode *cur = (LLPCode*) userdata;
00670
00671 BOOL state = (pcode == *cur);
00672 mButtons[i]->setToggleState( state );
00673 mButtons[i]->setVisible( create_visible );
00674 }
00675 }
00676
00677 if (mCheckSticky) mCheckSticky ->setVisible( create_visible );
00678 if (mCheckCopySelection) mCheckCopySelection ->setVisible( create_visible );
00679 if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
00680 if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
00681
00682 if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
00683 if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
00684
00685
00686 BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
00687
00688 if (mBtnLand) mBtnLand ->setToggleState( land_visible );
00689
00690
00691 if (mRadioSelectLand) mRadioSelectLand->set( tool == LLToolSelectLand::getInstance() );
00692
00693
00694 if (mRadioSelectLand) mRadioSelectLand->setVisible( land_visible );
00695
00696 S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
00697 S32 dozer_size = gSavedSettings.getS32("RadioLandBrushSize");
00698
00699 if (mRadioDozerFlatten)
00700 {
00701 mRadioDozerFlatten ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 0);
00702 mRadioDozerFlatten ->setVisible( land_visible );
00703 }
00704 if (mRadioDozerRaise)
00705 {
00706 mRadioDozerRaise ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 1);
00707 mRadioDozerRaise ->setVisible( land_visible );
00708 }
00709 if (mRadioDozerLower)
00710 {
00711 mRadioDozerLower ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 2);
00712 mRadioDozerLower ->setVisible( land_visible );
00713 }
00714 if (mRadioDozerSmooth)
00715 {
00716 mRadioDozerSmooth ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 3);
00717 mRadioDozerSmooth ->setVisible( land_visible );
00718 }
00719 if (mRadioDozerNoise)
00720 {
00721 mRadioDozerNoise ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 4);
00722 mRadioDozerNoise ->setVisible( land_visible );
00723 }
00724 if (mRadioDozerRevert)
00725 {
00726 mRadioDozerRevert ->set( tool == LLToolBrushLand::getInstance() && dozer_mode == 5);
00727 mRadioDozerRevert ->setVisible( land_visible );
00728 }
00729 if (mComboDozerSize)
00730 {
00731 mComboDozerSize ->setCurrentByIndex(dozer_size);
00732 mComboDozerSize ->setVisible( land_visible );
00733 mComboDozerSize ->setEnabled( tool == LLToolBrushLand::getInstance() );
00734 }
00735 if (mBtnApplyToSelection)
00736 {
00737 mBtnApplyToSelection->setVisible( land_visible );
00738 mBtnApplyToSelection->setEnabled( land_visible && !LLViewerParcelMgr::getInstance()->selectionEmpty() && tool != LLToolSelectLand::getInstance());
00739 }
00740 if (mCheckShowOwners)
00741 {
00742 mCheckShowOwners ->setVisible( land_visible );
00743 }
00744
00745
00746
00747
00748 BOOL show_more = gSavedSettings.getBOOL("ToolboxShowMore");
00749
00750 mTab->setVisible(show_more && tool != LLToolBrushLand::getInstance() && tool != LLToolSelectLand::getInstance());
00751 mPanelLandInfo->setVisible(show_more && (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance()));
00752 }
00753
00754
00755
00756 BOOL LLFloaterTools::canClose()
00757 {
00758
00759 return !LLApp::isExiting();
00760 }
00761
00762
00763 void LLFloaterTools::onOpen()
00764 {
00765 mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
00766 mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
00767
00768 gMenuBarView->setItemVisible("Tools", TRUE);
00769 gMenuBarView->arrange();
00770 }
00771
00772
00773 void LLFloaterTools::onClose(bool app_quitting)
00774 {
00775 setMinimized(FALSE);
00776 setVisible(FALSE);
00777 mTab->setVisible(FALSE);
00778
00779 LLViewerJoystick::getInstance()->moveAvatar(false);
00780
00781
00782
00783 gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
00784
00785
00786 LLSelectMgr::getInstance()->promoteSelectionToRoot();
00787 gSavedSettings.setBOOL("EditLinkedParts", FALSE);
00788
00789 gViewerWindow->showCursor();
00790
00791 resetToolState();
00792
00793 mParcelSelection = NULL;
00794 mObjectSelection = NULL;
00795
00796
00797 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
00798
00799
00800 LLToolMgr::getInstance()->getCurrentToolset()->selectFirstTool();
00801
00802 gMenuBarView->setItemVisible("Tools", FALSE);
00803 gMenuBarView->arrange();
00804 }
00805
00806 void LLFloaterTools::showMore(BOOL show_more)
00807 {
00808 BOOL showing_more = gSavedSettings.getBOOL("ToolboxShowMore");
00809 if (show_more == showing_more)
00810 {
00811 return;
00812 }
00813
00814 gSavedSettings.setBOOL("ToolboxShowMore", show_more);
00815
00816
00817
00818
00819 if (show_more)
00820 {
00821 reshape( getRect().getWidth(), mLargeHeight, TRUE);
00822 translate( 0, mSmallHeight - mLargeHeight );
00823 }
00824 else
00825 {
00826 reshape( getRect().getWidth(), mSmallHeight, TRUE);
00827 translate( 0, mLargeHeight - mSmallHeight );
00828 }
00829 childSetVisible("button less", show_more);
00830 childSetVisible("button more", !show_more);
00831 }
00832
00833 void LLFloaterTools::showPanel(EInfoPanel panel)
00834 {
00835 llassert(panel >= 0 && panel < PANEL_COUNT);
00836 mTab->selectTabByName(PANEL_NAMES[panel]);
00837 }
00838
00839 void click_show_more(void *userdata)
00840 {
00841 LLFloaterTools *f = (LLFloaterTools *)userdata;
00842 BOOL show_more = !gSavedSettings.getBOOL("ToolboxShowMore");
00843 f->showMore( show_more );
00844 }
00845
00846 void click_popup_info(void*)
00847 {
00848
00849 }
00850
00851 void click_popup_done(void*)
00852 {
00853 handle_reset_view();
00854 }
00855
00856 void click_popup_grab_drag(LLUICtrl*, void*)
00857 {
00858 gGrabBtnVertical = FALSE;
00859 gGrabBtnSpin = FALSE;
00860 }
00861
00862 void click_popup_grab_lift(LLUICtrl*, void*)
00863 {
00864 gGrabBtnVertical = TRUE;
00865 gGrabBtnSpin = FALSE;
00866 }
00867
00868 void click_popup_grab_spin(LLUICtrl*, void*)
00869 {
00870 gGrabBtnVertical = FALSE;
00871 gGrabBtnSpin = TRUE;
00872 }
00873
00874 void commit_radio_zoom(LLUICtrl *, void*)
00875 {
00876 gCameraBtnZoom = TRUE;
00877 gCameraBtnOrbit = FALSE;
00878 gCameraBtnPan = FALSE;
00879 }
00880
00881 void commit_radio_orbit(LLUICtrl *, void*)
00882 {
00883 gCameraBtnZoom = FALSE;
00884 gCameraBtnOrbit = TRUE;
00885 gCameraBtnPan = FALSE;
00886 }
00887
00888 void commit_radio_pan(LLUICtrl *, void*)
00889 {
00890 gCameraBtnZoom = FALSE;
00891 gCameraBtnOrbit = FALSE;
00892 gCameraBtnPan = TRUE;
00893 }
00894
00895 void commit_slider_zoom(LLUICtrl *ctrl, void*)
00896 {
00897
00898 F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f;
00899 gAgent.setCameraZoomFraction(zoom_level);
00900 }
00901
00902 void click_popup_rotate_left(void*)
00903 {
00904 LLSelectMgr::getInstance()->selectionRotateAroundZ( 45.f );
00905 dialog_refresh_all();
00906 }
00907
00908 void click_popup_rotate_reset(void*)
00909 {
00910 LLSelectMgr::getInstance()->selectionResetRotation();
00911 dialog_refresh_all();
00912 }
00913
00914 void click_popup_rotate_right(void*)
00915 {
00916 LLSelectMgr::getInstance()->selectionRotateAroundZ( -45.f );
00917 dialog_refresh_all();
00918 }
00919
00920
00921 void click_popup_dozer_mode(LLUICtrl *, void *user)
00922 {
00923 S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
00924 S32 mode = (S32)(intptr_t) user;
00925 gFloaterTools->setEditTool( LLToolBrushLand::getInstance() );
00926 gSavedSettings.setS32("RadioLandBrushAction", mode);
00927 gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
00928 }
00929
00930 void click_popup_dozer_size(LLUICtrl *, void *user)
00931 {
00932 S32 size = (S32)(intptr_t) user;
00933 gSavedSettings.setS32("RadioLandBrushSize", size);
00934 }
00935
00936 void click_dozer_size(LLUICtrl *ctrl, void *user)
00937 {
00938 S32 size = ((LLComboBox*) ctrl)->getCurrentIndex();
00939 gSavedSettings.setS32("RadioLandBrushSize", size);
00940 }
00941
00942 void click_apply_to_selection(void* user)
00943 {
00944 LLToolBrushLand::getInstance()->modifyLandInSelectionGlobal();
00945 }
00946
00947 void commit_select_tool(LLUICtrl *ctrl, void *data)
00948 {
00949 S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
00950 gFloaterTools->setEditTool(data);
00951 gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
00952 }
00953
00954 void commit_select_component(LLUICtrl *ctrl, void *data)
00955 {
00956 LLFloaterTools* floaterp = (LLFloaterTools*)data;
00957
00958
00959 if (gFocusMgr.childHasKeyboardFocus(floaterp))
00960 {
00961 gFocusMgr.setKeyboardFocus(NULL);
00962 }
00963
00964 BOOL select_individuals = floaterp->mCheckSelectIndividual->get();
00965 gSavedSettings.setBOOL("EditLinkedParts", select_individuals);
00966 floaterp->dirty();
00967
00968 if (select_individuals)
00969 {
00970 LLSelectMgr::getInstance()->demoteSelectionToIndividuals();
00971 }
00972 else
00973 {
00974 LLSelectMgr::getInstance()->promoteSelectionToRoot();
00975 }
00976 }
00977
00978 void commit_grid_mode(LLUICtrl *ctrl, void *data)
00979 {
00980 LLComboBox* combo = (LLComboBox*)ctrl;
00981
00982 LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
00983 }
00984
00985
00986 void LLFloaterTools::setObjectType( void* data )
00987 {
00988 LLPCode pcode = *(LLPCode*) data;
00989 LLToolPlacer::setObjectType( pcode );
00990 gSavedSettings.setBOOL("CreateToolCopySelection", FALSE);
00991 gViewerWindow->setMouseCapture(NULL);
00992 }
00993
00994
00995 void LLFloaterTools::onClickGridOptions(void* data)
00996 {
00997
00998 LLFloaterBuildOptions::show(NULL);
00999
01000
01001 }
01002
01003 void LLFloaterTools::setEditTool(void* tool_pointer)
01004 {
01005 select_tool(tool_pointer);
01006 }
01007
01008 void LLFloaterTools::onFocusReceived()
01009 {
01010 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
01011 LLFloater::onFocusReceived();
01012 }