diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 7c2fd3a81..f10e211f1 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -297,8 +297,7 @@ boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackPa boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb ) { - if (!mCommitSignal) mCommitSignal = new commit_signal_t(); - return mCommitSignal->connect(cb); + return LLUICtrl::setCommitCallback(cb); } boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb ) { diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp index 29ea32816..377c9a12b 100644 --- a/indra/llui/llmultifloater.cpp +++ b/indra/llui/llmultifloater.cpp @@ -280,7 +280,7 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater, } //add the panel, add it to proper maps - mTabContainer->addTabPanel(floaterp, floaterp->getShortTitle(), FALSE, onTabSelected, this, 0, FALSE, insertion_point); + mTabContainer->addTabPanel(floaterp, floaterp->getShortTitle(), FALSE, 0, FALSE, insertion_point); mFloaterDataMap[floaterp->getHandle()] = floater_data; updateResizeLimits(); @@ -366,10 +366,10 @@ void LLMultiFloater::removeFloater(LLFloater* floaterp) updateResizeLimits(); - tabOpen((LLFloater*)mTabContainer->getCurrentPanel(), false); + tabOpen((LLFloater*)mTabContainer->getCurrentPanel()); } -void LLMultiFloater::tabOpen(LLFloater* opened_floater, bool from_click) +void LLMultiFloater::tabOpen(LLFloater* opened_floater) { // default implementation does nothing } @@ -464,12 +464,9 @@ void LLMultiFloater::setFloaterFlashing(LLFloater* floaterp, BOOL flashing) mTabContainer->setTabPanelFlashing(floaterp, flashing); } -//static -void LLMultiFloater::onTabSelected(void* userdata, bool from_click) +void LLMultiFloater::onTabSelected() { - LLMultiFloater* floaterp = (LLMultiFloater*)userdata; - - floaterp->tabOpen((LLFloater*)floaterp->mTabContainer->getCurrentPanel(), from_click); + tabOpen((LLFloater*)mTabContainer->getCurrentPanel()); } void LLMultiFloater::setCanResize(BOOL can_resize) @@ -499,6 +496,7 @@ BOOL LLMultiFloater::postBuild() if (checkRequirements()) { mTabContainer = getChild("Preview Tabs"); + mTabContainer->setCommitCallback(boost::bind(&LLMultiFloater::onTabSelected, this)); return TRUE; } diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h index 29c03b3c4..0ac9ee856 100644 --- a/indra/llui/llmultifloater.h +++ b/indra/llui/llmultifloater.h @@ -60,7 +60,7 @@ public: virtual void showFloater(LLFloater* floaterp); virtual void removeFloater(LLFloater* floaterp); - virtual void tabOpen(LLFloater* opened_floater, bool from_click); + virtual void tabOpen(LLFloater* opened_floater); virtual void tabClose(); virtual BOOL selectFloater(LLFloater* floaterp); @@ -74,7 +74,7 @@ public: virtual void setFloaterFlashing(LLFloater* floaterp, BOOL flashing); virtual BOOL closeAllFloaters(); //Returns FALSE if the floater could not be closed due to pending confirmation dialogs void setTabContainer(LLTabContainer* tab_container) { if (!mTabContainer) mTabContainer = tab_container; } - static void onTabSelected(void* userdata, bool); + void onTabSelected(); virtual void updateResizeLimits(); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 627f06c80..136dcf524 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -931,24 +931,6 @@ LLPanel *LLPanel::childGetVisibleTab(const std::string& id) const return NULL; } -void LLPanel::childSetTabChangeCallback(const std::string& id, const std::string& tabname, void (*on_tab_clicked)(void*, bool), void *userdata, void (*on_precommit)(void*,bool)) -{ - LLTabContainer* child = getChild(id); - if (child) - { - LLPanel *panel = child->getPanelByName(tabname); - if (panel) - { - child->setTabChangeCallback(panel, on_tab_clicked); - child->setTabUserData(panel, userdata); - if (on_precommit) - { - child->setTabPrecommitChangeCallback(panel, on_precommit); - } - } - } -} - void LLPanel::childSetKeystrokeCallback(const std::string& id, void (*keystroke_callback)(LLLineEditor* caller, void* user_data), void *user_data) { LLLineEditor* child = getChild(id); diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index bb16b6e02..ad721cbf5 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -198,7 +198,6 @@ public: // LLTabContainer void childShowTab(const std::string& id, const std::string& tabname, bool visible = true); LLPanel *childGetVisibleTab(const std::string& id) const; - void childSetTabChangeCallback(const std::string& id, const std::string& tabname, void (*on_tab_clicked)(void*, bool), void *userdata, void (*on_precommit)(void*,bool) = NULL); // LLTextBox void childSetWrappedText(const std::string& id, const std::string& text, bool visible = true); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 0f08f2c58..8ce359b8f 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -69,12 +69,33 @@ const S32 TABCNTRV_PAD = 0; static LLRegisterWidget r("tab_container"); +// Structure used to map tab buttons to and from tab panels +class LLTabTuple +{ +public: + LLTabTuple( LLTabContainer* c, LLPanel* p, LLButton* b, LLTextBox* placeholder = NULL) + : + mTabContainer(c), + mTabPanel(p), + mButton(b), + mOldState(FALSE), + mPlaceholderText(placeholder), + mPadding(0) + {} + + LLTabContainer* mTabContainer; + LLPanel* mTabPanel; + LLButton* mButton; + BOOL mOldState; + LLTextBox* mPlaceholderText; + S32 mPadding; +}; + LLTabContainer::LLTabContainer(const std::string& name, const LLRect& rect, TabPosition pos, BOOL bordered, BOOL is_vertical ) : LLPanel(name, rect, bordered), mCurrentTabIdx(-1), - mNextTabIdx(-1), mTabsHidden(FALSE), mScrolled(FALSE), mScrollPos(0), @@ -221,10 +242,13 @@ void LLTabContainer::draw() } // Hide all the buttons - for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) + if (getTabsHidden()) { - LLTabTuple* tuple = *iter; - tuple->mButton->setVisible( FALSE ); + for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) + { + LLTabTuple* tuple = *iter; + tuple->mButton->setVisible( FALSE ); + } } LLPanel::draw(); @@ -320,7 +344,7 @@ void LLTabContainer::draw() BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) { BOOL handled = FALSE; - BOOL has_scroll_arrows = (getMaxScrollPos() > 0); + BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); if (has_scroll_arrows) { @@ -355,7 +379,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) } S32 tab_count = getTabCount(); - if (tab_count > 0) + if (tab_count > 0 && !getTabsHidden()) { LLTabTuple* firsttuple = getTab(0); LLRect tab_rect; @@ -379,7 +403,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) index = llclamp(index, 0, tab_count-1); LLButton* tab_button = getTab(index)->mButton; gFocusMgr.setMouseCapture(this); - gFocusMgr.setKeyboardFocus(tab_button); + tab_button->setFocus(TRUE); } } return handled; @@ -389,7 +413,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask ) { BOOL handled = FALSE; - BOOL has_scroll_arrows = (getMaxScrollPos() > 0); + BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); if (has_scroll_arrows) { @@ -431,7 +455,7 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask ) BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) { BOOL handled = FALSE; - BOOL has_scroll_arrows = (getMaxScrollPos() > 0); + BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); if (has_scroll_arrows) { @@ -487,7 +511,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect ) { BOOL handled = LLPanel::handleToolTip( x, y, msg, sticky_rect ); - if (!handled && getTabCount() > 0) + if (!handled && getTabCount() > 0 && !getTabsHidden()) { LLTabTuple* firsttuple = getTab(0); @@ -523,12 +547,6 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic } } } - - for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) - { - LLTabTuple* tuple = *iter; - tuple->mButton->setVisible( FALSE ); - } } return handled; } @@ -695,8 +713,6 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag void LLTabContainer::addTabPanel(LLPanel* child, const std::string& label, BOOL select, - void (*on_tab_clicked)(void*, bool), - void* userdata, S32 indent, BOOL placeholder, eInsertionPoint insertion_point) @@ -722,20 +738,28 @@ void LLTabContainer::addTabPanel(LLPanel* child, // Tab panel S32 tab_panel_top; S32 tab_panel_bottom; - if( getTabPosition() == LLTabContainer::TOP ) + if (!getTabsHidden()) { - S32 tab_height = mIsVertical ? BTN_HEIGHT : TABCNTR_TAB_HEIGHT; - tab_panel_top = getRect().getHeight() - getTopBorderHeight() - (tab_height - TABCNTR_BUTTON_PANEL_OVERLAP); - tab_panel_bottom = LLPANEL_BORDER_WIDTH; + if( getTabPosition() == LLTabContainer::TOP ) + { + S32 tab_height = mIsVertical ? BTN_HEIGHT : TABCNTR_TAB_HEIGHT; + tab_panel_top = getRect().getHeight() - getTopBorderHeight() - (tab_height - TABCNTR_BUTTON_PANEL_OVERLAP); + tab_panel_bottom = LLPANEL_BORDER_WIDTH; + } + else + { + tab_panel_top = getRect().getHeight() - getTopBorderHeight(); + tab_panel_bottom = (TABCNTR_TAB_HEIGHT - TABCNTR_BUTTON_PANEL_OVERLAP); // Run to the edge, covering up the border + } } else { - tab_panel_top = getRect().getHeight() - getTopBorderHeight(); - tab_panel_bottom = (TABCNTR_TAB_HEIGHT - TABCNTR_BUTTON_PANEL_OVERLAP); // Run to the edge, covering up the border + //Scip tab button space if they are invisible(EXT - 576) + tab_panel_top = getRect().getHeight(); + tab_panel_bottom = LLPANEL_BORDER_WIDTH; } - LLRect tab_panel_rect; - if (mIsVertical) + if (!getTabsHidden() && mIsVertical) { tab_panel_rect = LLRect(mMinTabWidth + (LLPANEL_BORDER_WIDTH * 2) + TABCNTRV_PAD, getRect().getHeight() - LLPANEL_BORDER_WIDTH, @@ -854,7 +878,7 @@ void LLTabContainer::addTabPanel(LLPanel* child, } } - LLTabTuple* tuple = new LLTabTuple( this, child, btn, on_tab_clicked, userdata, textbox ); + LLTabTuple* tuple = new LLTabTuple( this, child, btn, textbox ); insertTuple( tuple, insertion_point ); if (textbox) @@ -883,7 +907,7 @@ void LLTabContainer::addTabPanel(LLPanel* child, void LLTabContainer::addPlaceholder(LLPanel* child, const std::string& label) { - addTabPanel(child, label, FALSE, NULL, NULL, 0, TRUE); + addTabPanel(child, label, FALSE, 0, TRUE); } void LLTabContainer::removeTabPanel(LLPanel* child) @@ -1154,8 +1178,8 @@ BOOL LLTabContainer::selectTabPanel(LLPanel* child) BOOL LLTabContainer::selectTab(S32 which) { - if (which >= getTabCount()) return FALSE; - if (which < 0) return FALSE; + if (which >= getTabCount() || which < 0) + return FALSE; //if( gFocusMgr.childHasKeyboardFocus( this ) ) //{ @@ -1167,28 +1191,26 @@ BOOL LLTabContainer::selectTab(S32 which) { return FALSE; } + + LLSD cbdata; + if (selected_tuple->mTabPanel) + cbdata = selected_tuple->mTabPanel->getName(); - if (!selected_tuple->mPrecommitChangeCallback) + BOOL res = FALSE; + if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) ) { - return setTab(which); + res = setTab(which); + if (res && mCommitSignal) + { + (*mCommitSignal)(this, cbdata); + } } - - mNextTabIdx = which; - selected_tuple->mPrecommitChangeCallback(selected_tuple->mUserData, false); - return TRUE; + + return res; } BOOL LLTabContainer::setTab(S32 which) { - if (which == -1) - { - if (mNextTabIdx == -1) - { - return FALSE; - } - which = mNextTabIdx; - mNextTabIdx = -1; - } LLTabTuple* selected_tuple = getTab(which); if (!selected_tuple) @@ -1212,7 +1234,7 @@ BOOL LLTabContainer::setTab(S32 which) // RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs tuple->mButton->setTabStop( is_selected ); - if( is_selected && (mIsVertical || (getMaxScrollPos() > 0))) + if (is_selected) { // Make sure selected tab is within scroll region if (mIsVertical) @@ -1228,7 +1250,7 @@ BOOL LLTabContainer::setTab(S32 which) is_visible = FALSE; } } - else + else if (getMaxScrollPos() > 0) { if( i < getScrollPos() ) { @@ -1259,13 +1281,13 @@ BOOL LLTabContainer::setTab(S32 which) } is_visible = TRUE; } + else + { + is_visible = TRUE; + } } i++; } - if( selected_tuple->mOnChangeCallback ) - { - selected_tuple->mOnChangeCallback( selected_tuple->mUserData, false ); - } } if (mIsVertical && getCurrentPanelIndex() >= 0) { @@ -1368,33 +1390,6 @@ S32 LLTabContainer::getTopBorderHeight() const return mTopBorderHeight; } -void LLTabContainer::setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*, bool)) -{ - LLTabTuple* tuplep = getTabByPanel(tab); - if (tuplep) - { - tuplep->mOnChangeCallback = on_tab_clicked; - } -} - -void LLTabContainer::setTabPrecommitChangeCallback(LLPanel* tab, void (*on_precommit)(void*, bool)) -{ - LLTabTuple* tuplep = getTabByPanel(tab); - if (tuplep) - { - tuplep->mPrecommitChangeCallback = on_precommit; - } -} - -void LLTabContainer::setTabUserData(LLPanel* tab, void* userdata) -{ - LLTabTuple* tuplep = getTabByPanel(tab); - if (tuplep) - { - tuplep->mUserData = userdata; - } -} - void LLTabContainer::setRightTabBtnOffset(S32 offset) { mNextArrowBtn->translate( -offset - mRightTabBtnOffset, 0 ); @@ -1583,8 +1578,7 @@ LLView* LLTabContainer::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto } BOOL placeholder = FALSE; child->getAttributeBOOL("placeholder", placeholder); - tab_container->addTabPanel(panelp, label, false, - NULL, NULL, 0, placeholder); + tab_container->addTabPanel(panelp, label, false, 0, placeholder); } } @@ -1745,7 +1739,7 @@ void LLTabContainer::initButtons() setDefaultTabGroup(1); } -LLTabContainer::LLTabTuple* LLTabContainer::getTabByPanel(LLPanel* child) +LLTabTuple* LLTabContainer::getTabByPanel(LLPanel* child) { for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { @@ -1846,7 +1840,7 @@ void LLTabContainer::updateMaxScrollPos() void LLTabContainer::commitHoveredButton(S32 x, S32 y) { - if (hasMouseCapture()) + if (!getTabsHidden() && hasMouseCapture()) { for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 8117cdee9..4ad691e49 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -36,6 +36,7 @@ #include "llpanel.h" #include "lltextbox.h" #include "llframetimer.h" +class LLTabTuple; extern const S32 TABCNTR_HEADER_HEIGHT; @@ -79,9 +80,7 @@ public: void addTabPanel(LLPanel* child, const std::string& label, - BOOL select = FALSE, - void (*on_tab_clicked)(void*, bool) = NULL, - void* userdata = NULL, + BOOL select = FALSE, S32 indent = 0, BOOL placeholder = FALSE, eInsertionPoint insertion_point = END); @@ -108,7 +107,6 @@ public: BOOL selectTabPanel( LLPanel* child ); BOOL selectTab(S32 which); BOOL selectTabByName(const std::string& title); - BOOL setTab(S32 which); BOOL getTabPanelFlashing(LLPanel* child); void setTabPanelFlashing(LLPanel* child, BOOL state); @@ -118,10 +116,6 @@ public: void setTopBorderHeight(S32 height); S32 getTopBorderHeight() const; - - void setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*,bool)); - void setTabPrecommitChangeCallback(LLPanel* tab, void (*on_precommit)(void*, bool)); - void setTabUserData(LLPanel* tab, void* userdata); void setRightTabBtnOffset( S32 offset ); void setPanelTitle(S32 index, const std::string& title); @@ -146,39 +140,11 @@ public: static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory); private: - // Structure used to map tab buttons to and from tab panels - struct LLTabTuple - { - LLTabTuple( LLTabContainer* c, LLPanel* p, LLButton* b, - void (*cb)(void*,bool), void* userdata, LLTextBox* placeholder = NULL, - void (*pcb)(void*,bool) = NULL) - : - mTabContainer(c), - mTabPanel(p), - mButton(b), - mOnChangeCallback( cb ), - mPrecommitChangeCallback( pcb ), - mUserData( userdata ), - mOldState(FALSE), - mPlaceholderText(placeholder), - mPadding(0) - {} - - LLTabContainer* mTabContainer; - LLPanel* mTabPanel; - LLButton* mButton; - void (*mOnChangeCallback)(void*, bool); - void (*mPrecommitChangeCallback)(void*,bool); // Precommit callback gets called before tab is changed and - // can prevent it from being changed. onChangeCallback is called - // immediately after tab is actually changed - Nyx - void* mUserData; - BOOL mOldState; - LLTextBox* mPlaceholderText; - S32 mPadding; - }; void initButtons(); + BOOL setTab(S32 which); + LLTabTuple* getTab(S32 index) { return mTabList[index]; } LLTabTuple* getTabByPanel(LLPanel* child); void insertTuple(LLTabTuple * tuple, eInsertionPoint insertion_point); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index c264b73a7..ab33da86c 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -281,8 +281,6 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::ETy const LLUUID& item_id, LLWearable* wearable) { - //llassert_always(index == 0); - llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl; if (item_id.isNull()) @@ -472,29 +470,28 @@ void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 } } -void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, +LLWearable* LLAgentWearables::saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found) { - //llassert_always(index == 0); if (!isWearableCopyable(type, index)) { llwarns << "LLAgent::saveWearableAs() not copyable." << llendl; - return; + return NULL; } LLWearable* old_wearable = getWearable(type, index); if (!old_wearable) { llwarns << "LLAgent::saveWearableAs() no old wearable." << llendl; - return; + return NULL; } LLInventoryItem* item = gInventory.getItem(getWearableItemID(type,index)); if (!item) { llwarns << "LLAgent::saveWearableAs() no inventory item." << llendl; - return; + return NULL; } std::string trunc_name(new_name); LLStringUtil::truncate(trunc_name, DB_INV_ITEM_NAME_STR_LEN); @@ -532,6 +529,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, // unsaved changes so other inventory items aren't affected by the changes // that were just saved. old_wearable->revertValues(); + return new_wearable; } void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index) @@ -755,7 +753,7 @@ void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, pushWearable(type,wearable); return; } - + wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) { @@ -835,9 +833,8 @@ void LLAgentWearables::wearableUpdated(LLWearable *wearable) //while the wearable being created has not yet been stuffed into the wearable list. //This results in the param hints being buggered and screwing up the current wearable during LLVisualParamHint::preRender, //thus making the wearable 'dirty'. The code below basically 'forces' a refresh of the panel to fix this. - U32 index = gAgentWearables.getWearableIndex(wearable); - if(gFloaterCustomize && index==0) - gFloaterCustomize->setWearable(wearable->getType(), wearable); + if(gFloaterCustomize) + gFloaterCustomize->wearablesChanged(wearable->getType()); } @@ -1712,21 +1709,21 @@ bool LLAgentWearables::onSetWearableDialog( const LLSD& notification, const LLSD switch( option ) { - case 0: // "Save" + case 0: // "Save" gAgentWearables.saveWearable(wearable->getType(),index); - gAgentWearables.setWearableFinal( new_item, wearable ); - break; + gAgentWearables.setWearableFinal( new_item, wearable ); + break; - case 1: // "Don't Save" - gAgentWearables.setWearableFinal( new_item, wearable ); - break; + case 1: // "Don't Save" + gAgentWearables.setWearableFinal( new_item, wearable ); + break; - case 2: // "Cancel" - break; + case 2: // "Cancel" + break; - default: - llassert(0); - break; + default: + llassert(0); + break; } delete wearable; @@ -1742,10 +1739,11 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n if (do_append && getWearableItemID(type,0).notNull()) { new_wearable->setItemID(new_item->getUUID()); - mWearableDatas[type].push_back(new_wearable); + /*mWearableDatas[type].push_back(new_wearable); llinfos << "Added additional wearable for type " << type << " size is now " << mWearableDatas[type].size() << llendl; - checkWearableAgainstInventory(new_wearable); + checkWearableAgainstInventory(new_wearable);*/ + pushWearable(type,new_wearable); //To call LLAgentWearables::wearableUpdated } else { @@ -2228,6 +2226,12 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos U32 swap_i = closer_to_body ? i-1 : i+1; wearable_vec[i] = wearable_vec[swap_i]; wearable_vec[swap_i] = wearable; + + if(gFloaterCustomize) + { + gFloaterCustomize->wearablesChanged(item->getWearableType()); + } + return true; } diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 231edc7fb..c3aad9500 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -205,7 +205,7 @@ private: // Save Wearables //-------------------------------------------------------------------- public: - void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found); + LLWearable* saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found); void saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update = TRUE, const std::string new_name = ""); void saveAllWearables(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 7bf71fe36..60ebf402e 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2508,7 +2508,21 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update { cb = new ModifiedCOFCallback; } - const std::string description = vitem->getIsLinkType() ? vitem->getDescription() : ""; + std::string description = vitem->getIsLinkType() ? vitem->getDescription() : ""; + if(description.empty()) + { + LLWearable* wearable = gAgentWearables.getWearableFromItemID(vitem->getLinkedUUID()); + if(wearable) + { + U32 index = gAgentWearables.getWearableIndex(wearable); + if(index < LLAgentWearables::MAX_CLOTHING_PER_TYPE) + { + std::ostringstream order_num; + order_num << ORDER_NUMBER_SEPARATOR << wearable->getType() * 100 + index; + description = order_num.str(); + } + } + } link_inventory_item( gAgent.getID(), vitem->getLinkedUUID(), getCOF(), diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 02db1cc7b..b93812506 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -142,24 +142,16 @@ BOOL LLFloaterAvatarPicker::postBuild() inventory_panel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD); inventory_panel->setSelectCallback(boost::bind(&LLFloaterAvatarPicker::onCallingCardSelectionChange, _1, _2, (void*)this)); - childSetTabChangeCallback("ResidentChooserTabs", "SearchPanel", onTabChanged, this); - childSetTabChangeCallback("ResidentChooserTabs", "CallingCardsPanel", onTabChanged, this); - childSetTabChangeCallback("ResidentChooserTabs", "NearMePanel", onTabChanged, this); - childSetTabChangeCallback("ResidentChooserTabs", "KeyPanel", onTabChanged, this); + getChild("ResidentChooserTabs")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onTabChanged,this)); + setAllowMultiple(FALSE); return TRUE; } -void LLFloaterAvatarPicker::onTabChanged(void* userdata, bool from_click) +void LLFloaterAvatarPicker::onTabChanged() { - LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; - if (!self) - { - return; - } - - self->childSetEnabled("Select", self->visibleItemsSelected()); + childSetEnabled("Select", visibleItemsSelected()); } // Destroys the object diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index 56bc387bc..17b928f40 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -62,7 +62,7 @@ private: static void onRangeAdjust(LLUICtrl* source, void* data); static void onBtnClose(void* userdata); static void onList(class LLUICtrl* ctrl, void* userdata); - static void onTabChanged(void* userdata, bool from_click); + void onTabChanged(); void doCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data); static void onCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data); diff --git a/indra/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp index dd8a3742c..890d80829 100644 --- a/indra/newview/llfloatercustomize.cpp +++ b/indra/newview/llfloatercustomize.cpp @@ -405,25 +405,19 @@ BOOL LLFloaterCustomize::postBuild() initWearablePanels(); // Tab container - const std::string &invalid_name = LLWearableType::getTypeName(LLWearableType::WT_INVALID); - for(U32 type=LLWearableType::WT_SHAPE;type("customize tab container"); + if(tab_container) { - std::string name = LLWearableType::getTypeName((LLWearableType::EType)type); - if(name != invalid_name) - { - name[0] = toupper(name[0]); - childSetTabChangeCallback("customize tab container", name, onTabChanged, (void*)type, onTabPrecommit ); - } + tab_container->setCommitCallback(boost::bind(&LLFloaterCustomize::onTabChanged, _2)); + tab_container->setValidateCallback(boost::bind(&LLFloaterCustomize::onTabPrecommit, this, _1, _2)); } // Remove underwear panels for teens if (gAgent.isTeen()) { - LLTabContainer* tab_container = getChild("customize tab container"); if (tab_container) { - LLPanel* panel; - panel = tab_container->getPanelByName("Undershirt"); + LLPanel* panel = tab_container->getPanelByName("Undershirt"); if (panel) tab_container->removeTabPanel(panel); panel = tab_container->getPanelByName("Underpants"); if (panel) tab_container->removeTabPanel(panel); @@ -553,7 +547,7 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker) LLWearable* old_wearable = gAgentWearables.getWearable((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE if( old_wearable ) { - item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE + item = gInventory.getItem(old_wearable->getItemID()); if(item) { const LLPermissions& perm = item->getPermissions(); @@ -577,7 +571,7 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker) LLWearable* old_wearable = gAgentWearables.getWearable((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE if( old_wearable ) { - item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE + item = gInventory.getItem(old_wearable->getItemID()); if(item) { const LLPermissions& perm = item->getPermissions(); @@ -728,39 +722,51 @@ void LLFloaterCustomize::draw() BOOL LLFloaterCustomize::isDirty() const { - for(S32 i = 0; i < LLWearableType::WT_COUNT; i++) + LLWearableType::EType cur = getCurrentWearableType(); + for(U32 i = 0; i < gAgentWearables.getWearableCount(cur); ++i) { - if( mWearablePanelList[i] - && mWearablePanelList[i]->isDirty() ) - { + LLWearable* wearable = gAgentWearables.getWearable(cur,i); + if(wearable && wearable->isDirty()) return TRUE; - } } return FALSE; } -// static -void LLFloaterCustomize::onTabPrecommit( void* userdata, bool from_click ) +bool LLFloaterCustomize::onTabPrecommit( LLUICtrl* ctrl, const LLSD& param ) { - LLWearableType::EType type = (LLWearableType::EType)(intptr_t) userdata; - if (type != LLWearableType::WT_INVALID && gFloaterCustomize && gFloaterCustomize->getCurrentWearableType() != type) + std::string panel_name = param.asString(); + for(U32 type=LLWearableType::WT_SHAPE;typeaskToSaveIfDirty(boost::bind(&onCommitChangeTab, _1)); - } - else - { - onCommitChangeTab(true); + std::string type_name = LLWearableType::getTypeName((LLWearableType::EType)type); + std::transform(panel_name.begin(), panel_name.end(), panel_name.begin(), tolower); + + if(type_name == panel_name) + { + if(LLFloaterCustomize::sCurrentWearableType != type) + { + askToSaveIfDirty(boost::bind(&LLFloaterCustomize::onCommitChangeTab, _1, (LLTabContainer*)ctrl, param.asString(), (LLWearableType::EType)type)); + return false; + } + } } + return true; } // static -void LLFloaterCustomize::onTabChanged( void* userdata, bool from_click ) +void LLFloaterCustomize::onTabChanged( const LLSD& param ) { - LLWearableType::EType wearable_type = (LLWearableType::EType) (intptr_t)userdata; - if (wearable_type != LLWearableType::WT_INVALID) + std::string panel_name = param.asString(); + for(U32 type=LLWearableType::WT_SHAPE;typegetChild("customize tab container"); - if (tab_container) - { - tab_container->setTab(-1); - } + LLFloaterCustomize::setCurrentWearableType(type); + ctrl->selectTabByName(panel_name); } @@ -812,7 +815,7 @@ void LLFloaterCustomize::initScrollingPanelList() } } -void LLFloaterCustomize::setWearable(LLWearableType::EType type, LLWearable* wearable) +void LLFloaterCustomize::wearablesChanged(LLWearableType::EType type) { llassert( type < LLWearableType::WT_COUNT ); gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) ); @@ -820,22 +823,7 @@ void LLFloaterCustomize::setWearable(LLWearableType::EType type, LLWearable* wea LLPanelEditWearable* panel = mWearablePanelList[ type ]; if( panel ) { - U32 perm_mask = wearable ? PERM_NONE : PERM_ALL; - BOOL is_complete = wearable ? FALSE : TRUE; - if(wearable) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(gAgentWearables.getWearableItemID(type, 0)); // TODO: MULTI-WEARABLE - if(item) - { - perm_mask = item->getPermissions().getMaskOwner(); - is_complete = item->isComplete(); - if(!is_complete) - { - item->fetchFromServer(); - } - } - } - panel->setWearable(wearable, perm_mask, is_complete); + panel->wearablesChanged(); } } @@ -846,7 +834,7 @@ void LLFloaterCustomize::updateScrollingPanelList() void LLFloaterCustomize::askToSaveIfDirty( boost::function cb ) { - if( isDirty()) + if(isDirty()) { // Ask if user wants to save, then continue to next step afterwards mNextStepAfterSaveCallback.connect(cb); @@ -857,7 +845,7 @@ void LLFloaterCustomize::askToSaveIfDirty( boost::function cb ) } else { - cb(TRUE); //just clal it immediately. + cb(TRUE); //just call it immediately. } } @@ -869,28 +857,36 @@ bool LLFloaterCustomize::onSaveDialog(const LLSD& notification, const LLSD& resp BOOL proceed = FALSE; LLWearableType::EType cur = getCurrentWearableType(); - switch( option ) + for(U32 i = 0;i < gAgentWearables.getWearableCount(cur);++i) { - case 0: // "Save" - gAgentWearables.saveWearable( cur, 0 ); // TODO: MULTI-WEARABLE - proceed = TRUE; - break; - - case 1: // "Don't Save" + LLWearable* wearable = gAgentWearables.getWearable(cur,i); + if(wearable && wearable->isDirty()) { - gAgentWearables.revertWearable( cur, 0 ); // TODO: MULTI-WEARABLE - proceed = TRUE; + switch( option ) + { + case 0: // "Save" + gAgentWearables.saveWearable( cur, i ); + proceed = TRUE; + break; + + case 1: // "Don't Save" + { + gAgentWearables.revertWearable( cur, i ); + proceed = TRUE; + } + break; + + case 2: // "Cancel" + break; + + default: + llassert(0); + break; + } } - break; - - case 2: // "Cancel" - break; - - default: - llassert(0); - break; } + mNextStepAfterSaveCallback(proceed); mNextStepAfterSaveCallback.disconnect_all_slots(); //Should this be done? @@ -913,10 +909,13 @@ void LLFloaterCustomize::fetchInventory() LLUUID item_id; for(S32 type = (S32)LLWearableType::WT_SHAPE; type < (S32)LLWearableType::WT_COUNT; ++type) { - item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, 0); // TODO: MULTI-WEARABLE - if(item_id.notNull()) + for(U32 i = 0; i < gAgentWearables.getWearableCount((LLWearableType::EType)type); ++i) { - ids.push_back(item_id); + item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, i); + if(item_id.notNull()) + { + ids.push_back(item_id); + } } } @@ -939,7 +938,9 @@ void LLFloaterCustomize::updateInventoryUI() panel = mWearablePanelList[i]; if(panel) { - item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(panel->getType(), 0); // TODO: MULTI-WEARABLE + LLWearable* wearable = panel->getWearable(); + if(wearable) + item = gInventory.getItem(wearable->getItemID()); } if(item) { @@ -961,8 +962,8 @@ void LLFloaterCustomize::updateInventoryUI() { panel->setUIPermissions(perm_mask, is_complete); } - BOOL is_vis = panel && item && is_complete && (perm_mask & PERM_MODIFY); - childSetVisible("panel_container", is_vis); + //BOOL is_vis = panel && item && is_complete && (perm_mask & PERM_MODIFY); + //childSetVisible("panel_container", is_vis); } } diff --git a/indra/newview/llfloatercustomize.h b/indra/newview/llfloatercustomize.h index 31343d199..e603209fe 100644 --- a/indra/newview/llfloatercustomize.h +++ b/indra/newview/llfloatercustomize.h @@ -55,7 +55,7 @@ class LLMakeOutfitDialog; class LLRadioGroup; class LLScrollableContainerView; class LLScrollingPanelList; -class LLTabContainerVertical; +class LLTabContainer; class LLTextBox; class LLTextureCtrl; class LLViewerJointMesh; @@ -84,7 +84,7 @@ public: // New methods - void setWearable(LLWearableType::EType type, LLWearable* wearable); + void wearablesChanged(LLWearableType::EType type); void updateScrollingPanelList(); LLPanelEditWearable* getCurrentWearablePanel() { return mWearablePanelList[ sCurrentWearableType ]; } @@ -106,10 +106,10 @@ public: static void onBtnExport( void* userdata ); static void onBtnExport_continued(AIFilePicker* filepicker); - static void onTabChanged( void* userdata, bool from_click ); - static void onTabPrecommit( void* userdata, bool from_click ); + static void onTabChanged( const LLSD& param ); + bool onTabPrecommit( LLUICtrl* ctrl, const LLSD& param ); bool onSaveDialog(const LLSD& notification, const LLSD& response); - static void onCommitChangeTab(BOOL proceed); + static void onCommitChangeTab(BOOL proceed, LLTabContainer* ctrl, std::string panel_name, LLWearableType::EType type); void fetchInventory(); void updateInventoryUI(); diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index 7546370cc..128d7a379 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -144,23 +144,7 @@ LLFloaterDirectory::LLFloaterDirectory(const std::string& name) mPanelAvatarp->selectTab(0); } - childSetTabChangeCallback("Directory Tabs", "classified_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "events_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "places_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "land_sales_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "people_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "groups_panel", onTabChanged, this); - if (enableWebSearch) - { - // web search and showcase for SecondLife - childSetTabChangeCallback("Directory Tabs", "find_all_panel", onTabChanged, this); - childSetTabChangeCallback("Directory Tabs", "showcase_panel", onTabChanged, this); - } - - if(enableClassicAllSearch) - { - childSetTabChangeCallback("Directory Tabs", "find_all_old_panel", onTabChanged, this); - } + getChild("Directory Tabs")->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2)); } LLFloaterDirectory::~LLFloaterDirectory() @@ -508,16 +492,9 @@ void LLFloaterDirectory::onClose(bool app_quitting) } // static -void LLFloaterDirectory::onTabChanged(void* data, bool from_click) +void LLFloaterDirectory::onTabChanged( const LLSD& param ) { - LLFloaterDirectory* self = (LLFloaterDirectory*)data; - if (!self) return; - - LLPanel *panel = self->childGetVisibleTab("Directory Tabs"); - if (panel) - { - gSavedSettings.setString("LastFindPanel", panel->getName()); - } + gSavedSettings.setString("LastFindPanel", param.asString()); } void LLFloaterDirectory::hideAllDetailPanels() diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h index e43968624..0f57b0ff7 100644 --- a/indra/newview/llfloaterdirectory.h +++ b/indra/newview/llfloaterdirectory.h @@ -81,7 +81,7 @@ public: static void toggleEvents(void*); static void toggleFind(void*); - static void onTabChanged(void*, bool); + static void onTabChanged( const LLSD& param ); void hideAllDetailPanels(); diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 9a629d7d4..37bcb873b 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -130,10 +130,7 @@ LLFloaterGodTools::LLFloaterGodTools() factory_map["request"] = LLCallbackMap(createPanelRequest, this); LLUICtrlFactory::getInstance()->buildFloater(this, "floater_god_tools.xml", &factory_map); - childSetTabChangeCallback("GodTools Tabs", "grid", onTabChanged, this); - childSetTabChangeCallback("GodTools Tabs", "region", onTabChanged, this); - childSetTabChangeCallback("GodTools Tabs", "objects", onTabChanged, this); - childSetTabChangeCallback("GodTools Tabs", "request", onTabChanged, this); + getChild("GodTools Tabs")->setCommitCallback(boost::bind(&LLFloaterGodTools::onTabChanged,_1,_2)); sendRegionInfoRequest(); @@ -244,15 +241,12 @@ void LLFloaterGodTools::showPanel(const std::string& panel_name) if (panel) panel->setFocus(TRUE); } - -// static -void LLFloaterGodTools::onTabChanged(void* data, bool from_click) +//static +void LLFloaterGodTools::onTabChanged(LLUICtrl* ctrl, const LLSD& param) { - LLPanel* panel = (LLPanel*)data; - if (panel) - { + LLPanel* panel = (LLPanel*)ctrl->getChildView(param.asString(),false,false); + if(panel) panel->setFocus(TRUE); - } } diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index 75813ca88..3c36f256f 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -101,7 +101,7 @@ public: // Send possibly changed values to simulator. void sendGodUpdateRegionInfo(); - static void onTabChanged(void *data, bool from_click); + static void onTabChanged(LLUICtrl* ctrl, const LLSD& param); protected: U32 computeRegionFlags() const; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 6e102d58c..d5e9702d7 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -144,39 +144,39 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def mPrefsAscentVan(NULL) { mGeneralPanel = new LLPanelGeneral(); - mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel()); mGeneralPanel->setDefaultBtn(default_btn); mInputPanel = new LLPanelInput(); - mTabContainer->addTabPanel(mInputPanel, mInputPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mInputPanel, mInputPanel->getLabel()); mInputPanel->setDefaultBtn(default_btn); mNetworkPanel = new LLPanelNetwork(); - mTabContainer->addTabPanel(mNetworkPanel, mNetworkPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mNetworkPanel, mNetworkPanel->getLabel()); mNetworkPanel->setDefaultBtn(default_btn); mWebPanel = new LLPanelWeb(); - mTabContainer->addTabPanel(mWebPanel, mWebPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mWebPanel, mWebPanel->getLabel()); mWebPanel->setDefaultBtn(default_btn); mDisplayPanel = new LLPanelDisplay(); - mTabContainer->addTabPanel(mDisplayPanel, mDisplayPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mDisplayPanel, mDisplayPanel->getLabel()); mDisplayPanel->setDefaultBtn(default_btn); mAudioPanel = new LLPanelAudioPrefs(); - mTabContainer->addTabPanel(mAudioPanel, mAudioPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mAudioPanel, mAudioPanel->getLabel()); mAudioPanel->setDefaultBtn(default_btn); mPrefsChat = new LLPrefsChat(); - mTabContainer->addTabPanel(mPrefsChat->getPanel(), mPrefsChat->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsChat->getPanel(), mPrefsChat->getPanel()->getLabel()); mPrefsChat->getPanel()->setDefaultBtn(default_btn); mPrefsVoice = new LLPrefsVoice(); - mTabContainer->addTabPanel(mPrefsVoice, mPrefsVoice->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsVoice, mPrefsVoice->getLabel()); mPrefsVoice->setDefaultBtn(default_btn); mPrefsIM = new LLPrefsIM(); - mTabContainer->addTabPanel(mPrefsIM->getPanel(), mPrefsIM->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsIM->getPanel(), mPrefsIM->getPanel()->getLabel()); mPrefsIM->getPanel()->setDefaultBtn(default_btn); #if LL_LCD_COMPILE @@ -185,7 +185,7 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def if (gLcdScreen->Enabled()) { mLCDPanel = new LLPanelLCD(); - mTabContainer->addTabPanel(mLCDPanel, mLCDPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mLCDPanel, mLCDPanel->getLabel()); mLCDPanel->setDefaultBtn(default_btn); } @@ -194,29 +194,31 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def #endif mMsgPanel = new LLPanelMsgs(); - mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel()); mMsgPanel->setDefaultBtn(default_btn); mSkinsPanel = new LLPanelSkins(); - mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel()); mSkinsPanel->setDefaultBtn(default_btn); mGridsPanel = HippoPanelGrids::create(); - mTabContainer->addTabPanel(mGridsPanel, mGridsPanel->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mGridsPanel, mGridsPanel->getLabel()); mGridsPanel->setDefaultBtn(default_btn); mPrefsAscentChat = new LLPrefsAscentChat(); - mTabContainer->addTabPanel(mPrefsAscentChat, mPrefsAscentChat->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsAscentChat, mPrefsAscentChat->getLabel()); mPrefsAscentChat->setDefaultBtn(default_btn); mPrefsAscentSys = new LLPrefsAscentSys(); - mTabContainer->addTabPanel(mPrefsAscentSys, mPrefsAscentSys->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsAscentSys, mPrefsAscentSys->getLabel()); mPrefsAscentSys->setDefaultBtn(default_btn); mPrefsAscentVan = new LLPrefsAscentVan(); - mTabContainer->addTabPanel(mPrefsAscentVan, mPrefsAscentVan->getLabel(), FALSE, onTabChanged, mTabContainer); + mTabContainer->addTabPanel(mPrefsAscentVan, mPrefsAscentVan->getLabel()); mPrefsAscentVan->setDefaultBtn(default_btn); + mTabContainer->setCommitCallback(boost::bind(LLPreferenceCore::onTabChanged,_1)); + if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) { mTabContainer->selectFirstTab(); @@ -363,9 +365,9 @@ void LLPreferenceCore::cancel() } // static -void LLPreferenceCore::onTabChanged(void* user_data, bool from_click) +void LLPreferenceCore::onTabChanged(LLUICtrl* ctrl) { - LLTabContainer* self = (LLTabContainer*)user_data; + LLTabContainer* self = (LLTabContainer*)ctrl; gSavedSettings.setS32("LastPrefTab", self->getCurrentPanelIndex()); } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index a662a08c7..747a3ffb5 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -78,7 +78,7 @@ public: void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email); - static void onTabChanged(void* user_data, bool from_click); + static void onTabChanged(LLUICtrl* ctrl); // refresh all the graphics preferences menus void refreshEnabledGraphics(); diff --git a/indra/newview/llfloatertest.cpp b/indra/newview/llfloatertest.cpp index e9aada3f6..83a0c6fed 100644 --- a/indra/newview/llfloatertest.cpp +++ b/indra/newview/llfloatertest.cpp @@ -160,6 +160,8 @@ LLFloaterTestImpl::LLFloaterTestImpl() addChild(tab); mTab = tab; + tab->setCommitCallback(boost::bind(&LLFloaterTestImpl::onClickTab,_1,_2)); + //----------------------------------------------------------------------- // First tab container panel //----------------------------------------------------------------------- @@ -167,8 +169,7 @@ LLFloaterTestImpl::LLFloaterTestImpl() LLRect(0, 400, 400, 0), // dummy rect TRUE); // bordered tab->addTabPanel(panel, std::string("First"), - TRUE, // select - onClickTab, this); + TRUE); // select y = panel->getRect().getHeight() - VPAD; @@ -284,8 +285,7 @@ LLFloaterTestImpl::LLFloaterTestImpl() LLRect(0, 400, 400, 0), // dummy rect TRUE); // bordered tab->addTabPanel(panel, std::string("Second"), - FALSE, // select - onClickTab, this); + FALSE); // select y = panel->getRect().getHeight() - VPAD; diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 99917d91e..953d4c243 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -607,12 +607,14 @@ private: std::string mItemName; void (*mCommitCallback)(LLWearableSaveAsDialog*,void*); void* mCallbackUserData; + LLPanelEditWearable* mParent; public: - LLWearableSaveAsDialog( const std::string& desc, void(*commit_cb)(LLWearableSaveAsDialog*,void*), void* userdata ) + LLWearableSaveAsDialog( const std::string& desc, LLPanelEditWearable* parent, void(*commit_cb)(LLWearableSaveAsDialog*,void*), void* userdata ) : LLModalDialog( LLStringUtil::null, 240, 100 ), mCommitCallback( commit_cb ), - mCallbackUserData( userdata ) + mCallbackUserData( userdata ), + mParent( parent ) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_wearable_save_as.xml"); @@ -621,7 +623,11 @@ public: childSetTextArg("name ed", "[DESC]", desc); } - + ~LLWearableSaveAsDialog() + { + if(mParent && mParent->mActiveModal == this) + mParent->mActiveModal = NULL; + } virtual void startModal() { LLModalDialog::startModal(); @@ -658,11 +664,20 @@ public: LLPanelEditWearable::LLPanelEditWearable( LLWearableType::EType type ) : LLPanel( LLWearableType::getTypeLabel( type ) ), - mType( type ) + mType( type ), + mActiveModal( NULL ), + mCurrentIndex( 0 ), + mCurrentWearable( NULL ), + mPendingWearable( NULL ), + mPendingRefresh( false ) { } LLPanelEditWearable::~LLPanelEditWearable() { + if(mActiveModal) + { + mActiveModal->close(); + } } BOOL LLPanelEditWearable::postBuild() @@ -729,6 +744,23 @@ BOOL LLPanelEditWearable::postBuild() for_each_picker_ctrl_entry (this, mType, boost::bind(init_color_swatch_ctrl, this, _1, _2)); for_each_picker_ctrl_entry (this, mType, boost::bind(init_texture_ctrl, this, _1, _2)); } + + LLTabContainer* tab = getChild("layer_tabs", true, false); + if(tab) + { + for(U32 i = 1; i <= LLAgentWearables::MAX_CLOTHING_PER_TYPE; ++i) + { + LLPanel* new_panel = new LLPanel(llformat("%i",i)); + tab->addTabPanel(new_panel, llformat("Layer %i",i)); + } + tab->setCommitCallback(boost::bind(&LLPanelEditWearable::onTabChanged, this, _1)); + tab->setValidateCallback(boost::bind(&LLPanelEditWearable::onTabPrecommit, this)); + } + + childSetTextArg("title_not_worn", "[DESC]", LLWearableType::getTypeLabel( mType )); + childSetTextArg("title_loading", "[DESC]", LLWearableType::getTypeLabel( mType )); + childSetTextArg("title_no_modify", "[DESC]", LLWearableType::getTypeLabel( mType )); + childSetTextArg("title", "[DESC]", LLWearableType::getTypeLabel( mType )); return TRUE; } @@ -743,8 +775,11 @@ void LLPanelEditWearable::draw() if( gFloaterCustomize->isMinimized() || !isAgentAvatarValid()) return; + refreshWearables(false); + LLWearable* wearable = getWearable(); BOOL has_wearable = (wearable != NULL ); + BOOL has_any_wearable = has_wearable || gAgentWearables.getWearableCount(mType); BOOL is_dirty = isDirty(); BOOL is_modifiable = FALSE; BOOL is_copyable = FALSE; @@ -758,16 +793,49 @@ void LLPanelEditWearable::draw() is_complete = ((LLViewerInventoryItem*)item)->isComplete(); } - childSetEnabled("Save", is_modifiable && is_complete && has_wearable && is_dirty); - childSetEnabled("Save As", is_copyable && is_complete && has_wearable); - childSetEnabled("Revert", has_wearable && is_dirty ); - childSetEnabled("Take Off", has_wearable ); - childSetVisible("Take Off", mCanTakeOff && has_wearable ); - childSetVisible("Create New", !has_wearable ); + childSetEnabled("Save", has_wearable && is_modifiable && is_complete && is_dirty); + childSetEnabled("Save As", has_wearable && is_copyable && is_complete); + childSetEnabled("Revert", has_wearable && is_dirty ); + childSetEnabled("Take Off", has_wearable); + childSetVisible("Take Off", has_wearable && mCanTakeOff); + childSetVisible("Create New", !has_any_wearable); + childSetVisible("not worn instructions", !has_any_wearable); + childSetVisible("title_not_worn", !has_any_wearable); + childSetVisible("no modify instructions",has_wearable && !is_modifiable); + childSetVisible("title_no_modify", has_wearable && !is_modifiable); + childSetVisible("title", has_wearable && is_modifiable && is_complete); + childSetVisible("title_loading", (!has_wearable && has_any_wearable) || (has_wearable && is_modifiable && !is_complete)); + childSetVisible("path", has_wearable); + childSetVisible("square", has_wearable && !is_modifiable); //lock icon - childSetVisible("not worn instructions", !has_wearable ); - childSetVisible("no modify instructions", has_wearable && !is_modifiable); + /*LLTabContainer* tab = getChild("layer_tabs", true, false); + if(tab) + { + tab->setEnabled(has_any_wearable); + tab->setVisible(has_any_wearable); + }*/ + if(has_wearable && is_modifiable) + { + for_each_picker_ctrl_entry (this, mType, boost::bind(update_color_swatch_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry (this, mType, boost::bind(update_texture_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry (this, mType, boost::bind(set_enabled_color_swatch_ctrl, is_complete, _1, _2)); + for_each_picker_ctrl_entry (this, mType, boost::bind(set_enabled_texture_ctrl, is_complete, _1, _2)); + for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); + iter != mAlphaCheckbox2Index.end(); ++iter ) + { + LLCheckBoxCtrl* ctrl = getChild(iter->first, true, false); + if (ctrl) + { + ctrl->setEnabled(is_copyable && is_complete); + ctrl->setVisible(is_copyable && is_complete); + } + } + } + else + { + hideTextureControls(); + } const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mType); if (wearable_entry) @@ -798,15 +866,6 @@ void LLPanelEditWearable::draw() } } - childSetVisible("square", !is_modifiable); - - childSetVisible("title", FALSE); - childSetVisible("title_no_modify", FALSE); - childSetVisible("title_not_worn", FALSE); - childSetVisible("title_loading", FALSE); - - childSetVisible("path", FALSE); - LLTextBox *av_height = getChild("avheight",FALSE,FALSE); if(av_height) //Only display this if the element exists { @@ -825,65 +884,6 @@ void LLPanelEditWearable::draw() av_height->setVisible(TRUE); av_height->setTextArg("[AVHEIGHT]",avheight.str()); } - - if(has_wearable && !is_modifiable) - { - // *TODO:Translate - childSetVisible("title_no_modify", TRUE); - childSetTextArg("title_no_modify", "[DESC]", std::string(LLWearableType::getTypeLabel( mType ))); - - hideTextureControls(); - } - else if(has_wearable && !is_complete) - { - // *TODO:Translate - childSetVisible("title_loading", TRUE); - childSetTextArg("title_loading", "[DESC]", std::string(LLWearableType::getTypeLabel( mType ))); - - std::string path; - const LLUUID& item_id = wearable->getItemID(); - append_path(item_id, path); - childSetVisible("path", TRUE); - childSetTextArg("path", "[PATH]", path); - - hideTextureControls(); - } - else if(has_wearable && is_modifiable) - { - childSetVisible("title", TRUE); - childSetTextArg("title", "[DESC]", wearable->getName() ); - - std::string path; - const LLUUID& item_id = wearable->getItemID(); - append_path(item_id, path); - childSetVisible("path", TRUE); - childSetTextArg("path", "[PATH]", path); - - for_each_picker_ctrl_entry (this, mType, boost::bind(update_color_swatch_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry (this, mType, boost::bind(update_texture_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry (this, mType, boost::bind(set_enabled_color_swatch_ctrl, is_complete, _1, _2)); - for_each_picker_ctrl_entry (this, mType, boost::bind(set_enabled_texture_ctrl, is_complete, _1, _2)); - for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); - iter != mAlphaCheckbox2Index.end(); ++iter ) - { - LLCheckBoxCtrl* ctrl = getChild(iter->first, true, false); - if (ctrl) - { - ctrl->setEnabled(is_copyable && is_complete); - ctrl->setVisible(is_copyable && is_complete); - } - } - } - else - { - // *TODO:Translate - childSetVisible("title_not_worn", TRUE); - childSetTextArg("title_not_worn", "[DESC]", std::string(LLWearableType::getTypeLabel( mType ))); - - hideTextureControls(); - } - - childSetVisible("icon", has_wearable && is_modifiable); LLPanel::draw(); } @@ -897,17 +897,84 @@ void LLPanelEditWearable::setVisible(BOOL visible) } } -void LLPanelEditWearable::setWearable(LLWearable* wearable, U32 perm_mask, BOOL is_complete) +void LLPanelEditWearable::onTabChanged(LLUICtrl* ctrl) { - if( wearable ) + if(mPendingWearable) + return; + U32 tab_index = ((LLTabContainer*)ctrl)->getCurrentPanelIndex(); + U32 wearable_index = gAgentWearables.getWearableCount(mType) - tab_index - 1; + if(wearable_index != mCurrentIndex ) { - setUIPermissions(perm_mask, is_complete); - if (mType == LLWearableType::WT_ALPHA) + setWearableIndex(wearable_index); + } +} + +bool LLPanelEditWearable::onTabPrecommit() +{ + return !mPendingWearable; +} + +void LLPanelEditWearable::setWearableIndex(S32 index) +{ + if(mPendingWearable) + return; + + mCurrentIndex = index; + + LLTabContainer* tab = getChild("layer_tabs", true, false); + if(tab) + { + U32 tab_index = gAgentWearables.getWearableCount(mType) - index - 1; + + if(tab->getCurrentPanelIndex() != tab_index) + tab->selectTab(tab_index); + } + + LLWearable* wearable = gAgentWearables.getWearable(mType,mCurrentIndex); + + if(wearable == getWearable()) + return; + + mCurrentWearable = wearable; + + + if(wearable) + { + childSetTextArg("title", "[DESC]", wearable->getName() ); + childSetTextArg("title_no_modify", "[DESC]", wearable->getName()); + } + else + { + childSetTextArg("title", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )) ); + childSetTextArg("title_no_modify", "[DESC]", std::string(LLWearableType::getTypeLabel( mType ))); + } + + if(mActiveModal) + mActiveModal->close(); + + U32 perm_mask = wearable ? PERM_NONE : PERM_ALL; + BOOL is_complete = wearable ? FALSE : TRUE; + if(wearable) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(wearable->getItemID()); + if(item) { - initPreviousAlphaTextures(); - updateAlphaCheckboxes(); + perm_mask = item->getPermissions().getMaskOwner(); + is_complete = item->isComplete(); + if(!is_complete) + { + item->fetchFromServer(); + } } } + setUIPermissions(perm_mask, is_complete); + if (mType == LLWearableType::WT_ALPHA) + { + initPreviousAlphaTextures(); + updateAlphaCheckboxes(); + + } + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(mCurrentSubpart); if(subpart_entry) { @@ -916,7 +983,60 @@ void LLPanelEditWearable::setWearable(LLWearable* wearable, U32 perm_mask, BOOL buildParamList(gFloaterCustomize->getScrollingPanelList(), sorted_params); } + if(wearable) + { + std::string path; + const LLUUID& item_id = wearable->getItemID(); + append_path(item_id, path); + childSetTextArg("path", "[PATH]", path); + } + updateScrollingPanelList(); + +} + +void LLPanelEditWearable::refreshWearables(bool force_immediate) +{ + if(!force_immediate && !mPendingRefresh) + return; + + mPendingRefresh = false; + + U32 index; + if(mPendingWearable) + { + index = gAgentWearables.getWearableIndex(mPendingWearable); + if(index == LLAgentWearables::MAX_CLOTHING_PER_TYPE) + return; + mPendingWearable = NULL; + } + else + { + index = gAgentWearables.getWearableIndex(getWearable()); + if(index == LLAgentWearables::MAX_CLOTHING_PER_TYPE) + { + index = gAgentWearables.getWearableCount(mType); + if(index) + --index; + } + } + + + + LLTabContainer* tab = getChild("layer_tabs", true, false); + if(tab) + { + for(U32 i = 0; i < LLAgentWearables::MAX_CLOTHING_PER_TYPE; ++i) + { + tab->enableTabButton(i, i < gAgentWearables.getWearableCount(mType)); + } + } + setWearableIndex(index); +} + +void LLPanelEditWearable::wearablesChanged() +{ + mPendingRefresh = true; } // static @@ -936,11 +1056,13 @@ void LLPanelEditWearable::onBtnSave( void* userdata ) void LLPanelEditWearable::onBtnSaveAs( void* userdata ) { LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; - LLWearable* wearable = gAgentWearables.getWearable( self->getType(), 0 ); // TODO: MULTI-WEARABLE + if(self->mActiveModal) + return; + LLWearable* wearable = self->getWearable(); if( wearable ) { - LLWearableSaveAsDialog* save_as_dialog = new LLWearableSaveAsDialog( wearable->getName(), onSaveAsCommit, self ); - save_as_dialog->startModal(); + self->mActiveModal = new LLWearableSaveAsDialog( wearable->getName(), self, onSaveAsCommit, self ); + self->mActiveModal->startModal(); // LLWearableSaveAsDialog deletes itself. } } @@ -958,7 +1080,7 @@ void LLPanelEditWearable::onCommitSexChange() if (!isAgentAvatarValid()) return; LLWearableType::EType type = mType; // TODO: MULTI-WEARABLE - U32 index = 0; // TODO: MULTI-WEARABLE + U32 index = mCurrentIndex; // TODO: MULTI-WEARABLE if( !gAgentWearables.isWearableModifiable(type, index)) { @@ -1039,7 +1161,7 @@ bool LLPanelEditWearable::onSelectAutoWearOption(const LLSD& notification, const LLWearable* LLPanelEditWearable::getWearable() const { - return gAgentWearables.getWearable(mType, 0); // TODO: MULTI-WEARABLE + return mCurrentWearable;//gAgentWearables.getWearable(mType, mCurrentIndex); // TODO: MULTI-WEARABLE } @@ -1132,7 +1254,7 @@ void LLPanelEditWearable::hideTextureControls() void LLPanelEditWearable::saveChanges(bool force_save_as, std::string new_name) { - if (!getWearable() || !isDirty()) + if (!getWearable() || (!force_save_as && !isDirty())) { // do nothing if no unsaved changes return; @@ -1144,9 +1266,15 @@ void LLPanelEditWearable::saveChanges(bool force_save_as, std::string new_name) { // the name of the wearable has changed, re-save wearable with new name LLAppearanceMgr::instance().removeCOFItemLinks(getWearable()->getItemID(),false); - gAgentWearables.saveWearableAs(mType, index, new_name, FALSE); - childSetTextArg("title", "[DESC]", new_name ); - } + LLWearable* new_wearable = gAgentWearables.saveWearableAs(mType, index, new_name, FALSE); + if(new_wearable) + { + mPendingWearable = new_wearable; + mCurrentWearable = new_wearable; + childSetTextArg("title", "[DESC]", new_wearable->getName()); + childSetTextArg("title_no_modify", "[DESC]", new_wearable->getName()); + } + } else { gAgentWearables.saveWearable(mType, index, TRUE, new_name); @@ -1173,6 +1301,7 @@ void LLPanelEditWearable::revertChanges() void LLPanelEditWearable::showDefaultSubpart() { + refreshWearables(true); changeCamera(0); } @@ -1312,7 +1441,7 @@ void LLPanelEditWearable::updateScrollingPanelUI() return; } - llinfos << llformat("%#.8lX",wearable) << llendl; + llinfos << llformat("%#.8lX",wearable) << llendl; llinfos << "cur_wearable->isDirty()=" << wearable->isDirty() << llendl; LLViewerInventoryItem* item = gInventory.getItem(wearable->getItemID()); @@ -1330,13 +1459,14 @@ void LLPanelEditWearable::onBtnTakeOff( void* userdata ) { LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; - LLWearable* wearable = gAgentWearables.getWearable( self->mType, 0 ); // TODO: MULTI-WEARABLE + LLWearable* wearable = self->getWearable(); if( !wearable ) { return; } - gAgentWearables.removeWearable( self->mType, false, 0 ); // TODO: MULTI-WEARABLE + LLAppearanceMgr::instance().removeItemFromAvatar(wearable->getItemID()); + self->refreshWearables(true); } // static @@ -1382,7 +1512,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it) { LLScrollingPanelParam *panel_param = NULL; - panel_param = new LLScrollingPanelParam( "LLScrollingPanelParam", NULL, (*it).second.second, (*it).second.first, (mType != LLWearableType::WT_PHYSICS)); + panel_param = new LLScrollingPanelParam( "LLScrollingPanelParam", NULL, (*it).second.second, (*it).second.first, getWearable(), (mType != LLWearableType::WT_PHYSICS)); panel_list->addPanel( panel_param ); } } diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 8f732244a..412e6227b 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -67,7 +67,12 @@ public: LLWearableType::EType getType() const{ return mType; } LLWearable* getWearable() const; - void setWearable(LLWearable* wearable, U32 perm_mask, BOOL is_complete); + void onTabChanged(LLUICtrl* ctrl); + bool onTabPrecommit(); + + void setWearableIndex(S32 index); + void refreshWearables(bool force_immediate); + void wearablesChanged(); void saveChanges(bool force_save_as = false, std::string new_name = std::string()); @@ -124,6 +129,14 @@ private: typedef std::map s32_uuid_map_t; s32_uuid_map_t mPreviousAlphaTexture; ESubpart mCurrentSubpart; + U32 mCurrentIndex; + LLWearable* mCurrentWearable; + LLWearable* mPendingWearable; //For SaveAs. There's a period where the old wearable will be removed, but the new one will still be pending, + //so this is needed to retain focus on this wearables tab over the messy transition. + bool mPendingRefresh; //LLAgentWearables::setWearableOutfit fires a buttload of remove/wear calls which spams wearablesChanged + //a bazillion pointless (and not particularly valid) times. Deferring to draw effectively sorts it all out. +public: + LLModalDialog* mActiveModal; }; #endif diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index b1e55d30c..49b59720d 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -250,10 +250,8 @@ BOOL LLPanelGroup::postBuild() // Pass on whether or not to allow edit to tabs. panelp->setAllowEdit(mAllowEdit); panelp->addObserver(this); - - mTabContainer->setTabChangeCallback(panelp, onClickTab); - mTabContainer->setTabUserData(panelp, this); } + mTabContainer->setCommitCallback(boost::bind(&LLPanelGroup::handleClickTab,this)); updateTabVisibility(); // Act as though this tab was just activated. @@ -321,13 +319,6 @@ void LLPanelGroup::tabChanged() } } -// static -void LLPanelGroup::onClickTab(void* user_data, bool from_click) -{ - LLPanelGroup* self = static_cast(user_data); - self->handleClickTab(); -} - void LLPanelGroup::handleClickTab() { // If we are already handling a transition, @@ -377,7 +368,7 @@ void LLPanelGroup::selectTab(std::string tab_name) if ( tabp && mTabContainer ) { mTabContainer->selectTabPanel(tabp); - onClickTab(this, false); + handleClickTab(); } } diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 445fb2850..52cb72f36 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -70,7 +70,6 @@ public: static void onBtnCancel(void*); static void onBtnApply(void*); static void onBtnRefresh(void*); - static void onClickTab(void*,bool); void handleClickTab(); void setGroupID(const LLUUID& group_id); diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index fa0432b6c..4baa6cd8b 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -82,7 +82,7 @@ public: static void clickEarlierCallback(void* data); static void clickLaterCallback(void* data); - static void clickTabCallback(void* user_data, bool from_click); + void clickTabCallback(const LLSD ¶m); static LLMap sInstanceIDs; static std::map sTabsToHandlers; @@ -924,8 +924,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto if ( tab_containerp && panelp ) { - tab_containerp->setTabChangeCallback(panelp, clickTabCallback); - tab_containerp->setTabUserData(panelp, this); + tab_containerp->setCommitCallback(boost::bind(&LLGroupMoneyTabEventHandler::clickTabCallback, this, _2)); } sInstanceIDs.addData(mImplementationp->mPanelID, this); @@ -997,11 +996,10 @@ void LLGroupMoneyTabEventHandler::clickLaterCallback(void* data) if ( selfp ) selfp->onClickLater(); } -//static -void LLGroupMoneyTabEventHandler::clickTabCallback(void* data, bool from_click) +void LLGroupMoneyTabEventHandler::clickTabCallback(const LLSD& param) { - LLGroupMoneyTabEventHandler* selfp = (LLGroupMoneyTabEventHandler*) data; - if ( selfp ) selfp->onClickTab(); + if(param.asString() == "group_money_details_tab") + onClickTab(); } // ************************************************** diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index cf07b5edb..155ab8dde 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -147,10 +147,6 @@ BOOL LLPanelGroupRoles::postBuild() { LLPanelGroupSubTab* subtabp = (LLPanelGroupSubTab*) mSubTabContainer->getPanelByIndex(i); - // Add click callbacks to all the tabs. - mSubTabContainer->setTabChangeCallback(subtabp, onClickSubTab); - mSubTabContainer->setTabUserData(subtabp, this); - // Hand the subtab a pointer to this LLPanelGroupRoles, so that it can // look around for the widgets it is interested in. if (!subtabp->postBuildSubTab(this)) return FALSE; @@ -158,6 +154,9 @@ BOOL LLPanelGroupRoles::postBuild() subtabp->addObserver(this); } + // Add click callbacks to all the tabs. + mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab,this)); + // Set the current tab to whatever is currently being shown. mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); if (!mCurrentTab) @@ -198,13 +197,6 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp) } -// static -void LLPanelGroupRoles::onClickSubTab(void* user_data, bool from_click) -{ - LLPanelGroupRoles* self = static_cast(user_data); - self->handleClickSubTab(); -} - void LLPanelGroupRoles::handleClickSubTab() { // If we are already handling a transition, diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 3083c2d56..8ceac9b44 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -64,7 +64,6 @@ public: virtual BOOL isVisibleByAgent(LLAgent* agentp); static void* createTab(void* data); - static void onClickSubTab(void*,bool); void handleClickSubTab(); // Checks if the current tab needs to be applied, and tries to switch to the requested tab. diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index f37772a37..d2cbb0ca2 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -215,9 +215,7 @@ BOOL LLInventoryView::postBuild() sActiveViews.put(this); - childSetTabChangeCallback("inventory filter tabs", "All Items", onFilterSelected, this); - childSetTabChangeCallback("inventory filter tabs", "Recent Items", onFilterSelected, this); - childSetTabChangeCallback("inventory filter tabs", "Worn Items", onFilterSelected, this); + getChild("inventory filter tabs")->setCommitCallback(boost::bind(&LLInventoryView::onFilterSelected,this)); childSetAction("Inventory.ResetAll",onResetAll,this); childSetAction("Inventory.ExpandAll",onExpandAll,this); @@ -764,21 +762,19 @@ void LLInventoryView::onCollapseAll(void* userdata) self->mActivePanel->closeAllFolders(); } -//static -void LLInventoryView::onFilterSelected(void* userdata, bool from_click) +void LLInventoryView::onFilterSelected() { - LLInventoryView* self = (LLInventoryView*) userdata; // Find my index - self->mActivePanel = (LLInventoryPanel*)self->childGetVisibleTab("inventory filter tabs"); + mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); - if (!self->mActivePanel) + if (!mActivePanel) { return; } - //self->setFilterSubString(self->mFilterSubString); - LLInventoryFilter* filter = self->mActivePanel->getFilter(); - LLFloaterInventoryFinder *finder = self->getFinder(); + //>setFilterSubString(self->mFilterSubString); + LLInventoryFilter* filter = mActivePanel->getFilter(); + LLFloaterInventoryFinder *finder = getFinder(); if (finder) { finder->changeFilter(filter); @@ -788,8 +784,8 @@ void LLInventoryView::onFilterSelected(void* userdata, bool from_click) // If our filter is active we may be the first thing requiring a fetch so we better start it here. LLInventoryModelBackgroundFetch::instance().start(); } - self->setFilterTextFromFilter(); - self->updateSortControls(); + setFilterTextFromFilter(); + updateSortControls(); } const std::string LLInventoryView::getFilterSubString() diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 44f6c7f09..dee764118 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -107,7 +107,7 @@ public: static BOOL checkFoldersByName(void *user_data); - static void onFilterSelected(void* userdata, bool from_click); + void onFilterSelected(); const std::string getFilterSubString(); void setFilterSubString(const std::string& string); diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index afc2a3c77..aa6905f2b 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -577,7 +577,7 @@ void LLMultiPreview::handleReshape(const LLRect& new_rect, bool by_user) } -void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) +void LLMultiPreview::tabOpen(LLFloater* opened_floater) { LLPreview* opened_preview = (LLPreview*)opened_floater; if (opened_preview && opened_preview->getAssetStatus() == LLPreview::PREVIEW_ASSET_UNLOADED) diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index ed6bb3087..02184af85 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -53,7 +53,7 @@ public: LLMultiPreview(const LLRect& rect); /*virtual*/void open(); /*Flawfinder: ignore*/ - /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click); + /*virtual*/void tabOpen(LLFloater* opened_floater); /*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false); static LLMultiPreview* getAutoOpenInstance(const LLUUID& id); diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 5b142c571..88127e68f 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -57,8 +57,8 @@ const S32 PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + LLScrollingPanelParam::PARAM_HIN S32 LLScrollingPanelParam::sUpdateDelayFrames = 0; LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint ) - : LLScrollingPanelParamBase( name, mesh, param, allow_modify, bVisualHint, LLRect( 0, PARAM_PANEL_HEIGHT, PARAM_PANEL_WIDTH, 0 )), + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint ) + : LLScrollingPanelParamBase( name, mesh, param, allow_modify, wearable, bVisualHint, LLRect( 0, PARAM_PANEL_HEIGHT, PARAM_PANEL_WIDTH, 0 )), mLess(NULL), mMore(NULL) { @@ -70,9 +70,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name, F32 min_weight = param->getMinWeight(); F32 max_weight = param->getMaxWeight(); - mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight); + mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, mWearable, min_weight); pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER; - mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight ); + mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, mWearable, max_weight ); mHintMin->setAllowsUpdates( FALSE ); mHintMax->setAllowsUpdates( FALSE ); @@ -107,9 +107,7 @@ LLScrollingPanelParam::~LLScrollingPanelParam() void LLScrollingPanelParam::updatePanel(BOOL allow_modify) { - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE - - if(!wearable) + if(!mWearable) { // not editing a wearable just now, no update necessary return; @@ -150,9 +148,7 @@ void LLScrollingPanelParam::setVisible( BOOL visible ) void LLScrollingPanelParam::draw() { - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE - - if( !wearable || gFloaterCustomize->isMinimized() ) + if( !mWearable || gFloaterCustomize->isMinimized() ) { return; } @@ -219,15 +215,14 @@ void LLScrollingPanelParam::onHintMouseDown( bool max ) { LLVisualParamHint* hint = max ? mHintMax : mHintMin; LLViewerVisualParam* param = hint->getVisualParam(); - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE - if(!wearable || !param) + if(!mWearable || !param) { return; } // morph towards this result - F32 current_weight = wearable->getVisualParamWeight( hint->getVisualParam()->getID() ); + F32 current_weight = mWearable->getVisualParamWeight( hint->getVisualParam()->getID() ); // if we have maxed out on this morph, we shouldn't be able to click it if( hint->getVisualParamWeight() != current_weight ) @@ -241,14 +236,13 @@ void LLScrollingPanelParam::onHintHeldDown( bool max ) { LLVisualParamHint* hint = max ? mHintMax : mHintMin; LLViewerVisualParam* param = hint->getVisualParam(); - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)param->getWearableType(),0); // TODO: MULTI-WEARABLE - if(!wearable || !param) + if(!mWearable || !param) { return; } - F32 current_weight = wearable->getVisualParamWeight( param->getID() ); + F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); if (current_weight != hint->getVisualParamWeight() ) { @@ -275,8 +269,8 @@ void LLScrollingPanelParam::onHintHeldDown( bool max ) if (slider->getMinValue() < new_percent && new_percent < slider->getMaxValue()) { - wearable->setVisualParamWeight(param->getID(), new_weight, FALSE); - wearable->writeToAvatar(); + mWearable->setVisualParamWeight(param->getID(), new_weight, FALSE); + mWearable->writeToAvatar(); gAgentAvatarp->updateVisualParams(); slider->setValue( weightToPercent( new_weight ) ); @@ -297,11 +291,10 @@ void LLScrollingPanelParam::onHintMouseUp( bool max ) { LLViewerVisualParam* param = hint->getVisualParam(); - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)param->getWearableType(),0); // TODO: MULTI-WEARABLE - if(wearable) + if(mWearable) { // step in direction - F32 current_weight = wearable->getVisualParamWeight( param->getID() ); + F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); F32 range = mHintMax->getVisualParamWeight() - mHintMin->getVisualParamWeight(); //if min, range should be negative. if(!max) @@ -315,8 +308,8 @@ void LLScrollingPanelParam::onHintMouseUp( bool max ) if (slider->getMinValue() < new_percent && new_percent < slider->getMaxValue()) { - wearable->setVisualParamWeight(param->getID(), new_weight, FALSE); - wearable->writeToAvatar(); + mWearable->setVisualParamWeight(param->getID(), new_weight, FALSE); + mWearable->writeToAvatar(); slider->setValue( weightToPercent( new_weight ) ); } } diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index 4b2069574..8c02e5fa6 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -40,7 +40,7 @@ class LLJoint; class LLScrollingPanelParam : public LLScrollingPanelParamBase { public: - LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint ); + LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint ); virtual ~LLScrollingPanelParam(); virtual void draw(); @@ -69,7 +69,6 @@ public: protected: LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint. F32 mLastHeldTime; - BOOL mAllowModify; }; diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp index bd8561cf6..0a83ac44a 100644 --- a/indra/newview/llscrollingpanelparambase.cpp +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -41,10 +41,11 @@ #include "llagentwearables.h" LLScrollingPanelParamBase::LLScrollingPanelParamBase( const std::string& name, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint, LLRect rect ) + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint, LLRect rect ) : LLScrollingPanel( name, rect ), mParam(param), - mAllowModify(allow_modify) + mAllowModify(allow_modify), + mWearable(wearable) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml"); //Set up the slider @@ -87,14 +88,14 @@ LLScrollingPanelParamBase::~LLScrollingPanelParamBase() void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify) { LLViewerVisualParam* param = mParam; - LLWearable* wearable = gAgentWearables.getWearable( (LLWearableType::EType)param->getWearableType(), 0 ); // TODO: MULTI-WEARABLE - if(!wearable) + + if(!mWearable) { // not editing a wearable just now, no update necessary return; } - F32 current_weight = wearable->getVisualParamWeight( param->getID() ); + F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); childSetValue("param slider", weightToPercent( current_weight ) ); mAllowModify = allow_modify; childSetEnabled("param slider", mAllowModify); @@ -107,21 +108,19 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl) return; } - LLWearable* wearable = gAgentWearables.getWearable( (LLWearableType::EType)mParam->getWearableType(), 0 ); // TODO: MULTI-WEARABLE - - if(!wearable) + if(!mWearable) { return; } LLSliderCtrl* slider = (LLSliderCtrl*) ctrl; - F32 current_weight = wearable->getVisualParamWeight(mParam->getID()); + F32 current_weight = mWearable->getVisualParamWeight(mParam->getID()); F32 new_weight = percentToWeight( (F32)slider->getValue().asReal() ); if (current_weight != new_weight ) { - wearable->setVisualParamWeight( mParam->getID(), new_weight, FALSE); - wearable->writeToAvatar(); + mWearable->setVisualParamWeight( mParam->getID(), new_weight, FALSE); + mWearable->writeToAvatar(); gAgentAvatarp->updateVisualParams(); } } diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h index 9f41882c6..d114f622d 100644 --- a/indra/newview/llscrollingpanelparambase.h +++ b/indra/newview/llscrollingpanelparambase.h @@ -42,7 +42,7 @@ class LLScrollingPanelParamBase : public LLScrollingPanel { public: LLScrollingPanelParamBase( const std::string& name, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint, LLRect rect ); + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint, LLRect rect ); virtual ~LLScrollingPanelParamBase(); virtual void updatePanel(BOOL allow_modify); @@ -56,6 +56,7 @@ public: LLViewerVisualParam* mParam; protected: BOOL mAllowModify; + LLWearable *mWearable; }; #endif diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index c3954e8a7..f9d880aa0 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -81,6 +81,7 @@ LLVisualParamHint::LLVisualParamHint( S32 width, S32 height, LLViewerJointMesh *mesh, LLViewerVisualParam *param, + LLWearable *wearable, F32 param_weight) : LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ), @@ -88,6 +89,7 @@ LLVisualParamHint::LLVisualParamHint( mIsVisible( FALSE ), mJointMesh( mesh ), mVisualParam( param ), + mWearablePtr( wearable ), mVisualParamWeight( param_weight ), mAllowsUpdates( TRUE ), mDelayFrames( 0 ), @@ -153,12 +155,7 @@ BOOL LLVisualParamHint::needsRender() void LLVisualParamHint::preRender(BOOL clear_depth) { mLastParamWeight = mVisualParam->getWeight(); - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mVisualParam->getWearableType(),0); // TODO: MULTI-WEARABLE - if(wearable) - { - llinfos << llformat("%#.8lX",wearable) << llendl; - wearable->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); - } + if(mWearablePtr)mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); gAgentAvatarp->setVisualParamWeight("Blink_Left", 0.f); gAgentAvatarp->setVisualParamWeight("Blink_Right", 0.f); @@ -259,8 +256,7 @@ BOOL LLVisualParamHint::render() gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); - LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mVisualParam->getWearableType(),0); // TODO: MULTI-WEARABLE - if(wearable)wearable->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE); + if(mWearablePtr)mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE); gAgentAvatarp->updateVisualParams(); gGL.color4f(1,1,1,1); mGLTexturep->setGLTextureCreated(true); diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index 0fdfd403f..950a3ab11 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -62,6 +62,7 @@ public: S32 width, S32 height, LLViewerJointMesh *mesh, LLViewerVisualParam *param, + LLWearable *wearable, F32 param_weight); /*virtual*/ S8 getType() const ; @@ -89,6 +90,7 @@ protected: BOOL mIsVisible; // is this distortion hint visible? LLViewerJointMesh* mJointMesh; // mesh that this distortion applies to LLViewerVisualParam* mVisualParam; // visual param applied by this hint + LLWearable* mWearablePtr; // wearable we're editing F32 mVisualParamWeight; // weight for this visual parameter BOOL mAllowsUpdates; // updates are blocked unless this is true S32 mDelayFrames; // updates are blocked for this many frames diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 900d705a9..cdf4ee57d 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -817,17 +817,6 @@ const LLSD SHClientTagMgr::generateClientTag(const LLVOAvatar* pAvatar) const if(!mClientDefinitions.empty()) { std::map::const_iterator it = mClientDefinitions.find(id); - /*S32 idx = ll_rand(mClientDefinitions.size()-1); - for(;it!=mClientDefinitions.end();++it) - { - if(!idx--) - { - llinfos << "[" << idx << "] Returning " << it->second["name"] << " : " << it->second["id"] << llendl; - return it->second; - } - else - llinfos << "[" << idx << "] Skipping " << it->second["name"] << " : " << it->second["id"] << llendl; - }*/ if(it != mClientDefinitions.end()) { return it->second; diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index c40351d23..3c7ccbe17 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -763,7 +763,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake if(gAgentCamera.cameraCustomizeAvatar()) { - gFloaterCustomize->setWearable(type, NULL); + gFloaterCustomize->wearablesChanged(type); } gAgentAvatarp->updateVisualParams(); diff --git a/indra/newview/skins/default/xui/en-us/floater_customize.xml b/indra/newview/skins/default/xui/en-us/floater_customize.xml index d77f5e14c..939aff135 100644 --- a/indra/newview/skins/default/xui/en-us/floater_customize.xml +++ b/indra/newview/skins/default/xui/en-us/floater_customize.xml @@ -86,17 +86,17 @@ mouse_opaque="true" name="path" v_pad="0" width="373"> Located in [PATH] - - Put on a new shape by dragging one from your inventory + +Put on a new shape by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. You do not have permission to modify this wearable. @@ -106,8 +106,8 @@ scratch and wear it. mouse_opaque="true" name="Item Action Label" v_pad="0" width="100"> Shape: -