From be06bebffcc1a08c3018ab3712048599455e025b Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Mon, 10 Sep 2012 20:12:27 +0300 Subject: CHUI-282 WIP Modified conversation view item and IM floater container so that the folder view handles the positioning of items in conversations list. --- indra/newview/llconversationview.cpp | 170 ++++++++++++++++++++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) (limited to 'indra/newview/llconversationview.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 9f3df93aba..514bf38b00 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -42,10 +42,173 @@ LLConversationViewSession::Params::Params() : 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("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); + + addChild(mItemPanel); + + mSessionTitle = mItemPanel->getChild("conversation_title"); + + refresh(); + + return TRUE; +} + +void LLConversationViewSession::draw() +{ + 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)); + } + + 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(); + 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; + } + + LLView::draw(); + + mExpanderHighlighted = FALSE; +} + +// virtual +S32 LLConversationViewSession::arrange(S32* width, S32* height) +{ + LLRect rect(getIndentation() + ARROW_SIZE, + getLocalRect().mTop, + getLocalRect().mRight, + getLocalRect().mTop - getItemHeight()); + mItemPanel->setRect(rect); + mItemPanel->reshape(rect.getWidth(), rect.getHeight()); + + return LLFolderViewFolder::arrange(width, height); +} + void LLConversationViewSession::selectItem() { LLFolderViewItem::selectItem(); @@ -103,6 +266,11 @@ void LLConversationViewSession::refresh() LLConversationItem* vmi = dynamic_cast(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 -- cgit v1.2.3 From 4b52515b543546844835064dfb89e5af2bbbd948 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Thu, 13 Sep 2012 20:10:45 +0300 Subject: CHUI-282 WIP Fixed conversation list items selection. Fixed displaying session participants only when session item is open. --- indra/newview/llconversationview.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'indra/newview/llconversationview.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 514bf38b00..53971a3159 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -35,12 +35,13 @@ // // Implementation of conversations list session widgets // +static LLDefaultChildRegistry::Register r_conversation_view_session("conversation_view_session"); LLConversationViewSession::Params::Params() : container() {} -LLConversationViewSession::LLConversationViewSession( const LLConversationViewSession::Params& p ): +LLConversationViewSession::LLConversationViewSession(const LLConversationViewSession::Params& p): LLFolderViewFolder(p), mContainer(p.container), mItemPanel(NULL), @@ -65,6 +66,8 @@ BOOL LLConversationViewSession::postBuild() 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; @@ -77,7 +80,10 @@ void LLConversationViewSession::draw() { 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); @@ -190,10 +196,27 @@ void LLConversationViewSession::draw() } mDragAndDropTarget = FALSE; } +// ***** LLFolderViewItem::draw() code end ***** - LLView::draw(); + // draw children if root folder, or any other folder that is open or animating to closed state + bool draw_children = getRoot() == static_cast(this) + || isOpen() + || mCurHeight != mTargetHeight; - mExpanderHighlighted = FALSE; + 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 @@ -203,8 +226,7 @@ S32 LLConversationViewSession::arrange(S32* width, S32* height) getLocalRect().mTop, getLocalRect().mRight, getLocalRect().mTop - getItemHeight()); - mItemPanel->setRect(rect); - mItemPanel->reshape(rect.getWidth(), rect.getHeight()); + mItemPanel->setShape(rect); return LLFolderViewFolder::arrange(width, height); } -- cgit v1.2.3