296 lines
8.0 KiB
C++
296 lines
8.0 KiB
C++
/* @file llvoiceremotectrl.cpp
|
|
* @brief A remote control for voice chat
|
|
*
|
|
* $LicenseInfo:firstyear=2005&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2005-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
#include "llvoiceremotectrl.h"
|
|
|
|
#include "llagent.h"
|
|
#include "llui.h"
|
|
#include "llbutton.h"
|
|
#include "lluictrlfactory.h"
|
|
#include "llviewercontrol.h"
|
|
#include "llvoiceclient.h"
|
|
#include "llimpanel.h"
|
|
#include "llfloateractivespeakers.h"
|
|
#include "llfloaterchatterbox.h"
|
|
#include "lliconctrl.h"
|
|
#include "lloverlaybar.h"
|
|
#include "lltextbox.h"
|
|
|
|
LLVoiceRemoteCtrl::LLVoiceRemoteCtrl (const std::string& name) : LLPanel(name)
|
|
{
|
|
setIsChrome(TRUE);
|
|
|
|
if (gSavedSettings.getBOOL("ShowVoiceChannelPopup"))
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote_expanded.xml");
|
|
}
|
|
else
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote.xml");
|
|
}
|
|
|
|
setFocusRoot(TRUE);
|
|
}
|
|
|
|
LLVoiceRemoteCtrl::~LLVoiceRemoteCtrl()
|
|
{
|
|
}
|
|
|
|
BOOL LLVoiceRemoteCtrl::postBuild()
|
|
{
|
|
mTalkBtn = getChild<LLButton>("push_to_talk");
|
|
mTalkBtn->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnTalkClicked));
|
|
mTalkBtn->setHeldDownCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnTalkHeld));
|
|
mTalkBtn->setMouseUpCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnTalkReleased));
|
|
|
|
mTalkLockBtn = getChild<LLButton>("ptt_lock");
|
|
mTalkLockBtn->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnLock,this));
|
|
|
|
mSpeakersBtn = getChild<LLButton>("speakers_btn");
|
|
mSpeakersBtn->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onClickSpeakers));
|
|
|
|
childSetAction("show_channel", onClickPopupBtn, this);
|
|
childSetAction("end_call_btn", onClickEndCall, this);
|
|
|
|
LLTextBox* text = getChild<LLTextBox>("channel_label");
|
|
if (text)
|
|
{
|
|
text->setUseEllipses(TRUE);
|
|
}
|
|
|
|
childSetAction("voice_channel_bg", onClickVoiceChannel, this);
|
|
|
|
mEndCallBtn.connect(this,"end_call_btn");
|
|
mVoiceVolIcon.connect(this,"voice_volume");
|
|
mVoiceChanIcon.connect(this,"voice_channel_icon");
|
|
mVoiceChanBgBtn.connect(this,"voice_channel_bg");
|
|
mChanLabelTextBox.connect(this,"channel_label");
|
|
mShowChanBtn.connect(this,"show_channel");
|
|
return TRUE;
|
|
}
|
|
|
|
void LLVoiceRemoteCtrl::draw()
|
|
{
|
|
BOOL voice_active = FALSE;
|
|
LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
|
|
if (channelp)
|
|
{
|
|
voice_active = channelp->isActive();
|
|
}
|
|
|
|
mTalkBtn->setEnabled(voice_active);
|
|
mTalkLockBtn->setEnabled(voice_active);
|
|
|
|
static LLCachedControl<bool> ptt_currently_enabled("PTTCurrentlyEnabled",false);
|
|
// propagate ptt state to button display,
|
|
if (!mTalkBtn->hasMouseCapture())
|
|
{
|
|
// not in push to talk mode, or push to talk is active means I'm talking
|
|
mTalkBtn->setToggleState(!ptt_currently_enabled || gVoiceClient->getUserPTTState());
|
|
}
|
|
mSpeakersBtn->setToggleState(LLFloaterActiveSpeakers::instanceVisible(LLSD()));
|
|
mTalkLockBtn->setToggleState(!ptt_currently_enabled);
|
|
|
|
std::string talk_blip_image;
|
|
if (gVoiceClient->getIsSpeaking(gAgent.getID()))
|
|
{
|
|
F32 voice_power = gVoiceClient->getCurrentPower(gAgent.getID());
|
|
|
|
if (voice_power > LLVoiceClient::OVERDRIVEN_POWER_LEVEL)
|
|
{
|
|
talk_blip_image = "icn_voice_ptt-on-lvl3.tga";
|
|
}
|
|
else
|
|
{
|
|
F32 power = gVoiceClient->getCurrentPower(gAgent.getID());
|
|
S32 icon_image_idx = llmin(2, llfloor((power / LLVoiceClient::OVERDRIVEN_POWER_LEVEL) * 3.f));
|
|
|
|
switch(icon_image_idx)
|
|
{
|
|
case 0:
|
|
talk_blip_image = "icn_voice_ptt-on.tga";
|
|
break;
|
|
case 1:
|
|
talk_blip_image = "icn_voice_ptt-on-lvl1.tga";
|
|
break;
|
|
case 2:
|
|
talk_blip_image = "icn_voice_ptt-on-lvl2.tga";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
talk_blip_image = "icn_voice_ptt-off.tga";
|
|
}
|
|
|
|
LLIconCtrl* icon = mVoiceVolIcon;
|
|
if (icon)
|
|
{
|
|
icon->setImage(talk_blip_image);
|
|
}
|
|
|
|
LLFloater* voice_floater = LLFloaterChatterBox::getInstance()->getCurrentVoiceFloater();
|
|
std::string active_channel_name;
|
|
if (voice_floater)
|
|
{
|
|
active_channel_name = voice_floater->getShortTitle();
|
|
}
|
|
|
|
LLVoiceChannel* current_channel = LLVoiceChannel::getCurrentVoiceChannel();
|
|
mEndCallBtn->setEnabled(LLVoiceClient::voiceEnabled()
|
|
&& current_channel
|
|
&& current_channel->isActive()
|
|
&& current_channel != LLVoiceChannelProximal::getInstance());
|
|
|
|
mChanLabelTextBox->setValue(active_channel_name);
|
|
mVoiceChanBgBtn->setToolTip(active_channel_name);
|
|
|
|
if (current_channel)
|
|
{
|
|
LLIconCtrl* voice_channel_icon = mVoiceChanIcon;
|
|
if (voice_channel_icon && voice_floater)
|
|
{
|
|
voice_channel_icon->setImage(voice_floater->getString("voice_icon"));
|
|
}
|
|
|
|
LLButton* voice_channel_bg = mVoiceChanBgBtn;
|
|
if (voice_channel_bg)
|
|
{
|
|
LLColor4 bg_color;
|
|
if (current_channel->isActive())
|
|
{
|
|
bg_color = lerp(LLColor4::green, LLColor4::white, 0.7f);
|
|
}
|
|
else if (current_channel->getState() == LLVoiceChannel::STATE_ERROR)
|
|
{
|
|
bg_color = lerp(LLColor4::red, LLColor4::white, 0.7f);
|
|
}
|
|
else // active, but not connected
|
|
{
|
|
bg_color = lerp(LLColor4::yellow, LLColor4::white, 0.7f);
|
|
}
|
|
voice_channel_bg->setImageColor(bg_color);
|
|
}
|
|
}
|
|
|
|
LLButton* expand_button = mShowChanBtn;
|
|
if (expand_button)
|
|
{
|
|
if (expand_button->getToggleState())
|
|
{
|
|
expand_button->setImageOverlay(std::string("arrow_down.tga"));
|
|
}
|
|
else
|
|
{
|
|
expand_button->setImageOverlay(std::string("arrow_up.tga"));
|
|
}
|
|
}
|
|
|
|
LLPanel::draw();
|
|
}
|
|
|
|
void LLVoiceRemoteCtrl::onBtnTalkClicked()
|
|
{
|
|
// when in toggle mode, clicking talk button turns mic on/off
|
|
if (gSavedSettings.getBOOL("PushToTalkToggle"))
|
|
{
|
|
gVoiceClient->toggleUserPTTState();
|
|
}
|
|
}
|
|
|
|
void LLVoiceRemoteCtrl::onBtnTalkHeld()
|
|
{
|
|
// when not in toggle mode, holding down talk button turns on mic
|
|
if (!gSavedSettings.getBOOL("PushToTalkToggle"))
|
|
{
|
|
gVoiceClient->setUserPTTState(true);
|
|
}
|
|
}
|
|
|
|
void LLVoiceRemoteCtrl::onBtnTalkReleased()
|
|
{
|
|
// when not in toggle mode, releasing talk button turns off mic
|
|
if (!gSavedSettings.getBOOL("PushToTalkToggle"))
|
|
{
|
|
gVoiceClient->setUserPTTState(false);
|
|
}
|
|
}
|
|
|
|
void LLVoiceRemoteCtrl::onBtnLock(void* user_data)
|
|
{
|
|
LLVoiceRemoteCtrl* remotep = (LLVoiceRemoteCtrl*)user_data;
|
|
|
|
gSavedSettings.setBOOL("PTTCurrentlyEnabled", !remotep->mTalkLockBtn->getToggleState());
|
|
}
|
|
|
|
//static
|
|
void LLVoiceRemoteCtrl::onClickPopupBtn(void* user_data)
|
|
{
|
|
LLVoiceRemoteCtrl* remotep = (LLVoiceRemoteCtrl*)user_data;
|
|
|
|
remotep->deleteAllChildren();
|
|
if (gSavedSettings.getBOOL("ShowVoiceChannelPopup"))
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildPanel(remotep, "panel_voice_remote_expanded.xml");
|
|
}
|
|
else
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildPanel(remotep, "panel_voice_remote.xml");
|
|
}
|
|
gOverlayBar->layoutButtons();
|
|
}
|
|
|
|
//static
|
|
void LLVoiceRemoteCtrl::onClickEndCall(void* user_data)
|
|
{
|
|
LLVoiceChannel* current_channel = LLVoiceChannel::getCurrentVoiceChannel();
|
|
|
|
if (current_channel && current_channel != LLVoiceChannelProximal::getInstance())
|
|
{
|
|
current_channel->deactivate();
|
|
}
|
|
}
|
|
|
|
|
|
void LLVoiceRemoteCtrl::onClickSpeakers()
|
|
{
|
|
LLFloaterActiveSpeakers::toggleInstance(LLSD());
|
|
}
|
|
|
|
//static
|
|
void LLVoiceRemoteCtrl::onClickVoiceChannel(void* user_data)
|
|
{
|
|
LLFloaterChatterBox::showInstance();
|
|
}
|