SL-18412 Merge remote-tracking branch 'RyeMutt/viewer/menu-leaks' into DRTVWR-570-maint-Q
commit
f0cd5407c4
|
|
@ -1386,6 +1386,8 @@ Sovereign Engineer
|
|||
SL-15096
|
||||
SL-16127
|
||||
SL-18249
|
||||
SL-18394
|
||||
SL-18412
|
||||
SpacedOut Frye
|
||||
VWR-34
|
||||
VWR-45
|
||||
|
|
|
|||
|
|
@ -163,6 +163,7 @@ LLFolderView::LLFolderView(const Params& p)
|
|||
: LLFolderViewFolder(p),
|
||||
mScrollContainer( NULL ),
|
||||
mPopupMenuHandle(),
|
||||
mMenuFileName(p.options_menu),
|
||||
mAllowMultiSelect(p.allow_multiselect),
|
||||
mAllowDrag(p.allow_drag),
|
||||
mShowEmptyMessage(p.show_empty_message),
|
||||
|
|
@ -182,6 +183,7 @@ LLFolderView::LLFolderView(const Params& p)
|
|||
mMinWidth(0),
|
||||
mDragAndDropThisFrame(FALSE),
|
||||
mCallbackRegistrar(NULL),
|
||||
mEnableRegistrar(NULL),
|
||||
mUseEllipses(p.use_ellipses),
|
||||
mDraggingOverItem(NULL),
|
||||
mStatusTextBox(NULL),
|
||||
|
|
@ -244,17 +246,6 @@ LLFolderView::LLFolderView(const Params& p)
|
|||
mStatusTextBox->setFollowsTop();
|
||||
addChild(mStatusTextBox);
|
||||
|
||||
|
||||
// make the popup menu available
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(p.options_menu, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!menu)
|
||||
{
|
||||
menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu");
|
||||
}
|
||||
menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
|
||||
mViewModelItem->openItem();
|
||||
|
||||
mAreChildrenInited = true; // root folder is a special case due to not being loaded normally, assume that it's inited.
|
||||
|
|
@ -276,6 +267,7 @@ LLFolderView::~LLFolderView( void )
|
|||
mStatusTextBox = NULL;
|
||||
|
||||
if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
|
||||
mAutoOpenItems.removeAllNodes();
|
||||
clearSelection();
|
||||
|
|
@ -1438,22 +1430,56 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
|
|||
BOOL handled = childrenHandleRightMouseDown(x, y, mask) != NULL;
|
||||
S32 count = mSelectedItems.size();
|
||||
|
||||
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
|
||||
LLMenuGL* menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
if (!menu)
|
||||
{
|
||||
if (mCallbackRegistrar)
|
||||
{
|
||||
mCallbackRegistrar->pushScope();
|
||||
}
|
||||
if (mEnableRegistrar)
|
||||
{
|
||||
mEnableRegistrar->pushScope();
|
||||
}
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(mMenuFileName, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!menu)
|
||||
{
|
||||
menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu");
|
||||
}
|
||||
menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
if (mEnableRegistrar)
|
||||
{
|
||||
mEnableRegistrar->popScope();
|
||||
}
|
||||
if (mCallbackRegistrar)
|
||||
{
|
||||
mCallbackRegistrar->popScope();
|
||||
}
|
||||
}
|
||||
bool hide_folder_menu = mSuppressFolderMenu && isFolderSelected();
|
||||
if ((handled
|
||||
&& ( count > 0 && (hasVisibleChildren()) ) // show menu only if selected items are visible
|
||||
&& menu ) &&
|
||||
if (menu && (handled
|
||||
&& ( count > 0 && (hasVisibleChildren()) )) && // show menu only if selected items are visible
|
||||
!hide_folder_menu)
|
||||
{
|
||||
if (mCallbackRegistrar)
|
||||
{
|
||||
mCallbackRegistrar->pushScope();
|
||||
}
|
||||
if (mEnableRegistrar)
|
||||
{
|
||||
mEnableRegistrar->pushScope();
|
||||
}
|
||||
|
||||
updateMenuOptions(menu);
|
||||
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
if (mEnableRegistrar)
|
||||
{
|
||||
mEnableRegistrar->popScope();
|
||||
}
|
||||
if (mCallbackRegistrar)
|
||||
{
|
||||
mCallbackRegistrar->popScope();
|
||||
|
|
@ -1531,7 +1557,7 @@ void LLFolderView::deleteAllChildren()
|
|||
{
|
||||
closeRenamer();
|
||||
if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
|
||||
mPopupMenuHandle = LLHandle<LLView>();
|
||||
mPopupMenuHandle.markDead();
|
||||
mScrollContainer = NULL;
|
||||
mRenameItem = NULL;
|
||||
mRenamer = NULL;
|
||||
|
|
|
|||
|
|
@ -235,6 +235,7 @@ public:
|
|||
bool showItemLinkOverlays() { return mShowItemLinkOverlays; }
|
||||
|
||||
void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
|
||||
void setEnableRegistrar(LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* registrar) { mEnableRegistrar = registrar; }
|
||||
|
||||
LLPanel* getParentPanel() { return mParentPanel.get(); }
|
||||
// DEBUG only
|
||||
|
|
@ -272,6 +273,7 @@ protected:
|
|||
|
||||
protected:
|
||||
LLHandle<LLView> mPopupMenuHandle;
|
||||
std::string mMenuFileName;
|
||||
|
||||
selected_items_t mSelectedItems;
|
||||
bool mKeyboardSelection,
|
||||
|
|
@ -327,6 +329,7 @@ protected:
|
|||
LLFolderViewItem* mDraggingOverItem; // See EXT-719
|
||||
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* mCallbackRegistrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* mEnableRegistrar;
|
||||
|
||||
public:
|
||||
static F32 sAutoOpenTime;
|
||||
|
|
|
|||
|
|
@ -209,13 +209,6 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
|
|||
|
||||
setPrevalidateInput(p.prevalidate_input_callback());
|
||||
setPrevalidate(p.prevalidate_callback());
|
||||
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>
|
||||
("menu_text_editor.xml",
|
||||
LLMenuGL::sMenuContainer,
|
||||
LLMenuHolderGL::child_registry_t::instance());
|
||||
setContextMenu(menu);
|
||||
}
|
||||
|
||||
LLLineEditor::~LLLineEditor()
|
||||
|
|
@ -2637,6 +2630,15 @@ LLWString LLLineEditor::getConvertedText() const
|
|||
void LLLineEditor::showContextMenu(S32 x, S32 y)
|
||||
{
|
||||
LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
|
||||
if (!menu)
|
||||
{
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
menu = LLUICtrlFactory::createFromFile<LLContextMenu>
|
||||
("menu_text_editor.xml",
|
||||
LLMenuGL::sMenuContainer,
|
||||
LLMenuHolderGL::child_registry_t::instance());
|
||||
setContextMenu(menu);
|
||||
}
|
||||
|
||||
if (menu)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -4087,25 +4087,39 @@ void LLTearOffMenu::closeTearOff()
|
|||
}
|
||||
|
||||
LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p)
|
||||
: LLMenuItemGL(p),
|
||||
mBranch( p.branch()->getHandle() )
|
||||
: LLMenuItemGL(p)
|
||||
{
|
||||
mBranch.get()->hide();
|
||||
mBranch.get()->setParentMenuItem(this);
|
||||
LLContextMenu* branch = static_cast<LLContextMenu*>(p.branch);
|
||||
if (branch)
|
||||
{
|
||||
mBranch = branch->getHandle();
|
||||
branch->hide();
|
||||
branch->setParentMenuItem(this);
|
||||
}
|
||||
}
|
||||
|
||||
LLContextMenuBranch::~LLContextMenuBranch()
|
||||
{
|
||||
if (mBranch.get())
|
||||
{
|
||||
mBranch.get()->die();
|
||||
}
|
||||
}
|
||||
|
||||
// called to rebuild the draw label
|
||||
void LLContextMenuBranch::buildDrawLabel( void )
|
||||
{
|
||||
auto menu = getBranch();
|
||||
if (menu)
|
||||
{
|
||||
// default enablement is this -- if any of the subitems are
|
||||
// enabled, this item is enabled. JC
|
||||
U32 sub_count = mBranch.get()->getItemCount();
|
||||
U32 sub_count = menu->getItemCount();
|
||||
U32 i;
|
||||
BOOL any_enabled = FALSE;
|
||||
for (i = 0; i < sub_count; i++)
|
||||
{
|
||||
LLMenuItemGL* item = mBranch.get()->getItem(i);
|
||||
LLMenuItemGL* item = menu->getItem(i);
|
||||
item->buildDrawLabel();
|
||||
if (item->getEnabled() && !item->getDrawTextDisabled() )
|
||||
{
|
||||
|
|
@ -4127,13 +4141,17 @@ void LLContextMenuBranch::buildDrawLabel( void )
|
|||
|
||||
void LLContextMenuBranch::showSubMenu()
|
||||
{
|
||||
LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem();
|
||||
if (menu_item != NULL && menu_item->getVisible())
|
||||
auto menu = getBranch();
|
||||
if(menu)
|
||||
{
|
||||
S32 center_x;
|
||||
S32 center_y;
|
||||
localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y);
|
||||
mBranch.get()->show(center_x, center_y);
|
||||
LLMenuItemGL* menu_item = menu->getParentMenuItem();
|
||||
if (menu_item != NULL && menu_item->getVisible())
|
||||
{
|
||||
S32 center_x;
|
||||
S32 center_y;
|
||||
localPointToScreen(getRect().getWidth(), getRect().getHeight(), ¢er_x, ¢er_y);
|
||||
menu->show(center_x, center_y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4147,13 +4165,17 @@ void LLContextMenuBranch::setHighlight( BOOL highlight )
|
|||
{
|
||||
if (highlight == getHighlight()) return;
|
||||
LLMenuItemGL::setHighlight(highlight);
|
||||
if( highlight )
|
||||
auto menu = getBranch();
|
||||
if (menu)
|
||||
{
|
||||
showSubMenu();
|
||||
}
|
||||
else
|
||||
{
|
||||
mBranch.get()->hide();
|
||||
if (highlight)
|
||||
{
|
||||
showSubMenu();
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -745,8 +745,7 @@ public:
|
|||
|
||||
LLContextMenuBranch(const Params&);
|
||||
|
||||
virtual ~LLContextMenuBranch()
|
||||
{}
|
||||
virtual ~LLContextMenuBranch();
|
||||
|
||||
// called to rebuild the draw label
|
||||
virtual void buildDrawLabel( void );
|
||||
|
|
|
|||
|
|
@ -196,7 +196,6 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
|
|||
mHighlightedItem(-1),
|
||||
mBorder(NULL),
|
||||
mSortCallback(NULL),
|
||||
mPopupMenu(NULL),
|
||||
mCommentTextView(NULL),
|
||||
mNumDynamicWidthColumns(0),
|
||||
mTotalStaticColumnWidth(0),
|
||||
|
|
@ -348,6 +347,13 @@ LLScrollListCtrl::~LLScrollListCtrl()
|
|||
mItemList.clear();
|
||||
clearColumns(); //clears columns and deletes headers
|
||||
delete mIsFriendSignal;
|
||||
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1997,17 +2003,23 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
// create the context menu from the XUI file and display it
|
||||
std::string menu_name = is_group ? "menu_url_group.xml" : "menu_url_agent.xml";
|
||||
delete mPopupMenu;
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
|
||||
menu_name, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (mPopupMenu)
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
|
||||
menu_name, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
if (mIsFriendSignal)
|
||||
{
|
||||
bool isFriend = *(*mIsFriendSignal)(uuid);
|
||||
LLView* addFriendButton = mPopupMenu->getChild<LLView>("add_friend");
|
||||
LLView* removeFriendButton = mPopupMenu->getChild<LLView>("remove_friend");
|
||||
LLView* addFriendButton = menu->getChild<LLView>("add_friend");
|
||||
LLView* removeFriendButton = menu->getChild<LLView>("remove_friend");
|
||||
|
||||
if (addFriendButton && removeFriendButton)
|
||||
{
|
||||
|
|
@ -2016,8 +2028,8 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
}
|
||||
}
|
||||
|
||||
mPopupMenu->show(x, y);
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
menu->show(x, y);
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -526,7 +526,7 @@ private:
|
|||
|
||||
S32 mHighlightedItem;
|
||||
class LLViewBorder* mBorder;
|
||||
LLContextMenu *mPopupMenu;
|
||||
LLHandle<LLContextMenu> mPopupMenuHandle;
|
||||
|
||||
LLView *mCommentTextView;
|
||||
|
||||
|
|
|
|||
|
|
@ -273,6 +273,12 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
|
|||
LLTextBase::~LLTextBase()
|
||||
{
|
||||
mSegments.clear();
|
||||
LLContextMenu* menu = static_cast<LLContextMenu*>(mPopupMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
delete mURLClickSignal;
|
||||
delete mIsFriendSignal;
|
||||
delete mIsObjectBlockedSignal;
|
||||
|
|
|
|||
|
|
@ -257,7 +257,6 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
|
|||
mMouseDownY(0),
|
||||
mTabsToNextField(p.ignore_tab),
|
||||
mPrevalidateFunc(p.prevalidate_callback()),
|
||||
mContextMenu(NULL),
|
||||
mShowContextMenu(p.show_context_menu),
|
||||
mEnableTooltipPaste(p.enable_tooltip_paste),
|
||||
mPassDelete(FALSE),
|
||||
|
|
@ -301,8 +300,13 @@ LLTextEditor::~LLTextEditor()
|
|||
// Scrollbar is deleted by LLView
|
||||
std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer());
|
||||
mUndoStack.clear();
|
||||
// context menu is owned by menu holder, not us
|
||||
//delete mContextMenu;
|
||||
// Mark the menu as dead or its retained in memory till shutdown.
|
||||
LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
|
||||
if(menu)
|
||||
{
|
||||
menu->die();
|
||||
mContextMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
|
@ -2051,12 +2055,19 @@ void LLTextEditor::setEnabled(BOOL enabled)
|
|||
|
||||
void LLTextEditor::showContextMenu(S32 x, S32 y)
|
||||
{
|
||||
if (!mContextMenu)
|
||||
LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
|
||||
if (!menu)
|
||||
{
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
mContextMenu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_text_editor.xml",
|
||||
menu = LLUICtrlFactory::createFromFile<LLContextMenu>("menu_text_editor.xml",
|
||||
LLMenuGL::sMenuContainer,
|
||||
LLMenuHolderGL::child_registry_t::instance());
|
||||
if(!menu)
|
||||
{
|
||||
LL_WARNS() << "Failed to create menu for LLTextEditor: " << getName() << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
mContextMenuHandle = menu->getHandle();
|
||||
}
|
||||
|
||||
// Route menu to this class
|
||||
|
|
@ -2102,11 +2113,11 @@ void LLTextEditor::showContextMenu(S32 x, S32 y)
|
|||
}
|
||||
}
|
||||
|
||||
mContextMenu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
|
||||
mContextMenu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
|
||||
mContextMenu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
|
||||
mContextMenu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
|
||||
mContextMenu->show(screen_x, screen_y, this);
|
||||
menu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
|
||||
menu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
|
||||
menu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
|
||||
menu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
|
||||
menu->show(screen_x, screen_y, this);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@ private:
|
|||
keystroke_signal_t mKeystrokeSignal;
|
||||
LLTextValidate::validate_func_t mPrevalidateFunc;
|
||||
|
||||
LLContextMenu* mContextMenu;
|
||||
LLHandle<LLContextMenu> mContextMenuHandle;
|
||||
}; // end class LLTextEditor
|
||||
|
||||
// Build time optimization, generate once in .cpp file
|
||||
|
|
|
|||
|
|
@ -127,7 +127,12 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)
|
|||
|
||||
LLToolBar::~LLToolBar()
|
||||
{
|
||||
delete mPopupMenuHandle.get();
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
delete mButtonAddSignal;
|
||||
delete mButtonEnterSignal;
|
||||
delete mButtonLeaveSignal;
|
||||
|
|
|
|||
|
|
@ -141,6 +141,18 @@ public:
|
|||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
auto menu = mPopupMenuHandleAvatar.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandleAvatar.markDead();
|
||||
}
|
||||
menu = mPopupMenuHandleObject.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandleObject.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
|
|
@ -567,36 +579,6 @@ public:
|
|||
|
||||
BOOL postBuild()
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar registrar_enable;
|
||||
|
||||
registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Enable", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemEnabled, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Visible", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemVisible, this, _2));
|
||||
registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_avatar_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_object_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::showInspector, this));
|
||||
|
||||
setMouseEnterCallback(boost::bind(&LLChatHistoryHeader::showInfoCtrl, this));
|
||||
|
|
@ -883,13 +865,53 @@ protected:
|
|||
void showObjectContextMenu(S32 x,S32 y)
|
||||
{
|
||||
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandleObject.get();
|
||||
if(menu)
|
||||
if (!menu)
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar registrar_enable;
|
||||
registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
|
||||
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_object_icon.xml" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void showAvatarContextMenu(S32 x,S32 y)
|
||||
{
|
||||
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandleAvatar.get();
|
||||
if (!menu)
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar registrar_enable;
|
||||
registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Enable", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemEnabled, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Visible", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemVisible, this, _2));
|
||||
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_avatar_icon.xml" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
if(menu)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
|
|||
, mMaxDisplayedCount(p.max_displayed_count)
|
||||
, mIsNewMessagesState(false)
|
||||
, mFlashToLitTimer(NULL)
|
||||
, mContextMenu(NULL)
|
||||
{
|
||||
LLButton::Params button_params = p.button;
|
||||
mButton = LLUICtrlFactory::create<LLButton>(button_params);
|
||||
|
|
@ -79,6 +78,12 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
|
|||
LLSysWellChiclet::~LLSysWellChiclet()
|
||||
{
|
||||
mFlashToLitTimer->unset();
|
||||
LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mContextMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
void LLSysWellChiclet::setCounter(S32 counter)
|
||||
|
|
@ -145,14 +150,16 @@ void LLSysWellChiclet::updateWidget(bool is_window_empty)
|
|||
// virtual
|
||||
BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(!mContextMenu)
|
||||
LLContextMenu* menu_avatar = mContextMenuHandle.get();
|
||||
if(!menu_avatar)
|
||||
{
|
||||
createMenu();
|
||||
menu_avatar = mContextMenuHandle.get();
|
||||
}
|
||||
if (mContextMenu)
|
||||
if (menu_avatar)
|
||||
{
|
||||
mContextMenu->show(x, y);
|
||||
LLMenuGL::showPopup(this, mContextMenu, x, y);
|
||||
menu_avatar->show(x, y);
|
||||
LLMenuGL::showPopup(this, menu_avatar, x, y);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -192,7 +199,7 @@ bool LLNotificationChiclet::enableMenuItem(const LLSD& user_data)
|
|||
|
||||
void LLNotificationChiclet::createMenu()
|
||||
{
|
||||
if(mContextMenu)
|
||||
if(mContextMenuHandle.get())
|
||||
{
|
||||
LL_WARNS() << "Menu already exists" << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -207,10 +214,14 @@ void LLNotificationChiclet::createMenu()
|
|||
boost::bind(&LLNotificationChiclet::enableMenuItem, this, _2));
|
||||
|
||||
llassert(LLMenuGL::sMenuContainer != NULL);
|
||||
mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
|
||||
LLContextMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
|
||||
("menu_notification_well_button.xml",
|
||||
LLMenuGL::sMenuContainer,
|
||||
LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mContextMenuHandle = menu->getHandle();
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
|
|
@ -309,10 +320,19 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
|
|||
, mDefaultWidth(p.rect().getWidth())
|
||||
, mNewMessagesIcon(NULL)
|
||||
, mChicletButton(NULL)
|
||||
, mPopupMenu(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
LLIMChiclet::~LLIMChiclet()
|
||||
{
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
/* virtual*/
|
||||
BOOL LLIMChiclet::postBuild()
|
||||
{
|
||||
|
|
@ -364,16 +384,18 @@ void LLIMChiclet::setToggleState(bool toggle)
|
|||
|
||||
BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(!mPopupMenu)
|
||||
auto menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
if(!menu)
|
||||
{
|
||||
createPopupMenu();
|
||||
menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
}
|
||||
|
||||
if (mPopupMenu)
|
||||
if (menu)
|
||||
{
|
||||
updateMenuItems();
|
||||
mPopupMenu->arrangeAndClear();
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
menu->arrangeAndClear();
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -381,15 +403,16 @@ BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
void LLIMChiclet::hidePopupMenu()
|
||||
{
|
||||
if (mPopupMenu)
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenu->setVisible(FALSE);
|
||||
menu->setVisible(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
bool LLIMChiclet::canCreateMenu()
|
||||
{
|
||||
if(mPopupMenu)
|
||||
if(mPopupMenuHandle.get())
|
||||
{
|
||||
LL_WARNS() << "Menu already exists" << LL_ENDL;
|
||||
return false;
|
||||
|
|
@ -1107,8 +1130,13 @@ void LLScriptChiclet::createPopupMenu()
|
|||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
registrar.add("ScriptChiclet.Action", boost::bind(&LLScriptChiclet::onMenuItemClicked, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
|
||||
("menu_script_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -1185,8 +1213,12 @@ void LLInvOfferChiclet::createPopupMenu()
|
|||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
registrar.add("InvOfferChiclet.Action", boost::bind(&LLInvOfferChiclet::onMenuItemClicked, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
|
||||
("menu_inv_offer_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
|
|
|||
|
|
@ -252,7 +252,7 @@ public:
|
|||
{};
|
||||
|
||||
|
||||
virtual ~LLIMChiclet() {};
|
||||
virtual ~LLIMChiclet();
|
||||
|
||||
/**
|
||||
* It is used for default setting up of chicklet:click handler, etc.
|
||||
|
|
@ -325,7 +325,7 @@ protected:
|
|||
|
||||
bool canCreateMenu();
|
||||
|
||||
LLMenuGL* mPopupMenu;
|
||||
LLHandle<LLUICtrl> mPopupMenuHandle;
|
||||
|
||||
bool mShowSpeaker;
|
||||
bool mCounterEnabled;
|
||||
|
|
@ -519,7 +519,7 @@ protected:
|
|||
bool mIsNewMessagesState;
|
||||
|
||||
LLFlashTimer* mFlashToLitTimer;
|
||||
LLContextMenu* mContextMenu;
|
||||
LLHandle<LLContextMenu> mContextMenuHandle;
|
||||
};
|
||||
|
||||
class LLNotificationChiclet : public LLSysWellChiclet
|
||||
|
|
|
|||
|
|
@ -69,6 +69,12 @@ LLFloaterBump::LLFloaterBump(const LLSD& key)
|
|||
// Destroys the object
|
||||
LLFloaterBump::~LLFloaterBump()
|
||||
{
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLFloaterBump::postBuild()
|
||||
|
|
@ -77,11 +83,15 @@ BOOL LLFloaterBump::postBuild()
|
|||
mList->setAllowMultipleSelection(false);
|
||||
mList->setRightMouseDownCallback(boost::bind(&LLFloaterBump::onScrollListRightClicked, this, _1, _2, _3));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_avatar_other.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenu->setItemVisible(std::string("Normal"), false);
|
||||
mPopupMenu->setItemVisible(std::string("Always use impostor"), false);
|
||||
mPopupMenu->setItemVisible(std::string("Never use impostor"), false);
|
||||
mPopupMenu->setItemVisible(std::string("Impostor seperator"), false);
|
||||
LLContextMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_avatar_other.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
menu->setItemVisible(std::string("Normal"), false);
|
||||
menu->setItemVisible(std::string("Always use impostor"), false);
|
||||
menu->setItemVisible(std::string("Never use impostor"), false);
|
||||
menu->setItemVisible(std::string("Impostor seperator"), false);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -176,18 +186,19 @@ void LLFloaterBump::onScrollListRightClicked(LLUICtrl* ctrl, S32 x, S32 y)
|
|||
if (!gMeanCollisionList.empty())
|
||||
{
|
||||
LLScrollListItem* item = mList->hitItem(x, y);
|
||||
if (item && mPopupMenu)
|
||||
auto menu = mPopupMenuHandle.get();
|
||||
if (item && menu)
|
||||
{
|
||||
mItemUUID = item->getUUID();
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
menu->buildDrawLabels();
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
|
||||
std::string mute_msg = (LLMuteList::getInstance()->isMuted(mItemUUID, mNames[mItemUUID])) ? "UnmuteAvatar" : "MuteAvatar";
|
||||
mPopupMenu->getChild<LLUICtrl>("Avatar Mute")->setValue(LLTrans::getString(mute_msg));
|
||||
mPopupMenu->setItemEnabled(std::string("Zoom In"), bool(gObjectList.findObject(mItemUUID)));
|
||||
menu->getChild<LLUICtrl>("Avatar Mute")->setValue(LLTrans::getString(mute_msg));
|
||||
menu->setItemEnabled(std::string("Zoom In"), bool(gObjectList.findObject(mItemUUID)));
|
||||
|
||||
((LLContextMenu*)mPopupMenu)->show(x, y);
|
||||
LLMenuGL::showPopup(ctrl, mPopupMenu, x, y);
|
||||
menu->show(x, y);
|
||||
LLMenuGL::showPopup(ctrl, menu, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ private:
|
|||
virtual ~LLFloaterBump();
|
||||
|
||||
LLScrollListCtrl* mList;
|
||||
LLMenuGL* mPopupMenu;
|
||||
LLHandle<LLContextMenu> mPopupMenuHandle;
|
||||
LLUUID mItemUUID;
|
||||
|
||||
typedef std::map<LLUUID, std::string> uuid_map_t;
|
||||
|
|
|
|||
|
|
@ -211,6 +211,7 @@ BOOL LLFloaterIMContainer::postBuild()
|
|||
p.options_menu = "menu_conversation.xml";
|
||||
mConversationsRoot = LLUICtrlFactory::create<LLFolderView>(p);
|
||||
mConversationsRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
mConversationsRoot->setEnableRegistrar(&mEnableCallbackRegistrar);
|
||||
|
||||
// Add listener to conversation model events
|
||||
mConversationsEventStream.listen("ConversationsRefresh", boost::bind(&LLFloaterIMContainer::onConversationModelEvent, this, _1));
|
||||
|
|
|
|||
|
|
@ -317,6 +317,7 @@ BOOL LLFloaterIMSessionTab::postBuild()
|
|||
p.name = "root";
|
||||
mConversationsRoot = LLUICtrlFactory::create<LLFolderView>(p);
|
||||
mConversationsRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
mConversationsRoot->setEnableRegistrar(&mEnableCallbackRegistrar);
|
||||
// Attach that root to the scroller
|
||||
mScroller->addChild(mConversationsRoot);
|
||||
mConversationsRoot->setScrollContainer(mScroller);
|
||||
|
|
|
|||
|
|
@ -211,7 +211,11 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
|
|||
p.allow_drop = mParams.allow_drop_on_root;
|
||||
p.options_menu = "menu_inventory.xml";
|
||||
|
||||
return LLUICtrlFactory::create<LLFolderView>(p);
|
||||
LLFolderView* fv = LLUICtrlFactory::create<LLFolderView>(p);
|
||||
fv->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
fv->setEnableRegistrar(&mEnableCallbackRegistrar);
|
||||
|
||||
return fv;
|
||||
}
|
||||
|
||||
void LLInventoryPanel::clearFolderRoot()
|
||||
|
|
@ -264,6 +268,7 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
|
|||
}
|
||||
mCommitCallbackRegistrar.popScope();
|
||||
mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
mFolderRoot.get()->setEnableRegistrar(&mEnableCallbackRegistrar);
|
||||
|
||||
// Scroller
|
||||
LLRect scroller_view_rect = getRect();
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ LLListContextMenu::~LLListContextMenu()
|
|||
if (!mMenuHandle.isDead())
|
||||
{
|
||||
mMenuHandle.get()->die();
|
||||
mMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -59,13 +60,8 @@ void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32
|
|||
LLContextMenu* menup = mMenuHandle.get();
|
||||
if (menup)
|
||||
{
|
||||
//preventing parent (menu holder) from deleting already "dead" context menus on exit
|
||||
LLView* parent = menup->getParent();
|
||||
if (parent)
|
||||
{
|
||||
parent->removeChild(menup);
|
||||
}
|
||||
delete menup;
|
||||
menup->die();
|
||||
mMenuHandle.markDead();
|
||||
mUUIDs.clear();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -106,7 +106,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
|
|||
mTrusted(p.trusted_content),
|
||||
mWindowShade(NULL),
|
||||
mHoverTextChanged(false),
|
||||
mContextMenu(NULL),
|
||||
mAllowFileDownload(false)
|
||||
{
|
||||
{
|
||||
|
|
@ -151,6 +150,13 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
|
|||
|
||||
LLMediaCtrl::~LLMediaCtrl()
|
||||
{
|
||||
auto menu = mContextMenuHandle.get();
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mContextMenuHandle.markDead();
|
||||
}
|
||||
|
||||
if (mMediaSource)
|
||||
{
|
||||
mMediaSource->remObserver( this );
|
||||
|
|
@ -336,15 +342,33 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
|
|||
setFocus( TRUE );
|
||||
}
|
||||
|
||||
if (mContextMenu)
|
||||
auto menu = mContextMenuHandle.get();
|
||||
if (!menu)
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
|
||||
registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this));
|
||||
|
||||
// stinson 05/05/2014 : use this as the parent of the context menu if the static menu
|
||||
// container has yet to be created
|
||||
LLPanel* menuParent = (LLMenuGL::sMenuContainer != NULL) ? dynamic_cast<LLPanel*>(LLMenuGL::sMenuContainer) : dynamic_cast<LLPanel*>(this);
|
||||
llassert(menuParent != NULL);
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
|
||||
"menu_media_ctrl.xml", menuParent, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mContextMenuHandle = menu->getHandle();
|
||||
}
|
||||
}
|
||||
|
||||
if (menu)
|
||||
{
|
||||
// hide/show debugging options
|
||||
bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
|
||||
mContextMenu->setItemVisible("open_webinspector", media_plugin_debugging_enabled );
|
||||
mContextMenu->setItemVisible("debug_separator", media_plugin_debugging_enabled );
|
||||
menu->setItemVisible("open_webinspector", media_plugin_debugging_enabled );
|
||||
menu->setItemVisible("debug_separator", media_plugin_debugging_enabled );
|
||||
|
||||
mContextMenu->show(x, y);
|
||||
LLMenuGL::showPopup(this, mContextMenu, x, y);
|
||||
menu->show(x, y);
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -409,15 +433,6 @@ void LLMediaCtrl::onFocusLost()
|
|||
//
|
||||
BOOL LLMediaCtrl::postBuild ()
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
|
||||
registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this));
|
||||
|
||||
// stinson 05/05/2014 : use this as the parent of the context menu if the static menu
|
||||
// container has yet to be created
|
||||
LLPanel* menuParent = (LLMenuGL::sMenuContainer != NULL) ? dynamic_cast<LLPanel*>(LLMenuGL::sMenuContainer) : dynamic_cast<LLPanel*>(this);
|
||||
llassert(menuParent != NULL);
|
||||
mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
|
||||
"menu_media_ctrl.xml", menuParent, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChanged, this, _2));
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -1230,11 +1245,6 @@ void LLMediaCtrl::setTrustedContent(bool trusted)
|
|||
}
|
||||
}
|
||||
|
||||
void LLMediaCtrl::updateContextMenuParent(LLView* pNewParent)
|
||||
{
|
||||
mContextMenu->updateParent(pNewParent);
|
||||
}
|
||||
|
||||
bool LLMediaCtrl::wantsKeyUpKeyDown() const
|
||||
{
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -174,8 +174,6 @@ public:
|
|||
|
||||
LLUUID getTextureID() {return mMediaTextureID;}
|
||||
|
||||
void updateContextMenuParent(LLView* pNewParent);
|
||||
|
||||
// The Browser windows want keyup and keydown events. Overridden from LLFocusableElement to return true.
|
||||
virtual bool wantsKeyUpKeyDown() const;
|
||||
virtual bool wantsReturnKey() const;
|
||||
|
|
@ -220,7 +218,7 @@ public:
|
|||
mTextureHeight;
|
||||
|
||||
class LLWindowShade* mWindowShade;
|
||||
LLContextMenu* mContextMenu;
|
||||
LLHandle<LLContextMenu> mContextMenuHandle;
|
||||
};
|
||||
|
||||
#endif // LL_LLMediaCtrl_H
|
||||
|
|
|
|||
|
|
@ -93,8 +93,7 @@ LLNetMap::LLNetMap (const Params & p)
|
|||
mObjectImagep(),
|
||||
mClosestAgentToCursor(),
|
||||
mClosestAgentAtLastRightClick(),
|
||||
mToolTipMsg(),
|
||||
mPopupMenu(NULL)
|
||||
mToolTipMsg()
|
||||
{
|
||||
mScale = gSavedSettings.getF32("MiniMapScale");
|
||||
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
|
||||
|
|
@ -103,6 +102,12 @@ LLNetMap::LLNetMap (const Params & p)
|
|||
|
||||
LLNetMap::~LLNetMap()
|
||||
{
|
||||
auto menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
menu->die();
|
||||
mPopupMenuHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLNetMap::postBuild()
|
||||
|
|
@ -112,7 +117,8 @@ BOOL LLNetMap::postBuild()
|
|||
registrar.add("Minimap.Zoom", boost::bind(&LLNetMap::handleZoom, this, _2));
|
||||
registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -859,12 +865,13 @@ BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
|
|||
|
||||
BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
auto menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
menu->buildDrawLabels();
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
menu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -990,9 +997,10 @@ void LLNetMap::handleZoom(const LLSD& userdata)
|
|||
|
||||
void LLNetMap::handleStopTracking (const LLSD& userdata)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
auto menu = static_cast<LLMenuGL*>(mPopupMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
menu->setItemEnabled ("Stop Tracking", false);
|
||||
LLTracker::stopTracking (LLTracker::isTracking(NULL));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ private:
|
|||
void handleZoom(const LLSD& userdata);
|
||||
void handleStopTracking (const LLSD& userdata);
|
||||
|
||||
LLMenuGL* mPopupMenu;
|
||||
LLHandle<LLView> mPopupMenuHandle;
|
||||
uuid_vec_t gmSelected;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -307,6 +307,13 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
|
|||
|
||||
gInventory.removeObserver(this);
|
||||
delete mSavedFolderState;
|
||||
|
||||
auto menu = mMenuAddHandle.get();
|
||||
if(menu)
|
||||
{
|
||||
menu->die();
|
||||
mMenuAddHandle.markDead();
|
||||
}
|
||||
}
|
||||
|
||||
LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
|
||||
|
|
@ -1177,13 +1184,12 @@ void LLPanelMainInventory::initListCommandsHandlers()
|
|||
mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2));
|
||||
mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
|
||||
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGearMenuButton->setMenu(mMenuGearDefault);
|
||||
mGearMenuButton->setMenu(mMenuGearDefault, LLMenuButton::MP_TOP_LEFT, true);
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mMenuAddHandle = menu->getHandle();
|
||||
|
||||
mMenuVisibility = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_search_visibility.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mVisibilityMenuButton->setMenu(mMenuVisibility);
|
||||
mVisibilityMenuButton->setMenuPosition(LLMenuButton::MP_BOTTOM_LEFT);
|
||||
mVisibilityMenuButton->setMenu(mMenuVisibility, LLMenuButton::MP_BOTTOM_LEFT, true);
|
||||
|
||||
// Update the trash button when selected item(s) get worn or taken off.
|
||||
LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLPanelMainInventory::updateListCommands, this));
|
||||
|
|
|
|||
|
|
@ -1361,6 +1361,7 @@ void LLPanelObjectInventory::reset()
|
|||
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
|
||||
|
||||
mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
mFolders->setEnableRegistrar(&mEnableCallbackRegistrar);
|
||||
|
||||
if (hasFocus())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3420,6 +3420,59 @@ void LLViewerWindow::updateUI()
|
|||
root_view = mRootView;
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> dump_menu_holder(gSavedSettings, "DumpMenuHolderSize", false);
|
||||
if (dump_menu_holder)
|
||||
{
|
||||
static bool init = false;
|
||||
static LLFrameTimer child_count_timer;
|
||||
static std::vector <std::string> child_vec;
|
||||
if (!init)
|
||||
{
|
||||
child_count_timer.resetWithExpiry(5.f);
|
||||
init = true;
|
||||
}
|
||||
if (child_count_timer.hasExpired())
|
||||
{
|
||||
LL_INFOS() << "gMenuHolder child count: " << gMenuHolder->getChildCount() << LL_ENDL;
|
||||
std::vector<std::string> local_child_vec;
|
||||
LLView::child_list_t child_list = *gMenuHolder->getChildList();
|
||||
for (auto child : child_list)
|
||||
{
|
||||
local_child_vec.emplace_back(child->getName());
|
||||
}
|
||||
if (!local_child_vec.empty() && local_child_vec != child_vec)
|
||||
{
|
||||
std::vector<std::string> out_vec;
|
||||
std::sort(local_child_vec.begin(), local_child_vec.end());
|
||||
std::sort(child_vec.begin(), child_vec.end());
|
||||
std::set_difference(child_vec.begin(), child_vec.end(), local_child_vec.begin(), local_child_vec.end(), std::inserter(out_vec, out_vec.begin()));
|
||||
if (!out_vec.empty())
|
||||
{
|
||||
LL_INFOS() << "gMenuHolder removal diff size: '"<<out_vec.size() <<"' begin_child_diff";
|
||||
for (auto str : out_vec)
|
||||
{
|
||||
LL_CONT << " : " << str;
|
||||
}
|
||||
LL_CONT << " : end_child_diff" << LL_ENDL;
|
||||
}
|
||||
|
||||
out_vec.clear();
|
||||
std::set_difference(local_child_vec.begin(), local_child_vec.end(), child_vec.begin(), child_vec.end(), std::inserter(out_vec, out_vec.begin()));
|
||||
if (!out_vec.empty())
|
||||
{
|
||||
LL_INFOS() << "gMenuHolder addition diff size: '" << out_vec.size() << "' begin_child_diff";
|
||||
for (auto str : out_vec)
|
||||
{
|
||||
LL_CONT << " : " << str;
|
||||
}
|
||||
LL_CONT << " : end_child_diff" << LL_ENDL;
|
||||
}
|
||||
child_vec.swap(local_child_vec);
|
||||
}
|
||||
child_count_timer.resetWithExpiry(5.f);
|
||||
}
|
||||
}
|
||||
|
||||
// only update mouse hover set when UI is visible (since we shouldn't send hover events to invisible UI
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue