Files
SingularityViewer/indra/newview/llmediaremotectrl.cpp
Inusaito Sayori 9723a45e72 Modernize LLIconCtrl
Adds min_height and min_width attributes
Adds mPriority for controlling priority with which to call LLUI::getUIImage*
Moves specialized setImage()s into setValue
Removes mImageName and mImageID, value is stored in base as LLSD now
2013-12-01 15:58:24 -05:00

310 lines
9.4 KiB
C++

/**
* @file llmediaremotectrl.cpp
* @brief A remote control for media (video and music)
*
* $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 "llmediaremotectrl.h"
#include "llaudioengine.h"
#include "llchat.h"
#include "llfloaterchat.h"
#include "lliconctrl.h"
#include "llmimetypes.h"
#include "lloverlaybar.h"
#include "llviewermedia.h"
#include "llviewerparcelmedia.h"
#include "llviewerparcelmgr.h"
#include "lluictrlfactory.h"
#include "llpanelaudiovolume.h"
#include "llparcel.h"
#include "llviewercontrol.h"
#include "llbutton.h"
#include "llstreamingaudio.h"
////////////////////////////////////////////////////////////////////////////////
//
//
static LLRegisterWidget<LLMediaRemoteCtrl> r("media_remote");
static std::string sLastTooltip;
LLMediaRemoteCtrl::LLMediaRemoteCtrl()
{
setIsChrome(TRUE);
setFocusRoot(TRUE);
mFactoryMap["Volume Panel"] = LLCallbackMap(createVolumePanel, NULL);
build();
}
void LLMediaRemoteCtrl::build()
{
//HACK: only works because we don't have any implicit children (i.e. titlebars, close button, etc)
deleteAllChildren();
if (gSavedSettings.getBOOL("ShowVolumeSettingsPopup"))
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_remote_expanded.xml", &getFactoryMap());
}
else
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_remote.xml", &getFactoryMap());
}
}
BOOL LLMediaRemoteCtrl::postBuild()
{
mControls = getChild<LLPanel>("media_controls");
llassert_always(mControls);
childSetAction("media_play",LLOverlayBar::toggleMediaPlay,this);
childSetAction("music_play",LLOverlayBar::toggleMusicPlay,this);
childSetAction("media_stop",LLOverlayBar::mediaStop,this);
childSetAction("music_stop",LLOverlayBar::toggleMusicPlay,this);
childSetAction("media_pause",LLOverlayBar::toggleMediaPlay,this);
childSetAction("music_pause",LLOverlayBar::toggleMusicPlay,this);
mMusicPlayBtn.connect(this,"music_play");
mMusicStopBtn.connect(this,"music_stop");
mMusicPauseBtn.connect(this,"music_pause");
mMediaPlayBtn.connect(this,"media_play");
mMediaStopBtn.connect(this,"media_stop");
mMediaPauseBtn.connect(this,"media_pause");
mMediaIcon.connect(this,"media_icon");
mMusicIcon.connect(this,"music_icon");
mExpandBtn.connect(this,"expand");
childSetAction("expand", onClickExpandBtn, this);
LLButton *pause = getChild<LLButton>("music_pause");
mCachedPauseTip = pause->getToolTip();
return TRUE;
}
void LLMediaRemoteCtrl::draw()
{
enableMediaButtons();
LLButton* expand_button = mExpandBtn;
if (expand_button)
{
if (expand_button->getToggleState())
{
expand_button->setImageOverlay("arrow_down.tga");
}
else
{
expand_button->setImageOverlay("arrow_up.tga");
}
}
LLPanel::draw();
}
LLMediaRemoteCtrl::~LLMediaRemoteCtrl ()
{
}
//static
void LLMediaRemoteCtrl::onClickExpandBtn(void* user_data)
{
LLMediaRemoteCtrl* remotep = (LLMediaRemoteCtrl*)user_data;
remotep->build();
gOverlayBar->layoutButtons();
}
//static
void* LLMediaRemoteCtrl::createVolumePanel(void* data)
{
LLPanelAudioVolume* panel = new LLPanelAudioVolume();
return panel;
}
// Virtual
void LLMediaRemoteCtrl::setToolTip(const std::string& msg)
{
// TODO: this gets removed for Media on a Prim
const std::string mime_type = LLViewerParcelMedia::getMimeType();
std::string tool_tip = LLMIMETypes::findToolTip(mime_type);
std::string play_tip = LLMIMETypes::findPlayTip(mime_type);
// childSetToolTip("media_stop", mControls->getString("stop_label") + "\n" + tool_tip);
mMediaIcon->setToolTip(tool_tip);
mMediaIcon->setToolTip(play_tip);
}
void LLMediaRemoteCtrl::enableMediaButtons()
{
// Media
bool play_media_enabled = false;
bool stop_media_enabled = false;
bool play_music_enabled = false;
bool stop_music_enabled = false;
bool music_show_pause = false;
bool media_show_pause = false;
LLColor4 music_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" );
LLColor4 media_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" );
std::string media_type = "none/none";
// Put this in xui file
std::string media_url = mControls->getString("default_tooltip_label");
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (gSavedSettings.getBOOL("AudioStreamingMedia"))
{
if ( parcel && !parcel->getMediaURL().empty())
{
// Set the tooltip
// Put this text into xui file
media_url = parcel->getMediaURL();
media_type = parcel->getMediaType();
play_media_enabled = true;
media_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" );
LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getStatus();
switch(status)
{
case LLViewerMediaImpl::MEDIA_NONE:
media_show_pause = false;
stop_media_enabled = false;
break;
case LLViewerMediaImpl::MEDIA_LOADING:
case LLViewerMediaImpl::MEDIA_LOADED:
case LLViewerMediaImpl::MEDIA_PLAYING:
// HACK: only show the pause button for movie types
media_show_pause = LLMIMETypes::widgetType(parcel->getMediaType()) == "movie" ? true : false;
stop_media_enabled = true;
play_media_enabled = false;
break;
case LLViewerMediaImpl::MEDIA_PAUSED:
media_show_pause = false;
stop_media_enabled = true;
break;
default:
// inherit defaults above
break;
}
}
}
if (gSavedSettings.getBOOL("AudioStreamingMusic") && gAudiop)
{
if ( parcel && !parcel->getMusicURL().empty())
{
play_music_enabled = true;
music_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" );
if (gOverlayBar->musicPlaying())
{
music_show_pause = true;
stop_music_enabled = true;
}
else
{
music_show_pause = false;
stop_music_enabled = false;
}
}
// Don't test the mime-type: this is not updated in a consistent basis. The existence of a valid gAudiop is enough guarantee.
}
const std::string media_icon_name = LLMIMETypes::findIcon(media_type);
LLButton* music_play_btn = mMusicPlayBtn;
LLButton* music_stop_btn = mMusicStopBtn;
LLButton* music_pause_btn = mMusicPauseBtn;
LLButton* media_play_btn = mMediaPlayBtn;
LLButton* media_stop_btn = mMediaStopBtn;
LLButton* media_pause_btn = mMediaPauseBtn;
LLIconCtrl* media_icon = mMediaIcon;
music_play_btn->setEnabled(play_music_enabled);
music_stop_btn->setEnabled(stop_music_enabled);
music_pause_btn->setEnabled(music_show_pause);
music_pause_btn->setVisible(music_show_pause);
music_play_btn->setVisible(! music_show_pause);
if(music_show_pause)
{
LLStreamingAudioInterface *stream = gAudiop ? gAudiop->getStreamingAudioImpl() : NULL;
if(stream && stream->getMetaData())
{
std::string info_text = "Loading...";
const LLSD& metadata = *(stream->getMetaData());
LLSD artist = metadata.get("ARTIST");
LLSD title = metadata.get("TITLE");
if(artist.isDefined() && title.isDefined())
info_text = artist.asString() + " -- " + title.asString();
else if(title.isDefined())
info_text = getString("Title") + ": " + title.asString();
else if(artist.isDefined())
info_text = getString("Artist") + ": " + artist.asString();
if(music_pause_btn->getToolTip() != info_text) //Has info_text changed since last call?
{
music_pause_btn->setToolTip(info_text);
static LLCachedControl<bool> announce_stream_metadata("AnnounceStreamMetadata");
if(announce_stream_metadata && info_text != sLastTooltip && info_text != "Loading...") //Are we announcing? Don't annoounce what we've last announced. Don't announce Loading.
{
sLastTooltip = info_text;
LLChat chat;
chat.mText = getString("Now_playing") + " " + info_text;
chat.mSourceType = CHAT_SOURCE_SYSTEM;
// Lie to RLVa so it won't filter this
chat.mRlvLocFiltered = true;
chat.mRlvNamesFiltered = true;
LLFloaterChat::addChat(chat);
}
}
}
else
music_pause_btn->setToolTip(mCachedPauseTip);
}
mMusicIcon->setColor(music_icon_color);
if(!media_icon_name.empty())
{
media_icon->setValue(media_icon_name);
}
media_play_btn->setEnabled(play_media_enabled);
media_stop_btn->setEnabled(stop_media_enabled);
media_pause_btn->setEnabled(media_show_pause);
media_pause_btn->setVisible(media_show_pause);
media_play_btn->setVisible(! media_show_pause);
mMediaIcon->setColor(media_icon_color);
setToolTip(media_url);
}