master
Dessie Linden 2010-05-14 09:11:17 -07:00
commit 5fe6a5489c
44 changed files with 441 additions and 139 deletions

View File

@ -101,6 +101,7 @@ set(llui_SOURCE_FILES
lluictrlfactory.cpp
lluiimage.cpp
lluistring.cpp
lluitextutil.cpp
llundo.cpp
llurlaction.cpp
llurlentry.cpp
@ -197,6 +198,7 @@ set(llui_HEADER_FILES
llui.h
lluiimage.h
lluistring.h
lluitextutil.h
llundo.h
llurlaction.h
llurlentry.h

View File

@ -32,12 +32,13 @@
#include "linden_common.h"
#include "lluictrl.h"
#include "llscrollbar.h"
#include "llaccordionctrltab.h"
#include "lllocalcliprect.h"
#include "lllocalcliprect.h"
#include "llscrollbar.h"
#include "lltextbox.h"
#include "lluictrl.h"
#include "lluitextutil.h"
static const std::string DD_BUTTON_NAME = "dd_button";
static const std::string DD_TEXTBOX_NAME = "dd_textbox";
@ -72,7 +73,8 @@ public:
virtual BOOL postBuild();
void setTitle(const std::string& title);
std::string getTitle();
void setTitle(const std::string& title, const std::string& hl);
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
@ -146,10 +148,28 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild()
return TRUE;
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title)
std::string LLAccordionCtrlTab::LLAccordionCtrlTabHeader::getTitle()
{
if(mHeaderTextbox)
mHeaderTextbox->setText(title);
{
return mHeaderTextbox->getText();
}
else
{
return LLStringUtil::null;
}
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title, const std::string& hl)
{
if(mHeaderTextbox)
{
LLTextUtil::textboxSetHighlightedVal(
mHeaderTextbox,
LLStyle::Params(),
title,
hl);
}
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
@ -436,12 +456,25 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)
addChild(panel,0);
}
void LLAccordionCtrlTab::setTitle(const std::string& title)
std::string LLAccordionCtrlTab::getTitle()
{
LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
if (header)
{
header->setTitle(title);
return header->getTitle();
}
else
{
return LLStringUtil::null;
}
}
void LLAccordionCtrlTab::setTitle(const std::string& title, const std::string& hl)
{
LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
if (header)
{
header->setTitle(title, hl);
}
}
@ -903,5 +936,3 @@ BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
}
return LLUICtrl::handleToolTip(x, y, mask);
}

View File

@ -113,8 +113,10 @@ public:
void setAccordionView(LLView* panel);
LLView* getAccordionView() { return mContainerPanel; };
// Set text in LLAccordionCtrlTabHeader
void setTitle(const std::string& title);
std::string getTitle();
// Set text and highlight substring in LLAccordionCtrlTabHeader
void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null);
boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
boost::signals2::connection setFocusLostCallback(const focus_signal_t::slot_type& cb);

View File

@ -179,7 +179,7 @@ struct LLFoundData
{
LLFoundData() :
mAssetType(LLAssetType::AT_NONE),
mWearableType(LLWearableType::WT_NONE),
mWearableType(LLWearableType::WT_INVALID),
mWearable(NULL) {}
LLFoundData(const LLUUID& item_id,
@ -392,7 +392,7 @@ public:
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType(),
linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_NONE
linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID
);
found.mWearable = mWearable;
mHolder->mFoundList.push_front(found);
@ -1115,7 +1115,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF()
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType(),
linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_NONE
linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID
);
#if 0

View File

@ -316,9 +316,7 @@ void LLAvatarList::refresh()
}
// Send refresh_complete signal.
std::vector<LLSD> cur_values;
getValues(cur_values);
mRefreshCompleteSignal(this, LLSD((S32)cur_values.size()));
mRefreshCompleteSignal(this, LLSD((S32)size(false)));
}
// Commit if we've added/removed items.

View File

@ -36,12 +36,13 @@
#include "llavataractions.h"
#include "llavatarlistitem.h"
#include "llfloaterreg.h"
#include "llagent.h"
#include "lloutputmonitorctrl.h"
#include "llavatariconctrl.h"
#include "lltextutil.h"
#include "llbutton.h"
#include "llfloaterreg.h"
#include "lluitextutil.h"
#include "llagent.h"
#include "llavatariconctrl.h"
#include "lloutputmonitorctrl.h"
bool LLAvatarListItem::sStaticInitialized = false;
S32 LLAvatarListItem::sLeftPadding = 0;

View File

@ -183,20 +183,6 @@ void LLSysWellChiclet::setCounter(S32 counter)
mButton->setLabel(s_count);
setNewMessagesState(counter > mCounter);
// we have to flash to 'Lit' state each time new unread message is coming.
if (counter > mCounter)
{
mFlashToLitTimer->flash();
}
else if (counter == 0)
{
// if notification is resolved while well is flashing it can leave in the 'Lit' state
// when flashing finishes itself. Let break flashing here.
mFlashToLitTimer->stopFlashing();
}
mCounter = counter;
}
@ -316,7 +302,26 @@ void LLIMWellChiclet::createMenu()
void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
{
setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount());
const LLUUID& session_id = session_data["session_id"];
const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount();
const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")
&& !LLFloaterReg::instanceVisible("impanel", session_id);
setNewMessagesState(counter > mCounter && im_not_visible);
// we have to flash to 'Lit' state each time new unread message is coming.
if (counter > mCounter && im_not_visible)
{
mFlashToLitTimer->flash();
}
else if (counter == 0)
{
// if notification is resolved while well is flashing it can leave in the 'Lit' state
// when flashing finishes itself. Let break flashing here.
mFlashToLitTimer->stopFlashing();
}
setCounter(counter);
}
/************************************************************************/

View File

@ -46,6 +46,20 @@ static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearable
const LLSD REARRANGE = LLSD().with("rearrange", LLSD());
static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
bool LLWearableItemNameComparator::doCompare(const LLPanelWearableListItem* wearable_item1, const LLPanelWearableListItem* wearable_item2) const
{
std::string name1 = wearable_item1->getItemName();
std::string name2 = wearable_item2->getItemName();
LLStringUtil::toUpper(name1);
LLStringUtil::toUpper(name2);
return name1 < name2;
}
LLCOFWearables::LLCOFWearables() : LLPanel(),
mAttachments(NULL),
@ -73,6 +87,10 @@ BOOL LLCOFWearables::postBuild()
mClothing->setCommitOnSelectionChange(true);
mBodyParts->setCommitOnSelectionChange(true);
//clothing is sorted according to its position relatively to the body
mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
return LLPanel::postBuild();
}
@ -164,16 +182,15 @@ void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel
if (mAttachments->size())
{
mAttachments->sort(); //*TODO by Name
mAttachments->sort();
mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
}
if (mBodyParts->size())
{
mBodyParts->sort(); //*TODO by name
mBodyParts->sort();
mBodyParts->notify(REARRANGE);
}
mBodyParts->notify(REARRANGE);
}
//create a clothing list item, update verbs and show/hide line separator

View File

