Added context menu to the group list (task EXT-3595).

--HG--
branch : product-engine
master
Vadim Savchuk 2009-12-21 20:56:38 +02:00
parent 7d308294e9
commit c72de2edf0
3 changed files with 134 additions and 0 deletions

View File

@ -37,6 +37,7 @@
// libs
#include "llbutton.h"
#include "lliconctrl.h"
#include "llmenugl.h"
#include "lltextbox.h"
#include "lltrans.h"
@ -46,6 +47,7 @@
#include "llfloaterreg.h"
#include "lltextutil.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
static LLDefaultChildRegistry::Register<LLGroupList> r("group_list");
S32 LLGroupListItem::sIconWidth = 0;
@ -88,11 +90,24 @@ LLGroupList::LLGroupList(const Params& p)
// Set default sort order.
setComparator(&GROUP_COMPARATOR);
// Set up context menu.
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
registrar.add("People.Groups.Action", boost::bind(&LLGroupList::onContextMenuItemClick, this, _2));
enable_registrar.add("People.Groups.Enable", boost::bind(&LLGroupList::onContextMenuItemEnable, this, _2));
LLMenuGL* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups.xml",
gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if(context_menu)
mContextMenuHandle = context_menu->getHandle();
}
LLGroupList::~LLGroupList()
{
gAgent.removeListener(this);
LLView::deleteViewByHandle(mContextMenuHandle);
}
// virtual
@ -104,6 +119,22 @@ void LLGroupList::draw()
LLFlatListView::draw();
}
// virtual
BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
LLMenuGL* context_menu = (LLMenuGL*)mContextMenuHandle.get();
if (context_menu)
{
context_menu->buildDrawLabels();
context_menu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, context_menu, x, y);
}
return handled;
}
void LLGroupList::setNameFilter(const std::string& filter)
{
if (mNameFilter != filter)
@ -203,6 +234,46 @@ bool LLGroupList::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD&
return false;
}
bool LLGroupList::onContextMenuItemClick(const LLSD& userdata)
{
std::string action = userdata.asString();
LLUUID selected_group = getSelectedUUID();
if (action == "view_info")
{
LLGroupActions::show(selected_group);
}
else if (action == "chat")
{
LLGroupActions::startIM(selected_group);
}
else if (action == "call")
{
LLGroupActions::startCall(selected_group);
}
else if (action == "activate")
{
LLGroupActions::activate(selected_group);
}
else if (action == "leave")
{
LLGroupActions::leave(selected_group);
}
return true;
}
bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)
{
LLUUID selected_group_id = getSelectedUUID();
bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected
if (userdata.asString() == "activate")
return real_group_selected && gAgent.getGroupID() != selected_group_id;
return real_group_selected;
}
/************************************************************************/
/* LLGroupListItem implementation */
/************************************************************************/

View File

@ -60,6 +60,7 @@ public:
virtual ~LLGroupList();
virtual void draw(); // from LLView
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); // from LLView
void setNameFilter(const std::string& filter);
void toggleIcons();
@ -71,6 +72,11 @@ private:
void addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, EAddPosition pos = ADD_BOTTOM);
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); // called on agent group list changes
bool onContextMenuItemClick(const LLSD& userdata);
bool onContextMenuItemEnable(const LLSD& userdata);
LLHandle<LLView> mContextMenuHandle;
bool mShowIcons;
bool mDirty;
std::string mNameFilter;

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
<menu_item_call
label="View Info"
name="View Info">
<menu_item_call.on_click
function="People.Groups.Action"
parameter="view_info" />
<menu_item_call.on_enable
function="People.Groups.Enable"
parameter="view_info" />
</menu_item_call>
<menu_item_call
label="Chat"
name="Chat">
<menu_item_call.on_click
function="People.Groups.Action"
parameter="chat" />
<menu_item_call.on_enable
function="People.Groups.Enable"
parameter="chat" />
</menu_item_call>
<menu_item_call
label="Call"
name="Call">
<menu_item_call.on_click
function="People.Groups.Action"
parameter="call" />
<menu_item_call.on_enable
function="People.Groups.Enable"
parameter="call" />
</menu_item_call>
<menu_item_separator />
<menu_item_call
label="Activate"
name="Activate">
<menu_item_call.on_click
function="People.Groups.Action"
parameter="activate" />
<menu_item_call.on_enable
function="People.Groups.Enable"
parameter="activate" />
</menu_item_call>
<menu_item_separator />
<menu_item_call
label="Leave"
name="Leave">
<menu_item_call.on_click
function="People.Groups.Action"
parameter="leave" />
<menu_item_call.on_enable
function="People.Groups.Enable"
parameter="leave" />
</menu_item_call>
</menu>