llfloatertools.cpp

Go to the documentation of this file.
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 // Globals
00082 LLFloaterTools *gFloaterTools = NULL;
00083 
00084 
00085 const LLString PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
00086 {
00087         LLString("General"),    // PANEL_GENERAL,
00088         LLString("Object"),     // PANEL_OBJECT,
00089         LLString("Features"),   // PANEL_FEATURES,
00090         LLString("Texture"),    // PANEL_FACE,
00091         LLString("Content"),    // PANEL_CONTENTS,
00092 };
00093 
00094 // Local prototypes
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 //static
00119 void*   LLFloaterTools::createPanelPermissions(void* data)
00120 {
00121         LLFloaterTools* floater = (LLFloaterTools*)data;
00122         floater->mPanelPermissions = new LLPanelPermissions("General");
00123         return floater->mPanelPermissions;
00124 }
00125 //static
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 //static
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 //static
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 //static
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 //static
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 //static
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         // Hide until tool selected
00177         setVisible(FALSE);
00178 
00179         // Since we constantly show and hide this during drags, don't
00180         // make sounds on visibility changes.
00181         setSoundFlags(LLView::SILENT);
00182 
00183         getDragHandle()->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") );
00184 
00185         LLRect rect;
00186         mBtnFocus = getChild<LLButton>("button focus");//btn;
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         // Create Buttons
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 // Create the popupview with a dummy center.  It will be moved into place
00336 // during LLViewerWindow's per-frame hover processing.
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);//LLPanelPermissions
00405         factory_map["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
00406         factory_map["Features"] = LLCallbackMap(createPanelVolume, this);//LLPanelVolume
00407         factory_map["Texture"] = LLCallbackMap(createPanelFace, this);//LLPanelFace
00408         factory_map["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents
00409         factory_map["ContentsInventory"] = LLCallbackMap(createPanelContentsInventory, this);//LLPanelContents
00410         factory_map["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo
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         // force a toggle initially. seems to be needed to correctly initialize 
00419         // both "more" and "less" cases. it also seems to be important to begin
00420         // with the user's preference first so that it's initial position will
00421         // be correct (SL-51192) -MG
00422         BOOL show_more = gSavedSettings.getBOOL("ToolboxShowMore"); // get user's preference
00423         gSavedSettings.setBOOL("ToolboxShowMore", show_more); // sets up forced toggle below
00424         showMore( !show_more ); // does the toggle
00425         showMore(  show_more ); // reset the real user's preference
00426 }
00427 
00428 LLFloaterTools::~LLFloaterTools()
00429 {
00430         // children automatically deleted
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         //      mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
00486         LLFloater::draw();
00487 }
00488 
00489 void LLFloaterTools::dirty()
00490 {
00491         mDirty = TRUE; 
00492         LLFloaterOpenObject::dirty();
00493 }
00494 
00495 // Clean up any tool state that should not persist when the
00496 // floater is closed.
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         // HACK to allow seeing the buttons when you have the app in a window.
00512         // Keep the visibility the same as it 
00513         if (tool == gToolNull)
00514         {
00515                 return;
00516         }
00517 
00518         if ( isMinimized() )
00519         {       // SL looks odd if we draw the tools while the window is minimized
00520                 return;
00521         }
00522         
00523         // Focus buttons
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         // multiply by correction factor because volume sliders go [0, 0.5]
00550         childSetValue( "slider zoom", gAgent.getCameraZoomFraction() * 0.5f);
00551 
00552         // Move buttons
00553         BOOL move_visible = (tool == LLToolGrab::getInstance());
00554 
00555         if (mBtnMove) mBtnMove  ->setToggleState( move_visible );
00556 
00557         // HACK - highlight buttons for next click
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         // Edit buttons
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                 //mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
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                   //mComboGridMode->add(getString("grid_reference_text"));
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         // Snap to grid disabled for grab tool - very confusing
00640         if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
00641         if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
00642 
00643         //mCheckSelectLinked    ->setVisible( edit_visible );
00644         if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
00645         if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
00646 
00647         // Create buttons
00648         BOOL create_visible = (tool == LLToolCompCreate::getInstance());
00649 
00650         mBtnCreate      ->setToggleState(       tool == LLToolCompCreate::getInstance() );
00651 
00652         if (mCheckCopySelection
00653                 && mCheckCopySelection->get())
00654         {
00655                 // don't highlight any placer button
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                 // Highlight the correct placer button
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         // Land buttons
00686         BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
00687 
00688         if (mBtnLand)   mBtnLand        ->setToggleState( land_visible );
00689 
00690         //      mRadioEditLand  ->set( tool == LLToolBrushLand::getInstance() );
00691         if (mRadioSelectLand)   mRadioSelectLand->set( tool == LLToolSelectLand::getInstance() );
00692 
00693         //      mRadioEditLand  ->setVisible( land_visible );
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         // More panel visibility
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 // virtual
00756 BOOL LLFloaterTools::canClose()
00757 {
00758         // don't close when quitting, so camera will stay put
00759         return !LLApp::isExiting();
00760 }
00761 
00762 // virtual
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 // virtual
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     // Different from handle_reset_view in that it doesn't actually 
00782         //   move the camera if EditCameraMovement is not set.
00783         gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
00784         
00785         // exit component selection mode
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         // Switch back to basic toolset
00797         LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
00798         // we were already in basic toolset, using build tools
00799         // so manually reset tool to default (pie menu tool)
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         // Visibility updated next frame - JC
00817         // mTab->setVisible(show_more);
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 //      gBuildView->setPropertiesPanelOpen(TRUE);
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         // renormalize value, since max "volume" level is 0.5 for some reason
00898         F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f;
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         //forfeit focus
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 // static 
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 // static
00995 void LLFloaterTools::onClickGridOptions(void* data)
00996 {
00997         //LLFloaterTools* floaterp = (LLFloaterTools*)data;
00998         LLFloaterBuildOptions::show(NULL);
00999         // RN: this makes grid options dependent on build tools window
01000         //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
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 }

Generated on Fri May 16 08:33:31 2008 for SecondLife by  doxygen 1.5.5