@ -40,6 +40,53 @@
class LLFlatListView;
/** Abstract comparator of wearable list items */
class LLWearableListItemComparator : public LLFlatListView::ItemComparator
{
LOG_CLASS(LLWearableListItemComparator);
public:
LLWearableListItemComparator() {};
virtual ~LLWearableListItemComparator() {};
virtual bool compare(const LLPanel* item1, const LLPanel* item2) const
{
const LLPanelWearableListItem* wearable_item1 = dynamic_cast<const LLPanelWearableListItem*>(item1);
const LLPanelWearableListItem* wearable_item2 = dynamic_cast<const LLPanelWearableListItem*>(item2);
if (!wearable_item1 || !wearable_item2)
{
llwarning("item1 and item2 cannot be null", 0);
return true;
}
return doCompare(wearable_item1, wearable_item2);
}
protected:
/**
* Returns true if wearable_item1 < wearable_item2, false otherwise
* Implement this method in your particular comparator.
*/
virtual bool doCompare(const LLPanelWearableListItem* wearable_item1, const LLPanelWearableListItem* wearable_item2) const = 0;
};
class LLWearableItemNameComparator : public LLWearableListItemComparator
{
LOG_CLASS(LLWearableItemNameComparator);
public:
LLWearableItemNameComparator() {};
virtual ~LLWearableItemNameComparator() {};
protected:
virtual bool doCompare(const LLPanelWearableListItem* wearable_item1, const LLPanelWearableListItem* wearable_item2) const;
};
/**
* Adaptor between LLAccordionCtrlTab and LLFlatListView to facilitate communication between them
* (notify, notifyParent) regarding size changes of a list and selection changes across accordion tabs.

View File

@ -846,16 +846,16 @@ void LLFolderView::clearSelection()
mSelectThisID.setNull();
}
BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection) const
std::set<LLUUID> LLFolderView::getSelectionList() const
{
std::set<LLUUID> selection;
for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
item_it != mSelectedItems.end();
++item_it)
{
selection.insert((*item_it)->getListener()->getUUID());
}
return (selection.size() != 0);
return selection;
}
BOOL LLFolderView::startDrag(LLToolDragAndDrop::ESource source)
@ -2070,8 +2070,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
}
std::set<LLUUID> selected_items;
getSelectionList(selected_items);
std::set<LLUUID> selected_items = getSelectionList();
LLMultiPreview* multi_previewp = NULL;
LLMultiProperties* multi_propertiesp = NULL;

View File

@ -164,7 +164,7 @@ public:
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
virtual BOOL getSelectionList(std::set<LLUUID> &selection) const;
virtual std::set<LLUUID> getSelectionList() const;
// make sure if ancestor is selected, descendents are not
void sanitizeSelection();

View File

@ -387,6 +387,12 @@ void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection)
getRoot()->extendSelection(selection, NULL, selected_items);
}
std::set<LLUUID> LLFolderViewItem::getSelectionList() const
{
std::set<LLUUID> selection;
return selection;
}
EInventorySortGroup LLFolderViewItem::getSortGroup() const
{
return SG_ITEM;

View File

@ -231,7 +231,7 @@ public:
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; }
// gets multiple-element selection
virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;}
virtual std::set<LLUUID> getSelectionList() const;
// Returns true is this object and all of its children can be removed (deleted by user)
virtual BOOL isRemovable();

View File

@ -40,12 +40,12 @@
#include "llmenugl.h"
#include "lltextbox.h"
#include "lltrans.h"
#include "lluitextutil.h"
// newview
#include "llagent.h"
#include "llgroupactions.h"
#include "llfloaterreg.h"
#include "lltextutil.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "llvoiceclient.h"

View File

@ -1104,6 +1104,21 @@ void LLIMFloater::closeHiddenIMToasts()
channel->closeHiddenToasts(IMToastMatcher());
}
}
// static
void LLIMFloater::confirmLeaveCallCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
const LLSD& payload = notification["payload"];
LLUUID session_id = payload["session_id"];
LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id);
if (option == 0 && im_floater != NULL)
{
im_floater->closeFloater();
}
return;
}
// static
bool LLIMFloater::isChatMultiTab()
@ -1176,7 +1191,7 @@ void LLIMFloater::onClickCloseBtn()
{
LLSD payload;
payload["session_id"] = mSessionID;
LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload);
LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload, confirmLeaveCallCallback);
return;
}

View File

@ -155,6 +155,8 @@ private:
static void closeHiddenIMToasts();
static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
LLPanelChatControlPanel* mControlPanel;
LLUUID mSessionID;
S32 mLastMessageIndex;

View File

@ -60,8 +60,8 @@ LLIconDictionary::LLIconDictionary()
{
addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture", "Inv_Texture_Link"));
addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture", "Inv_Texture_Link"));
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_Callingcard", "Inv_Callingcard_Link"));
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_Callingcard", "Inv_Callingcard_Link"));
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard", "Inv_CallingCard_Link"));
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard", "Inv_CallingCard_Link"));
addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark", "Inv_Landmark_Link"));
addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark", "Inv_Landmark_Link"));
addEntry(LLInventoryIcon::ICONNAME_SCRIPT, new IconEntry("Inv_Script", "Inv_Script_Link"));

View File

@ -40,11 +40,13 @@
// llcommon
#include "llcommonutils.h"
// llui
#include "lliconctrl.h"
#include "lluitextutil.h"
#include "llcallbacklist.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "lltextutil.h"
#include "lltrans.h"
////////////////////////////////////////////////////////////////////////////////
@ -320,6 +322,7 @@ LLInventoryItemsList::Params::Params()
LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
: LLFlatListViewEx(p)
, mNeedsRefresh(false)
, mPrevVisibility(false)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
// but reset to true in all derived classes. This settings might need to
@ -327,6 +330,8 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p
setCommitOnSelectionChange(true);
setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
gIdleCallbacks.addFunction(idle, this);
}
// virtual
@ -344,12 +349,31 @@ void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item
mNeedsRefresh = true;
}
void LLInventoryItemsList::draw()
boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
{
LLFlatListViewEx::draw();
if(mNeedsRefresh)
return mRefreshCompleteSignal.connect(cb);
}
void LLInventoryItemsList::doIdle()
{
bool cur_visibility = getVisible();
if(cur_visibility != mPrevVisibility || mNeedsRefresh)
{
refresh();
mRefreshCompleteSignal(this, LLSD());
mPrevVisibility = getVisible();
}
}
//static
void LLInventoryItemsList::idle(void* user_data)
{
LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data);
if ( self )
{ // Do the real idle
self->doIdle();
}
}

View File

@ -42,6 +42,7 @@
// newview
#include "llflatlistview.h"
#include "llviewerinventory.h"
class LLIconCtrl;
class LLTextBox;
@ -120,6 +121,9 @@ public:
/* Removes item highlight */
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
/** Get the name of a corresponding inventory item */
const std::string& getItemName() const { return mItem->getName(); }
virtual ~LLPanelInventoryListItemBase(){}
protected:
@ -208,14 +212,23 @@ public:
void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array);
boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
/**
* Let list know items need to be refreshed in next draw()
* Let list know items need to be refreshed in next doIdle()
*/
void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; }
bool getNeedsRefresh(){ return mNeedsRefresh; }
/*virtual*/ void draw();
/**
* Idle routine used to refresh the list regardless of the current list
* visibility, unlike draw() which is called only for the visible list.
* This is needed for example to filter items of the list hidden by closed
* accordion tab.
*/
void doIdle(); // Real idle routine
static void idle(void* user_data); // static glue to doIdle()
protected:
friend class LLUICtrlFactory;
@ -225,7 +238,7 @@ protected:
/**
* Refreshes list items, adds new items and removes deleted items.
* Called from draw() until all new items are added, ,
* Called from doIdle() until all new items are added,
* maximum 50 items can be added during single call.
*/
void refresh();
@ -245,6 +258,10 @@ private:
uuid_vec_t mIDs; // IDs of items that were added in refreshList().
// Will be used in refresh() to determine added and removed ids
bool mNeedsRefresh;
bool mPrevVisibility;
commit_signal_t mRefreshCompleteSignal;
};
#endif //LL_LLINVENTORYITEMSLIST_H

