diff options
44 files changed, 667 insertions, 206 deletions
| diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index e0e86ae228..b77126996e 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3420,6 +3420,12 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent)  	if (pMenu)  	{ +		//eat TAB key - EXT-7000 +		if (key == KEY_TAB && mask == MASK_NONE) +		{ +			return TRUE; +		} +  		//handle ESCAPE and RETURN key  		handled = LLPanel::handleKey(key, mask, called_from_parent);  		if (!handled) @@ -3726,10 +3732,14 @@ void LLContextMenuBranch::buildDrawLabel( void )  void	LLContextMenuBranch::showSubMenu()  { -	S32 center_x; -	S32 center_y; -	localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); -	mBranch->show(	center_x, center_y); +	LLMenuItemGL* menu_item = mBranch->getParentMenuItem(); +	if (menu_item != NULL && menu_item->getVisible()) +	{ +		S32 center_x; +		S32 center_y; +		localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); +		mBranch->show(center_x, center_y); +	}  }  // onCommit() - do the primary funcationality of the menu item. diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4e4c0274e7..f71662a7c8 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3578,6 +3578,17 @@        <key>Value</key>        <integer>1024</integer>      </map> +    <key>GesturesMarketplaceURL</key> +    <map> +      <key>Comment</key> +      <string>URL to the Gestures Marketplace</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>https://www.xstreetsl.com/modules.php?name=Marketplace&CategoryID=233</string> +    </map>      <key>GridCrossSections</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 47ec5270c3..72ee289c91 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -399,6 +399,15 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)  	return handled;  } +void LLAvatarList::setVisible(BOOL visible) +{ +	if ( visible == FALSE && mContextMenu ) +	{ +		mContextMenu->hide(); +	} +	LLFlatListViewEx::setVisible(visible); +} +  void LLAvatarList::computeDifference(  	const uuid_vec_t& vnew_unsorted,  	uuid_vec_t& vadded, diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index ff090f3a34..a9320055ca 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -70,6 +70,8 @@ public:  	virtual void clear(); +	virtual void setVisible(BOOL visible); +  	void setNameFilter(const std::string& filter);  	void setDirty(bool val = true, bool force_refresh = false);  	uuid_vec_t& getIDs() 							{ return mIDs; } diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 3ba2c7a3e3..c6fac7a9f1 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -71,6 +71,7 @@ public:  	{  	public:  		virtual void show(LLView* spawning_view, const uuid_vec_t& selected_uuids, S32 x, S32 y) = 0; +		virtual void hide() = 0;  	};  	/** diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 226d5593c9..7f528c88b2 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -479,6 +479,10 @@ BOOL LLBottomTray::postBuild()  	initResizeStateContainers(); +	setButtonsControlsAndListeners(); + +	initButtonsVisibility(); +  	// update wells visibility:  	showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());  	showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty()); @@ -1091,52 +1095,108 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32&  bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const  { +	// 0. Check if passed button was previously hidden on resize  	bool can_be_shown = mResizeState & processed_object_type;  	if (can_be_shown)  	{ -		static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES; -		static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT; -		static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA; +		// Yes, it was. Lets now check that all buttons before it (that can be hidden on resize) +		// are already shown + +		// process buttons in direct order (from left to right) +		resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); +		const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); -		switch(processed_object_type) +		// 1. Find and accumulate all buttons types before one passed into the method. +		MASK buttons_before_mask = RS_NORESIZE; +		for (; it != it_end; ++it)  		{ -		case RS_BUTTON_GESTURES: // Gestures should be shown first -			break; -		case RS_BUTTON_MOVEMENT: // Move only if gesture is shown -			can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState); -			break; -		case RS_BUTTON_CAMERA: -			can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState); -			break; -		case RS_BUTTON_SNAPSHOT: -			can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState); -			break; -		default: // nothing to do here -			break; +			const EResizeState button_type = *it; +			if (button_type == processed_object_type) break; + +			buttons_before_mask |= button_type;  		} + +		// 2. Check if some previous buttons are still hidden on resize +		can_be_shown = !(buttons_before_mask & mResizeState);  	}  	return can_be_shown;  }  void LLBottomTray::initResizeStateContainers()  { +	// *TODO: get rid of mGesturePanel, mMovementPanel, mCamPanel, mSnapshotPanel instance members  	// init map with objects should be processed for each type  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); - -	// init default widths -	mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth(); -	mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth(); -	mObjectDefaultWidthMap[RS_BUTTON_CAMERA]   = mCamPanel->getRect().getWidth(); -	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth(); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));  	// init an order of processed buttons  	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);  	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);  	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);  	mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); +	mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); +	mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); +	mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); +	mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); + +	// init default widths + +	// process buttons that can be hidden on resize... +	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); +	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + +	for (; it != it_end; ++it) +	{ +		const EResizeState button_type = *it; +		// is there an appropriate object? +		if (0 == mStateProcessedObjectMap.count(button_type)) continue; + +		// set default width for it. +		mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth(); +	} + +	// ... and add Speak button because it also can be shrunk. +	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth(); + +} + +void LLBottomTray::initButtonsVisibility() +{ +	// *TODO: move control settings of other buttons here +	setTrayButtonVisibleIfPossible(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); +} + +void LLBottomTray::setButtonsControlsAndListeners() +{ +	// *TODO: move control settings of other buttons here +	gSavedSettings.declareBOOL("ShowBuildButton", TRUE, "Shows/Hides Build button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowSearchButton", TRUE, "Shows/Hides Search button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowWorldMapButton", TRUE, "Shows/Hides Map button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowMiniMapButton", TRUE, "Shows/Hides Mini-Map button in the bottom tray. (Declared in code)"); + + +	gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2)); +	gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2)); +	gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2)); +	gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2)); +} + +bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility) +{ +	if (LLBottomTray::instanceExists()) +	{ +		LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean()); +	} +	return true;  }  void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index e9d59e82ba..5588aefb42 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -120,12 +120,24 @@ private:  		, RS_BUTTON_SPEAK		= 0x0040  		, RS_IM_WELL			= 0x0080  		, RS_NOTIFICATION_WELL	= 0x0100 +		, RS_BUTTON_BUILD		= 0x0200 +		, RS_BUTTON_SEARCH		= 0x0400 +		, RS_BUTTON_WORLD_MAP	= 0x0800 +		, RS_BUTTON_MINI_MAP	= 0x1000 + +		/* +		Once new button that can be hidden on resize is added don't forget to update related places: +			- RS_BUTTONS_CAN_BE_HIDDEN enum value below. +			- initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder +		*/  		/**  		 * Specifies buttons which can be hidden when bottom tray is shrunk.  		 * They are: Gestures, Movement (Move), Camera (View), Snapshot +		 *		new: Build, Search, Map, World Map, Mini-Map.  		 */  		, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES +									| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP  	}EResizeState;  	/** @@ -272,6 +284,28 @@ private:  	void initResizeStateContainers();  	/** +	 * Initializes buttons' visibility depend on stored Control Settings. +	 */ +	void initButtonsVisibility(); + +	/** +	 * Initializes listeners of Control Settings to toggle appropriate buttons' visibility. +	 * +	 * @see toggleShowButton() +	 */ +	void setButtonsControlsAndListeners(); + +	/** +	 * Toggles visibility of specified button depend on passed value. +	 * +	 * @param button_type - type of button to be toggled +	 * @param new_visibility - new visibility of the button +	 * +	 * @see setButtonsControlsAndListeners() +	 */ +	static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); + +	/**  	 * Sets passed visibility to object specified by resize type.  	 */  	void setTrayButtonVisible(EResizeState shown_object_type, bool visible); diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 5b6a99e793..35a244c461 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -326,12 +326,14 @@ void LLNearbyChatToastPanel::draw()  		if(icon)  		{  			icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT); -			if(mSourceType == CHAT_SOURCE_AGENT) -				icon->setValue(mFromID); +			if(mSourceType == CHAT_SOURCE_OBJECT) +				icon->setValue(LLSD("OBJECT_Icon"));  			else if(mSourceType == CHAT_SOURCE_SYSTEM)  				icon->setValue(LLSD("SL_Logo")); -			else -				icon->setValue(LLSD("OBJECT_Icon")); +			else if(mSourceType == CHAT_SOURCE_AGENT) +				icon->setValue(mFromID); +			else if(!mFromID.isNull()) +				icon->setValue(mFromID);  		}  		mIsDirty = false;  	} diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 2ae11aa2b5..a87f7288fa 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1744,6 +1744,8 @@ BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask )  	mParentPanel->setFocus(TRUE); +	LLEditMenuHandler::gEditMenuHandler = this; +  	return LLView::handleMouseDown( x, y, mask );  } diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index 2d1d401cd4..9b592e79af 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -322,7 +322,7 @@ LLInventoryItemsList::Params::Params()  LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)  :	LLFlatListViewEx(p)  ,	mNeedsRefresh(false) -,	mPrevVisibility(false) +,	mForceRefresh(false)  {  	// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView  	// but reset to true in all derived classes. This settings might need to @@ -356,14 +356,13 @@ boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(con  void LLInventoryItemsList::doIdle()  { -	bool cur_visibility = getVisible(); -	if(cur_visibility != mPrevVisibility || mNeedsRefresh) +	if (!mNeedsRefresh) return; + +	if (isInVisibleChain() || mForceRefresh)  	{  		refresh();  		mRefreshCompleteSignal(this, LLSD()); - -		mPrevVisibility = getVisible();  	}  } @@ -414,6 +413,7 @@ void LLInventoryItemsList::refresh()  	bool needs_refresh = add_limit_exceeded;  	setNeedsRefresh(needs_refresh); +	setForceRefresh(needs_refresh);  }  void LLInventoryItemsList::computeDifference( diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index 60cccc0f4f..a3863b511c 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -222,6 +222,12 @@ public:  	bool getNeedsRefresh(){ return mNeedsRefresh; }  	/** +	 * Sets the flag indicating that the list needs to be refreshed even if it is +	 * not currently visible. +	 */ +	void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; } + +	/**  	 * Idle routine used to refresh the list regardless of the current list  	 * visibility, unlike draw() which is called only for the visible list.  	 * This is needed for example to filter items of the list hidden by closed @@ -259,7 +265,7 @@ private:  					 // Will be used in refresh() to determine added and removed ids  	bool mNeedsRefresh; -	bool mPrevVisibility; +	bool mForceRefresh;  	commit_signal_t mRefreshCompleteSignal;  }; diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index c24d2ee0ea..8557548887 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -493,7 +493,7 @@ void LLInventoryExistenceObserver::changed(U32 mask)  	}  } -void LLInventoryMoveFromWorldObserver::changed(U32 mask) +void LLInventoryAddItemByAssetObserver::changed(U32 mask)  {  	if(!(mask & LLInventoryObserver::ADD))  	{ @@ -535,7 +535,7 @@ void LLInventoryMoveFromWorldObserver::changed(U32 mask)  	}  } -void LLInventoryMoveFromWorldObserver::watchAsset(const LLUUID& asset_id) +void LLInventoryAddItemByAssetObserver::watchAsset(const LLUUID& asset_id)  {  	if(asset_id.notNull())  	{ @@ -551,7 +551,7 @@ void LLInventoryMoveFromWorldObserver::watchAsset(const LLUUID& asset_id)  	}  } -bool LLInventoryMoveFromWorldObserver::isAssetWatched( const LLUUID& asset_id ) +bool LLInventoryAddItemByAssetObserver::isAssetWatched( const LLUUID& asset_id )  {  	return std::find(mWatchedAssets.begin(), mWatchedAssets.end(), asset_id) != mWatchedAssets.end();  } diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 036e6ca40d..6d5a86a6fc 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -180,10 +180,10 @@ protected:  // something useful.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryMoveFromWorldObserver : public LLInventoryObserver +class LLInventoryAddItemByAssetObserver : public LLInventoryObserver  {  public: -	LLInventoryMoveFromWorldObserver() : mIsDirty(false) {} +	LLInventoryAddItemByAssetObserver() : mIsDirty(false) {}  	virtual void changed(U32 mask);  	void watchAsset(const LLUUID& asset_id); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 1507b7d324..bd504906d5 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -79,6 +79,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)  :	LLUICtrl(p)  	, mLabel(p.label)  	, mViewAllItemIndex(0) +	, mGetMoreItemIndex(0)  {  	LLButton::Params button_params = p.combo_button;  	button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); @@ -260,9 +261,12 @@ void LLGestureComboList::refreshGestures()  	sortByName(); -	// store index followed by the last added Gesture and add View All item at bottom -	mViewAllItemIndex = idx; -	 +	// store indices for Get More and View All items (idx is the index followed by the last added Gesture) +	mGetMoreItemIndex = idx; +	mViewAllItemIndex = idx + 1; + +	// add Get More and View All items at the bottom +	mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));  	mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));  	// Insert label after sorting, at top, with separator below it @@ -318,6 +322,12 @@ void LLGestureComboList::onCommitGesture()  			return;  		} +		if (mGetMoreItemIndex == index) +		{ +			LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL")); +			return; +		} +  		LLMultiGesture* gesture = mGestures.at(index);  		if(gesture)  		{ diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index dd467d7978..5af3152662 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -62,6 +62,7 @@ protected:  	std::vector<LLMultiGesture*> mGestures;  	std::string mLabel;  	LLSD::Integer mViewAllItemIndex; +	LLSD::Integer mGetMoreItemIndex;  public: diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 12d5203429..43b7e15977 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -170,7 +170,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));  		// Setting list refresh callback to apply filter on list change. -		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1)); +		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));  		// Fetch the new outfit contents.  		cat->fetch(); @@ -178,6 +178,21 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		// Refresh the list of outfit items after fetch().  		// Further list updates will be triggered by the category observer.  		list->updateList(cat_id); + +		// If filter is currently applied we store the initial tab state and +		// open it to show matched items if any. +		if (!mFilterSubString.empty()) +		{ +			tab->notifyChildren(LLSD().with("action","store_state")); +			tab->setDisplayChildren(true); + +			// Setting mForceRefresh flag will make the list refresh its contents +			// even if it is not currently visible. This is required to apply the +			// filter to the newly added list. +			list->setForceRefresh(true); + +			list->setFilterSubString(mFilterSubString); +		}  	}  	// Handle removed tabs. @@ -327,7 +342,7 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI  	mSelectedOutfitUUID = category_id;  } -void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl) +void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)  {  	if (!ctrl || mFilterSubString.empty())  		return; @@ -338,7 +353,7 @@ void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)  		 iter != iter_end; ++iter)  	{  		LLAccordionCtrlTab* tab = iter->second; -		if (tab) continue; +		if (!tab) continue;  		LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());  		if (list != ctrl) continue; @@ -395,8 +410,6 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  		if (!new_filter_substring.empty())  		{ -			tab->setDisplayChildren(true); -  			std::string title = tab->getTitle();  			LLStringUtil::toUpper(title); @@ -413,6 +426,18 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  			{  				tab->setTitle(tab->getTitle(), cur_filter);  			} + +			if (tab->getVisible()) +			{ +				// Open tab if it has passed the filter. +				tab->setDisplayChildren(true); +			} +			else +			{ +				// Set force refresh flag to refresh not visible list +				// when some changes occur in it. +				list->setForceRefresh(true); +			}  		}  		else  		{ diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index bcb393b12a..8eaa39e6f1 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -98,7 +98,7 @@ private:  	 * Called upon list refresh event to update tab visibility depending on  	 * the results of applying filter to the title and list items of the tab.  	 */ -	void onWearableItemsListRefresh(LLUICtrl* ctrl); +	void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);  	/**  	 * Highlights filtered items and hides tabs which haven't passed filter. diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ddd41a1791..555248e31a 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -212,7 +212,6 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)  	if (mInsignia)  	{  		mInsignia->setCommitCallback(onCommitAny, this); -		mDefaultIconID = mInsignia->getImageAssetID();  	}  	mFounderName = getChild<LLNameBox>("founder_name"); @@ -656,7 +655,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  		}  		else  		{ -			mInsignia->setImageAssetID(mDefaultIconID); +			mInsignia->setImageAssetName(mInsignia->getDefaultImageName());  		}  	} @@ -846,16 +845,7 @@ void LLPanelGroupGeneral::reset()  	mInsignia->setEnabled(true); -	LLPointer<LLUIImage> imagep = LLUI::getUIImage(mInsignia->getDefaultImageName()); -	if(imagep) -	{ -		LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get()); -		if(pTexture) -		{ -			LLUUID id = pTexture->getID(); -			mInsignia->setImageAssetID(id); -		} -	} +	mInsignia->setImageAssetName(mInsignia->getDefaultImageName());  	{  		std::string empty_str = ""; diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index 6245018871..6f4fa994da 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -95,7 +95,6 @@ private:  	BOOL			mChanged;  	BOOL			mFirstUse;  	std::string		mIncompleteMemberDataStr; -	LLUUID			mDefaultIconID;  	// Group information (include any updates in updateChanged)  	LLLineEditor		*mGroupNameEditor; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index a77ba0c69c..93fbecfd3f 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -118,8 +118,7 @@ LLPanelGroupRoles::LLPanelGroupRoles()  	mCurrentTab(NULL),  	mRequestedTab( NULL ),  	mSubTabContainer( NULL ), -	mFirstUse( TRUE ), -	mIgnoreTransition( FALSE ) +	mFirstUse( TRUE )  {  } @@ -153,8 +152,8 @@ BOOL LLPanelGroupRoles::postBuild()  		//subtabp->addObserver(this);  	} -	// Add click callbacks to all the tabs. -	mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab, this)); +	// Add click callbacks to tab switching. +	mSubTabContainer->setValidateBeforeCommit(boost::bind(&LLPanelGroupRoles::handleSubTabSwitch, this, _1));  	// Set the current tab to whatever is currently being shown.  	mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); @@ -196,30 +195,20 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp)  } -void LLPanelGroupRoles::handleClickSubTab() +bool LLPanelGroupRoles::handleSubTabSwitch(const LLSD& data)  { -	// If we are already handling a transition, -	// ignore this. -	if (mIgnoreTransition) -	{ -		return; -	} - -	mRequestedTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); +	std::string panel_name = data.asString(); +	 +	LLPanelGroupTab* activating_tab = static_cast<LLPanelGroupTab*>(mSubTabContainer->getPanelByName(panel_name)); -	// Make sure they aren't just clicking the same tab... -	if (mRequestedTab == mCurrentTab) +	if(activating_tab == mCurrentTab +		|| activating_tab == mRequestedTab)  	{ -		return; +		return true;  	} -	// Try to switch from the current panel to the panel the user selected. -	attemptTransition(); -} - -BOOL LLPanelGroupRoles::attemptTransition() -{ -	// Check if the current tab needs to be applied. +	mRequestedTab = activating_tab; +	  	std::string mesg;  	if (mCurrentTab && mCurrentTab->needsApply(mesg))  	{ @@ -235,16 +224,10 @@ BOOL LLPanelGroupRoles::attemptTransition()  		LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),  			boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));  		mHasModal = TRUE; -		// We need to reselect the current tab, since it isn't finished. -		if (mSubTabContainer) -		{ -			mIgnoreTransition = TRUE; -			mSubTabContainer->selectTabPanel( mCurrentTab ); -			mIgnoreTransition = FALSE; -		} +		  		// Returning FALSE will block a close action from finishing until  		// we get a response back from the user. -		return FALSE; +		return false;  	}  	else  	{ @@ -253,7 +236,7 @@ BOOL LLPanelGroupRoles::attemptTransition()  		{  			transitionToTab();  		} -		return TRUE; +		return true;  	}  } @@ -271,6 +254,7 @@ void LLPanelGroupRoles::transitionToTab()  		// This is now the current tab;  		mCurrentTab = mRequestedTab;  		mCurrentTab->activate(); +		mRequestedTab = 0;  	}  } @@ -278,6 +262,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	mHasModal = FALSE; +	LLPanelGroupTab* transition_tab = mRequestedTab;  	switch (option)  	{  	case 0: // "Apply Changes" @@ -297,26 +282,20 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS  			// Skip switching tabs.  			break;  		} - -		// This panel's info successfully applied. -		// Switch to the next panel. -		// No break!  Continue into 'Ignore Changes' which just switches tabs. -		mIgnoreTransition = TRUE; -		mSubTabContainer->selectTabPanel( mRequestedTab ); -		mIgnoreTransition = FALSE;  		transitionToTab(); +		mSubTabContainer->selectTabPanel( transition_tab ); +		  		break;  	}  	case 1: // "Ignore Changes"  		// Switch to the requested panel without applying changes  		cancel(); -		mIgnoreTransition = TRUE; -		mSubTabContainer->selectTabPanel( mRequestedTab ); -		mIgnoreTransition = FALSE;  		transitionToTab(); +		mSubTabContainer->selectTabPanel( transition_tab );  		break;  	case 2: // "Cancel"  	default: +		mRequestedTab = NULL;  		// Do nothing.  The user is canceling the action.  		break;  	} diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 98cebe9882..a877402041 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -65,7 +65,7 @@ public:  	virtual BOOL isVisibleByAgent(LLAgent* agentp); -	void handleClickSubTab(); +	bool handleSubTabSwitch(const LLSD& data);  	// Checks if the current tab needs to be applied, and tries to switch to the requested tab.  	BOOL attemptTransition(); @@ -93,7 +93,6 @@ protected:  	LLPanelGroupTab*		mRequestedTab;  	LLTabContainer*	mSubTabContainer;  	BOOL					mFirstUse; -	BOOL					mIgnoreTransition;  	std::string				mDefaultNeedsApplyMesg;  	std::string				mWantApplyMesg; diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index c04be85174..44832ac496 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -169,14 +169,48 @@ protected:  	S32 mBaseOutfitLastVersion;  }; +class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver +{ +public: +	LLCOFDragAndDropObserver(LLInventoryModel* model); + +	virtual ~LLCOFDragAndDropObserver(); + +	virtual void done(); + +private: +	LLInventoryModel* mModel; +}; + +inline LLCOFDragAndDropObserver::LLCOFDragAndDropObserver(LLInventoryModel* model): +		mModel(model) +{ +	if (model != NULL) +	{ +		model->addObserver(this); +	} +} + +inline LLCOFDragAndDropObserver::~LLCOFDragAndDropObserver() +{ +	if (mModel != NULL && mModel->containsObserver(this)) +	{ +		mModel->removeObserver(this); +	} +} +void LLCOFDragAndDropObserver::done() +{ +	LLAppearanceMgr::instance().updateAppearanceFromCOF(); +}  LLPanelOutfitEdit::LLPanelOutfitEdit()  :	LLPanel(),   	mSearchFilter(NULL),  	mCOFWearables(NULL),  	mInventoryItemsPanel(NULL), -	mCOFObserver(NULL) +	mCOFObserver(NULL), +	mCOFDragAndDropObserver(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -197,6 +231,7 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()  	delete mSavedFolderState;  	delete mCOFObserver; +	delete mCOFDragAndDropObserver;  }  BOOL LLPanelOutfitEdit::postBuild() @@ -234,6 +269,8 @@ BOOL LLPanelOutfitEdit::postBuild()  	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));  	mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2)); +	mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); +  	LLComboBox* type_filter = getChild<LLComboBox>("filter_wearables_combobox");  	type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));  	type_filter->removeall(); @@ -522,6 +559,56 @@ void LLPanelOutfitEdit::update()  	updateVerbs();  } +BOOL LLPanelOutfitEdit::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +										  EDragAndDropType cargo_type, +										  void* cargo_data, +										  EAcceptance* accept, +										  std::string& tooltip_msg) +{ +	if (cargo_data == NULL) +	{ +		llwarns << "cargo_data is NULL" << llendl; +		return TRUE; +	} + +	switch (cargo_type) +	{ +	case DAD_BODYPART: +	case DAD_CLOTHING: +	case DAD_OBJECT: +	case DAD_LINK: +		*accept = ACCEPT_YES_MULTI; +		break; +	default: +		*accept = ACCEPT_NO; +	} + +	if (drop) +	{ +		LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data); + +		if (LLAssetType::lookupIsAssetIDKnowable(item->getType())) +		{ +			mCOFDragAndDropObserver->watchAsset(item->getAssetUUID()); + +			/* +			 * Adding request to wear item. If the item is a link, then getLinkedUUID() will +			 * return the ID of the linked item. Otherwise it will return the item's ID. The +			 * second argument is used to delay the appearance update until all dragged items +			 * are added to optimize user experience. +			 */ +			LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), false); +		} +		else +		{ +			// if asset id is not available for the item we must wear it immediately (attachments only) +			LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), true); +		} +	} + +	return TRUE; +} +  void LLPanelOutfitEdit::displayCurrentOutfit()  {  	if (!getVisible()) diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index cb8283fca3..953a70785c 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -50,6 +50,7 @@ class LLCOFWearables;  class LLTextBox;  class LLInventoryCategory;  class LLCOFObserver; +class LLCOFDragAndDropObserver;  class LLInventoryPanel;  class LLSaveFolderState;  class LLFolderViewItem; @@ -114,6 +115,12 @@ public:  	 */  	bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel); +	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +									  EDragAndDropType cargo_type, +									  void* cargo_data, +									  EAcceptance* accept, +									  std::string& tooltip_msg); +  private: @@ -134,6 +141,8 @@ private:  	LLPanel*						mWearableItemsPanel;  	LLCOFObserver*	mCOFObserver; +	LLCOFDragAndDropObserver* mCOFDragAndDropObserver; +  	std::vector<LLLookItemType> mLookItemTypes;  	LLCOFWearables*		mCOFWearables; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 660615df5a..ea75c16c56 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -134,11 +134,6 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)  void LLPanelOutfitsInventory::updateVerbs()  { -	if (mParent) -	{ -		mParent->updateVerbs(); -	} -  	if (mListCommands)  	{  		updateListCommands(); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index daf116d255..1117ae05d7 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -655,6 +655,7 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()  	bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);  	main_menu->setItemVisible("SortByName", is_sort_visible);  	main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible); +	main_menu->setItemVisible("Moderator Options Separator", isGroupModerator());  	main_menu->setItemVisible("Moderator Options", isGroupModerator());  	main_menu->setItemVisible("View Icons Separator", mParent.mAvatarListToggleIconsConnection.connected());  	main_menu->setItemVisible("View Icons", mParent.mAvatarListToggleIconsConnection.connected()); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 0086c6aec4..658a7b52e3 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -118,9 +118,6 @@ BOOL LLSidepanelAppearance::postBuild()  	childSetAction("edit_outfit_btn", boost::bind(&LLSidepanelAppearance::onEditOutfitButtonClicked, this)); -	mEditBtn = getChild<LLButton>("edit_btn"); -	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this)); -  	mNewOutfitBtn = getChild<LLButton>("newlook_btn");  	mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));  	mNewOutfitBtn->setEnabled(false); @@ -172,24 +169,24 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)  {  	fetchInventory();  	refreshCurrentOutfitName(); -	updateVerbs();  	if (mPanelOutfitsInventory)  	{  		mPanelOutfitsInventory->onOpen(key);  	} -	if(key.size() == 0) +	if (!key.has("type"))  		return; -	 -	toggleOutfitEditPanel(TRUE); -	updateVerbs(); -	 -	mLookInfoType = key["type"].asString(); -	if (mLookInfoType == "edit_outfit") +	// Switch to the requested panel. +	std::string type = key["type"].asString(); +	if (type == "my_outfits")  	{ -		mOutfitEdit->displayCurrentOutfit(); +		showOutfitsInventoryPanel(); +	} +	else if (type == "edit_outfit") +	{ +		showOutfitEditPanel(/*update = */ true);  	}  } @@ -233,6 +230,7 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked()  	}  } +// *TODO: obsolete?  void LLSidepanelAppearance::onEditAppearanceButtonClicked()  {  	if (gAgentWearables.areWearablesLoaded()) @@ -248,19 +246,6 @@ void LLSidepanelAppearance::onEditOutfitButtonClicked()  	LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);  } -void LLSidepanelAppearance::onEditButtonClicked() -{ -	toggleOutfitEditPanel(FALSE); -	toggleWearableEditPanel(TRUE, NULL); -	/*if (mOutfitEdit->getVisible()) -	  { -	  } -	  else -	  { -	  mPanelOutfitsInventory->onEdit(); -	  }*/ -} -  void LLSidepanelAppearance::onNewOutfitButtonClicked()  {  	if (!mOutfitEdit->getVisible()) @@ -271,33 +256,27 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()  void LLSidepanelAppearance::onEditWearBackClicked()  { -	mEditWearable->saveChanges(); -	toggleWearableEditPanel(FALSE, NULL); -	toggleOutfitEditPanel(TRUE); +	showOutfitEditPanel(/* update = */ false);  }  void LLSidepanelAppearance::showOutfitsInventoryPanel()  { -	mOutfitEdit->setVisible(FALSE); - -	mPanelOutfitsInventory->setVisible(TRUE); - -	mFilterEditor->setVisible(TRUE); -	mEditBtn->setVisible(TRUE); -	mNewOutfitBtn->setVisible(TRUE); -	mCurrOutfitPanel->setVisible(TRUE); +	toggleWearableEditPanel(FALSE); +	toggleOutfitEditPanel(FALSE);  } -void LLSidepanelAppearance::showOutfitEditPanel() +void LLSidepanelAppearance::showOutfitEditPanel(bool update)  { -	mOutfitEdit->setVisible(TRUE); -	 -	mPanelOutfitsInventory->setVisible(FALSE); +	if (!mOutfitEdit) +		return; + +	toggleWearableEditPanel(FALSE); +	toggleOutfitEditPanel(TRUE); -	mFilterEditor->setVisible(FALSE); -	mEditBtn->setVisible(FALSE); -	mNewOutfitBtn->setVisible(FALSE); -	mCurrOutfitPanel->setVisible(FALSE); +	if (update) +	{ +		mOutfitEdit->displayCurrentOutfit(); +	}  }  void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible) @@ -305,16 +284,27 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)  	if (!mOutfitEdit)  		return; +	if (mOutfitEdit->getVisible() == visible) +	{ +		// visibility isn't changing, hence nothing to do +		return; +	} +  	mOutfitEdit->setVisible(visible);  	if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);  	mFilterEditor->setVisible(!visible); -	mEditBtn->setVisible(!visible);  	mNewOutfitBtn->setVisible(!visible);  	mCurrOutfitPanel->setVisible(!visible);  }  void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)  { +	if (mEditWearable->getVisible() == visible) +	{ +		// visibility isn't changing, hence nothing to do +		return; +	} +  	if (!wearable)  	{  		wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0); @@ -324,6 +314,13 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  		return;  	} +	// Save changes if closing. +	if (!visible) +	{ +		mEditWearable->saveChanges(); +	} + +	// Toggle panel visibility.  	mCurrOutfitPanel->setVisible(!visible);  	mEditWearable->setVisible(visible); @@ -332,21 +329,6 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	mPanelOutfitsInventory->setVisible(!visible);  } -void LLSidepanelAppearance::updateVerbs() -{ -	bool is_look_info_visible = mOutfitEdit->getVisible(); - -	if (mPanelOutfitsInventory && !is_look_info_visible) -	{ -//		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); -//		mEditBtn->setEnabled(is_correct_type); -	} -	else -	{ -		mEditBtn->setEnabled(FALSE); -	} -} -  void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)  {  	// Set current outfit status (wearing/unsaved). diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 2900831099..a919b07ed6 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -60,11 +60,10 @@ public:  	void fetchInventory();  	void inventoryFetched(); -	void updateVerbs();  	void onNewOutfitButtonClicked();  	void showOutfitsInventoryPanel(); -	void showOutfitEditPanel(); +	void showOutfitEditPanel(bool update);  	void setWearablesLoading(bool val);  private: @@ -73,12 +72,11 @@ private:  	void onOpenOutfitButtonClicked();  	void onEditAppearanceButtonClicked();  	void onEditOutfitButtonClicked(); -	void onEditButtonClicked();  	void onEditWearBackClicked();  	//@deprecated use showXXX() methods instead  	void toggleOutfitEditPanel(BOOL visible); -	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); +	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL);  	LLFilterEditor*			mFilterEditor;  	LLPanelOutfitsInventory* mPanelOutfitsInventory; @@ -87,7 +85,6 @@ private:  	LLButton*					mOpenOutfitBtn;  	LLButton*					mEditAppearanceBtn; -	LLButton*					mEditBtn;  	LLButton*					mNewOutfitBtn;  	LLPanel*					mCurrOutfitPanel; @@ -103,10 +100,6 @@ private:  	// Search string for filtering landmarks and teleport  	// history locations  	std::string					mFilterSubString; - -	// Information type currently shown in Look Information panel -	std::string					mLookInfoType; -  };  #endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 140a9c818a..e8fdee9430 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -94,7 +94,7 @@ public:  	 * if no such tab - return NULL, otherwise a pointer to the panel  	 * Pass params as array, or they may be overwritten(example - params["name"]="nearby")  	 */ -	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params); +	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params = LLSD());  	/**  	 * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. @@ -102,7 +102,7 @@ public:  	 * otherwise Side Tray is collapsed.  	 * params are passed to "panel_name" panel onOpen().  	 */ -	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params); +	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());  	/*  	 * get the panel (don't show it or do anything else with it) diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a1b3c8dabd..6165d309c3 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1137,6 +1137,20 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)  	}  } +void	LLTextureCtrl::setImageAssetName(const std::string& name) +{ +	LLPointer<LLUIImage> imagep = LLUI::getUIImage(name); +	if(imagep) +	{ +		LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get()); +		if(pTexture) +		{ +			LLUUID id = pTexture->getID(); +			setImageAssetID(id); +		} +	} +} +  void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )  {  	if( mImageAssetID != asset_id ) diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 837f837430..bcd0a083f2 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -128,7 +128,7 @@ public:  	virtual void	clear();  	// Takes a UUID, wraps get/setImageAssetID -	virtual void	setValue(const LLSD& value ); +	virtual void	setValue(const LLSD& value);  	virtual LLSD	getValue() const;  	// LLTextureCtrl interface @@ -142,6 +142,8 @@ public:  	const LLUUID&	getImageItemID() { return mImageItemID; } +	virtual void	setImageAssetName(const std::string& name); +	  	void			setImageAssetID(const LLUUID &image_asset_id);  	const LLUUID&	getImageAssetID() const						{ return mImageAssetID; } diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index a31c3a0f1b..9efa6c4108 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -151,8 +151,9 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,  									  bool trusted_browser)  {  	llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl; +	const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());  	bool handled = LLCommandDispatcher::dispatch( -			slurl.getAppCmd(), slurl.getAppPath(), slurl.getAppQuery(), web, trusted_browser); +			slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser);  	// alert if we didn't handle this secondlife:///app/ SLURL  	// (but still return true because it is a valid app SLURL) diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 49748c59e8..da8832b1a2 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -95,6 +95,41 @@ public:  		mInventoryItemsDict["New Script"]		= LLTrans::getString("New Script");  		mInventoryItemsDict["New Folder"]		= LLTrans::getString("New Folder");  		mInventoryItemsDict["Contents"]			= LLTrans::getString("Contents"); + +		mInventoryItemsDict["Gesture"]			= LLTrans::getString("Gesture"); +		mInventoryItemsDict["Male Gestures"]	= LLTrans::getString("Male Gestures"); +		mInventoryItemsDict["Female Gestures"]	= LLTrans::getString("Female Gestures"); +		mInventoryItemsDict["Other Gestures"]	= LLTrans::getString("Other Gestures"); +		mInventoryItemsDict["Speech Gestures"]	= LLTrans::getString("Speech Gestures"); + +		//predefined gestures + +		//male +		mInventoryItemsDict["Male - Excuse me"]			= LLTrans::getString("Male - Excuse me"); +		mInventoryItemsDict["Male - Get lost"]			= LLTrans::getString("Male - Get lost"); +		mInventoryItemsDict["Male - Blow kiss"]			= LLTrans::getString("Male - Blow kiss"); +		mInventoryItemsDict["Male - Boo"]				= LLTrans::getString("Male - Boo"); +		mInventoryItemsDict["Male - Bored"]				= LLTrans::getString("Male - Bored"); +		mInventoryItemsDict["Male - Hey"]				= LLTrans::getString("Male - Hey"); +		mInventoryItemsDict["Male - Laugh"]				= LLTrans::getString("Male - Laugh"); +		mInventoryItemsDict["Male - Repulsed"]			= LLTrans::getString("Male - Repulsed"); +		mInventoryItemsDict["Male - Shrug"]				= LLTrans::getString("Male - Shrug"); +		mInventoryItemsDict["Male - Stick tougue out"]	= LLTrans::getString("Male - Stick tougue out"); +		mInventoryItemsDict["Male - Wow"]				= LLTrans::getString("Male - Wow"); + +		//female +		mInventoryItemsDict["FeMale - Excuse me"]		= LLTrans::getString("FeMale - Excuse me"); +		mInventoryItemsDict["FeMale - Get lost"]		= LLTrans::getString("FeMale - Get lost"); +		mInventoryItemsDict["FeMale - Blow kiss"]		= LLTrans::getString("FeMale - Blow kiss"); +		mInventoryItemsDict["FeMale - Boo"]				= LLTrans::getString("FeMale - Boo"); +		mInventoryItemsDict["Female - Bored"]			= LLTrans::getString("Female - Bored"); +		mInventoryItemsDict["Female - Hey"]				= LLTrans::getString("Female - Hey"); +		mInventoryItemsDict["Female - Laugh"]			= LLTrans::getString("Female - Laugh"); +		mInventoryItemsDict["Female - Repulsed"]		= LLTrans::getString("Female - Repulsed"); +		mInventoryItemsDict["Female - Shrug"]			= LLTrans::getString("Female - Shrug"); +		mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out"); +		mInventoryItemsDict["Female - Wow"]				= LLTrans::getString("Female - Wow"); +		  	}  }; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 42428bab03..c245650d51 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5597,10 +5597,7 @@ void handle_viewer_disable_message_log(void*)  void handle_customize_avatar()  { -	if (gAgentWearables.areWearablesLoaded()) -	{ -		gAgentCamera.changeCameraToCustomizeAvatar(); -	} +	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));  }  void handle_report_abuse() diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 86e040692c..fb87e2d3b9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -774,11 +774,11 @@ private:   * We can't create it each time items are moved because "drop" event is sent separately for each   * element even while multi-dragging. We have to have the only instance of the observer. See EXT-4347.   */ -class LLViewerInventoryMoveFromWorldObserver : public LLInventoryMoveFromWorldObserver +class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetObserver  {  public:  	LLViewerInventoryMoveFromWorldObserver() -		: LLInventoryMoveFromWorldObserver() +		: LLInventoryAddItemByAssetObserver()  		, mActivePanel(NULL)  	{ diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 5c30b9ee94..dc51ae8b92 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -68,8 +68,8 @@           function="Self.EnableStandUp" />      </menu_item_call>       <menu_item_call -     label="My Appearance" -     name="Appearance..."> +     label="Change Outfit" +     name="Change Outfit">          <menu_item_call.on_click           function="CustomizeAvatar" />          <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index a21c1ac44b..0efe598243 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -183,9 +183,9 @@          </menu_item_call>      </context_menu>       <menu_item_call -     label="My Appearance" +     label="Change Outfit"       layout="topleft" -     name="Appearance..."> +     name="Chenge Outfit">          <menu_item_call.on_click           function="CustomizeAvatar" />          <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml index 7ef91a1d85..5beafef4e4 100644 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml @@ -52,6 +52,50 @@               function="CheckControl"               parameter="ShowSnapshotButton" />      </menu_item_check>         +    <menu_item_check +     label="Build button" +     layout="topleft" +     name="ShowBuildButton"> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="ShowBuildButton" /> +        <menu_item_check.on_check +         function="CheckControl" +         parameter="ShowBuildButton" /> +    </menu_item_check> +    <menu_item_check +     label="Search button" +     layout="topleft" +     name="ShowSearchButton"> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="ShowSearchButton" /> +        <menu_item_check.on_check +         function="CheckControl" +         parameter="ShowSearchButton" /> +    </menu_item_check> +    <menu_item_check +     label="Map button" +     layout="topleft" +     name="ShowWorldMapButton"> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="ShowWorldMapButton" /> +        <menu_item_check.on_check +         function="CheckControl" +         parameter="ShowWorldMapButton" /> +    </menu_item_check> +    <menu_item_check +     label="Mini-Map button" +     layout="topleft" +     name="ShowMiniMapButton"> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="ShowMiniMapButton" /> +        <menu_item_check.on_check +         function="CheckControl" +         parameter="ShowMiniMapButton" /> +    </menu_item_check>      <menu_item_separator       name="Separator" />      <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 03bd93e271..ea18e02ca1 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -16,8 +16,8 @@       function="Self.EnableStandUp" />    </menu_item_call>    <menu_item_call -   label="My Appearance" -   name="my_appearance"> +   label="Change Outfit" +   name="change_outfit">      <menu_item_call.on_click       function="CustomizeAvatar" />      <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml index f126431263..4ed5807808 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -127,7 +127,8 @@           parameter="can_mute_text" />      </menu_item_check>      <menu_item_separator -     layout="topleft" /> +     layout="topleft"  +     name="Moderator Options Separator"/>      <context_menu       label="Moderator Options >"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index c9ebeb60fb..16c2581d63 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -38,8 +38,8 @@               parameter="agent" />          </menu_item_call>          <menu_item_call -         label="My Appearance" -         name="Appearance"> +         label="Change Outfit" +         name="ChangeOutfit">              <menu_item_call.on_click               function="CustomizeAvatar" />              <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 7b11538ccc..620aabeeb8 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -10,7 +10,7 @@   left="0"   name="bottom_tray"   top="28" - width="1000"> + width="1310">      <string       name="SpeakBtnToolTip"       value="Turns microphone on/off" /> @@ -28,7 +28,7 @@       name="toolbar_stack"       orientation="horizontal"       top="0" -     width="1000"> +     width="1310">          <icon           auto_resize="false"           follows="left|right" @@ -211,6 +211,134 @@              </button>          </layout_panel>          <layout_panel +         auto_resize="false" +         follows="left|right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="52" +         mouse_opaque="false" +         name="build_btn_panel" +         user_resize="false" +         width="83"> +<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. +Disabled for now. +--> +            <button +enabled="false" +             follows="left|right" +             height="23" +             image_pressed="PushButton_Press" +             image_pressed_selected="PushButton_Selected_Press" +             image_selected="PushButton_Selected_Press" +             is_toggle="true" +             label="Build" +             layout="topleft" +             left="0" +             name="build_btn" +             tool_tip="Shows/hides Build Tools" +             top="5" +             use_ellipses="true" +             width="80"> +                <init_callback +                 function="Button.SetFloaterToggle" +                 parameter="build" /> +            </button> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="left|right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="52" +         mouse_opaque="false" +         name="search_btn_panel" +         user_resize="false" +         width="83"> +            <button +             follows="left|right" +             height="23" +             image_pressed="PushButton_Press" +             image_pressed_selected="PushButton_Selected_Press" +             image_selected="PushButton_Selected_Press" +             is_toggle="true" +             label="Search" +             layout="topleft" +             left="0" +             name="search_btn" +             tool_tip="Shows/hides Search" +             top="5" +             use_ellipses="true" +             width="80"> +                <init_callback +                 function="Button.SetFloaterToggle" +                 parameter="search" /> +            </button> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="left|right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="52" +         mouse_opaque="false" +         name="world_map_btn_panel" +         user_resize="false" +         width="83"> +            <button +             follows="left|right" +             height="23" +             image_pressed="PushButton_Press" +             image_pressed_selected="PushButton_Selected_Press" +             image_selected="PushButton_Selected_Press" +             is_toggle="true" +             label="Map" +             layout="topleft" +             left="0" +             name="world_map_btn" +             tool_tip="Shows/hides World Map" +             top="5" +             use_ellipses="true" +             width="80"> +                <init_callback +                 function="Button.SetFloaterToggle" +                 parameter="world_map" /> +            </button> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="left|right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="52" +         mouse_opaque="false" +         name="mini_map_btn_panel" +         user_resize="false" +         width="83"> +            <button +             follows="left|right" +             height="23" +             image_pressed="PushButton_Press" +             image_pressed_selected="PushButton_Selected_Press" +             image_selected="PushButton_Selected_Press" +             is_toggle="true" +             label="Mini-Map" +             layout="topleft" +             left="0" +             name="mini_map_btn" +             tool_tip="Shows/hides Mini-Map" +             top="5" +             use_ellipses="true" +             width="80"> +                <init_callback +                 function="Button.SetFloaterToggle" +                 parameter="mini_map" /> +            </button> +        </layout_panel> +        <layout_panel           follows="left|right"           height="30"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index 7961664516..9072418329 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -260,7 +260,7 @@               top_pad="5"               left="0">                  <layout_panel -                 auto_resize="true" +                 auto_resize="false"                   layout="topleft"                   follows="left|top|right"                   height="30" @@ -292,7 +292,7 @@                   width="311"                   user_resize="true">                      <inventory_panel -		             allow_multi_select="false" +		             allow_multi_select="true"  		             border="false"  		             follows="left|top|right|bottom"  		             height="130" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6d80b17ac6..bf28e78cf6 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1894,6 +1894,7 @@ Clears (deletes) the media and all params from the given face.  	<string name="Wave"          value=" Wave " />  	<string name="HelloAvatar"   value=" Hello, avatar! " />  	<string name="ViewAllGestures"  value="  View All >>" /> +	<string name="GetMoreGestures"  value="  Get More >>" />  	<!-- inventory filter -->      <!-- use value="" because they have preceding spaces --> @@ -3136,6 +3137,36 @@ Abuse Report</string>    <string name="New Script">New Script</string>    <string name="New Folder">New Folder</string>    <string name="Contents">Contents</string> +  <string name="Gesture">Gesture</string> +  <string name="Male Gestures">Male Gestures</string> +  <string name="Female Gestures">Female Gestures</string> +  <string name="Other Gestures">Other Gestures</string> +  <string name="Speech Gestures">Speech Gestures</string> + +  <!-- gestures --> +  <string name="Male - Excuse me">Male - Excuse me</string> +  <string name="Male - Get lost">Male - Get lost</string> +  <string name="Male - Blow kiss">Male - Blow kiss</string> +  <string name="Male - Boo">Male - Boo</string> +  <string name="Male - Bored">Male - Bored</string> +  <string name="Male - Hey">Male - Hey</string> +  <string name="Male - Laugh">Male - Laugh</string> +  <string name="Male - Repulsed">Male - Repulsed</string> +  <string name="Male - Shrug">Male - Shrug</string> +  <string name="Male - Stick tougue out">Male - Stick tougue out</string> +  <string name="Male - Wow">Male - Wow</string> + +  <string name="FeMale - Excuse me">FeMale - Excuse me</string> +  <string name="FeMale - Get lost">FeMale - Get lost</string> +  <string name="FeMale - Blow kiss">FeMale - Blow kiss</string> +  <string name="FeMale - Boo">FeMale - Boo</string> +  <string name="Female - Bored">Female - Bored</string> +  <string name="Female - Hey">Female - Hey</string> +  <string name="Female - Laugh">Female - Laugh</string> +  <string name="Female - Repulsed">Female - Repulsed</string> +  <string name="Female - Shrug">Female - Shrug</string> +  <string name="Female - Stick tougue out">Female - Stick tougue out</string> +  <string name="Female - Wow">Female - Wow</string>    <!-- birth date format shared by avatar inspector and profile panels -->    <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string> diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml index 6190ea7872..216c4dea95 100644 --- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml +++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml @@ -11,6 +11,7 @@    read_only="true"    use_ellipses="true"    word_wrap="true" +  show_context_menu="true"    tab_stop="true"    v_pad="3"    h_pad="4" > | 
