summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorDmitry Oleshko <doleshko@productengine.com>2009-11-06 20:03:03 +0200
committerDmitry Oleshko <doleshko@productengine.com>2009-11-06 20:03:03 +0200
commitdae2e04f1930404296f39a39ec91c8cdb95eb733 (patch)
treea9a57478c020c427a647c4fb331502bcbb842b82 /indra
parent8f679595d5cbcc29a5c9576b04df034aa0c2157f (diff)
partial implementation for the major task (EXT-989) IM chiclets should expand to show active voice indicator
--HG-- branch : product-engine
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llchiclet.cpp194
-rw-r--r--indra/newview/llchiclet.h76
-rw-r--r--indra/newview/llvoicechannel.cpp3
-rw-r--r--indra/newview/llvoicechannel.h7
4 files changed, 168 insertions, 112 deletions
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 6fd7e6b07d..041baf06e7 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -200,7 +200,9 @@ void LLChiclet::setValue(const LLSD& value)
LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
: LLChiclet(p)
+, mShowSpeaker(false)
, mNewMessagesIcon(NULL)
+, mSpeakerCtrl(NULL)
, mCounterCtrl(NULL)
{
// initialize an overlay icon for new messages
@@ -219,6 +221,40 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
setShowCounter(false);
}
+void LLIMChiclet::setShowSpeaker(bool show)
+{
+ bool needs_resize = getShowSpeaker() != show;
+ if(needs_resize)
+ {
+ mShowSpeaker = show;
+ toggleSpeakerControl();
+ onChicletSizeChanged();
+ }
+}
+void LLIMChiclet::initSpeakerControl()
+{
+ mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
+}
+
+void LLIMChiclet::toggleSpeakerControl()
+{
+ LLRect speaker_rect = mSpeakerCtrl->getRect();
+ S32 required_width = getRect().getWidth();
+
+ if(getShowSpeaker())
+ {
+ required_width = required_width + speaker_rect.getWidth();
+ initSpeakerControl();
+ }
+ else
+ {
+ required_width = required_width - speaker_rect.getWidth();
+ }
+
+ reshape(required_width, getRect().getHeight());
+ mSpeakerCtrl->setVisible(getShowSpeaker());
+}
+
void LLIMChiclet::setShowNewMessagesIcon(bool show)
{
if(mNewMessagesIcon)
@@ -310,7 +346,7 @@ LLIMP2PChiclet::Params::Params()
// Changed icon height from 25 to 24 to fix ticket EXT-794.
// In some cases(after changing UI scale) 25 pixel height icon was
// drawn incorrectly, i'm not sure why.
- avatar_icon.rect(LLRect(0, 24, 25, 0));
+ avatar_icon.rect(LLRect(0, 24, 24, 0));
avatar_icon.mouse_opaque(false);
unread_notifications.name("unread");
@@ -323,7 +359,9 @@ LLIMP2PChiclet::Params::Params()
unread_notifications.visible(false);
speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
+ speaker.rect(LLRect(25, 25, 45, 0));
+ speaker.auto_update(true);
+ speaker.draw_border(false);
show_speaker = false;
}
@@ -331,7 +369,6 @@ LLIMP2PChiclet::Params::Params()
LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
@@ -359,18 +396,9 @@ void LLIMP2PChiclet::setCounter(S32 counter)
setShowNewMessagesIcon(counter);
}
-LLRect LLIMP2PChiclet::getRequiredRect()
+void LLIMP2PChiclet::initSpeakerControl()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
- {
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
- }
- if(getShowSpeaker())
- {
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
- }
- return rect;
+ mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
}
void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id)
@@ -447,18 +475,6 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
}
}
-void LLIMP2PChiclet::setShowSpeaker(bool show)
-{
- LLIMChiclet::setShowSpeaker(show);
-
- bool needs_resize = getShowSpeaker() != show;
- mSpeakerCtrl->setVisible(getShowSpeaker());
- if(needs_resize)
- {
- onChicletSizeChanged();
- }
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -494,7 +510,9 @@ LLAdHocChiclet::Params::Params()
speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
+ speaker.rect(LLRect(25, 25, 45, 0));
+ speaker.auto_update(true);
+ speaker.draw_border(false);
show_speaker = false;
}
@@ -502,7 +520,6 @@ LLAdHocChiclet::Params::Params()
LLAdHocChiclet::LLAdHocChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
@@ -533,24 +550,35 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id)
mChicletIconCtrl->setValue(im_session->mOtherParticipantID);
}
-void LLAdHocChiclet::setCounter(S32 counter)
+void LLAdHocChiclet::draw()
{
- mCounterCtrl->setCounter(counter);
- setShowNewMessagesIcon(counter);
+ initSpeakerControl();
+ LLIMChiclet::draw();
}
-LLRect LLAdHocChiclet::getRequiredRect()
+void LLAdHocChiclet::initSpeakerControl()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
- {
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
- }
- if(getShowSpeaker())
+ LLUUID speaker_id;
+ LLSpeakerMgr::speaker_list_t speaker_list;
+
+ LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE);
+ for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
{
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
+ LLPointer<LLSpeaker> s = *i;
+ if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+ {
+ speaker_id = s->mID;
+ break;
+ }
}
- return rect;
+
+ mSpeakerCtrl->setSpeakerId(speaker_id);
+}
+
+void LLAdHocChiclet::setCounter(S32 counter)
+{
+ mCounterCtrl->setCounter(counter);
+ setShowNewMessagesIcon(counter);
}
BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -584,7 +612,9 @@ LLIMGroupChiclet::Params::Params()
unread_notifications.visible(false);
speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
+ speaker.rect(LLRect(25, 25, 45, 0));
+ speaker.auto_update(true);
+ speaker.draw_border(false);
show_speaker = false;
}
@@ -593,7 +623,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
: LLIMChiclet(p)
, LLGroupMgrObserver(LLUUID::null)
, mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
LLChicletGroupIconCtrl::Params avatar_params = p.group_icon;
@@ -626,18 +655,32 @@ void LLIMGroupChiclet::setCounter(S32 counter)
setShowNewMessagesIcon(counter);
}
-LLRect LLIMGroupChiclet::getRequiredRect()
+void LLIMGroupChiclet::draw()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
- {
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
- }
- if(getShowSpeaker())
+ initSpeakerControl();
+ LLIMChiclet::draw();
+}
+
+void LLIMGroupChiclet::initSpeakerControl()
+{
+ LLUUID speaker_id;
+ LLSpeakerMgr* speaker_mgr = NULL;
+ LLSpeakerMgr::speaker_list_t speaker_list;
+
+ speaker_mgr = LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers;
+ speaker_mgr->update(TRUE);
+ speaker_mgr->getSpeakerList(&speaker_list, FALSE);
+ for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
{
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
+ LLPointer<LLSpeaker> s = *i;
+ if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+ {
+ speaker_id = s->mID;
+ break;
+ }
}
- return rect;
+
+ mSpeakerCtrl->setSpeakerId(speaker_id);
}
void LLIMGroupChiclet::setSessionId(const LLUUID& session_id)
@@ -724,17 +767,6 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
}
}
-void LLIMGroupChiclet::setShowSpeaker(bool show)
-{
- LLIMChiclet::setShowSpeaker(show);
-
- bool needs_resize = getShowSpeaker() != show;
- mSpeakerCtrl->setVisible(getShowSpeaker());
- if(needs_resize)
- {
- onChicletSizeChanged();
- }
-}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -850,10 +882,28 @@ BOOL LLChicletPanel::postBuild()
LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
+ LLVoiceChannel::setOnCurrentVoiceChannelChanged(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
return TRUE;
}
+void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
+{
+ for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
+ {
+ if(chiclet->getSessionId() == session_id)
+ {
+ chiclet->setShowSpeaker(true);
+ continue;
+ }
+ chiclet->setShowSpeaker(false);
+ }
+ }
+}
+
S32 LLChicletPanel::calcChickletPanleWidth()
{
S32 res = 0;
@@ -897,23 +947,7 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
{
- S32 chiclet_width = ctrl->getRect().getWidth();
- S32 chiclet_new_width = ctrl->getRequiredRect().getWidth();
-
- if(chiclet_new_width == chiclet_width)
- {
- return;
- }
-
- LLRect chiclet_rect = ctrl->getRect();
- chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width;
-
- ctrl->setRect(chiclet_rect);
-
- S32 offset = chiclet_new_width - chiclet_width;
- S32 index = getChicletIndex(ctrl);
-
- shiftChiclets(offset, index + 1);
+ arrange();
trimChiclets();
showScrollButtonsIfNeeded();
}
@@ -1452,6 +1486,6 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value )
//////////////////////////////////////////////////////////////////////////
LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
- : LLIconCtrl(p)
+ : LLOutputMonitorCtrl(p)
{
}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index a830240b7d..21909d2577 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -149,11 +149,11 @@ protected:
/*
* Class for displaying status of Voice Chat
*/
-class LLChicletSpeakerCtrl : public LLIconCtrl
+class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
{
public:
- struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
+ struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params>
{
Params(){};
};
@@ -266,8 +266,6 @@ private:
* Base class for Instant Message chiclets.
* IMChiclet displays icon, number of unread messages(optional)
* and voice chat status(optional).
-* Every chiclet should override LLUICtrl::getRequiredRect and return
-* desired width.
*/
class LLIMChiclet : public LLChiclet
{
@@ -306,9 +304,14 @@ public:
virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
/*
- * Shows/hides voice chat status control.
+ * Init Speaker Control with speaker's ID
*/
- virtual void setShowSpeaker(bool show) { mShowSpeaker = show; }
+ virtual void initSpeakerControl();
+
+ /*
+ * set status (Shows/Hide) for voice control.
+ */
+ virtual void setShowSpeaker(bool show);
/*
* Returns voice chat status control visibility.
@@ -316,6 +319,11 @@ public:
virtual bool getShowSpeaker() {return mShowSpeaker;};
/*
+ * Shows/Hides for voice control for a chiclet.
+ */
+ virtual void toggleSpeakerControl();
+
+ /*
* Shows/hides overlay icon concerning new unread messages.
*/
virtual void setShowNewMessagesIcon(bool show);
@@ -325,10 +333,7 @@ public:
*/
virtual bool getShowNewMessagesIcon();
- /*
- * Draws border around chiclet.
- */
- /*virtual*/ void draw();
+ virtual void draw();
/**
* Determine whether given ID refers to a group or an IM chat session.
@@ -363,6 +368,8 @@ protected:
LLIconCtrl* mNewMessagesIcon;
LLChicletNotificationCounterCtrl* mCounterCtrl;
+ LLChicletSpeakerCtrl* mSpeakerCtrl;
+
/** the id of another participant, either an avatar id or a group id*/
LLUUID mOtherParticipantId;
@@ -410,8 +417,6 @@ public:
/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
- /*virtual*/ void setShowSpeaker(bool show);
-
/*
* 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.
@@ -419,15 +424,14 @@ public:
/*virtual*/ void setCounter(S32);
/*
- * Returns number of unread messages.
+ * Init Speaker Control with speaker's ID
*/
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+ /*virtual*/ void initSpeakerControl();
/*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
+ * Returns number of unread messages.
*/
- /*virtual*/ LLRect getRequiredRect();
+ /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
protected:
LLIMP2PChiclet(const Params& p);
@@ -457,7 +461,6 @@ protected:
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
@@ -495,15 +498,19 @@ public:
/*virtual*/ void setCounter(S32);
/*
- * Returns number of unread messages.
+ * Keep Speaker Control with actual speaker's ID
*/
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+ /*virtual*/ void draw();
/*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
+ * Init Speaker Control with speaker's ID
*/
- /*virtual*/ LLRect getRequiredRect();
+ /*virtual*/ void initSpeakerControl();
+
+ /*
+ * Returns number of unread messages.
+ */
+ /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
protected:
LLAdHocChiclet(const Params& p);
@@ -517,7 +524,6 @@ protected:
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
@@ -547,14 +553,17 @@ public:
*/
/*virtual*/ void setSessionId(const LLUUID& session_id);
+ /*
+ * Keep Speaker Control with actual speaker's ID
+ */
+ /*virtual*/ void draw();
+
/**
* Callback for LLGroupMgrObserver, we get this when group data is available or changed.
* Sets group icon.
*/
/*virtual*/ void changed(LLGroupChange gc);
- /*virtual*/ void setShowSpeaker(bool show);
-
/*
* 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.
@@ -562,15 +571,14 @@ public:
/*virtual*/ void setCounter(S32);
/*
- * Returns number of unread messages.
+ * Init Speaker Control with speaker's ID
*/
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+ /*virtual*/ void initSpeakerControl();
/*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
+ * Returns number of unread messages.
*/
- /*virtual*/ LLRect getRequiredRect();
+ /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
~LLIMGroupChiclet();
@@ -597,7 +605,6 @@ protected:
private:
LLChicletGroupIconCtrl* mChicletIconCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
@@ -736,6 +743,11 @@ public:
/*virtual*/ BOOL postBuild();
/*
+ * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
+ */
+ void onCurrentVoiceChannelChanged(const LLUUID& session_id);
+
+ /*
* Reshapes controls and rearranges chiclets if needed.
*/
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE );
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index cefc88ebee..5ab3a2aaf3 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -46,6 +46,7 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap;
LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap;
LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL;
LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
+LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChanged;
BOOL LLVoiceChannel::sSuspended = FALSE;
@@ -320,6 +321,8 @@ void LLVoiceChannel::activate()
{
setState(STATE_CALL_STARTED);
}
+
+ sCurrentVoiceChannelChanged(this->mSessionID);
}
void LLVoiceChannel::getChannelInfo()
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 8f1e9ff02d..dfa886c99c 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -54,6 +54,13 @@ public:
typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t;
+ // on current channel changed signal
+ typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
+ typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t;
+ static channel_changed_signal_t sCurrentVoiceChannelChanged;
+ static boost::signals2::connection setOnCurrentVoiceChannelChanged(channel_changed_callback_t cb) { return sCurrentVoiceChannelChanged.connect(cb); }
+
+
LLVoiceChannel(const LLUUID& session_id, const std::string& session_name);
virtual ~LLVoiceChannel();