diff options
Diffstat (limited to 'indra/newview/lltoolbar.cpp')
-rw-r--r-- | indra/newview/lltoolbar.cpp | 251 |
1 files changed, 76 insertions, 175 deletions
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index 33edb3ef27..d27958c2ac 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -36,18 +36,21 @@ #include "lltoolbar.h" #include "imageids.h" +#include "llfloaterreg.h" #include "llfontgl.h" +#include "llflyoutbutton.h" #include "llrect.h" #include "llparcel.h" #include "llagent.h" +#include "llagentwearables.h" #include "llbutton.h" #include "llfocusmgr.h" #include "llviewercontrol.h" #include "llmenucommands.h" #include "llimview.h" #include "lluiconstants.h" -#include "llvoavatar.h" +#include "llvoavatarself.h" #include "lltooldraganddrop.h" #include "llinventoryview.h" #include "llfloaterchatterbox.h" @@ -57,6 +60,9 @@ #include "llui.h" #include "llviewermenu.h" #include "llfirstuse.h" +#include "llscrolllistctrl.h" +#include "llscrolllistitem.h" +#include "llscrolllistcell.h" #include "llviewerparcelmgr.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" @@ -65,29 +71,12 @@ #include "llfloaterchat.h" #include "llfloatermute.h" #include "llimpanel.h" -#include "llscrolllistctrl.h" +#include "lllayoutstack.h" #if LL_DARWIN #include "llresizehandle.h" - // This class draws like an LLResizeHandle but has no interactivity. - // It's just there to provide a cue to the user that the lower right corner of the window functions as a resize handle. - class LLFakeResizeHandle : public LLResizeHandle - { - public: - LLFakeResizeHandle(const std::string& name, const LLRect& rect, S32 min_width, S32 min_height, ECorner corner = RIGHT_BOTTOM ) - : LLResizeHandle(name, rect, min_width, min_height, corner ) - { - - } - - virtual BOOL handleHover(S32 x, S32 y, MASK mask) { return FALSE; }; - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; }; - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) { return FALSE; }; - - }; - #endif // LL_DARWIN // @@ -95,7 +84,6 @@ // LLToolBar *gToolBar = NULL; -S32 TOOL_BAR_HEIGHT = 20; // // Statics @@ -114,44 +102,13 @@ LLToolBar::LLToolBar() { setIsChrome(TRUE); setFocusRoot(TRUE); + + mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate); } BOOL LLToolBar::postBuild() { - childSetCommitCallback("communicate_btn", onClickCommunicate, this); - childSetControlName("communicate_btn", "ShowCommunicate"); - - childSetAction("chat_btn", onClickChat, this); - childSetControlName("chat_btn", "ChatVisible"); - - childSetAction("appearance_btn", onClickAppearance, this); - childSetControlName("appearance_btn", ""); - - childSetAction("fly_btn", onClickFly, this); - childSetControlName("fly_btn", "FlyBtnState"); - - childSetAction("sit_btn", onClickSit, this); - childSetControlName("sit_btn", "SitBtnState"); - - childSetAction("snapshot_btn", onClickSnapshot, this); - childSetControlName("snapshot_btn", ""); - - childSetAction("directory_btn", onClickDirectory, this); - childSetControlName("directory_btn", "ShowDirectory"); - - childSetAction("build_btn", onClickBuild, this); - childSetControlName("build_btn", "BuildBtnState"); - - childSetAction("radar_btn", onClickRadar, this); - childSetControlName("radar_btn", "ShowMiniMap"); - - childSetAction("map_btn", onClickMap, this); - childSetControlName("map_btn", "ShowWorldMap"); - - childSetAction("inventory_btn", onClickInventory, this); - childSetControlName("inventory_btn", "ShowInventory"); - for (child_list_const_iter_t child_iter = getChildList()->begin(); child_iter != getChildList()->end(); ++child_iter) { @@ -167,8 +124,14 @@ BOOL LLToolBar::postBuild() if(mResizeHandle == NULL) { LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT); - mResizeHandle = new LLFakeResizeHandle(std::string(""), rect, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT); - this->addChildAtEnd(mResizeHandle); + LLResizeHandle::Params p; + p.name(""); + p.rect(rect); + p.min_width(RESIZE_HANDLE_WIDTH); + p.min_height(RESIZE_HANDLE_HEIGHT); + p.enabled(false); + mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p); + addChildInBack(mResizeHandle); LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack"); toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight()); } @@ -196,11 +159,14 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, LLInventoryView* active_inventory = LLInventoryView::getActiveInventory(); + LLRect button_screen_rect; + inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect); + if(active_inventory && active_inventory->getVisible()) { mInventoryAutoOpen = FALSE; } - else if (inventory_btn->getRect().pointInRect(x, y)) + else if (button_screen_rect.pointInRect(x, y)) { if (mInventoryAutoOpen) { @@ -290,18 +256,34 @@ void LLToolBar::refresh() sitting = gAgent.getAvatarObject()->mIsSitting; } - childSetEnabled("fly_btn", (gAgent.canFly() || gAgent.getFlying()) && !sitting ); - - childSetEnabled("build_btn", LLViewerParcelMgr::getInstance()->agentCanBuild() ); + if (!gAgent.canFly()) + { + gSavedSettings.setBOOL("FlyBtnEnabled", gAgent.getFlying() ? true : false); + gSavedSettings.setBOOL("FlyBtnState", false); + } + else + { + gSavedSettings.setBOOL("FlyBtnEnabled", sitting ? false : true); + } // Check to see if we're in build mode - BOOL build_mode = LLToolMgr::getInstance()->inEdit(); - // And not just clicking on a scripted object - if (LLToolGrab::getInstance()->getHideBuildHighlight()) + bool build_enabled = LLToolMgr::getInstance()->canEdit(); + if (build_enabled) + { + gSavedSettings.setBOOL("BuildBtnEnabled", true); + bool build_mode = LLToolMgr::getInstance()->inEdit(); + // HACK: Not in mouselook and not just clicking on a scripted object + if (gAgent.cameraMouselook() || LLToolGrab::getInstance()->getHideBuildHighlight()) { build_mode = FALSE; } gSavedSettings.setBOOL("BuildBtnState", build_mode); + } + else + { + gSavedSettings.setBOOL("BuildBtnEnabled", false); + gSavedSettings.setBOOL("BuildBtnState", false); + } if (isInVisibleChain()) { @@ -319,29 +301,38 @@ void LLToolBar::updateCommunicateList() LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater(); LLScrollListItem* itemp = NULL; - itemp = communicate_button->add(LLFloaterMyFriends::getInstance()->getShortTitle(), LLSD("contacts"), ADD_TOP); + LLSD contact_sd; + contact_sd["value"] = "contacts"; + contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle(); if (LLFloaterMyFriends::getInstance() == frontmost_floater) { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); + contact_sd["columns"][0]["font"]["style"] = "BOLD"; // make sure current tab is selected in list if (selected.isUndefined()) { - selected = itemp->getValue(); + selected = "contacts"; } } - itemp = communicate_button->add(LLFloaterChat::getInstance()->getShortTitle(), LLSD("local chat"), ADD_TOP); + itemp = communicate_button->addElement(contact_sd, ADD_TOP); + + LLSD communicate_sd; + communicate_sd["value"] = "local chat"; + communicate_sd["columns"][0]["value"] = LLFloaterChat::getInstance()->getShortTitle(); + if (LLFloaterChat::getInstance() == frontmost_floater) { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); + communicate_sd["columns"][0]["font"]["style"] = "BOLD"; if (selected.isUndefined()) { - selected = itemp->getValue(); + selected = "local chat"; } } + itemp = communicate_button->addElement(communicate_sd, ADD_TOP); + communicate_button->addSeparator(ADD_TOP); communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP); communicate_button->addSeparator(ADD_TOP); - communicate_button->add(LLFloaterMute::getInstance()->getShortTitle(), LLSD("mute list"), ADD_TOP); + communicate_button->add(LLFloaterReg::getTypedInstance<LLFloaterMute>("mute")->getShortTitle(), LLSD("mute list"), ADD_TOP); std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it; @@ -357,38 +348,40 @@ void LLToolBar::updateCommunicateList() { std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : ""; floater_title.append(im_floaterp->getShortTitle()); - itemp = communicate_button->add(floater_title, im_floaterp->getSessionID(), ADD_TOP); + LLSD im_sd; + im_sd["value"] = im_floaterp->getSessionID(); + im_sd["columns"][0]["value"] = floater_title; if (im_floaterp == frontmost_floater) { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); + im_sd["columns"][0]["font"]["style"] = "BOLD"; if (selected.isUndefined()) { - selected = itemp->getValue(); + selected = im_floaterp->getSessionID(); } } + itemp = communicate_button->addElement(im_sd, ADD_TOP); } } - communicate_button->setToggleState(gSavedSettings.getBOOL("ShowCommunicate")); communicate_button->setValue(selected); } // static -void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, void* user_data) +void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data) { - LLToolBar* toolbar = (LLToolBar*)user_data; - LLFlyoutButton* communicate_button = toolbar->getChild<LLFlyoutButton>("communicate_btn"); + LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl); + llassert_always(communicate_button); LLSD selected_option = communicate_button->getValue(); if (selected_option.asString() == "contacts") { - LLFloaterMyFriends::showInstance(); + LLFloaterReg::showInstance("contacts", "friends"); } else if (selected_option.asString() == "local chat") { - LLFloaterChat::showInstance(); + LLFloaterReg::showInstance("communicate", "local"); } else if (selected_option.asString() == "redock") { @@ -410,112 +403,20 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, void* user_data) } } - LLFloaterChatterBox::showInstance(session_to_show); + LLFloaterReg::showInstance("communicate", session_to_show); } else if (selected_option.asString() == "mute list") { - LLFloaterMute::showInstance(); + LLFloaterReg::showInstance("mute"); } else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle { - if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) - { - LLFloaterMyFriends::toggleInstance(); + LLFloaterReg::toggleInstance("communicate"); } - else - { - LLFloaterChatterBox::toggleInstance(); - } - } - else // otherwise selection_option is a specific IM session id - { - LLFloaterChatterBox::showInstance(selected_option); - } -} - - -// static -void LLToolBar::onClickChat(void* user_data) -{ - handle_chat(NULL); -} - -// static -void LLToolBar::onClickAppearance(void*) -{ - if (gAgent.areWearablesLoaded()) - { - gAgent.changeCameraToCustomizeAvatar(); - } -} - - -// static -void LLToolBar::onClickFly(void*) -{ - gAgent.toggleFlying(); -} - - -// static -void LLToolBar::onClickSit(void*) -{ - if (!(gAgent.getControlFlags() & AGENT_CONTROL_SIT_ON_GROUND)) - { - // sit down - gAgent.setFlying(FALSE); - gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - - // Might be first sit - LLFirstUse::useSit(); - } - else + else // otherwise selection_option is undifined or a specific IM session id { - // stand up - gAgent.setFlying(FALSE); - gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); + LLFloaterReg::showInstance("communicate", selected_option); } } -// static -void LLToolBar::onClickSnapshot(void*) -{ - LLFloaterSnapshot::show (0); -} - - -// static -void LLToolBar::onClickDirectory(void*) -{ - handle_find(NULL); -} - - -// static -void LLToolBar::onClickBuild(void*) -{ - toggle_build_mode(); -} - - -// static -void LLToolBar::onClickRadar(void*) -{ - handle_mini_map(NULL); -} - - -// static -void LLToolBar::onClickMap(void*) -{ - handle_map(NULL); -} - - -// static -void LLToolBar::onClickInventory(void*) -{ - handle_inventory(NULL); -} - |