SL-16344 #3 Moved LLPanelFace related code into LLPanelFace
parent
1b929cb9a9
commit
8ea7867528
|
|
@ -46,7 +46,6 @@
|
|||
#include "llfloaterreg.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "llmediactrl.h"
|
||||
#include "llmenugl.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llpanelcontents.h"
|
||||
|
|
@ -240,7 +239,6 @@ BOOL LLFloaterTools::postBuild()
|
|||
mRadioGroupMove = getChild<LLRadioGroup>("move_radio_group");
|
||||
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
|
||||
mBtnGridOptions = getChild<LLButton>("Options...");
|
||||
mTitleMedia = getChild<LLMediaCtrl>("title_media");
|
||||
mBtnLink = getChild<LLButton>("link_btn");
|
||||
mBtnUnlink = getChild<LLButton>("unlink_btn");
|
||||
|
||||
|
|
@ -329,7 +327,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
|
||||
mCheckSnapToGrid(NULL),
|
||||
mBtnGridOptions(NULL),
|
||||
mTitleMedia(NULL),
|
||||
mComboGridMode(NULL),
|
||||
mCheckStretchUniform(NULL),
|
||||
mCheckStretchTexture(NULL),
|
||||
|
|
@ -369,8 +366,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mLandImpactsObserver(NULL),
|
||||
|
||||
mDirty(TRUE),
|
||||
mHasSelection(TRUE),
|
||||
mNeedMediaTitle(TRUE)
|
||||
mHasSelection(TRUE)
|
||||
{
|
||||
gFloaterTools = this;
|
||||
|
||||
|
|
@ -394,9 +390,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
|
||||
mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
|
||||
mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
|
||||
|
||||
mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
|
||||
mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
|
||||
|
|
@ -522,7 +515,7 @@ void LLFloaterTools::refresh()
|
|||
mPanelObject->refresh();
|
||||
mPanelVolume->refresh();
|
||||
mPanelFace->refresh();
|
||||
refreshMedia();
|
||||
mPanelFace->refreshMedia();
|
||||
mPanelContents->refresh();
|
||||
mPanelLandInfo->refresh();
|
||||
|
||||
|
|
@ -549,9 +542,6 @@ void LLFloaterTools::draw()
|
|||
mDirty = FALSE;
|
||||
}
|
||||
|
||||
// grab media name/title and update the UI widget
|
||||
updateMediaTitle();
|
||||
|
||||
// mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
|
@ -874,8 +864,7 @@ void LLFloaterTools::onClose(bool app_quitting)
|
|||
LLViewerJoystick::getInstance()->moveAvatar(false);
|
||||
|
||||
// destroy media source used to grab media title
|
||||
if( mTitleMedia )
|
||||
mTitleMedia->unloadMediaSource();
|
||||
mPanelFace->unloadMedia();
|
||||
|
||||
// Different from handle_reset_view in that it doesn't actually
|
||||
// move the camera if EditCameraMovement is not set.
|
||||
|
|
@ -1128,51 +1117,6 @@ void LLFloaterTools::onFocusReceived()
|
|||
LLFloater::onFocusReceived();
|
||||
}
|
||||
|
||||
// Media stuff
|
||||
void LLFloaterTools::refreshMedia()
|
||||
{
|
||||
getMediaState();
|
||||
}
|
||||
|
||||
bool LLFloaterTools::selectedMediaEditable()
|
||||
{
|
||||
U32 owner_mask_on;
|
||||
U32 owner_mask_off;
|
||||
U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER,
|
||||
&owner_mask_on, &owner_mask_off );
|
||||
U32 group_mask_on;
|
||||
U32 group_mask_off;
|
||||
U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP,
|
||||
&group_mask_on, &group_mask_off );
|
||||
U32 everyone_mask_on;
|
||||
U32 everyone_mask_off;
|
||||
S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE,
|
||||
&everyone_mask_on, &everyone_mask_off );
|
||||
|
||||
bool selected_Media_editable = false;
|
||||
|
||||
// if perms we got back are valid
|
||||
if ( valid_owner_perms &&
|
||||
valid_group_perms &&
|
||||
valid_everyone_perms )
|
||||
{
|
||||
|
||||
if ( ( owner_mask_on & PERM_MODIFY ) ||
|
||||
( group_mask_on & PERM_MODIFY ) ||
|
||||
( group_mask_on & PERM_MODIFY ) )
|
||||
{
|
||||
selected_Media_editable = true;
|
||||
}
|
||||
else
|
||||
// user is NOT allowed to press the RESET button
|
||||
{
|
||||
selected_Media_editable = false;
|
||||
};
|
||||
};
|
||||
|
||||
return selected_Media_editable;
|
||||
}
|
||||
|
||||
void LLFloaterTools::updateLandImpacts()
|
||||
{
|
||||
LLParcel *parcel = mParcelSelection->getParcel();
|
||||
|
|
@ -1209,784 +1153,3 @@ void LLFloaterTools::updateLandImpacts()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterTools::getMediaState()
|
||||
{
|
||||
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
|
||||
LLViewerObject* first_object = selected_objects->getFirstObject();
|
||||
LLTextBox* media_info = getChild<LLTextBox>("media_info");
|
||||
|
||||
if( !(first_object
|
||||
&& first_object->getPCode() == LL_PCODE_VOLUME
|
||||
&&first_object->permModify()
|
||||
))
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
media_info->clear();
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string url = first_object->getRegion()->getCapability("ObjectMedia");
|
||||
bool has_media_capability = (!url.empty());
|
||||
|
||||
if(!has_media_capability)
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
|
||||
&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
|
||||
|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
|
||||
bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
|
||||
|
||||
// Check modify permissions and whether any selected objects are in
|
||||
// the process of being fetched. If they are, then we're not editable
|
||||
if (editable)
|
||||
{
|
||||
LLObjectSelection::iterator iter = selected_objects->begin();
|
||||
LLObjectSelection::iterator end = selected_objects->end();
|
||||
for ( ; iter != end; ++iter)
|
||||
{
|
||||
LLSelectNode* node = *iter;
|
||||
LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
|
||||
if (NULL != object)
|
||||
{
|
||||
if (!object->permModify())
|
||||
{
|
||||
LL_INFOS("LLFloaterToolsMedia")
|
||||
<< "Selection not editable due to lack of modify permissions on object id "
|
||||
<< object->getID() << LL_ENDL;
|
||||
|
||||
editable = false;
|
||||
break;
|
||||
}
|
||||
// XXX DISABLE this for now, because when the fetch finally
|
||||
// does come in, the state of this floater doesn't properly
|
||||
// update. Re-selecting fixes the problem, but there is
|
||||
// contention as to whether this is a sufficient solution.
|
||||
// if (object->isMediaDataBeingFetched())
|
||||
// {
|
||||
// LL_INFOS("LLFloaterToolsMedia")
|
||||
// << "Selection not editable due to media data being fetched for object id "
|
||||
// << object->getID() << LL_ENDL;
|
||||
//
|
||||
// editable = false;
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Media settings
|
||||
bool bool_has_media = false;
|
||||
struct media_functor : public LLSelectedTEGetFunctor<bool>
|
||||
{
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
LLTextureEntry *te = object->getTE(face);
|
||||
if (te)
|
||||
{
|
||||
return te->hasMedia();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} func;
|
||||
|
||||
|
||||
// check if all faces have media(or, all dont have media)
|
||||
LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
|
||||
{
|
||||
functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
LLMediaEntry get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return *(object->getTE(face)->getMediaData());
|
||||
return mMediaEntry;
|
||||
};
|
||||
|
||||
const LLMediaEntry& mMediaEntry;
|
||||
|
||||
} func_media_data(default_media_data);
|
||||
|
||||
LLMediaEntry media_data_get;
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get ));
|
||||
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
std::string media_title = "";
|
||||
// update UI depending on whether "object" (prim or face) has media
|
||||
// and whether or not you are allowed to edit it.
|
||||
|
||||
getChildView("add_media")->setEnabled(editable);
|
||||
// IF all the faces have media (or all dont have media)
|
||||
if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
|
||||
{
|
||||
// TODO: get media title and set it.
|
||||
media_info->clear();
|
||||
// if identical is set, all faces are same (whether all empty or has the same media)
|
||||
if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) )
|
||||
{
|
||||
// Media data is valid
|
||||
if(media_data_get!=default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
// else all faces might be empty.
|
||||
}
|
||||
else // there' re Different Medias' been set on on the faces.
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(bool_has_media && editable );
|
||||
// TODO: display a list of all media on the face - use 'identical' flag
|
||||
}
|
||||
else // not all face has media but at least one does.
|
||||
{
|
||||
// seleted faces have not identical value
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data );
|
||||
|
||||
if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Media data is valid
|
||||
if(media_data_get!=default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
navigateToTitleMedia(media_title);
|
||||
media_info->setText(media_title);
|
||||
|
||||
// load values for media settings
|
||||
updateMediaSettings();
|
||||
|
||||
LLFloaterMediaSettings::initValues(mMediaSettings, editable );
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to add media to a prim or prim face
|
||||
void LLFloaterTools::onClickBtnAddMedia()
|
||||
{
|
||||
// check if multiple faces are selected
|
||||
if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
|
||||
{
|
||||
LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
|
||||
}
|
||||
else
|
||||
{
|
||||
onClickBtnEditMedia();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch( option )
|
||||
{
|
||||
case 0: // "Yes"
|
||||
gFloaterTools->onClickBtnEditMedia();
|
||||
break;
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to edit existing media settings on a prim or prim face
|
||||
// TODO: test if there is media on the item and only allow editing if present
|
||||
void LLFloaterTools::onClickBtnEditMedia()
|
||||
{
|
||||
refreshMedia();
|
||||
LLFloaterReg::showInstance("media_settings");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to delete media from a prim or prim face
|
||||
void LLFloaterTools::onClickBtnDeleteMedia()
|
||||
{
|
||||
LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch( option )
|
||||
{
|
||||
case 0: // "Yes"
|
||||
LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() );
|
||||
if(LLFloaterReg::instanceVisible("media_settings"))
|
||||
{
|
||||
LLFloaterReg::hideInstance("media_settings");
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::clearMediaSettings()
|
||||
{
|
||||
LLFloaterMediaSettings::clearValues(false);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::navigateToTitleMedia( const std::string url )
|
||||
{
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
if (url.empty() || multi_media_info_str == url)
|
||||
{
|
||||
// nothing to show
|
||||
mNeedMediaTitle = false;
|
||||
}
|
||||
else if (mTitleMedia)
|
||||
{
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
// check if url changed or if we need a new media source
|
||||
if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
|
||||
{
|
||||
mTitleMedia->navigateTo( url );
|
||||
|
||||
LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mTitleMedia->getTextureID());
|
||||
if (impl)
|
||||
{
|
||||
// if it's a page with a movie, we don't want to hear it
|
||||
impl->setVolume(0);
|
||||
};
|
||||
}
|
||||
|
||||
// flag that we need to update the title (even if no request were made)
|
||||
mNeedMediaTitle = true;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::updateMediaTitle()
|
||||
{
|
||||
// only get the media name if we need it
|
||||
if ( ! mNeedMediaTitle )
|
||||
return;
|
||||
|
||||
// get plugin impl
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
if ( media_plugin && mTitleMedia->getCurrentNavUrl() == media_plugin->getNavigateURI())
|
||||
{
|
||||
// get the media name (asynchronous - must call repeatedly)
|
||||
std::string media_title = media_plugin->getMediaName();
|
||||
|
||||
// only replace the title if what we get contains something
|
||||
if ( ! media_title.empty() )
|
||||
{
|
||||
// update the UI widget
|
||||
LLTextBox* media_title_field = getChild<LLTextBox>("media_info");
|
||||
if ( media_title_field )
|
||||
{
|
||||
media_title_field->setText( media_title );
|
||||
|
||||
// stop looking for a title when we get one
|
||||
// FIXME: check this is the right approach
|
||||
mNeedMediaTitle = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::updateMediaSettings()
|
||||
{
|
||||
bool identical( false );
|
||||
std::string base_key( "" );
|
||||
std::string value_str( "" );
|
||||
int value_int = 0;
|
||||
bool value_bool = false;
|
||||
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
|
||||
// TODO: (CP) refactor this using something clever or boost or both !!
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
// controls
|
||||
U8 value_u8 = default_media_data.getControls();
|
||||
struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
|
||||
{
|
||||
functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
|
||||
|
||||
U8 get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getControls();
|
||||
return mMediaEntry.getControls();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_controls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
|
||||
base_key = std::string( LLMediaEntry::CONTROLS_KEY );
|
||||
mMediaSettings[ base_key ] = value_u8;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// First click (formerly left click)
|
||||
value_bool = default_media_data.getFirstClickInteract();
|
||||
struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getFirstClickInteract();
|
||||
return mMediaEntry.getFirstClickInteract();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_first_click(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
|
||||
base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Home URL
|
||||
value_str = default_media_data.getHomeURL();
|
||||
struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::string get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getHomeURL();
|
||||
return mMediaEntry.getHomeURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_home_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
|
||||
base_key = std::string( LLMediaEntry::HOME_URL_KEY );
|
||||
mMediaSettings[ base_key ] = value_str;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Current URL
|
||||
value_str = default_media_data.getCurrentURL();
|
||||
struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::string get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getCurrentURL();
|
||||
return mMediaEntry.getCurrentURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_current_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
|
||||
base_key = std::string( LLMediaEntry::CURRENT_URL_KEY );
|
||||
mMediaSettings[ base_key ] = value_str;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto zoom
|
||||
value_bool = default_media_data.getAutoZoom();
|
||||
struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
|
||||
functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoZoom();
|
||||
return mMediaEntry.getAutoZoom();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_zoom(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto play
|
||||
//value_bool = default_media_data.getAutoPlay();
|
||||
// set default to auto play TRUE -- angela EXT-5172
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoPlay();
|
||||
//return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_play(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
|
||||
// Auto scale
|
||||
// set default to auto scale TRUE -- angela EXT-5172
|
||||
//value_bool = default_media_data.getAutoScale();
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoScale();
|
||||
// return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_scale(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto loop
|
||||
value_bool = default_media_data.getAutoLoop();
|
||||
struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoLoop();
|
||||
return mMediaEntry.getAutoLoop();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_loop(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// width pixels (if not auto scaled)
|
||||
value_int = default_media_data.getWidthPixels();
|
||||
struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
int get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWidthPixels();
|
||||
return mMediaEntry.getWidthPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_width_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
|
||||
base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY );
|
||||
mMediaSettings[ base_key ] = value_int;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// height pixels (if not auto scaled)
|
||||
value_int = default_media_data.getHeightPixels();
|
||||
struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
int get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getHeightPixels();
|
||||
return mMediaEntry.getHeightPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_height_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
|
||||
base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY );
|
||||
mMediaSettings[ base_key ] = value_int;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Enable Alt image
|
||||
value_bool = default_media_data.getAltImageEnable();
|
||||
struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAltImageEnable();
|
||||
return mMediaEntry.getAltImageEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_enable_alt_image(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
|
||||
base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - owner interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
|
||||
struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - owner control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
|
||||
struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_control(default_media_data);
|
||||
identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - group interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
|
||||
struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - group control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
|
||||
struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - anyone interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
|
||||
struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_interact(default_media_data);
|
||||
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - anyone control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
|
||||
struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// security - whitelist enable
|
||||
value_bool = default_media_data.getWhiteListEnable();
|
||||
struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWhiteListEnable();
|
||||
return mMediaEntry.getWhiteListEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_enable(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
|
||||
base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// security - whitelist URLs
|
||||
std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
|
||||
struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
|
||||
{
|
||||
functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::vector<std::string> get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWhiteList();
|
||||
return mMediaEntry.getWhiteList();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_urls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
|
||||
base_key = std::string( LLMediaEntry::WHITELIST_KEY );
|
||||
mMediaSettings[ base_key ].clear();
|
||||
std::vector< std::string >::iterator iter = value_vector_str.begin();
|
||||
while( iter != value_vector_str.end() )
|
||||
{
|
||||
std::string white_list_url = *iter;
|
||||
mMediaSettings[ base_key ].append( white_list_url );
|
||||
++iter;
|
||||
};
|
||||
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ class LLRadioGroup;
|
|||
class LLSlider;
|
||||
class LLTabContainer;
|
||||
class LLTextBox;
|
||||
class LLMediaCtrl;
|
||||
class LLTool;
|
||||
class LLParcelSelection;
|
||||
class LLObjectSelection;
|
||||
|
|
@ -98,11 +97,6 @@ public:
|
|||
static void setEditTool(void* data);
|
||||
void setTool(const LLSD& user_data);
|
||||
void saveLastTool();
|
||||
void onClickBtnDeleteMedia();
|
||||
void onClickBtnAddMedia();
|
||||
void onClickBtnEditMedia();
|
||||
void clearMediaSettings();
|
||||
bool selectedMediaEditable();
|
||||
void updateLandImpacts();
|
||||
|
||||
static void setGridMode(S32 mode);
|
||||
|
|
@ -111,13 +105,6 @@ public:
|
|||
|
||||
private:
|
||||
void refresh();
|
||||
void refreshMedia();
|
||||
void getMediaState();
|
||||
void updateMediaSettings();
|
||||
void navigateToTitleMedia( const std::string url ); // navigate if changed
|
||||
void updateMediaTitle();
|
||||
static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
|
||||
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
|
||||
static void setObjectType( LLPCode pcode );
|
||||
void onClickGridOptions();
|
||||
|
||||
|
|
@ -193,19 +180,12 @@ public:
|
|||
LLParcelSelectionHandle mParcelSelection;
|
||||
LLObjectSelectionHandle mObjectSelection;
|
||||
|
||||
LLMediaCtrl *mTitleMedia;
|
||||
bool mNeedMediaTitle;
|
||||
|
||||
private:
|
||||
BOOL mDirty;
|
||||
BOOL mHasSelection;
|
||||
|
||||
std::map<std::string, std::string> mStatusText;
|
||||
|
||||
|
||||
protected:
|
||||
LLSD mMediaSettings;
|
||||
|
||||
public:
|
||||
static bool sShowObjectCost;
|
||||
static bool sPreviousFocusOnAvatar;
|
||||
|
|
|
|||
|
|
@ -112,16 +112,6 @@ void LLFloaterURLEntry::headerFetchComplete(S32 status, const std::string& mime_
|
|||
panel_media->setMediaType(mime_type);
|
||||
panel_media->setMediaURL(mMediaURLEdit->getValue().asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanelFace* panel_face = dynamic_cast<LLPanelFace*>(mPanelLandMediaHandle.get());
|
||||
if(panel_face)
|
||||
{
|
||||
panel_face->setMediaType(mime_type);
|
||||
panel_face->setMediaURL(mMediaURLEdit->getValue().asString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
getChildView("loading_label")->setVisible( false);
|
||||
closeFloater();
|
||||
|
|
|
|||
|
|
@ -45,10 +45,14 @@
|
|||
#include "llcombobox.h"
|
||||
#include "lldrawpoolbump.h"
|
||||
#include "llface.h"
|
||||
#include "llfloatermediasettings.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llmaterialmgr.h"
|
||||
#include "llmediactrl.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llpanelcontents.h"
|
||||
#include "llradiogroup.h"
|
||||
#include "llresmgr.h"
|
||||
#include "llselectmgr.h"
|
||||
|
|
@ -155,6 +159,10 @@ BOOL LLPanelFace::postBuild()
|
|||
childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);
|
||||
childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this);
|
||||
|
||||
mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLPanelFace::onClickBtnAddMedia, this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLPanelFace::onClickBtnDeleteMedia, this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLPanelFace::onClickBtnEditMedia, this));
|
||||
|
||||
childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
|
||||
childSetAction("button align textures", &LLPanelFace::onAlignTexture, this);
|
||||
|
||||
|
|
@ -298,7 +306,9 @@ BOOL LLPanelFace::postBuild()
|
|||
{
|
||||
mCtrlGlow->setCommitCallback(LLPanelFace::onCommitGlow, this);
|
||||
}
|
||||
|
||||
|
||||
mTitleMedia = getChild<LLMediaCtrl>("title_media");
|
||||
mTitleMediaText = getChild<LLTextBox>("media_info");
|
||||
|
||||
clearCtrls();
|
||||
|
||||
|
|
@ -307,7 +317,9 @@ BOOL LLPanelFace::postBuild()
|
|||
|
||||
LLPanelFace::LLPanelFace()
|
||||
: LLPanel(),
|
||||
mIsAlpha(false)
|
||||
mIsAlpha(false),
|
||||
mTitleMedia(NULL),
|
||||
mNeedMediaTitle(true)
|
||||
{
|
||||
USE_TEXTURE = LLTrans::getString("use_texture");
|
||||
}
|
||||
|
|
@ -315,7 +327,7 @@ LLPanelFace::LLPanelFace()
|
|||
|
||||
LLPanelFace::~LLPanelFace()
|
||||
{
|
||||
// Children all cleaned up by default view destructor.
|
||||
unloadMedia();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1574,6 +1586,752 @@ void LLPanelFace::refresh()
|
|||
getState();
|
||||
}
|
||||
|
||||
void LLPanelFace::refreshMedia()
|
||||
{
|
||||
LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
|
||||
LLViewerObject* first_object = selected_objects->getFirstObject();
|
||||
|
||||
if (!(first_object
|
||||
&& first_object->getPCode() == LL_PCODE_VOLUME
|
||||
&& first_object->permModify()
|
||||
))
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
mTitleMediaText->clear();
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string url = first_object->getRegion()->getCapability("ObjectMedia");
|
||||
bool has_media_capability = (!url.empty());
|
||||
|
||||
if (!has_media_capability)
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
|
||||
&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
|
||||
|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
|
||||
bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
|
||||
|
||||
// Check modify permissions and whether any selected objects are in
|
||||
// the process of being fetched. If they are, then we're not editable
|
||||
if (editable)
|
||||
{
|
||||
LLObjectSelection::iterator iter = selected_objects->begin();
|
||||
LLObjectSelection::iterator end = selected_objects->end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
LLSelectNode* node = *iter;
|
||||
LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
|
||||
if (NULL != object)
|
||||
{
|
||||
if (!object->permModify())
|
||||
{
|
||||
LL_INFOS("LLFloaterToolsMedia")
|
||||
<< "Selection not editable due to lack of modify permissions on object id "
|
||||
<< object->getID() << LL_ENDL;
|
||||
|
||||
editable = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Media settings
|
||||
bool bool_has_media = false;
|
||||
struct media_functor : public LLSelectedTEGetFunctor<bool>
|
||||
{
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
LLTextureEntry *te = object->getTE(face);
|
||||
if (te)
|
||||
{
|
||||
return te->hasMedia();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} func;
|
||||
|
||||
|
||||
// check if all faces have media(or, all dont have media)
|
||||
LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue(&func, bool_has_media);
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
|
||||
{
|
||||
functor_getter_media_data(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
LLMediaEntry get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return *(object->getTE(face)->getMediaData());
|
||||
return mMediaEntry;
|
||||
};
|
||||
|
||||
const LLMediaEntry& mMediaEntry;
|
||||
|
||||
} func_media_data(default_media_data);
|
||||
|
||||
LLMediaEntry media_data_get;
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get));
|
||||
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
std::string media_title = "";
|
||||
// update UI depending on whether "object" (prim or face) has media
|
||||
// and whether or not you are allowed to edit it.
|
||||
|
||||
getChildView("add_media")->setEnabled(editable);
|
||||
// IF all the faces have media (or all dont have media)
|
||||
if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo)
|
||||
{
|
||||
// TODO: get media title and set it.
|
||||
mTitleMediaText->clear();
|
||||
// if identical is set, all faces are same (whether all empty or has the same media)
|
||||
if (!(LLFloaterMediaSettings::getInstance()->mMultipleMedia))
|
||||
{
|
||||
// Media data is valid
|
||||
if (media_data_get != default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
// else all faces might be empty.
|
||||
}
|
||||
else // there' re Different Medias' been set on on the faces.
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(bool_has_media && editable);
|
||||
// TODO: display a list of all media on the face - use 'identical' flag
|
||||
}
|
||||
else // not all face has media but at least one does.
|
||||
{
|
||||
// seleted faces have not identical value
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data);
|
||||
|
||||
if (LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Media data is valid
|
||||
if (media_data_get != default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
navigateToTitleMedia(media_title);
|
||||
mTitleMediaText->setText(media_title);
|
||||
|
||||
// load values for media settings
|
||||
updateMediaSettings();
|
||||
|
||||
LLFloaterMediaSettings::initValues(mMediaSettings, editable);
|
||||
}
|
||||
|
||||
void LLPanelFace::unloadMedia()
|
||||
{
|
||||
// destroy media source used to grab media title
|
||||
if (mTitleMedia)
|
||||
mTitleMedia->unloadMediaSource();
|
||||
}
|
||||
|
||||
void LLPanelFace::draw()
|
||||
{
|
||||
// grab media name/title and update the UI widget
|
||||
// Todo: move it, it's preferable not to update
|
||||
// labels inside draw
|
||||
updateMediaTitle();
|
||||
|
||||
// mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
|
||||
LLPanel::draw();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLPanelFace::navigateToTitleMedia( const std::string url )
|
||||
{
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
if (url.empty() || multi_media_info_str == url)
|
||||
{
|
||||
// nothing to show
|
||||
mNeedMediaTitle = false;
|
||||
}
|
||||
else if (mTitleMedia)
|
||||
{
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
// check if url changed or if we need a new media source
|
||||
if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
|
||||
{
|
||||
mTitleMedia->navigateTo( url );
|
||||
|
||||
LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mTitleMedia->getTextureID());
|
||||
if (impl)
|
||||
{
|
||||
// if it's a page with a movie, we don't want to hear it
|
||||
impl->setVolume(0);
|
||||
};
|
||||
}
|
||||
|
||||
// flag that we need to update the title (even if no request were made)
|
||||
mNeedMediaTitle = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLPanelFace::selectedMediaEditable()
|
||||
{
|
||||
U32 owner_mask_on;
|
||||
U32 owner_mask_off;
|
||||
U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
|
||||
&owner_mask_on, &owner_mask_off);
|
||||
U32 group_mask_on;
|
||||
U32 group_mask_off;
|
||||
U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
|
||||
&group_mask_on, &group_mask_off);
|
||||
U32 everyone_mask_on;
|
||||
U32 everyone_mask_off;
|
||||
S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
|
||||
&everyone_mask_on, &everyone_mask_off);
|
||||
|
||||
bool selected_Media_editable = false;
|
||||
|
||||
// if perms we got back are valid
|
||||
if (valid_owner_perms &&
|
||||
valid_group_perms &&
|
||||
valid_everyone_perms)
|
||||
{
|
||||
|
||||
if ((owner_mask_on & PERM_MODIFY) ||
|
||||
(group_mask_on & PERM_MODIFY) ||
|
||||
(group_mask_on & PERM_MODIFY))
|
||||
{
|
||||
selected_Media_editable = true;
|
||||
}
|
||||
else
|
||||
// user is NOT allowed to press the RESET button
|
||||
{
|
||||
selected_Media_editable = false;
|
||||
};
|
||||
};
|
||||
|
||||
return selected_Media_editable;
|
||||
}
|
||||
|
||||
void LLPanelFace::clearMediaSettings()
|
||||
{
|
||||
LLFloaterMediaSettings::clearValues(false);
|
||||
}
|
||||
|
||||
void LLPanelFace::updateMediaSettings()
|
||||
{
|
||||
bool identical(false);
|
||||
std::string base_key("");
|
||||
std::string value_str("");
|
||||
int value_int = 0;
|
||||
bool value_bool = false;
|
||||
LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
|
||||
// TODO: (CP) refactor this using something clever or boost or both !!
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
// controls
|
||||
U8 value_u8 = default_media_data.getControls();
|
||||
struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
|
||||
{
|
||||
functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
|
||||
|
||||
U8 get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getControls();
|
||||
return mMediaEntry.getControls();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_controls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_controls, value_u8);
|
||||
base_key = std::string(LLMediaEntry::CONTROLS_KEY);
|
||||
mMediaSettings[base_key] = value_u8;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// First click (formerly left click)
|
||||
value_bool = default_media_data.getFirstClickInteract();
|
||||
struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_first_click(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getFirstClickInteract();
|
||||
return mMediaEntry.getFirstClickInteract();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_first_click(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_first_click, value_bool);
|
||||
base_key = std::string(LLMediaEntry::FIRST_CLICK_INTERACT_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Home URL
|
||||
value_str = default_media_data.getHomeURL();
|
||||
struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_home_url(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
std::string get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getHomeURL();
|
||||
return mMediaEntry.getHomeURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_home_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_home_url, value_str);
|
||||
base_key = std::string(LLMediaEntry::HOME_URL_KEY);
|
||||
mMediaSettings[base_key] = value_str;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Current URL
|
||||
value_str = default_media_data.getCurrentURL();
|
||||
struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_current_url(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
std::string get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getCurrentURL();
|
||||
return mMediaEntry.getCurrentURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_current_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_current_url, value_str);
|
||||
base_key = std::string(LLMediaEntry::CURRENT_URL_KEY);
|
||||
mMediaSettings[base_key] = value_str;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Auto zoom
|
||||
value_bool = default_media_data.getAutoZoom();
|
||||
struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
|
||||
functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getAutoZoom();
|
||||
return mMediaEntry.getAutoZoom();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_zoom(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_auto_zoom, value_bool);
|
||||
base_key = std::string(LLMediaEntry::AUTO_ZOOM_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Auto play
|
||||
//value_bool = default_media_data.getAutoPlay();
|
||||
// set default to auto play TRUE -- angela EXT-5172
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getAutoPlay();
|
||||
//return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_play(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_auto_play, value_bool);
|
||||
base_key = std::string(LLMediaEntry::AUTO_PLAY_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
|
||||
// Auto scale
|
||||
// set default to auto scale TRUE -- angela EXT-5172
|
||||
//value_bool = default_media_data.getAutoScale();
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_scale(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getAutoScale();
|
||||
// return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_scale(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_auto_scale, value_bool);
|
||||
base_key = std::string(LLMediaEntry::AUTO_SCALE_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Auto loop
|
||||
value_bool = default_media_data.getAutoLoop();
|
||||
struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getAutoLoop();
|
||||
return mMediaEntry.getAutoLoop();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_loop(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_auto_loop, value_bool);
|
||||
base_key = std::string(LLMediaEntry::AUTO_LOOP_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// width pixels (if not auto scaled)
|
||||
value_int = default_media_data.getWidthPixels();
|
||||
struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_width_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
int get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getWidthPixels();
|
||||
return mMediaEntry.getWidthPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_width_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_width_pixels, value_int);
|
||||
base_key = std::string(LLMediaEntry::WIDTH_PIXELS_KEY);
|
||||
mMediaSettings[base_key] = value_int;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// height pixels (if not auto scaled)
|
||||
value_int = default_media_data.getHeightPixels();
|
||||
struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
int get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getHeightPixels();
|
||||
return mMediaEntry.getHeightPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_height_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_height_pixels, value_int);
|
||||
base_key = std::string(LLMediaEntry::HEIGHT_PIXELS_KEY);
|
||||
mMediaSettings[base_key] = value_int;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Enable Alt image
|
||||
value_bool = default_media_data.getAltImageEnable();
|
||||
struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_enable_alt_image(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getAltImageEnable();
|
||||
return mMediaEntry.getAltImageEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_enable_alt_image(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_enable_alt_image, value_bool);
|
||||
base_key = std::string(LLMediaEntry::ALT_IMAGE_ENABLE_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - owner interact
|
||||
value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER);
|
||||
struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_perms_owner_interact, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_OWNER_INTERACT_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - owner control
|
||||
value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER);
|
||||
struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_perms_owner_control, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_OWNER_CONTROL_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - group interact
|
||||
value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP);
|
||||
struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_perms_group_interact, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_GROUP_INTERACT_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - group control
|
||||
value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP);
|
||||
struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_perms_group_control, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_GROUP_CONTROL_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - anyone interact
|
||||
value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE);
|
||||
struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_interact(default_media_data);
|
||||
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func_perms_anyone_interact, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_ANYONE_INTERACT_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// Perms - anyone control
|
||||
value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE);
|
||||
struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE);
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_perms_anyone_control, value_bool);
|
||||
base_key = std::string(LLPanelContents::PERMS_ANYONE_CONTROL_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// security - whitelist enable
|
||||
value_bool = default_media_data.getWhiteListEnable();
|
||||
struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getWhiteListEnable();
|
||||
return mMediaEntry.getWhiteListEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_enable(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_whitelist_enable, value_bool);
|
||||
base_key = std::string(LLMediaEntry::WHITELIST_ENABLE_KEY);
|
||||
mMediaSettings[base_key] = value_bool;
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
|
||||
// security - whitelist URLs
|
||||
std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
|
||||
struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
|
||||
{
|
||||
functor_getter_whitelist_urls(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
std::vector<std::string> get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
if (object)
|
||||
if (object->getTE(face))
|
||||
if (object->getTE(face)->getMediaData())
|
||||
return object->getTE(face)->getMediaData()->getWhiteList();
|
||||
return mMediaEntry.getWhiteList();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_urls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue(&func_whitelist_urls, value_vector_str);
|
||||
base_key = std::string(LLMediaEntry::WHITELIST_KEY);
|
||||
mMediaSettings[base_key].clear();
|
||||
std::vector< std::string >::iterator iter = value_vector_str.begin();
|
||||
while (iter != value_vector_str.end())
|
||||
{
|
||||
std::string white_list_url = *iter;
|
||||
mMediaSettings[base_key].append(white_list_url);
|
||||
++iter;
|
||||
};
|
||||
|
||||
mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
|
||||
}
|
||||
|
||||
void LLPanelFace::updateMediaTitle()
|
||||
{
|
||||
// only get the media name if we need it
|
||||
if (!mNeedMediaTitle)
|
||||
return;
|
||||
|
||||
// get plugin impl
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
if (media_plugin && mTitleMedia->getCurrentNavUrl() == media_plugin->getNavigateURI())
|
||||
{
|
||||
// get the media name (asynchronous - must call repeatedly)
|
||||
std::string media_title = media_plugin->getMediaName();
|
||||
|
||||
// only replace the title if what we get contains something
|
||||
if (!media_title.empty())
|
||||
{
|
||||
// update the UI widget
|
||||
if (mTitleMediaText)
|
||||
{
|
||||
mTitleMediaText->setText(media_title);
|
||||
|
||||
// stop looking for a title when we get one
|
||||
mNeedMediaTitle = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
// Static functions
|
||||
//
|
||||
|
|
@ -1655,7 +2413,7 @@ void LLPanelFace::updateVisibility()
|
|||
getChildView("radio_material_type")->setVisible(!show_media);
|
||||
|
||||
// Media controls
|
||||
getChildView("media_info")->setVisible(show_media);
|
||||
mTitleMediaText->setVisible(show_media);
|
||||
getChildView("add_media")->setVisible(show_media);
|
||||
getChildView("delete_media")->setVisible(show_media);
|
||||
getChildView("button align")->setVisible(show_media);
|
||||
|
|
@ -2027,6 +2785,75 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)
|
|||
sendBump(nmap_id.isNull() ? 0 : BUMPY_TEXTURE);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to edit existing media settings on a prim or prim face
|
||||
// TODO: test if there is media on the item and only allow editing if present
|
||||
void LLPanelFace::onClickBtnEditMedia()
|
||||
{
|
||||
refreshMedia();
|
||||
LLFloaterReg::showInstance("media_settings");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to delete media from a prim or prim face
|
||||
void LLPanelFace::onClickBtnDeleteMedia()
|
||||
{
|
||||
LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to add media to a prim or prim face
|
||||
void LLPanelFace::onClickBtnAddMedia()
|
||||
{
|
||||
// check if multiple faces are selected
|
||||
if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
|
||||
{
|
||||
refreshMedia();
|
||||
LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
|
||||
}
|
||||
else
|
||||
{
|
||||
onClickBtnEditMedia();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLPanelFace::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch (option)
|
||||
{
|
||||
case 0: // "Yes"
|
||||
LLSelectMgr::getInstance()->selectionSetMedia(0, LLSD());
|
||||
if (LLFloaterReg::instanceVisible("media_settings"))
|
||||
{
|
||||
LLFloaterReg::hideInstance("media_settings");
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLPanelFace::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch (option)
|
||||
{
|
||||
case 0: // "Yes"
|
||||
LLFloaterReg::showInstance("media_settings");
|
||||
break;
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelFace::syncOffsetX(LLPanelFace* self, F32 offsetU)
|
||||
{
|
||||
|
|
@ -2538,15 +3365,6 @@ void LLPanelFace::onAlignTexture(void* userdata)
|
|||
self->alignTestureLayer();
|
||||
}
|
||||
|
||||
|
||||
// TODO: I don't know who put these in or what these are for???
|
||||
void LLPanelFace::setMediaURL(const std::string& url)
|
||||
{
|
||||
}
|
||||
void LLPanelFace::setMediaType(const std::string& mime_type)
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ class LLUICtrl;
|
|||
class LLViewerObject;
|
||||
class LLFloater;
|
||||
class LLMaterialID;
|
||||
class LLMediaCtrl;
|
||||
|
||||
// Represents an edit for use in replicating the op across one or more materials in the selection set.
|
||||
//
|
||||
|
|
@ -97,8 +98,10 @@ public:
|
|||
virtual ~LLPanelFace();
|
||||
|
||||
void refresh();
|
||||
void setMediaURL(const std::string& url);
|
||||
void setMediaType(const std::string& mime_type);
|
||||
void refreshMedia();
|
||||
void unloadMedia();
|
||||
|
||||
/*virtual*/ void draw();
|
||||
|
||||
LLMaterialPtr createDefaultMaterial(LLMaterialPtr current_material)
|
||||
{
|
||||
|
|
@ -114,6 +117,12 @@ public:
|
|||
LLRender::eTexIndex getTextureChannelToEdit();
|
||||
|
||||
protected:
|
||||
void navigateToTitleMedia(const std::string url);
|
||||
bool selectedMediaEditable();
|
||||
void clearMediaSettings();
|
||||
void updateMediaSettings();
|
||||
void updateMediaTitle();
|
||||
|
||||
void getState();
|
||||
|
||||
void sendTexture(); // applies and sends texture
|
||||
|
|
@ -140,6 +149,9 @@ protected:
|
|||
void onCommitNormalTexture(const LLSD& data);
|
||||
void onCancelNormalTexture(const LLSD& data);
|
||||
void onSelectNormalTexture(const LLSD& data);
|
||||
void onClickBtnEditMedia();
|
||||
void onClickBtnDeleteMedia();
|
||||
void onClickBtnAddMedia();
|
||||
void onCommitColor(const LLSD& data);
|
||||
void onCommitShinyColor(const LLSD& data);
|
||||
void onCommitAlpha(const LLSD& data);
|
||||
|
|
@ -150,6 +162,9 @@ protected:
|
|||
|
||||
void onCloseTexturePicker(const LLSD& data);
|
||||
|
||||
static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
|
||||
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
|
||||
|
||||
// Make UI reflect state of currently selected material (refresh)
|
||||
// and UI mode (e.g. editing normal map v diffuse map)
|
||||
//
|
||||
|
|
@ -234,6 +249,9 @@ private:
|
|||
F32 getCurrentShinyOffsetU();
|
||||
F32 getCurrentShinyOffsetV();
|
||||
|
||||
LLMediaCtrl *mTitleMedia;
|
||||
LLTextBox *mTitleMediaText;
|
||||
|
||||
// Update visibility of controls to match current UI mode
|
||||
// (e.g. materials vs media editing)
|
||||
//
|
||||
|
|
@ -417,6 +435,9 @@ private:
|
|||
bool mUpdateInFlight;
|
||||
bool mUpdatePending;
|
||||
|
||||
LLSD mMediaSettings;
|
||||
bool mNeedMediaTitle;
|
||||
|
||||
public:
|
||||
#if defined(DEF_GET_MAT_STATE)
|
||||
#undef DEF_GET_MAT_STATE
|
||||
|
|
|
|||
Loading…
Reference in New Issue