diff --git a/indra/newview/fsfloaterassetblacklist.cpp b/indra/newview/fsfloaterassetblacklist.cpp index 890c7a79de..652718319f 100644 --- a/indra/newview/fsfloaterassetblacklist.cpp +++ b/indra/newview/fsfloaterassetblacklist.cpp @@ -32,6 +32,8 @@ #include "fscommon.h" #include "fsscrolllistctrl.h" +#include "llagent.h" +#include "llaudioengine.h" #include "llfiltereditor.h" #include "llfloaterreg.h" #include "llviewercontrol.h" @@ -39,10 +41,11 @@ FSFloaterAssetBlacklist::FSFloaterAssetBlacklist(const LLSD& key) - : LLFloater(key), + : LLFloater(key), LLEventTimer(0.25f), mResultList(NULL), mFilterSubString(LLStringUtil::null), mFilterSubStringOrig(LLStringUtil::null), + mAudioSourceID(LLUUID::null), mBlacklistCallbackConnection() { } @@ -60,15 +63,24 @@ BOOL FSFloaterAssetBlacklist::postBuild() mResultList = getChild("result_list"); mResultList->setContextMenu(&FSFloaterAssetBlacklistMenu::gFSAssetBlacklistMenu); mResultList->setFilterColumn(0); + mResultList->setCommitCallback(boost::bind(&FSFloaterAssetBlacklist::onSelectionChanged, this)); + mResultList->setCommitOnSelectionChange(true); childSetAction("remove_btn", boost::bind(&FSFloaterAssetBlacklist::onRemoveBtn, this)); childSetAction("remove_temp_btn", boost::bind(&FSFloaterAssetBlacklist::onRemoveAllTemporaryBtn, this)); + childSetAction("play_btn", boost::bind(&FSFloaterAssetBlacklist::onPlayBtn, this)); + childSetAction("stop_btn", boost::bind(&FSFloaterAssetBlacklist::onStopBtn, this)); childSetAction("close_btn", boost::bind(&FSFloaterAssetBlacklist::onCloseBtn, this)); getChild("filter_input")->setCommitCallback(boost::bind(&FSFloaterAssetBlacklist::onFilterEdit, this, _2)); mBlacklistCallbackConnection = FSAssetBlacklist::getInstance()->setBlacklistChangedCallback(boost::bind(&FSFloaterAssetBlacklist::onBlacklistChanged, this, _1, _2)); + childSetEnabled("play_btn", false); + childSetEnabled("stop_btn", true); + childSetVisible("play_btn", true); + childSetVisible("stop_btn", false); + return TRUE; } @@ -82,13 +94,13 @@ std::string FSFloaterAssetBlacklist::getTypeString(S32 type) { switch (type) { - case 0: + case LLAssetType::AT_TEXTURE: return getString("asset_texture"); - case 1: + case LLAssetType::AT_SOUND: return getString("asset_sound"); - case 6: + case LLAssetType::AT_OBJECT: return getString("asset_object"); - case 45: + case LLAssetType::AT_PERSON: return getString("asset_resident"); default: return getString("asset_unknown"); @@ -144,6 +156,9 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat element["columns"][5]["column"] = "date_sort"; element["columns"][5]["type"] = "text"; element["columns"][5]["value"] = llformat("%u", (U64)date.secondsSinceEpoch()); + element["columns"][6]["column"] = "asset_type"; + element["columns"][6]["type"] = "integer"; + element["columns"][6]["value"] = data["asset_type"].asInteger(); mResultList->addElement(element, ADD_BOTTOM); } @@ -198,6 +213,55 @@ void FSFloaterAssetBlacklist::onRemoveAllTemporaryBtn() gObjectList.resetDerenderList(true); } +void FSFloaterAssetBlacklist::onSelectionChanged() +{ + bool enabled = false; + size_t num_selected = mResultList->getAllSelected().size(); + if (num_selected == 1) + { + const LLScrollListItem* item = mResultList->getFirstSelected(); + S32 name_column = mResultList->getColumn("asset_type")->mIndex; + + if (item && item->getColumn(name_column)->getValue().asInteger() == LLAssetType::AT_SOUND) + { + enabled = true; + } + } + + childSetEnabled("play_btn", enabled); +} + +void FSFloaterAssetBlacklist::onPlayBtn() +{ + const LLScrollListItem* item = mResultList->getFirstSelected(); + S32 name_column = mResultList->getColumn("asset_type")->mIndex; + + if (!item || item->getUUID().isNull() || item->getColumn(name_column)->getValue().asInteger() != LLAssetType::AT_SOUND) + { + return; + } + + mAudioSourceID = LLUUID::generateNewID(); + gAudiop->triggerSound(item->getUUID(), gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI, LLVector3d::zero, LLUUID::null, mAudioSourceID); + + childSetVisible("stop_btn", true); + childSetVisible("play_btn", false); +} + +void FSFloaterAssetBlacklist::onStopBtn() +{ + if (mAudioSourceID.isNull()) + { + return; + } + + LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); + if (audio_source && !audio_source->isDone()) + { + audio_source->play(LLUUID::null); + } +} + void FSFloaterAssetBlacklist::onCloseBtn() { closeFloater(); @@ -220,6 +284,7 @@ void FSFloaterAssetBlacklist::onFilterEdit(const std::string& search_string) // Apply new filter. mResultList->setFilterString(mFilterSubStringOrig); + onSelectionChanged(); } BOOL FSFloaterAssetBlacklist::handleKeyHere(KEY key, MASK mask) @@ -233,6 +298,32 @@ BOOL FSFloaterAssetBlacklist::handleKeyHere(KEY key, MASK mask) return LLFloater::handleKeyHere(key, mask); } +BOOL FSFloaterAssetBlacklist::tick() +{ + if (mAudioSourceID.isNull()) + { + return FALSE; + } + + LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); + if (!audio_source || audio_source->isDone()) + { + childSetVisible("play_btn", true); + childSetVisible("stop_btn", false); + + mAudioSourceID.setNull(); + onSelectionChanged(); + } + + return FALSE; +} + +void FSFloaterAssetBlacklist::closeFloater(bool /* app_quitting */) +{ + onStopBtn(); + LLFloater::closeFloater(); +} + //--------------------------------------------------------------------------- // Context menu //--------------------------------------------------------------------------- diff --git a/indra/newview/fsfloaterassetblacklist.h b/indra/newview/fsfloaterassetblacklist.h index 83ffc020f7..a767db72c9 100644 --- a/indra/newview/fsfloaterassetblacklist.h +++ b/indra/newview/fsfloaterassetblacklist.h @@ -35,7 +35,7 @@ class FSScrollListCtrl; -class FSFloaterAssetBlacklist : public LLFloater +class FSFloaterAssetBlacklist : public LLFloater, public LLEventTimer { LOG_CLASS(FSFloaterAssetBlacklist); @@ -47,6 +47,8 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask); /*virtual*/ bool hasAccelerators() const { return true; } + /*virtual*/ BOOL tick(); + /*virtual*/ void closeFloater(bool app_quitting = false); void addElementToList(const LLUUID& id, const LLSD& data); void removeElements(); @@ -54,13 +56,18 @@ public: protected: void onRemoveBtn(); void onRemoveAllTemporaryBtn(); + void onPlayBtn(); + void onStopBtn(); void onCloseBtn(); void onFilterEdit(const std::string& search_string); void onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op); + void onSelectionChanged(); void buildBlacklist(); std::string getTypeString(S32 type); + LLUUID mAudioSourceID; + private: FSScrollListCtrl* mResultList; diff --git a/indra/newview/skins/default/xui/en/floater_fs_asset_blacklist.xml b/indra/newview/skins/default/xui/en/floater_fs_asset_blacklist.xml index ddc9f4a420..ad92b5ec9d 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_asset_blacklist.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_asset_blacklist.xml @@ -94,6 +94,10 @@ name="date_sort" width="-1" /> + [UNKNOWN] Template item [UNKNOWN] Template item @@ -120,6 +124,26 @@ left_pad="10" bottom="-6" follows="left|bottom"/> +