Merge LL 3.7.13 Group Banz

Tank_Master 2015-01-12 09:48:53 -08:00
commit 8da9ca220e
15 changed files with 474 additions and 256 deletions

View File

@ -523,3 +523,4 @@ a9f2d0cb11f73b06858e6083bb50083becc3f9cd 3.7.9-release
91dae9494b4d147541c7a01902334ba19a7ec05e 3.7.10-release
64799eb298834073a3e9992cd8d27c3cb9d30b10 3.7.11-release
3b44ea8988cb902f0dda8429e8d5e4569e304532 3.7.12-release
d86a7e1bc96d27b683f951d3701d5b7042158c68 3.7.13-release

View File

@ -8598,16 +8598,16 @@
<integer>0</integer>
</map>
<key>MemoryLogFrequency</key>
<map>
<key>Comment</key>
<string>Seconds between display of Memory in log (0 for never)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>600.0</real>
</map>
<map>
<key>Comment</key>
<string>Seconds between display of Memory in log (0 for never)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>30.0</real>
</map>
<key>MemoryPrivatePoolEnabled</key>
<map>
<key>Comment</key>

View File

@ -53,6 +53,7 @@ LLConversationItem::LLConversationItem(std::string display_name, const LLUUID& u
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@ -65,6 +66,7 @@ LLConversationItem::LLConversationItem(const LLUUID& uuid, LLFolderViewModelInte
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@ -77,6 +79,7 @@ LLConversationItem::LLConversationItem(LLFolderViewModelInterface& root_view_mod
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@ -161,6 +164,12 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
items.push_back(std::string("ModerateVoiceMute"));
items.push_back(std::string("ModerateVoiceUnmute"));
}
if ((getType() != CONV_SESSION_1_ON_1) && mDisplayGroupBanOptions)
{
items.push_back(std::string("Group Ban Separator"));
items.push_back(std::string("BanMember"));
}
}
}

View File

@ -145,6 +145,7 @@ protected:
bool mNeedsRefresh; // Flag signaling to the view that something changed for this item
F64 mLastActiveTime;
bool mDisplayModeratorOptions;
bool mDisplayGroupBanOptions;
boost::signals2::connection mAvatarNameCacheConnection;
};
@ -208,6 +209,7 @@ public:
void dumpDebugData();
void setModeratorOptionsVisible(bool visible) { mDisplayModeratorOptions = visible; }
void setDisplayModeratorRole(bool displayRole);
void setGroupBanVisible(bool visible) { mDisplayGroupBanOptions = visible; }
private:
void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName

View File