View File

@ -775,8 +775,7 @@ void LLInventoryPanel::doCreate(const LLSD& userdata)
bool LLInventoryPanel::beginIMSession()
{
std::set<LLUUID> selected_items;
mFolderRoot->getSelectionList(selected_items);
std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
std::string name;
static int session_num = 1;
@ -873,8 +872,7 @@ bool LLInventoryPanel::beginIMSession()
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
std::set<LLUUID> selected_items;
mFolderRoot->getSelectionList(selected_items);
std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
std::string joint_name = userdata.asString();
LLViewerJointAttachment* attachmentp = NULL;

View File

@ -169,6 +169,9 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
// Setting list commit callback to monitor currently selected wearable item.
list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
// Setting list refresh callback to apply filter on list change.
list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1));
// Fetch the new outfit contents.
cat->fetch();
@ -244,35 +247,9 @@ void LLOutfitsList::performAction(std::string action)
void LLOutfitsList::setFilterSubString(const std::string& string)
{
applyFilter(string);
mFilterSubString = string;
for (outfits_map_t::iterator
iter = mOutfitsMap.begin(),
iter_end = mOutfitsMap.end();
iter != iter_end; ++iter)
{
LLAccordionCtrlTab* tab = iter->second;
if (tab)
{
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*> (tab->getAccordionView());
if (list)
{
list->setFilterSubString(mFilterSubString);
}
if(!mFilterSubString.empty())
{
//store accordion tab state when filter is not empty
tab->notifyChildren(LLSD().with("action","store_state"));
tab->setDisplayChildren(true);
}
else
{
//restore accordion state after all those accodrion tab manipulations
tab->notifyChildren(LLSD().with("action","restore_state"));
}
}
}
}
//////////////////////////////////////////////////////////////////////////
@ -350,4 +327,102 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI
mSelectedOutfitUUID = category_id;
}
void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
{
if (!ctrl || mFilterSubString.empty())
return;
for (outfits_map_t::iterator
iter = mOutfitsMap.begin(),
iter_end = mOutfitsMap.end();
iter != iter_end; ++iter)
{
LLAccordionCtrlTab* tab = iter->second;
if (tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list != ctrl) continue;
std::string title = tab->getTitle();
LLStringUtil::toUpper(title);
std::string cur_filter = mFilterSubString;
LLStringUtil::toUpper(cur_filter);
if (std::string::npos == title.find(cur_filter))
{
// hide tab if its title doesn't pass filter
// and it has no visible items
tab->setVisible(list->size() != 0);
}
else
{
tab->setTitle(tab->getTitle(), cur_filter);
}
}
}
void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
{
for (outfits_map_t::iterator
iter = mOutfitsMap.begin(),
iter_end = mOutfitsMap.end();
iter != iter_end; ++iter)
{
LLAccordionCtrlTab* tab = iter->second;
if (!tab) continue;
bool more_restrictive = mFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, mFilterSubString.size()).compare(mFilterSubString);
// Restore tab visibility in case of less restrictive filter
// to compare it with updated string if it was previously hidden.
if (!more_restrictive)
{
tab->setVisible(TRUE);
}
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list)
{
list->setFilterSubString(new_filter_substring);
}
if(mFilterSubString.empty() && !new_filter_substring.empty())
{
//store accordion tab state when filter is not empty
tab->notifyChildren(LLSD().with("action","store_state"));
}
if (!new_filter_substring.empty())
{
tab->setDisplayChildren(true);
std::string title = tab->getTitle();
LLStringUtil::toUpper(title);
std::string cur_filter = new_filter_substring;
LLStringUtil::toUpper(cur_filter);
if (std::string::npos == title.find(cur_filter))
{
// hide tab if its title doesn't pass filter
// and it has no visible items
tab->setVisible(list->size() != 0);
}
else
{
tab->setTitle(tab->getTitle(), cur_filter);
}
}
else
{
// restore tab title when filter is empty
tab->setTitle(tab->getTitle());
//restore accordion state after all those accodrion tab manipulations
tab->notifyChildren(LLSD().with("action","restore_state"));
}
}
}
// EOF

