Merge branch 'master' of https://github.com/Lirusaito/SingularityViewer
This commit is contained in:
@@ -6864,6 +6864,19 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RadarUpdateEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When false, pauses the radar until further notice, good for banning someone who just left.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>HideFromEditor</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RadarUpdateRate</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -315,7 +315,7 @@ const LLAvatarListEntry::ACTIVITY_TYPE LLAvatarListEntry::getActivity()
|
||||
|
||||
LLFloaterAvatarList::LLFloaterAvatarList() : LLFloater(std::string("radar")),
|
||||
mTracking(false),
|
||||
mUpdate(true),
|
||||
mUpdate("RadarUpdateEnabled"),
|
||||
mDirtyAvatarSorting(false),
|
||||
mUpdateRate(gSavedSettings.getU32("RadarUpdateRate") * 3 + 3),
|
||||
mAvatarList(NULL)
|
||||
@@ -415,12 +415,12 @@ BOOL LLFloaterAvatarList::postBuild()
|
||||
getChild<LLRadioGroup>("update_rate")->setSelectedIndex(gSavedSettings.getU32("RadarUpdateRate"));
|
||||
getChild<LLRadioGroup>("update_rate")->setCommitCallback(boost::bind(&LLFloaterAvatarList::onCommitUpdateRate, this));
|
||||
|
||||
getChild<LLCheckboxCtrl>("hide_mark")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
getChild<LLCheckboxCtrl>("hide_pos")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
getChild<LLCheckboxCtrl>("hide_alt")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
getChild<LLCheckboxCtrl>("hide_act")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
getChild<LLCheckboxCtrl>("hide_age")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
getChild<LLCheckboxCtrl>("hide_time")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnMarkHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnPositionHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnAltitudeHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnActivityHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnAgeHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnTimeHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
|
||||
// Get a pointer to the scroll list from the interface
|
||||
mAvatarList = getChild<LLScrollListCtrl>("avatar_list");
|
||||
@@ -438,7 +438,7 @@ BOOL LLFloaterAvatarList::postBuild()
|
||||
if(gHippoGridManager->getConnectedGrid()->isSecondLife())
|
||||
childSetVisible("hide_client", false);
|
||||
else
|
||||
getChild<LLCheckboxCtrl>("hide_client")->setCommitCallback(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
gSavedSettings.getControl("RadarColumnClientHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -529,17 +529,11 @@ void LLFloaterAvatarList::updateAvatarList()
|
||||
//llinfos << "radar refresh: updating map" << llendl;
|
||||
|
||||
// Check whether updates are enabled
|
||||
LLCheckboxCtrl* check = getChild<LLCheckboxCtrl>("update_enabled_cb");
|
||||
if (check && !check->getValue())
|
||||
if (!mUpdate)
|
||||
{
|
||||
mUpdate = FALSE;
|
||||
refreshTracker();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
mUpdate = TRUE;
|
||||
}
|
||||
//moved to pipeline to prevent a crash
|
||||
//gPipeline.forAllVisibleDrawables(updateParticleActivity);
|
||||
|
||||
@@ -1248,19 +1242,18 @@ LLAvatarListEntry * LLFloaterAvatarList::getAvatarEntry(LLUUID avatar)
|
||||
|
||||
BOOL LLFloaterAvatarList::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
LLFloaterAvatarList* self = getInstance();
|
||||
LLScrollListItem* item = self->mAvatarList->getFirstSelected();
|
||||
LLScrollListItem* item = mAvatarList->getFirstSelected();
|
||||
if(item)
|
||||
{
|
||||
LLUUID agent_id = item->getUUID();
|
||||
if (( KEY_RETURN == key ) && (MASK_NONE == mask))
|
||||
{
|
||||
self->setFocusAvatar(agent_id);
|
||||
setFocusAvatar(agent_id);
|
||||
return TRUE;
|
||||
}
|
||||
else if (( KEY_RETURN == key ) && (MASK_CONTROL == mask))
|
||||
{
|
||||
LLAvatarListEntry* entry = self->getAvatarEntry(agent_id);
|
||||
const LLAvatarListEntry* entry = getAvatarEntry(agent_id);
|
||||
if (entry)
|
||||
{
|
||||
// llinfos << "Trying to teleport to " << entry->getName() << " at " << entry->getPosition() << llendl;
|
||||
@@ -1272,7 +1265,7 @@ BOOL LLFloaterAvatarList::handleKeyHere(KEY key, MASK mask)
|
||||
|
||||
if (( KEY_RETURN == key ) && (MASK_SHIFT == mask))
|
||||
{
|
||||
uuid_vec_t ids = self->mAvatarList->getSelectedIDs();
|
||||
uuid_vec_t ids = mAvatarList->getSelectedIDs();
|
||||
if (ids.size() > 0)
|
||||
{
|
||||
if (ids.size() == 1)
|
||||
@@ -1414,11 +1407,11 @@ void LLFloaterAvatarList::sendKeys()
|
||||
std::ostringstream ids;
|
||||
int num_ids = 0;
|
||||
|
||||
for (int i = 0; i < regionp->mMapAvatarIDs.count(); i++)
|
||||
for (int i = 0; i < regionp->mMapAvatarIDs.count(); ++i)
|
||||
{
|
||||
const LLUUID &id = regionp->mMapAvatarIDs.get(i);
|
||||
|
||||
ids << "," << id.asString();
|
||||
ids << "," << id;
|
||||
++num_ids;
|
||||
|
||||
|
||||
|
||||
@@ -354,7 +354,7 @@ private:
|
||||
/**
|
||||
* @brief TRUE when Updating
|
||||
*/
|
||||
bool mUpdate;
|
||||
const LLCachedControl<bool> mUpdate;
|
||||
|
||||
/**
|
||||
* @brief Update rate (if min frames per update)
|
||||
|
||||
@@ -3,10 +3,9 @@
|
||||
* @brief Panel for roles information about a particular group.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
@@ -35,6 +34,7 @@
|
||||
#include "llcheckboxctrl.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llbutton.h"
|
||||
#include "llfloateravatarinfo.h"
|
||||
#include "llfloatergroupinvite.h"
|
||||
@@ -1619,11 +1619,60 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
|
||||
{
|
||||
if (!data) return;
|
||||
// Build the donated tier string.
|
||||
std::ostringstream donated;
|
||||
donated << data->getContribution() << " sq. m.";
|
||||
|
||||
LLSD item_params;
|
||||
item_params["id"] = data->getID();
|
||||
|
||||
item_params["columns"][0]["column"] = "name";
|
||||
// value is filled in by name list control
|
||||
|
||||
item_params["columns"][1]["column"] = "donated";
|
||||
item_params["columns"][1]["value"] = donated.str();
|
||||
|
||||
item_params["columns"][2]["column"] = "online";
|
||||
item_params["columns"][2]["value"] = data->getOnlineStatus();
|
||||
item_params["columns"][2]["font"] = "SANSSERIF_SMALL";
|
||||
mMembersList->addNameItem(item_params);
|
||||
|
||||
mHasMatch = TRUE;
|
||||
}
|
||||
|
||||
void LLPanelGroupMembersSubTab::onNameCache(/*const LLUUID& update_id,*/ LLGroupMemberData* member, const LLAvatarName& av_name)
|
||||
{
|
||||
/* Singu Note: We don't have a getMemberVersion, yet, don't bother with these
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if (!gdatap
|
||||
|| gdatap->getMemberVersion() != update_id
|
||||
*/
|
||||
if (!member)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// trying to avoid unnecessary hash lookups
|
||||
std::string name;
|
||||
LLAvatarNameCache::getPNSName(av_name, name); // Singu Note: Diverge from LL Viewer and filter by name displayed
|
||||
if (matchesSearchFilter(name))
|
||||
{
|
||||
addMemberToList(member);
|
||||
if(!mMembersList->getEnabled())
|
||||
{
|
||||
mMembersList->setEnabled(TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupMembersSubTab::updateMembers()
|
||||
{
|
||||
mPendingMemberUpdate = FALSE;
|
||||
|
||||
lldebugs << "LLPanelGroupMembersSubTab::updateMembers()" << llendl;
|
||||
// Rebuild the members list.
|
||||
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if (!gdatap)
|
||||
@@ -1640,48 +1689,36 @@ void LLPanelGroupMembersSubTab::updateMembers()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//cleanup list only for first iteration
|
||||
if(mMemberProgress == gdatap->mMembers.begin())
|
||||
{
|
||||
mMembersList->deleteAllItems();
|
||||
}
|
||||
|
||||
|
||||
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
|
||||
|
||||
S32 i = 0;
|
||||
for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME;
|
||||
++mMemberProgress, ++i)
|
||||
for(S32 i = 0; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME; ++mMemberProgress, ++i)
|
||||
{
|
||||
if (!mMemberProgress->second)
|
||||
continue;
|
||||
// Do filtering on name if it is already in the cache.
|
||||
bool add_member = true;
|
||||
|
||||
// Do filtering on name if it is already in the cache.
|
||||
// Singu Note: Diverge from LL Viewer and filter by name displayed
|
||||
std::string fullname;
|
||||
if (gCacheName->getFullName(mMemberProgress->first, fullname))
|
||||
if (LLAvatarNameCache::getPNSName(mMemberProgress->first, fullname))
|
||||
{
|
||||
if ( !matchesSearchFilter(fullname) )
|
||||
if (matchesSearchFilter(fullname))
|
||||
{
|
||||
add_member = false;
|
||||
addMemberToList(mMemberProgress->second);
|
||||
}
|
||||
}
|
||||
|
||||
if (add_member)
|
||||
else
|
||||
{
|
||||
// Build the donated tier string.
|
||||
std::ostringstream donated;
|
||||
donated << mMemberProgress->second->getContribution() << " sq. m.";
|
||||
|
||||
LLSD row;
|
||||
row["id"] = (*mMemberProgress).first;
|
||||
|
||||
row["columns"][0]["column"] = "name";
|
||||
// value is filled in by name list control
|
||||
|
||||
row["columns"][1]["column"] = "donated";
|
||||
row["columns"][1]["value"] = donated.str();
|
||||
|
||||
row["columns"][2]["column"] = "online";
|
||||
row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus();
|
||||
row["columns"][2]["font"] = "SANSSERIF_SMALL";
|
||||
|
||||
mMembersList->addNameItem(row);
|
||||
mHasMatch = TRUE;
|
||||
// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
|
||||
LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
|
||||
this, /*gdatap->getMemberVersion(),*/ mMemberProgress->second, _2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,9 @@
|
||||
* @brief Panel for roles information about a particular group.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
@@ -35,6 +34,7 @@
|
||||
|
||||
#include "llpanelgroup.h"
|
||||
|
||||
class LLAvatarName;
|
||||
class LLNameListCtrl;
|
||||
class LLPanelGroupSubTab;
|
||||
class LLPanelGroupMembersSubTab;
|
||||
@@ -197,6 +197,9 @@ public:
|
||||
|
||||
virtual void draw();
|
||||
|
||||
void addMemberToList(LLGroupMemberData* data);
|
||||
void onNameCache(/*const LLUUID& update_id,*/ LLGroupMemberData* member, const LLAvatarName& av_name);
|
||||
|
||||
protected:
|
||||
typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;
|
||||
typedef std::map<LLUUID, role_change_data_map_t*> member_role_changes_map_t;
|
||||
|
||||
@@ -3693,6 +3693,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
||||
chat.mText = from_name;
|
||||
mesg = mesg.substr(3);
|
||||
ircstyle = TRUE;
|
||||
// This block was moved up to allow bubbles with italicized chat
|
||||
// set CHAT_STYLE_IRC to avoid adding Avatar Name as author of message. See EXT-656
|
||||
chat.mChatStyle = CHAT_STYLE_IRC;
|
||||
}
|
||||
chat.mText += mesg;
|
||||
|
||||
@@ -3720,12 +3723,23 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
||||
return;
|
||||
}
|
||||
|
||||
// We have a real utterance now, so can stop showing "..." and proceed.
|
||||
if (chatter && chatter->isAvatar())
|
||||
{
|
||||
LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
|
||||
static_cast<LLVOAvatar*>(chatter)->stopTyping();
|
||||
|
||||
if (!is_muted && !is_busy)
|
||||
{
|
||||
static const LLCachedControl<bool> use_chat_bubbles("UseChatBubbles",false);
|
||||
visible_in_chat_bubble = use_chat_bubbles;
|
||||
static_cast<LLVOAvatar*>(chatter)->addChat(chat);
|
||||
}
|
||||
}
|
||||
|
||||
// Look for IRC-style emotes
|
||||
if (ircstyle)
|
||||
{
|
||||
// set CHAT_STYLE_IRC to avoid adding Avatar Name as author of message. See EXT-656
|
||||
chat.mChatStyle = CHAT_STYLE_IRC;
|
||||
|
||||
// Do nothing, ircstyle is fixed above for chat bubbles
|
||||
}
|
||||
else
|
||||
@@ -3852,20 +3866,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
||||
chat.mText = from_name + verb + mesg;
|
||||
}
|
||||
|
||||
// We have a real utterance now, so can stop showing "..." and proceed.
|
||||
if (chatter && chatter->isAvatar())
|
||||
{
|
||||
LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
|
||||
((LLVOAvatar*)chatter)->stopTyping();
|
||||
|
||||
if (!is_muted && !is_busy)
|
||||
{
|
||||
static const LLCachedControl<bool> use_chat_bubbles("UseChatBubbles",false);
|
||||
visible_in_chat_bubble = use_chat_bubbles;
|
||||
((LLVOAvatar*)chatter)->addChat(chat);
|
||||
}
|
||||
}
|
||||
|
||||
if (chatter)
|
||||
{
|
||||
chat.mPosAgent = chatter->getPositionAgent();
|
||||
@@ -5286,7 +5286,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
|
||||
if (!avatarp)
|
||||
{
|
||||
// no agent by this ID...error?
|
||||
LL_WARNS("Messaging") << "Received animation state for unknown avatar" << uuid << LL_ENDL;
|
||||
LL_WARNS("Messaging") << "Received animation state for unknown avatar " << uuid << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -3318,6 +3318,13 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
|
||||
{
|
||||
F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f);
|
||||
LLFontGL::StyleFlags style;
|
||||
|
||||
// Singu Note: The following tweak may be a bad idea, though they've asked for actions to be italicized, the chat type for actions becomes irrelevant
|
||||
// If LLFontGL::StyleFlags wasn't the parameter type, font styles could be combined and underline could be used, but that may be unnatural...
|
||||
static const LLCachedControl<bool> italicize("LiruItalicizeActions");
|
||||
if (italicize && chat_iter->mChatStyle == CHAT_STYLE_IRC)
|
||||
style = LLFontGL::ITALIC;
|
||||
else
|
||||
switch(chat_iter->mChatType)
|
||||
{
|
||||
case CHAT_TYPE_WHISPER:
|
||||
|
||||
@@ -97,7 +97,7 @@ void ScriptCounter::requestInventories()
|
||||
if (LLViewerObject* object = selectNode->getObject())
|
||||
requestInventoriesFor(object);
|
||||
}
|
||||
cmdline_printchat(LLTrans::getString("ScriptCounting"));
|
||||
if (!doDelete) cmdline_printchat(LLTrans::getString("ScriptCounting"));
|
||||
requesting = false;
|
||||
}
|
||||
|
||||
@@ -130,7 +130,8 @@ void ScriptCounter::inventoryChanged(LLViewerObject* obj, LLInventoryObject::obj
|
||||
{
|
||||
obj->removeInventoryListener(this);
|
||||
--inventories;
|
||||
//llinfos << "Counting scripts in " << obj->getID() << llendl;
|
||||
//const LLUUID& objid = obj->getID();
|
||||
//llinfos << "Counting scripts in " << objid << llendl;
|
||||
|
||||
if (inv)
|
||||
{
|
||||
@@ -144,7 +145,11 @@ void ScriptCounter::inventoryChanged(LLViewerObject* obj, LLInventoryObject::obj
|
||||
{
|
||||
const LLUUID& id = asset->getUUID();
|
||||
if (id.notNull())
|
||||
{
|
||||
//llinfos << "Deleting script " << id << " in " << objid << llendl;
|
||||
obj->removeInventory(id);
|
||||
--i; // Avoid iteration when removing, everything has shifted
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,7 +289,7 @@
|
||||
<panel border="true" bottom_delta="-150" follows="left|top|right|bottom" height="255"
|
||||
label="Options" left="1" mouse_opaque="true"
|
||||
name="options_tab" width="398">
|
||||
<check_box height="16" label="Update"
|
||||
<check_box height="16" label="Update" control_name="RadarUpdateEnabled"
|
||||
left="10" bottom_delta="-180" name="update_enabled_cb"
|
||||
width="200" follows="bottom|left"
|
||||
hidden="false" mouse_opaque="true" font="SansSerifSmall"
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
<text bottom_delta="-2" left="170" height="12" name="AvatarPhysicsDetailText">Off</text>
|
||||
<text bottom="284" left="460" height="12" name="DrawDistanceMeterText1">m</text>
|
||||
<text bottom="284" left="470" height="12" name="DrawDistanceMeterText2">m</text>
|
||||
<slider bottom="280" left="215" control_name="RenderFarClip" decimal_digits="0" height="16" increment="32" initial_val="160" label="Draw Distance:" label_width="101" max_val="1024" min_val="64" name="DrawDistance" width="262"/>
|
||||
<slider bottom="280" left="215" control_name="RenderFarClip" decimal_digits="0" height="16" increment="8" initial_val="160" label="Draw Distance:" label_width="101" max_val="1024" min_val="24" name="DrawDistance" width="262"/>
|
||||
<slider bottom_delta="-18" control_name="RenderMaxPartCount" decimal_digits="0" height="16" increment="256" initial_val="4096" label="Max. Particle Count:" label_width="101" max_val="8192" min_val="0" name="MaxParticleCount" width="262"/>
|
||||
<slider bottom_delta="-18" control_name="RenderAvatarMaxVisible" decimal_digits="0" height="16" increment="1" initial_val="35" label="Max. non-impostors:" label_width="101" max_val="50" min_val="1" name="AvatarMaxVisible" width="250"/>
|
||||
<slider bottom_delta="-18" control_name="RenderGlowResolutionPow" decimal_digits="0" height="16" increment="1" initial_val="8" label="Post Process Quality:" label_width="101" max_val="9" min_val="8" name="RenderPostProcess" show_text="false" width="226"/>
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<panel label="Chat/IM" name="Chat/IM">
|
||||
<check_box label="Annonce les IMs entrants" name="quickstart_im_check"/>
|
||||
<check_box label="Ne pas envoyer "[Machin Truc] is typing..." name="hide_typing_check"/>
|
||||
<check_box label="N'accepter les IMs que de ses amis" name="InstantMessagesFriendsOnly"/>
|
||||
<check_box label="Montrer le nom du groupe dans le chat" name="append_group_name_check"/>
|
||||
<check_box label="Jouer le son typique pour le chat local" name="play_typing_sound_check"/>
|
||||
<check_box label="Ne pas afficher les notifs. de log dans le chat" name="hide_notifications_in_chat_check"/>
|
||||
|
||||
Reference in New Issue
Block a user