@ -533,6 +533,7 @@ void LLFloaterIMContainer::draw()
{
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID);
participant_model->setGroupBanVisible(haveAbilityToBan() && participant_model->getUUID() != gAgentID);
current_participant_model++;
}
@ -1151,6 +1152,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
{
toggleAllowTextChat(userID);
}
else if ("ban_member" == command)
{
banSelectedMember(userID);
}
}
else if (selectedIDS.size() > 1)
{
@ -1408,6 +1413,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
else if ("can_offer_teleport" == item)
{
return LLAvatarActions::canOfferTeleport(uuids);
}
else if ("can_ban_member" == item)
{
return canBanSelectedMember(single_id);
}
else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
{
@ -1831,6 +1840,95 @@ bool LLFloaterIMContainer::isGroupModerator()
return false;
}
bool LLFloaterIMContainer::haveAbilityToBan()
{
LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
if (NULL == speaker_manager)
{
LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
return false;
}
LLUUID group_uuid = speaker_manager->getSessionID();
return gAgent.isInGroup(group_uuid) && gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS);
}
bool LLFloaterIMContainer::canBanSelectedMember(const LLUUID& participant_uuid)
{
LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
if (NULL == speaker_manager)
{
LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
return false;
}
LLUUID group_uuid = speaker_manager->getSessionID();
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if(!gdatap)
{
LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
return false;
}
if (!gdatap->mMembers.size())
{
return false;
}
LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
if (mi == gdatap->mMembers.end())
{
return false;
}
LLGroupMemberData* member_data = (*mi).second;
// Is the member an owner?
if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
{
return false;
}
if( gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER) &&
gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS) )
{
return true;
}
return false;
}
void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid)
{
LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
if (NULL == speaker_manager)
{
LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
return;
}
LLUUID group_uuid = speaker_manager->getSessionID();
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if(!gdatap)
{
LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
return;
}
std::vector<LLUUID> ids;
ids.push_back(participant_uuid);
LLGroupBanData ban_data;
gdatap->createBanEntry(participant_uuid, ban_data);
LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, group_uuid, LLGroupMgr::BAN_CREATE, ids);
LLGroupMgr::getInstance()->sendGroupMemberEjects(group_uuid, ids);
LLGroupMgr::getInstance()->sendGroupMembersRequest(group_uuid);
LLSD args;
std::string name;
gCacheName->getFullName(participant_uuid, name);
args["AVATAR_NAME"] = name;
args["GROUP_NAME"] = gdatap->mName;
LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
}
void LLFloaterIMContainer::moderateVoice(const std::string& command, const LLUUID& userID)
{
if (!gAgent.getRegion()) return;

View File

@ -169,12 +169,16 @@ private:
LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
bool isGroupModerator();
bool haveAbilityToBan();
bool canBanSelectedMember(const LLUUID& participant_uuid);
LLUUID getGroupUIIDForSelectedParticipant();
bool isMuted(const LLUUID& avatar_id);
void moderateVoice(const std::string& command, const LLUUID& userID);
void moderateVoiceAllParticipants(bool unmute);
void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
void toggleAllowTextChat(const LLUUID& participant_uuid);
void toggleMute(const LLUUID& participant_id, U32 flags);
void banSelectedMember(const LLUUID& participant_uuid);
void openNearbyChat();
bool isParticipantListExpanded();

View File

@ -1893,8 +1893,8 @@ class GroupBanDataResponder : public LLHTTPClient::Responder
public:
GroupBanDataResponder(const LLUUID& gropup_id, BOOL force_refresh=false);
virtual ~GroupBanDataResponder() {}
virtual void result(const LLSD& pContent);
virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent);
virtual void httpSuccess();
virtual void httpFailure();
private:
LLUUID mGroupID;
BOOL mForceRefresh;
@ -1905,18 +1905,18 @@ GroupBanDataResponder::GroupBanDataResponder(const LLUUID& gropup_id, BOOL force
mForceRefresh(force_refresh)
{}
void GroupBanDataResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent)
void GroupBanDataResponder::httpFailure()
{
LL_WARNS("GrpMgr") << "Error receiving group member data [status:"
<< pStatus << "]: " << pContent << LL_ENDL;
<< mStatus << "]: " << mContent << LL_ENDL;
}
void GroupBanDataResponder::result(const LLSD& content)
void GroupBanDataResponder::httpSuccess()
{
if (content.has("ban_list"))
if (mContent.has("ban_list"))
{
// group ban data received
LLGroupMgr::processGroupBanRequest(content);
LLGroupMgr::processGroupBanRequest(mContent);
}
else if (mForceRefresh)
{
@ -2179,6 +2179,22 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
online_status,
is_owner);
LLGroupMemberData* member_old = group_datap->mMembers[member_id];
if (member_old && group_datap->mRoleMemberDataComplete)
{
LLGroupMemberData::role_list_t::iterator rit = member_old->roleBegin();
LLGroupMemberData::role_list_t::iterator end = member_old->roleEnd();
for ( ; rit != end; ++rit)
{
data->addRole((*rit).first,(*rit).second);
}
}
else
{
group_datap->mRoleMemberDataComplete = false;
}
group_datap->mMembers[member_id] = data;
}
@ -2198,7 +2214,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
group_datap->mMemberDataComplete = true;
group_datap->mMemberRequestID.setNull();
// Make the role-member data request
if (group_datap->mPendingRoleMemberRequest)
if (group_datap->mPendingRoleMemberRequest || !group_datap->mRoleMemberDataComplete)
{
group_datap->mPendingRoleMemberRequest = false;
LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_id);

View File

@ -64,7 +64,8 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
mNameColumnIndex(p.name_column.column_index),
mNameColumn(p.name_column.column_name),
mAllowCallingCardDrop(p.allow_calling_card_drop),
mShortNames(p.short_names)
mShortNames(p.short_names),
mPendingLookupsRemaining(0)
{}
// public

View File

@ -387,7 +387,7 @@ void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
}
else
{
LL_WARNS() << "llPanelGroupBulk: Selected avatar has no name: " << dest->getID() << LL_ENDL;
llwarns << "llPanelGroupBulk: Selected avatar has no name: " << dest->getID() << llendl;
names.push_back("(Unknown)");
}
}

