diff options
Diffstat (limited to 'indra/newview/llconversationview.cpp')
| -rwxr-xr-x | indra/newview/llconversationview.cpp | 194 | 
1 files changed, 192 insertions, 2 deletions
| diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index bc85cd68bc..208a89cc8d 100755 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -39,6 +39,7 @@  //  // Implementation of conversations list session widgets  // +static LLDefaultChildRegistry::Register<LLConversationViewSession> r_conversation_view_session("conversation_view_session"); @@ -46,12 +47,196 @@ LLConversationViewSession::Params::Params() :  	container()  {} -LLConversationViewSession::LLConversationViewSession( const LLConversationViewSession::Params& p ): +LLConversationViewSession::LLConversationViewSession(const LLConversationViewSession::Params& p):  	LLFolderViewFolder(p), -	mContainer(p.container) +	mContainer(p.container), +	mItemPanel(NULL), +	mSessionTitle(NULL)  {  } +BOOL LLConversationViewSession::postBuild() +{ +	LLFolderViewItem::postBuild(); + +	mItemPanel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); + +	addChild(mItemPanel); + +	mSessionTitle = mItemPanel->getChild<LLTextBox>("conversation_title"); + +	refresh(); + +	return TRUE; +} + +void LLConversationViewSession::draw() +{ +// *TODO Seth PE: remove the code duplicated from LLFolderViewFolder::draw() +// ***** LLFolderViewFolder::draw() code begin ***** +	if (mAutoOpenCountdown != 0.f) +	{ +		mControlLabelRotation = mAutoOpenCountdown * -90.f; +	} +	else if (isOpen()) +	{ +		mControlLabelRotation = lerp(mControlLabelRotation, -90.f, LLCriticalDamp::getInterpolant(0.04f)); +	} +	else +	{ +		mControlLabelRotation = lerp(mControlLabelRotation, 0.f, LLCriticalDamp::getInterpolant(0.025f)); +	} +// ***** LLFolderViewFolder::draw() code end ***** + +// *TODO Seth PE: remove the code duplicated from LLFolderViewItem::draw() +// ***** LLFolderViewItem::draw() code begin ***** +	const LLColor4U DEFAULT_WHITE(255, 255, 255); + +	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); +	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE); +	static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE); +	static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE); + +	const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>(); +	const S32 TOP_PAD = default_params.item_top_pad; +	const S32 FOCUS_LEFT = 1; + +	getViewModelItem()->update(); + +	//--------------------------------------------------------------------------------// +	// Draw open folder arrow +	// +	if (hasVisibleChildren() || getViewModelItem()->hasChildren()) +	{ +		LLUIImage* arrow_image = default_params.folder_arrow_image; +		gl_draw_scaled_rotated_image( +			mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD, +			ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor); +	} + + +	//--------------------------------------------------------------------------------// +	// Draw highlight for selected items +	// +	const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE); +	const BOOL filled = show_context || (getRoot() ? getRoot()->getParentPanel()->hasFocus() : FALSE); // If we have keyboard focus, draw selection filled +	const S32 focus_top = getRect().getHeight(); +	const S32 focus_bottom = getRect().getHeight() - mItemHeight; +	const bool folder_open = (getRect().getHeight() > mItemHeight + 4); +	if (mIsSelected) // always render "current" item.  Only render other selected items if mShowSingleSelection is FALSE +	{ +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		LLColor4 bg_color = sHighlightBgColor; +		if (!mIsCurSelection) +		{ +			// do time-based fade of extra objects +			F32 fade_time = (getRoot() ? getRoot()->getSelectionFadeElapsedTime() : 0.0f); +			if (getRoot() && getRoot()->getShowSingleSelection()) +			{ +				// fading out +				bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f); +			} +			else +			{ +				// fading in +				bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]); +			} +		} +		gl_rect_2d(FOCUS_LEFT, +				   focus_top, +				   getRect().getWidth() - 2, +				   focus_bottom, +				   bg_color, filled); +		if (mIsCurSelection) +		{ +			gl_rect_2d(FOCUS_LEFT, +					   focus_top, +					   getRect().getWidth() - 2, +					   focus_bottom, +					   sFocusOutlineColor, FALSE); +		} +		if (folder_open) +		{ +			gl_rect_2d(FOCUS_LEFT, +					   focus_bottom + 1, // overlap with bottom edge of above rect +					   getRect().getWidth() - 2, +					   0, +					   sFocusOutlineColor, FALSE); +			if (show_context) +			{ +				gl_rect_2d(FOCUS_LEFT, +						   focus_bottom + 1, +						   getRect().getWidth() - 2, +						   0, +						   sHighlightBgColor, TRUE); +			} +		} +	} +	else if (mIsMouseOverTitle) +	{ +		gl_rect_2d(FOCUS_LEFT, +			focus_top, +			getRect().getWidth() - 2, +			focus_bottom, +			sMouseOverColor, FALSE); +	} + +	//--------------------------------------------------------------------------------// +	// Draw DragNDrop highlight +	// +	if (mDragAndDropTarget) +	{ +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gl_rect_2d(FOCUS_LEFT, +				   focus_top, +				   getRect().getWidth() - 2, +				   focus_bottom, +				   sHighlightBgColor, FALSE); +		if (folder_open) +		{ +			gl_rect_2d(FOCUS_LEFT, +					   focus_bottom + 1, // overlap with bottom edge of above rect +					   getRect().getWidth() - 2, +					   0, +					   sHighlightBgColor, FALSE); +		} +		mDragAndDropTarget = FALSE; +	} +// ***** LLFolderViewItem::draw() code end ***** + +	// draw children if root folder, or any other folder that is open or animating to closed state +	bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) +						 || isOpen() +						 || mCurHeight != mTargetHeight; + +	for (folders_t::iterator iter = mFolders.begin(); +		iter != mFolders.end();) +	{ +		folders_t::iterator fit = iter++; +		(*fit)->setVisible(draw_children); +	} +	for (items_t::iterator iter = mItems.begin(); +		iter != mItems.end();) +	{ +		items_t::iterator iit = iter++; +		(*iit)->setVisible(draw_children); +	} + +	LLView::draw(); +} + +// virtual +S32 LLConversationViewSession::arrange(S32* width, S32* height) +{ +	LLRect rect(getIndentation() + ARROW_SIZE, +				getLocalRect().mTop, +				getLocalRect().mRight, +				getLocalRect().mTop - getItemHeight()); +	mItemPanel->setShape(rect); + +	return LLFolderViewFolder::arrange(width, height); +} +  void LLConversationViewSession::selectItem()  {  	LLFolderViewItem::selectItem(); @@ -109,6 +294,11 @@ void LLConversationViewSession::refresh()  	LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());  	vmi->resetRefresh(); +	if (mSessionTitle) +	{ +		mSessionTitle->setText(vmi->getDisplayName()); +	} +  	// Note: for the moment, all that needs to be done is done by LLFolderViewItem::refresh()  	// Do the regular upstream refresh | 