View File

@ -94,6 +94,17 @@ private:
*/
void changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id);
/**
* Called upon list refresh event to update tab visibility depending on
* the results of applying filter to the title and list items of the tab.
*/
void onWearableItemsListRefresh(LLUICtrl* ctrl);
/**
* Highlights filtered items and hides tabs which haven't passed filter.
*/
void applyFilter(const std::string& new_filter_substring);
LLInventoryCategoriesObserver* mCategoriesObserver;
LLAccordionCtrl* mAccordion;

View File

@ -993,10 +993,13 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
}
else if("create_pick" == command_name)
{
std::set<LLUUID> selection;
if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) )
if (mCurrentSelectedList)
{
return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
std::set<LLUUID> selection = mCurrentSelectedList->getRootFolder()->getSelectionList();
if (!selection.empty())
{
return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
}
}
return false;
}

View File

@ -1099,8 +1099,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (root)
{
can_delete = TRUE;
std::set<LLUUID> selection_set;
root->getSelectionList(selection_set);
std::set<LLUUID> selection_set = root->getSelectionList();
if (selection_set.empty()) return FALSE;
for (std::set<LLUUID>::iterator iter = selection_set.begin();
iter != selection_set.end();

View File

@ -1489,7 +1489,7 @@ void LLPanelObjectInventory::updateInventory()
BOOL inventory_has_focus = FALSE;
if (mHaveInventory)
{
mFolders->getSelectionList(selected_items);
selected_items = mFolders->getSelectionList();
inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
}

View File

@ -493,8 +493,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
LLFolderView* root = getActivePanel()->getRootFolder();
if (root)
{
std::set<LLUUID> selection_set;
root->getSelectionList(selection_set);
std::set<LLUUID> selection_set = root->getSelectionList();
can_delete = (selection_set.size() > 0);
for (std::set<LLUUID>::iterator iter = selection_set.begin();
iter != selection_set.end();
@ -515,8 +514,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
LLFolderView* root = getActivePanel()->getRootFolder();
if (root)
{
std::set<LLUUID> selection_set;
root->getSelectionList(selection_set);
std::set<LLUUID> selection_set = root->getSelectionList();
can_delete = (selection_set.size() > 0);
for (std::set<LLUUID>::iterator iter = selection_set.begin();
iter != selection_set.end();
@ -568,8 +566,7 @@ bool LLPanelOutfitsInventory::hasItemsSelected()
LLFolderView* root = getActivePanel()->getRootFolder();
if (root)
{
std::set<LLUUID> selection_set;
root->getSelectionList(selection_set);
std::set<LLUUID> selection_set = root->getSelectionList();
has_items_selected = (selection_set.size() > 0);
}
}

View File

@ -38,7 +38,7 @@
#include "llsidetray.h"
#include "llworldmap.h"
#include "llteleporthistorystorage.h"
#include "lltextutil.h"
#include "lluitextutil.h"
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"

View File

@ -37,6 +37,8 @@
#include "llavataractions.h"
#include "llagent.h"
#include "llimview.h"
#include "llnotificationsutil.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
#include "llviewercontrol.h"
@ -809,10 +811,43 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(co
LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
if (mgr)
{
if (!unmute)
{
LLSD payload;
payload["session_id"] = mgr->getSessionID();
payload["excluded_avatar_id"] = excluded_avatar_id;
LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback);
return;
}
mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
}
}
// static
void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 1)
{
return;
}
const LLSD& payload = notification["payload"];
const LLUUID& session_id = payload["session_id"];
const LLUUID& excluded_avatar_id = payload["excluded_avatar_id"];
LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> (
LLIMModel::getInstance()->getSpeakerManager(session_id));
if (speaker_manager)
{
speaker_manager->moderateVoiceOtherParticipants(excluded_avatar_id, false);
}
return;
}
bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();

View File

@ -216,6 +216,8 @@ class LLParticipantList
* @see moderateVoiceParticipant()
*/
void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
};
/**

View File

@ -323,8 +323,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
U32 LLSidepanelInventory::getSelectedCount()
{
LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
std::set<LLUUID> selection_list;
panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list);
std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
return selection_list.size();
}

View File

@ -235,7 +235,7 @@ BOOL LLTexLayerParamAlpha::getSkip() const
}
LLWearableType::EType type = (LLWearableType::EType)getWearableType();
if ((type != LLWearableType::WT_NONE) && !avatar->isWearingWearableType(type))
if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type))
{
return TRUE;
}

View File

@ -731,6 +731,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
gPipeline.sAllowRebuildPriorityGroup = TRUE ;
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
stop_glerror();

View File

@ -1545,7 +1545,7 @@ LLWearableType::EType LLViewerInventoryItem::getWearableType() const
if (!isWearableType())
{
llwarns << "item is not a wearable" << llendl;
return LLWearableType::WT_NONE;
return LLWearableType::WT_INVALID;
}
return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK);
}

View File

@ -796,7 +796,7 @@ private:
mSelectedItems.clear();
if (mActivePanel)
{
mActivePanel->getRootFolder()->getSelectionList(mSelectedItems);
mSelectedItems = mActivePanel->getRootFolder()->getSelectionList();
}
mSelectedItems.erase(mMoveIntoFolderID);
}
@ -829,8 +829,7 @@ private:
}
// get selected items (without destination folder)
selected_items_t selected_items;
mActivePanel->getRootFolder()->getSelectionList(selected_items);
selected_items_t selected_items = mActivePanel->getRootFolder()->getSelectionList();
selected_items.erase(mMoveIntoFolderID);
// compare stored & current sets of selected items
@ -6475,18 +6474,3 @@ void LLOfferInfo::forceResponse(InventoryOfferResponse response)
LLNotifications::instance().forceResponse(params, response);
}
static bool confirm_leave_call_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
const LLSD& payload = notification["payload"];
LLUUID session_id = payload["session_id"];
LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id);
if (option == 0 && im_floater != NULL)
{
im_floater->closeFloater();
}
return false;
}
static LLNotificationFunctorRegistration confirm_leave_call_cb("ConfirmLeaveCall", confirm_leave_call_callback);

View File

@ -45,7 +45,7 @@
//-----------------------------------------------------------------------------
LLViewerVisualParamInfo::LLViewerVisualParamInfo()
:
mWearableType( LLWearableType::WT_NONE ),
mWearableType( LLWearableType::WT_INVALID ),
mCrossWearable(FALSE),
mCamDist( 0.5f ),
mCamAngle( 0.f ),

View File

@ -145,7 +145,7 @@ public:
bool is_local_texture,
EBakedTextureIndex baked_texture_index = BAKED_NUM_INDICES,
const std::string& default_image_name = "",
LLWearableType::EType wearable_type = LLWearableType::WT_NONE);
LLWearableType::EType wearable_type = LLWearableType::WT_INVALID);
const std::string mDefaultImageName;
const LLWearableType::EType mWearableType;
// It's either a local texture xor baked

View File

@ -183,7 +183,7 @@ void LLVOAvatarSelf::markDead()
param;
param = (LLViewerVisualParam*) getNextVisualParam())
{
if (param->getWearableType() != LLWearableType::WT_NONE)
if (param->getWearableType() != LLWearableType::WT_INVALID)
{
param->setIsDummy(TRUE);
}

View File

@ -1856,6 +1856,11 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
}
LLTextureEntry *te = getTE(texture_index);
if(!te)
{
return ;
}
LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
<< " hasMedia = " << te->hasMedia() << " : "
<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;

View File

@ -88,7 +88,7 @@ static std::string asset_id_to_filename(const LLUUID &asset_id);
LLWearable::LLWearable(const LLTransactionID& transaction_id) :
mDefinitionVersion(LLWearable::sCurrentDefinitionVersion),
mType(LLWearableType::WT_NONE)
mType(LLWearableType::WT_INVALID)
{
mTransactionID = transaction_id;
mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
@ -96,7 +96,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) :
LLWearable::LLWearable(const LLAssetID& asset_id) :
mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ),
mType(LLWearableType::WT_NONE)
mType(LLWearableType::WT_INVALID)
{
mAssetID = asset_id;
mTransactionID.setNull();

View File

@ -76,14 +76,15 @@ LLWearableDictionary::LLWearableDictionary()
addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS));
addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES));
addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS));
addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET));
addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES));
addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT));
addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS));
addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET));
addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES));
addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT));
addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS));
addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT));
addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA));
addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO));
addEntry(LLWearableType::WT_NONE, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO));
addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
addEntry(LLWearableType::WT_COUNT, NULL);
}

View File

@ -59,7 +59,8 @@ public:
WT_TATTOO = 14,
WT_COUNT = 15,
WT_NONE = -1,
WT_INVALID = 255,
WT_NONE = -1,
};
static const std::string& getTypeName(EType type);

View File

@ -284,6 +284,7 @@ BOOL LLPipeline::sRenderFrameTest = FALSE;
BOOL LLPipeline::sRenderAttachedLights = TRUE;
BOOL LLPipeline::sRenderAttachedParticles = TRUE;
BOOL LLPipeline::sRenderDeferred = FALSE;
BOOL LLPipeline::sAllowRebuildPriorityGroup = FALSE ;
S32 LLPipeline::sVisibleLightCount = 0;
F32 LLPipeline::sMinRenderSize = 0.f;
@ -1780,6 +1781,12 @@ void LLPipeline::updateGL()
void LLPipeline::rebuildPriorityGroups()
{
if(!sAllowRebuildPriorityGroup)
{
return ;
}
sAllowRebuildPriorityGroup = FALSE ;
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);

View File

@ -462,6 +462,7 @@ public:
static BOOL sRenderAttachedLights;
static BOOL sRenderAttachedParticles;
static BOOL sRenderDeferred;
static BOOL sAllowRebuildPriorityGroup;
static S32 sVisibleLightCount;
static F32 sMinRenderSize;

View File

@ -6139,6 +6139,23 @@ Are you sure you want to leave this call?
<unique/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmMuteAll"
type="alert">
You have selected to mute all participants in a group call.
This will also cause all residents that later join the call to be
muted, even after you have left the call.
Mute everyone?
<usetemplate
ignoretext="Confirm before I mute all participants in a group call"
name="okcancelignore"
notext="Ok"
yestext="Cancel"/>
<unique/>
</notification>
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
</global>