Mute list, now with 100% more text-appearing-ness, and 20% new shinies (mute-type icons, multi-select unmute, and displayname support).
This commit is contained in:
@@ -48,14 +48,16 @@
|
|||||||
#include "llbutton.h"
|
#include "llbutton.h"
|
||||||
#include "lllineeditor.h"
|
#include "lllineeditor.h"
|
||||||
#include "llmutelist.h"
|
#include "llmutelist.h"
|
||||||
|
#include "llnamelistctrl.h"
|
||||||
#include "llresizehandle.h"
|
#include "llresizehandle.h"
|
||||||
#include "llscrolllistctrl.h"
|
|
||||||
#include "lltextbox.h"
|
#include "lltextbox.h"
|
||||||
#include "llviewertexteditor.h"
|
#include "llviewertexteditor.h"
|
||||||
#include "llviewerwindow.h"
|
#include "llviewerwindow.h"
|
||||||
#include "lluictrlfactory.h"
|
#include "lluictrlfactory.h"
|
||||||
#include "llfocusmgr.h"
|
#include "llfocusmgr.h"
|
||||||
|
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constants
|
// Constants
|
||||||
//
|
//
|
||||||
@@ -209,7 +211,12 @@ BOOL LLFloaterMute::postBuild()
|
|||||||
childSetAction("Mute object by name...", onClickMuteByName, this);
|
childSetAction("Mute object by name...", onClickMuteByName, this);
|
||||||
childSetAction("Unmute", onClickRemove, this);
|
childSetAction("Unmute", onClickRemove, this);
|
||||||
|
|
||||||
mMuteList = getChild<LLScrollListCtrl>("mutes");
|
mAvatarIcon = LLUI::getUIImage("icon_avatar_offline.tga");
|
||||||
|
mObjectIcon = LLUI::getUIImage("inv_item_object.tga");
|
||||||
|
mGroupIcon = LLUI::getUIImage("icon_group.tga");
|
||||||
|
mNameIcon = LLUI::getUIImage("icon_name.tga");
|
||||||
|
|
||||||
|
mMuteList = getChild<LLNameListCtrl>("mutes");
|
||||||
mMuteList->setCommitOnSelectionChange(TRUE);
|
mMuteList->setCommitOnSelectionChange(TRUE);
|
||||||
|
|
||||||
LLMuteList::getInstance()->addObserver(this);
|
LLMuteList::getInstance()->addObserver(this);
|
||||||
@@ -231,16 +238,63 @@ LLFloaterMute::~LLFloaterMute()
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void LLFloaterMute::refreshMuteList()
|
void LLFloaterMute::refreshMuteList()
|
||||||
{
|
{
|
||||||
|
uuid_vec_t selected = mMuteList->getSelectedIDs();
|
||||||
|
S32 scrollpos = mMuteList->getScrollPos();
|
||||||
|
|
||||||
mMuteList->deleteAllItems();
|
mMuteList->deleteAllItems();
|
||||||
|
mMuteDict.clear();
|
||||||
|
|
||||||
std::vector<LLMute> mutes = LLMuteList::getInstance()->getMutes();
|
std::vector<LLMute> mutes = LLMuteList::getInstance()->getMutes();
|
||||||
std::vector<LLMute>::iterator it;
|
std::vector<LLMute>::iterator it;
|
||||||
|
U32 count = 0;
|
||||||
for (it = mutes.begin(); it != mutes.end(); ++it)
|
for (it = mutes.begin(); it != mutes.end(); ++it)
|
||||||
{
|
{
|
||||||
std::string display_name = it->getDisplayName();
|
std::string display_name = it->mName;
|
||||||
mMuteList->addStringUUIDItem(display_name, it->mID);
|
LLSD element;
|
||||||
}
|
LLUUID entry_id;
|
||||||
|
if(it->mType == LLMute::GROUP || it->mType == LLMute::AGENT)
|
||||||
|
entry_id = it->mID;
|
||||||
|
else
|
||||||
|
entry_id.generate(boost::lexical_cast<std::string>( count++ ));
|
||||||
|
mMuteDict.insert(std::make_pair(entry_id,*it));
|
||||||
|
element["id"] = entry_id;
|
||||||
|
element["name"] = display_name;
|
||||||
|
|
||||||
|
LLSD& name_column = element["columns"][1];
|
||||||
|
name_column["column"] = "name";
|
||||||
|
name_column["type"] = "text";
|
||||||
|
name_column["value"] = "";
|
||||||
|
|
||||||
|
LLSD& icon_column = element["columns"][0];
|
||||||
|
icon_column["column"] = "icon";
|
||||||
|
icon_column["type"] = "icon";
|
||||||
|
|
||||||
|
switch(it->mType)
|
||||||
|
{
|
||||||
|
case LLMute::GROUP:
|
||||||
|
icon_column["value"] = mGroupIcon->getName();
|
||||||
|
element["target"] = LLNameListCtrl::GROUP;
|
||||||
|
break;
|
||||||
|
case LLMute::AGENT:
|
||||||
|
icon_column["value"] = mAvatarIcon->getName();
|
||||||
|
element["target"] = LLNameListCtrl::INDIVIDUAL;
|
||||||
|
break;
|
||||||
|
case LLMute::OBJECT:
|
||||||
|
icon_column["value"] = mObjectIcon->getName();
|
||||||
|
element["target"] = LLNameListCtrl::SPECIAL;
|
||||||
|
break;
|
||||||
|
case LLMute::BY_NAME:
|
||||||
|
default:
|
||||||
|
icon_column["value"] = mNameIcon->getName();
|
||||||
|
element["target"] = LLNameListCtrl::SPECIAL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mMuteList->addNameItemRow(element);
|
||||||
|
}
|
||||||
|
mMuteList->updateSort();
|
||||||
|
mMuteList->selectMultiple(selected);
|
||||||
|
mMuteList->setScrollPos(scrollpos);
|
||||||
updateButtons();
|
updateButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,17 +336,22 @@ void LLFloaterMute::onClickRemove(void *data)
|
|||||||
{
|
{
|
||||||
LLFloaterMute* floater = (LLFloaterMute *)data;
|
LLFloaterMute* floater = (LLFloaterMute *)data;
|
||||||
|
|
||||||
std::string name = floater->mMuteList->getSelectedItemLabel();
|
|
||||||
LLUUID id = floater->mMuteList->getStringUUIDSelectedItem();
|
|
||||||
LLMute mute(id);
|
|
||||||
mute.setFromDisplayName(name);
|
|
||||||
// now mute.mName has the suffix trimmed off
|
|
||||||
|
|
||||||
S32 last_selected = floater->mMuteList->getFirstSelectedIndex();
|
S32 last_selected = floater->mMuteList->getFirstSelectedIndex();
|
||||||
if (LLMuteList::getInstance()->remove(mute))
|
bool removed = false;
|
||||||
|
const std::vector<LLScrollListItem*> items = floater->mMuteList->getAllSelected();
|
||||||
|
for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||||
|
{
|
||||||
|
std::map<LLUUID,LLMute>::iterator mute_it = floater->mMuteDict.find((*it)->getUUID());
|
||||||
|
if(mute_it != floater->mMuteDict.end() && LLMuteList::getInstance()->remove(mute_it->second))
|
||||||
|
{
|
||||||
|
floater->mMuteDict.erase(mute_it);
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removed)
|
||||||
{
|
{
|
||||||
// Above removals may rebuild this dialog.
|
// Above removals may rebuild this dialog.
|
||||||
|
|
||||||
if (last_selected == floater->mMuteList->getItemCount())
|
if (last_selected == floater->mMuteList->getItemCount())
|
||||||
{
|
{
|
||||||
// we were on the last item, so select the last item again
|
// we were on the last item, so select the last item again
|
||||||
@@ -303,8 +362,12 @@ void LLFloaterMute::onClickRemove(void *data)
|
|||||||
// else select the item after the last item previously selected
|
// else select the item after the last item previously selected
|
||||||
floater->mMuteList->selectNthItem(last_selected);
|
floater->mMuteList->selectNthItem(last_selected);
|
||||||
}
|
}
|
||||||
|
floater->mMuteList->setNeedsSort();
|
||||||
|
floater->mMuteList->updateSort();
|
||||||
|
floater->updateButtons();
|
||||||
}
|
}
|
||||||
floater->updateButtons();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ class LLButton;
|
|||||||
class LLLineEditor;
|
class LLLineEditor;
|
||||||
class LLMessageSystem;
|
class LLMessageSystem;
|
||||||
class LLUUID;
|
class LLUUID;
|
||||||
class LLScrollListCtrl;
|
class LLNameListCtrl;
|
||||||
|
class LLMute;
|
||||||
|
|
||||||
class LLFloaterMute
|
class LLFloaterMute
|
||||||
: public LLFloater, public LLMuteListObserver, public LLFloaterSingleton<LLFloaterMute>
|
: public LLFloater, public LLMuteListObserver, public LLFloaterSingleton<LLFloaterMute>
|
||||||
@@ -74,7 +75,14 @@ private:
|
|||||||
static void callbackMuteByName(const std::string& text, void*);
|
static void callbackMuteByName(const std::string& text, void*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LLScrollListCtrl* mMuteList;
|
LLNameListCtrl* mMuteList;
|
||||||
|
|
||||||
|
LLPointer<LLUIImage> mAvatarIcon; //icon_avatar_offline.tga
|
||||||
|
LLPointer<LLUIImage> mObjectIcon; //inv_item_object.tga
|
||||||
|
LLPointer<LLUIImage> mGroupIcon; //icon_group.tga
|
||||||
|
LLPointer<LLUIImage> mNameIcon; //icon_name.tga
|
||||||
|
|
||||||
|
std::map<LLUUID, LLMute> mMuteDict; //Easiest way to associate listitems with LLMute instances without hacking in, say, a hidden column.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
indra/newview/skins/default/textures/icon_name.tga
Normal file
BIN
indra/newview/skins/default/textures/icon_name.tga
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
@@ -100,7 +100,8 @@
|
|||||||
<texture name="icon_place.tga"/>
|
<texture name="icon_place.tga"/>
|
||||||
<texture name="icon_popular.tga"/>
|
<texture name="icon_popular.tga"/>
|
||||||
<texture name="icon_top_pick.tga"/>
|
<texture name="icon_top_pick.tga"/>
|
||||||
|
<texture name="icon_name.tga"/>
|
||||||
|
|
||||||
<texture name="inv_folder_animation.tga"/>
|
<texture name="inv_folder_animation.tga"/>
|
||||||
<texture name="inv_folder_bodypart.tga"/>
|
<texture name="inv_folder_bodypart.tga"/>
|
||||||
<texture name="inv_folder_callingcard.tga"/>
|
<texture name="inv_folder_callingcard.tga"/>
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||||
<floater bottom="-384" can_close="true" can_drag_on_left="false" can_minimize="true"
|
<floater bottom="-384" can_close="true" can_drag_on_left="false" can_minimize="true"
|
||||||
can_resize="true" can_tear_off="true" enabled="true" height="300" left="45"
|
can_resize="true" can_tear_off="true" enabled="true" height="300" left="45"
|
||||||
min_height="140" min_width="220" mouse_opaque="true" name="mute floater"
|
min_height="152" min_width="220" mouse_opaque="true" name="mute floater"
|
||||||
rect_control="FloaterMuteRect3" short_title="Mute List"
|
rect_control="FloaterMuteRect3" short_title="Mute List"
|
||||||
title="Muted Residents & Objects" width="300">
|
title="Muted Residents & Objects" width="300">
|
||||||
<scroll_list background_visible="true" bottom="-220" column_padding="5" draw_border="true"
|
<name_list name="mutes"
|
||||||
draw_heading="false" draw_stripes="true" enabled="true"
|
left="10" right="-10" top="-20" bottom="90" can_resize="true"
|
||||||
follows="left|top|right|bottom" height="200"
|
column_padding="0" follows="left|top|bottom|right"
|
||||||
left="4" mouse_opaque="true" multi_select="false" name="mutes"
|
draw_heading="true" multi_select="true" name_column_index="1"
|
||||||
tool_tip="List of currently muted residents" width="292" />
|
tool_tip="Names of muted objects/avatars">
|
||||||
|
<column name="icon" label="" width="18"/>
|
||||||
|
<column dynamicwidth="true" label="Name" name="name" tool_tip="Name" />
|
||||||
|
</name_list>
|
||||||
<button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif"
|
<button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif"
|
||||||
halign="center" height="20" label="Mute Resident..."
|
halign="center" height="20" label="Mute Resident..."
|
||||||
label_selected="Mute Resident..." left="4" mouse_opaque="true"
|
label_selected="Mute Resident..." left="4" mouse_opaque="true"
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||||
<floater name="mute floater" short_title="Lista de Ignorados" title="Residentes y Objetos Ignorados">
|
<floater name="mute floater" short_title="Lista de Ignorados" title="Residentes y Objetos Ignorados">
|
||||||
<scroll_list name="mutes" tool_tip="Lista de residentes ignorados actualmente" />
|
<name_list name="mutes" tool_tip="Lista de residentes ignorados actualmente">
|
||||||
|
<column label="Nombre" name="name" tool_tip="Nombre"/>
|
||||||
|
</name_list>
|
||||||
<button label="Residente Ignorado..." label_selected="Residente Ignorado..." name="Mute resident..." tool_tip="Selecciona un residente para ignorar" />
|
<button label="Residente Ignorado..." label_selected="Residente Ignorado..." name="Mute resident..." tool_tip="Selecciona un residente para ignorar" />
|
||||||
<button label="Ignorar objeto por su nombre..." label_selected="Ignorar objeto por su nombre..." name="Mute object by name..."/>
|
<button label="Ignorar objeto por su nombre..." label_selected="Ignorar objeto por su nombre..." name="Mute object by name..."/>
|
||||||
<button label="No Ignorar" label_selected="No Ignorar" name="Unmute" tool_tip="Quitar un residente u objeto de la lista de ignorados" />
|
<button label="No Ignorar" label_selected="No Ignorar" name="Unmute" tool_tip="Quitar un residente u objeto de la lista de ignorados" />
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||||
<floater name="mute floater" title="Résidents et objets ignorés(mute)" short_title="Liste des ignorés(mute)">
|
<floater name="mute floater" title="Résidents et objets ignorés(mute)" short_title="Liste des ignorés(mute)">
|
||||||
<scroll_list name="mutes" tool_tip="Liste des résidents ignorés(mute)actuellement" />
|
<name_list name="mutes" tool_tip="Liste des résidents ignorés(mute)actuellement">
|
||||||
|
<column label="Nom" name="name" tool_tip="Nom"/>
|
||||||
|
</name_list>
|
||||||
<button label="Ignorer le résident(mute)" label_selected="Ignorer le résident(mute)"
|
<button label="Ignorer le résident(mute)" label_selected="Ignorer le résident(mute)"
|
||||||
name="Mute resident"
|
name="Mute resident"
|
||||||
tool_tip="Choisir le résident à ignorer (mute)" />
|
tool_tip="Choisir le résident à ignorer (mute)" />
|
||||||
|
|||||||
Reference in New Issue
Block a user