View File

@ -39,7 +39,7 @@ class LLPanelGroupBulk : public LLPanel
{
public:
LLPanelGroupBulk(const LLUUID& group_id);
~LLPanelGroupBulk();
/*virtual*/ ~LLPanelGroupBulk();
public:
static void callbackClickSubmit(void* userdata) {}

View File

@ -492,7 +492,7 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
}
else
{
LL_WARNS() << "llPanelGroupInvite: Selected avatar has no name: " << dest->getID() << LL_ENDL;
llwarns << "llPanelGroupInvite: Selected avatar has no name: " << dest->getID() << llendl;
names.push_back("(Unknown)");
}
}

View File

@ -2024,7 +2024,7 @@ bool LLPanelGroupRolesSubTab::needsApply(std::string& mesg)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if(!gdatap)
{
LL_WARNS() << "Unable to get group data for group " << mGroupID << LL_ENDL;
llwarns << "Unable to get group data for group " << mGroupID << llendl;
return false;
}
@ -2412,8 +2412,8 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
}
else
{
LL_WARNS() << "Unable to look up role information for role id: "
<< role_id << LL_ENDL;
LL_WARNS() << "Unable to look up role information for role id: "
<< role_id << LL_ENDL;
}
}
@ -2452,9 +2452,8 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
}
else
{
LL_WARNS() << "Unable to look up role information for role id: "
<< role_id <<
LL_ENDL;
llwarns << "Unable to look up role information for role id: "
<< role_id << llendl;
}
//////////////////////////////////////////////////////////////////////////
@ -2903,6 +2902,7 @@ void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id)
LLPanelGroupSubTab::setGroupID(id);
}
// LLPanelGroupBanListSubTab /////////////////////////////////////////////
static LLPanelInjector<LLPanelGroupBanListSubTab> t_panel_group_ban_subtab("panel_group_banlist_subtab");
@ -3153,17 +3153,18 @@ void LLPanelGroupBanListSubTab::populateBanList()
ban_entry.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
// Baker TODO: MAINT-
// Check out utc_to_pacific_time()
std::string ban_date_str = bd.mBanDate.toHTTPDateString("%Y/%m/%d");
time_t utc_time;
utc_time = time_corrected();
LLSD substitution;
substitution["datetime"] = (S32) utc_time;
LLStringUtil::format (ban_date_str, substitution);
// time_t utc_time;
// utc_time = time_corrected();
// LLSD substitution;
// substitution["datetime"] = (S32) utc_time;
// LLStringUtil::format (ban_date_str, substitution);
LL_INFOS("BAKER") << "[BAKER] BAN_DATE: " << bd.mBanDate.toHTTPDateString("%Y/%m/%d") << LL_ENDL;
LL_INFOS("BAKER") << "[BAKER] BAN_DATE_MODIFIED: " << ban_date_str << LL_ENDL;
//LL_INFOS("BAKER") << "[BAKER] BAN_DATE: " << bd.mBanDate.toHTTPDateString("%Y/%m/%d") << LL_ENDL;
//LL_INFOS("BAKER") << "[BAKER] BAN_DATE_MODIFIED: " << ban_date_str << LL_ENDL;
//ban_entry.columns.add().column("ban_date").value(ban_date_str.font.name("SANSSERIF_SMALL").style("NORMAL");
ban_entry.columns.add().column("ban_date").value(bd.mBanDate.toHTTPDateString("%Y/%m/%d")).font.name("SANSSERIF_SMALL").style("NORMAL");

0
indra/newview/roles_constants.h Executable file → Normal file
View File

View File

@ -214,4 +214,12 @@
<on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
</menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" name="Group Ban Separator"/>
<menu_item_call
label="Ban member"
layout="topleft"
name="BanMember">
<on_click function="Avatar.DoToSelected" parameter="ban_member" />
<on_enable function="Avatar.EnableItem" parameter="can_ban_member" />
</menu_item_call>
</toggleable_menu>

View File

