implemented major task (EXT-3354) Add "unread message" counters for IM sessions in the IM well window

- IM Well Window's chiclets now have counters and count IMs from 1 to "99+"
- IM Well Window's items can resize on appearance of chiclet's counter or speaker indicator

--HG--
branch : product-engine
master
Dmitry Oleshko 2009-12-18 15:58:37 +02:00
parent 55ff23cdad
commit f3a92bfc17
5 changed files with 147 additions and 55 deletions

View File

@ -66,7 +66,8 @@ static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer");
static const LLRect CHICLET_RECT(0, 25, 25, 0);
static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
static const LLRect VOICE_INDICATOR_RECT(50, 25, 70, 0);
static const LLRect COUNTER_RECT(25, 25, 50, 0);
static const S32 OVERLAY_ICON_SHIFT = 2; // used for shifting of an overlay icon for new massages in a chiclet
// static
@ -170,6 +171,7 @@ LLSysWellChiclet::~LLSysWellChiclet()
void LLSysWellChiclet::setCounter(S32 counter)
{
// note same code in LLChicletNotificationCounterCtrl::setCounter(S32 counter)
std::string s_count;
if(counter != 0)
{
@ -427,7 +429,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
// shift an icon a little bit to the right and up corner of a chiclet
overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);
setShowCounter(false);
enableCounterControl(false);
}
void LLIMChiclet::setShowSpeaker(bool show)
@ -440,30 +442,87 @@ void LLIMChiclet::setShowSpeaker(bool show)
onChicletSizeChanged();
}
}
void LLIMChiclet::enableCounterControl(bool enable)
{
mCounterEnabled = enable;
if(!enable)
{
LLChiclet::setShowCounter(false);
}
}
void LLIMChiclet::setShowCounter(bool show)
{
if(!mCounterEnabled)
{
return;
}
bool needs_resize = getShowCounter() != show;
if(needs_resize)
{
LLChiclet::setShowCounter(show);
toggleCounterControl();
onChicletSizeChanged();
}
}
void LLIMChiclet::initSpeakerControl()
{
// virtual
}
void LLIMChiclet::setRequiredWidth()
{
bool show_speaker = getShowSpeaker();
bool show_counter = getShowCounter();
S32 required_width = CHICLET_RECT.getWidth();
if (show_counter)
{
required_width += COUNTER_RECT.getWidth();
}
if (show_speaker)
{
required_width += VOICE_INDICATOR_RECT.getWidth();
}
reshape(required_width, getRect().getHeight());
}
void LLIMChiclet::toggleSpeakerControl()
{
LLRect speaker_rect = mSpeakerCtrl->getRect();
S32 required_width = getRect().getWidth();
if(getShowSpeaker())
{
required_width = required_width + speaker_rect.getWidth();
if(getShowCounter())
{
mSpeakerCtrl->setRect(VOICE_INDICATOR_RECT);
}
else
{
mSpeakerCtrl->setRect(COUNTER_RECT);
}
initSpeakerControl();
}
else
{
required_width = required_width - speaker_rect.getWidth();
}
reshape(required_width, getRect().getHeight());
setRequiredWidth();
mSpeakerCtrl->setVisible(getShowSpeaker());
}
void LLIMChiclet::setCounter(S32 counter)
{
mCounterCtrl->setCounter(counter);
setShowCounter(counter);
setShowNewMessagesIcon(counter);
}
void LLIMChiclet::toggleCounterControl()
{
setRequiredWidth();
mCounterCtrl->setVisible(getShowCounter());
}
void LLIMChiclet::setShowNewMessagesIcon(bool show)
{
if(mNewMessagesIcon)
@ -564,6 +623,7 @@ LLIMP2PChiclet::Params::Params()
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
unread_notifications.mouse_opaque(false);
unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
speaker.name("speaker");
@ -602,12 +662,6 @@ LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
mSpeakerCtrl->setVisible(getShowSpeaker());
}
void LLIMP2PChiclet::setCounter(S32 counter)
{
mCounterCtrl->setCounter(counter);
setShowNewMessagesIcon(counter);
}
void LLIMP2PChiclet::initSpeakerControl()
{
mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
@ -720,6 +774,7 @@ LLAdHocChiclet::Params::Params()
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
unread_notifications.mouse_opaque(false);
unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
@ -794,12 +849,6 @@ void LLAdHocChiclet::switchToCurrentSpeaker()
mSpeakerCtrl->setSpeakerId(speaker_id);
}
void LLAdHocChiclet::setCounter(S32 counter)
{
mCounterCtrl->setCounter(counter);
setShowNewMessagesIcon(counter);
}
void LLAdHocChiclet::createPopupMenu()
{
if(mPopupMenu)
@ -871,6 +920,7 @@ LLIMGroupChiclet::Params::Params()
unread_notifications.font_halign(LLFontGL::HCENTER);
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
speaker.name("speaker");
@ -911,12 +961,6 @@ LLIMGroupChiclet::~LLIMGroupChiclet()
LLGroupMgr::getInstance()->removeObserver(this);
}
void LLIMGroupChiclet::setCounter(S32 counter)
{
mCounterCtrl->setCounter(counter);
setShowNewMessagesIcon(counter);
}
void LLIMGroupChiclet::draw()
{
switchToCurrentSpeaker();
@ -1608,11 +1652,16 @@ S32 LLChicletPanel::getTotalUnreadIMCount()
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
LLChicletNotificationCounterCtrl::Params::Params()
: max_displayed_count("max_displayed_count", MAX_DISPLAYED_COUNT)
{
}
LLChicletNotificationCounterCtrl::LLChicletNotificationCounterCtrl(const Params& p)
: LLTextBox(p)
, mCounter(0)
, mInitialWidth(0)
, mMaxDisplayedCount(p.max_displayed_count)
{
mInitialWidth = getRect().getWidth();
}
@ -1621,11 +1670,21 @@ void LLChicletNotificationCounterCtrl::setCounter(S32 counter)
{
mCounter = counter;
std::stringstream stream;
stream << getCounter();
// note same code in LLSysWellChiclet::setCounter(S32 counter)
std::string s_count;
if(counter != 0)
{
static std::string more_messages_exist("+");
std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
s_count = llformat("%d%s"
, llmin(counter, mMaxDisplayedCount)
, more_messages.c_str()
);
}
if(mCounter != 0)
{
setText(stream.str());
setText(s_count);
}
else
{

View File

@ -52,10 +52,19 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
{
public:
static const S32 MAX_DISPLAYED_COUNT = 99;
struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
{
Params()
{};
/**
* Contains maximum displayed count of unread messages. Default value is 9.
*
* If count is less than "max_unread_count" will be displayed as is.
* Otherwise 9+ will be shown (for default value).
*/
Optional<S32> max_displayed_count;
Params();
};
/**
@ -93,6 +102,7 @@ private:
S32 mCounter;
S32 mInitialWidth;
S32 mMaxDisplayedCount;
};
/**
@ -358,6 +368,32 @@ public:
*/
virtual void toggleSpeakerControl();
/**
* Sets number of unread messages. Will update chiclet's width if number text
* exceeds size of counter and notify it's parent about size change.
*/
virtual void setCounter(S32);
/**
* Enables/disables the counter control for a chiclet.
*/
virtual void enableCounterControl(bool enable);
/**
* Sets show counter state.
*/
virtual void setShowCounter(bool show);
/**
* Shows/Hides for counter control for a chiclet.
*/
virtual void toggleCounterControl();
/**
* Sets required width for a chiclet according to visible controls.
*/
virtual void setRequiredWidth();
/**
* Shows/hides overlay icon concerning new unread messages.
*/
@ -400,6 +436,7 @@ protected:
protected:
bool mShowSpeaker;
bool mCounterEnabled;
LLIconCtrl* mNewMessagesIcon;
LLChicletNotificationCounterCtrl* mCounterCtrl;
@ -452,12 +489,6 @@ public:
/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
/**
* Sets number of unread messages. Will update chiclet's width if number text
* exceeds size of counter and notify it's parent about size change.
*/
/*virtual*/ void setCounter(S32);
/**
* Init Speaker Control with speaker's ID
*/
@ -526,12 +557,6 @@ public:
*/
/*virtual*/ void setSessionId(const LLUUID& session_id);
/**
* Sets number of unread messages. Will update chiclet's width if number text
* exceeds size of counter and notify it's parent about size change.
*/
/*virtual*/ void setCounter(S32);
/**
* Keep Speaker Control with actual speaker's ID
*/
@ -694,12 +719,6 @@ public:
*/
/*virtual*/ void changed(LLGroupChange gc);
/**
* Sets number of unread messages. Will update chiclet's width if number text
* exceeds size of counter and notify it's parent about size change.
*/
/*virtual*/ void setCounter(S32);
/**
* Init Speaker Control with speaker's ID
*/

View File

@ -350,6 +350,8 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
}
// Initialize chiclet.
mChiclet->setChicletSizeChangedCallback(boost::bind(&LLIMWellWindow::RowPanel::onChicletSizeChanged, this, mChiclet, _2));
mChiclet->enableCounterControl(true);
mChiclet->setCounter(chicletCounter);
mChiclet->setSessionId(sessionId);
mChiclet->setIMSessionName(name);
@ -363,6 +365,16 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::RowPanel::onClosePanel, this));
}
//---------------------------------------------------------------------------------
void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
{
LLTextBox* text = getChild<LLTextBox>("contact_name");
S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
LLRect text_rect = text->getRect();
text_rect.mLeft = new_text_left;
text->setRect(text_rect);
}
//---------------------------------------------------------------------------------
LLIMWellWindow::RowPanel::~RowPanel()
{

View File

@ -223,6 +223,8 @@ private:
void onMouseLeave(S32 x, S32 y, MASK mask);
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
private:
static const S32 CHICLET_HPAD = 10;
void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
void onClosePanel();
public:
LLIMChiclet* mChiclet;

View File

@ -69,9 +69,9 @@
name="contact_name"
layout="topleft"
top="10"
left_pad="20"
left_pad="10"
height="14"
width="245"
width="255"
length="1"
follows="right|left"
use_ellipses="true"