@ -174,138 +174,136 @@ clicking on their names.
right="-5"
name="show_all_button"
width="100" />-->
<panel.string
name="help_text">
Roles have a title and an allowed list of Abilities
that Members can perform. Members can belong to
one or more Roles. A group can have up to 10 Roles,
including the Everyone and Owner Roles.
</panel.string>
<panel.string
name="cant_delete_role">
The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
</panel.string>
<panel.string
name="power_folder_icon" translate="false">
Inv_FolderClosed
</panel.string>
<panel.string
name="power_all_have_icon" translate="false">
Checkbox_On
</panel.string>
<panel.string
name="power_partial_icon" translate="false">
Checkbox_Off
</panel.string>
<filter_editor
layout="topleft"
top="5"
left="5"
right="-5"
height="22"
search_button_visible="false"
follows="left|top|right"
label="Filter Roles"
name="filter_input" />
<scroll_list
<panel.string
name="help_text">
Roles have a title and an allowed list of Abilities
that Members can perform. Members can belong to
one or more Roles. A group can have up to 10 Roles,
including the Everyone and Owner Roles.
</panel.string>
<panel.string
name="cant_delete_role">
The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
</panel.string>
<panel.string
name="power_folder_icon" translate="false">
Inv_FolderClosed
</panel.string>
<panel.string
name="power_all_have_icon" translate="false">
Checkbox_On
</panel.string>
<panel.string
name="power_partial_icon" translate="false">
Checkbox_Off
</panel.string>
<filter_editor
layout="topleft"
top="5"
left="5"
right="-5"
height="22"
search_button_visible="false"
follows="left|top|right"
label="Filter Roles"
name="filter_input" />
<scroll_list
name="role_list"
left="3"
top_pad="5"
right="-1"
height="129"
column_padding="0"
draw_heading="true"
draw_stripes="false"
heading_height="23"
search_column="1"
column_padding="0"
draw_heading="true"
draw_stripes="false"
heading_height="23"
search_column="1"
follows="all"
layout="topleft">
<scroll_list.columns
label="Role"
name="name"
relative_width="0.45" />
<scroll_list.columns
label="Title"
name="title"
relative_width="0.45" />
<scroll_list.columns
label="#"
name="members"
relative_width="0.15" />
</scroll_list>
<scroll_list.columns
label="Role"
name="name"
relative_width="0.45" />
<scroll_list.columns
label="Title"
name="title"
relative_width="0.45" />
<scroll_list.columns
label="#"
name="members"
relative_width="0.15" />
</scroll_list>
<button
name="role_create"
<button
name="role_create"
label="New Role"
left="3"
top_pad="4"
width="100"
height="23"
height="23"
follows="bottom|left"
layout="topleft" />
<button
name="role_delete"
name="role_delete"
label="Delete Role"
left_pad="4"
width="100"
height="23"
follows="bottom|left"
layout="topleft" />
</panel>
</panel>
<!-- ABILITIES sub tab -->
<panel
<panel
name="actions_sub_tab"
label="Abilities"
tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
help_topic="roles_actions_tab"
left="0"
left="0"
top="0"
right="-1"
right="-1"
height="188"
class="panel_group_actions_subtab"
class="panel_group_actions_subtab"
follows="all"
layout="topleft">
<panel.string
name="help_text">
Abilities allow Members in Roles to do specific
things in this group. There&apos;s a broad variety of Abilities.
</panel.string>
<panel.string
name="power_folder_icon" translate="false">
Inv_FolderClosed
</panel.string>
<panel.string
name="power_all_have_icon" translate="false">
Checkbox_On
</panel.string>
<panel.string
name="power_partial_icon" translate="false">
Checkbox_Off
</panel.string>
<panel.string
name="help_text">
Abilities allow Members in Roles to do specific
things in this group. There&apos;s a broad variety of Abilities.
</panel.string>
<panel.string
name="power_folder_icon" translate="false">
Inv_FolderClosed
</panel.string>
<panel.string
name="power_all_have_icon" translate="false">
Checkbox_On
</panel.string>
<panel.string
name="power_partial_icon" translate="false">
Checkbox_Off
</panel.string>
<filter_editor
layout="topleft"
top="5"
left="5"
right="-5"
height="22"
search_button_visible="false"
follows="left|top|right"
label="Filter Abilities"
name="filter_input" />
<filter_editor
layout="topleft"
top="5"
left="5"
right="-5"
height="22"
search_button_visible="false"
follows="left|top|right"
label="Filter Abilities"
name="filter_input" />
<scroll_list
name="action_list"
tool_tip="Select an Ability to view more details"
<scroll_list
name="action_list"
tool_tip="Select an Ability to view more details"
left="0"
top_pad="5"
top_pad="5"
right="-1"
height="161"
column_padding="0"
@ -316,28 +314,108 @@ things in this group. There&apos;s a broad variety of Abilities.
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
name="action"/>
</scroll_list>
</panel>
</scroll_list>
</panel>
<panel
border="false"
height="303"
label="Banned Residents"
label="BANNED RESIDENTS"
layout="topleft"
left="0"
right="-1"
help_topic="roles_banlist_tab"
name="banlist_sub_tab"
class="panel_group_banlist_subtab"
tool_tip="View the banned residents from this group."
width="310">
<panel.string
name="help_text">
Any resident on the ban list will be unable to join the group.
</panel.string>
<panel.string
name="ban_count_template">
Ban count: [COUNT]/[LIMIT]
</panel.string>
<name_list
column_padding="0"
draw_heading="true"
height="400"
follows="left|top|right"
layout="topleft"
left="0"
right="-1"
multi_select="true"
name="ban_list"
short_names="false"
top_pad="5">
<name_list.columns
label="Resident"
name="name"
font.name="SANSSERIF_SMALL"
font.style="NORMAL"
relative_width="0.7" />
<name_list.columns
label="Date Banned"
name="ban_date"
relative_width="0.3" />
</name_list>
<button
follows="top|left"
height="23"
label="Ban Resident(s)"
layout="topleft"
left="3"
name="ban_create"
tool_tip="Ban residents from your group"
width="120" />
<button
follows="top|left"
height="23"
label="Remove Ban(s)"
layout="topleft"
left_pad="5"
name="ban_delete"
tool_tip="Unban selected residents from your group"
width="120" />
<button
follows="top|left"
height="23"
width="23"
image_overlay="Refresh_Off"
layout="topleft"
left_pad="5"
name="ban_refresh"
tool_tip="Refresh the ban list"
/>
<text
type="string"
height="18"
left_pad="5"
follows="top|left"
layout="topleft"
name="ban_count"
width="100">
</text>
</panel>
<panel
border="false"
height="303"
label="Banned Residents"
layout="topleft"
left="0"
right="-1"
help_topic="roles_banlist_tab"
name="banlist_sub_tab"
class="panel_group_banlist_subtab"
@ -470,29 +548,29 @@ things in this group. There&apos;s a broad variety of Abilities.
top_pad="4"
height="16"
type="string"
text_color="EmphasisColor"
text_color="EmphasisColor"
follows="left|top|right"
layout="topleft">
Assigned Roles
</text>
</text>
<scroll_list
name="member_assigned_roles"
<scroll_list
name="member_assigned_roles"
top_pad="0"
right="-1"
height="93"
draw_stripes="true"
follows="top|left|right"
layout="topleft">
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
name="role"
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
name="role"
width="135" />
</scroll_list>
</scroll_list>
<!--
@ -507,105 +585,105 @@ things in this group. There&apos;s a broad variety of Abilities.
//-->
<text
type="string"
type="string"
top_pad="4"
right="-1"
height="16"
height="16"
follows="left|top|right"
text_color="EmphasisColor"
name="static2"
text_color="EmphasisColor"
name="static2"
layout="topleft">
Allowed Abilities
</text>
</text>
<scroll_list
<scroll_list
tool_tip="For details of each allowed ability see the abilities tab"
right="-1"
right="-1"
top_pad="0"
height="93"
draw_stripes="true"
name="member_allowed_actions"
search_column="2"
name="member_allowed_actions"
search_column="2"
follows="all"
layout="topleft">
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
name="action"/>
</scroll_list>
</scroll_list>
<!--
</layout_panel>
</layout_stack>
//-->
</panel>
</panel>
<!-- ROLES footer -->
<panel
<panel
name="roles_footer"
top="192"
left="0"
right="-1"
left="0"
right="-1"
height="226"
background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
mouse_opaque="false"
mouse_opaque="false"
visible="false"
follows="all"
layout="topleft">
<text
<text
name="role_name_label"
left="5"
top_pad="3"
width="70"
height="16"
height="16"
type="string"
follows="left|top"
follows="left|top"
layout="topleft">
Role Name
</text>
</text>
<line_editor
<line_editor
name="role_name"
left_pad="4"
right="-1"
height="20"
height="20"
type="string"
layout="topleft"
follows="left|top|right"
layout="topleft"
follows="left|top|right"
max_length_bytes="20">
</line_editor>
</line_editor>
<text
<text
name="role_title_label"
top_pad="4"
left="5"
width="70"
height="16"
height="16"
type="string"
follows="left|top"
follows="left|top"
layout="topleft">
Role Title
</text>
</text>
<line_editor
<line_editor
name="role_title"
left_pad="4"
right="-1"
height="20"
height="20"
type="string"
follows="left|top|right"
max_length_bytes="20"
follows="left|top|right"
max_length_bytes="20"
layout="topleft">
</line_editor>
</line_editor>
<check_box
top_pad="4"
@ -628,21 +706,21 @@ things in this group. There&apos;s a broad variety of Abilities.
follows="left|top"
layout="topleft">
Description
</text>
</text>
<text_editor
type="string"
layout="topleft"
follows="left|top|right"
right="-1"
max_length="295"
<text_editor
type="string"
layout="topleft"
follows="left|top|right"
right="-1"
max_length="295"
height="37"
name="role_description"
top_pad="0"
name="role_description"
top_pad="0"
left="5"
width="300"
word_wrap="true">
</text_editor>
width="300"
word_wrap="true">
</text_editor>
<!--
<layout_stack
@ -672,23 +750,23 @@ things in this group. There&apos;s a broad variety of Abilities.
follows="top|left|right"
layout="topleft">
<text
<text
name="assigned_members_label"
left="0"
top_pad="0"
right="-1"
height="16"
height="16"
type="string"
follows="left|top|right"
text_color="EmphasisColor"
text_color="EmphasisColor"
layout="topleft">
Assigned Members
</text>
</text>
<name_list
name="role_assigned_members"
<name_list
name="role_assigned_members"
left="0"
top_pad="0"
top_pad="0"
right="-1"
height="69"
draw_stripes="true"
@ -720,18 +798,18 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
top_pad="0"
right="-1"
height="16"
height="16"
type="string"
text_color="EmphasisColor"
text_color="EmphasisColor"
follows="left|top|right"
layout="topleft">
Allowed Abilities
</text>
</text>
<scroll_list
name="role_allowed_actions"
tool_tip="For details of each allowed ability see the abilities tab"
top_pad="0"
<scroll_list
name="role_allowed_actions"
tool_tip="For details of each allowed ability see the abilities tab"
top_pad="0"
right="-1"
height="20"
draw_stripes="true"
@ -739,25 +817,25 @@ things in this group. There&apos;s a broad variety of Abilities.
follows="all"
layout="topleft">
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
<scroll_list.columns
label=""
name="icon"
width="2" />
<scroll_list.columns
label=""
name="checkbox"
width="20" />
<scroll_list.columns
label=""
name="action"/>
</scroll_list>
</scroll_list>
<!--
</layout_panel>
</layout_stack>
//-->
</panel>
</panel>
</panel>
<!-- ABILITIES footer -->
@ -767,8 +845,8 @@ things in this group. There&apos;s a broad variety of Abilities.
left="4"
right="-4"
height="226"
background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
mouse_opaque="false"
visible="false"
follows="all"
@ -785,7 +863,7 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft"
name="action_description_panel">
<text_editor
<text_editor
name="action_description"
top="0"
left="0"
@ -794,14 +872,14 @@ things in this group. There&apos;s a broad variety of Abilities.
halign="left"
bg_readonly_color="Transparent"
font="SansSerifSmall"
type="string"
enabled="false"
max_length="512"
type="string"
enabled="false"
max_length="512"
word_wrap="true"
follows="left|top|right"
layout="topleft">
This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
</text_editor>
</text_editor>
</panel>
<!--
@ -822,22 +900,22 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft">
//-->
<text
<text
name="action_roles_label"
left="0"
top_pad="0"
right="-1"
height="16"
height="16"
type="string"
text_color="EmphasisColor"
follows="left|top|right"
layout="topleft">
Roles with this ability
</text>
</text>
<scroll_list
name="action_roles"
top_pad="0"
<scroll_list
name="action_roles"
top_pad="0"
right="-1"
height="90"
follows="left|top|right"
@ -852,22 +930,22 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft">
//-->
<text
<text
name="action_members_label"
top_pad="0"
right="-1"
height="16"
height="16"
type="string"
text_color="EmphasisColor"
follows="top|left|right"
layout="topleft">
Members with this ability
</text>
</text>
<name_list
name="action_members"
<name_list
name="action_members"
left="0"
top_pad="0"
top_pad="0"
right="-1"
height="46"
follows="all"
@ -876,7 +954,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</layout_panel>
</layout_stack>
//-->
</panel>
</panel>
<!--
</layout_panel>
</layout_stack>