summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llfloatertools.cpp4
-rw-r--r--indra/newview/llfolderviewmodelinventory.cpp85
-rw-r--r--indra/newview/llfolderviewmodelinventory.h14
-rw-r--r--indra/newview/llimfloatercontainer.h2
-rw-r--r--indra/newview/llinventorybridge.cpp5
-rw-r--r--indra/newview/llinventorypanel.h1
-rw-r--r--indra/newview/llpanelobjectinventory.cpp81
-rw-r--r--indra/newview/llpanelobjectinventory.h9
-rw-r--r--indra/newview/llplacesinventorybridge.cpp2
9 files changed, 128 insertions, 75 deletions
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 6978e6a430..43465d4209 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -660,8 +660,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
- bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
- getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
+ //bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
+ //getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
mBtnLink->setVisible(edit_visible);
mBtnUnlink->setVisible(edit_visible);
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index faf5b3e7ac..13ca73917b 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -109,7 +109,7 @@ bool LLFolderViewModelInventory::contentsReady()
void LLFolderViewModelItemInventory::requestSort()
{
LLFolderViewModelItemCommon::requestSort();
- if (mRootViewModel->getSorter().isByDate())
+ if (mRootViewModel.getSorter().isByDate())
{
// sort by date potentially affects parent folders which use a date
// derived from newest item in them
@@ -123,23 +123,24 @@ void LLFolderViewModelItemInventory::requestSort()
bool LLFolderViewModelItemInventory::potentiallyVisible()
{
return passedFilter() // we've passed the filter
- || getLastFilterGeneration() < mRootViewModel->getFilter()->getFirstSuccessGeneration() // or we don't know yet
+ || getLastFilterGeneration() < mRootViewModel.getFilter()->getFirstSuccessGeneration() // or we don't know yet
|| descendantsPassedFilter();
}
bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)
{
- if (filter_generation < 0 && mRootViewModel)
- filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration();
+ if (filter_generation < 0)
+ filter_generation = mRootViewModel.getFilter()->getFirstSuccessGeneration();
return mPassedFolderFilter
- && mLastFilterGeneration >= filter_generation
- && (mPassedFilter || descendantsPassedFilter(filter_generation));
+ && (descendantsPassedFilter(filter_generation)
+ || (mLastFilterGeneration >= filter_generation
+ && mPassedFilter));
}
bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation)
{
- if (filter_generation < 0) filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration();
+ if (filter_generation < 0) filter_generation = mRootViewModel.getFilter()->getFirstSuccessGeneration();
return mMostFilteredDescendantGeneration >= filter_generation;
}
@@ -148,27 +149,29 @@ void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_fo
mPassedFilter = passed;
mPassedFolderFilter = passed_folder;
mLastFilterGeneration = filter_generation;
+
+ bool passed_filter_before = mPrevPassedAllFilters;
+ mPrevPassedAllFilters = passedFilter(filter_generation);
+
+ if (passed_filter_before != mPrevPassedAllFilters)
+ {
+ //TODO RN: ensure this still happens, but without dependency on folderview
+ LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
+ if (parent_folder)
+ {
+ parent_folder->requestArrange();
+ }
+ }
}
-bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
+void LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
{
- bool passed_filter_before = item->passedFilter();
S32 filter_generation = filter.getCurrentGeneration();
- S32 must_pass_generation = filter.getFirstRequiredGeneration();
if (item->getLastFilterGeneration() < filter_generation)
{
- if (item->getLastFilterGeneration() >= must_pass_generation
- && !item->passedFilter(must_pass_generation))
- {
- // failed to pass an earlier filter that was a subset of the current one
- // go ahead and flag this item as done
- item->setPassedFilter(false, false, filter_generation);
- }
- else
- {
- item->filter( filter );
- }
+ // recursive application of the filter for child items
+ item->filter( filter );
}
// track latest generation to pass any child items, for each folder up to root
@@ -181,39 +184,36 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
view_model->mMostFilteredDescendantGeneration = filter_generation;
view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent);
}
-
- return !passed_filter_before;
- }
- else // !item->passedfilter()
- {
- return passed_filter_before;
}
}
-bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
+void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
{
- bool changed = false;
+ const S32 filter_generation = filter.getCurrentGeneration();
+ const S32 must_pass_generation = filter.getFirstRequiredGeneration();
+
+ if (getLastFilterGeneration() >= must_pass_generation
+ && !passedFilter(must_pass_generation))
+ {
+ // failed to pass an earlier filter that was a subset of the current one
+ // go ahead and flag this item as done
+ setPassedFilter(false, false, filter_generation);
+ return;
+ }
if(!mChildren.empty()
- && (getLastFilterGeneration() < filter.getFirstRequiredGeneration() // haven't checked descendants against minimum required generation to pass
- || descendantsPassedFilter(filter.getFirstRequiredGeneration()))) // or at least one descendant has passed the minimum requirement
+ && (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
+ || descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
{
// now query children
- for (child_list_t::iterator iter = mChildren.begin();
- iter != mChildren.end() && filter.getFilterCount() > 0;
+ for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
+ iter != end_iter && filter.getFilterCount() > 0;
++iter)
{
- changed |= filterChildItem((*iter), filter);
+ filterChildItem((*iter), filter);
}
}
- if (changed)
- {
- //TODO RN: ensure this still happens, but without dependency on folderview
- LLFolderViewFolder* folder = static_cast<LLFolderViewFolder*>(mFolderViewItem);
- folder->requestArrange();
- }
-
// if we didn't use all filter iterations
// that means we filtered all of our descendants
// so filter ourselves now
@@ -226,11 +226,10 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
? filter.checkFolder(this)
: true;
- setPassedFilter(passed_filter, passed_filter_folder, filter.getCurrentGeneration());
+ setPassedFilter(passed_filter, passed_filter_folder, filter_generation);
//TODO RN: create interface for string highlighting
//mStringMatchOffset = filter.getStringMatchOffset(this);
}
- return changed;
}
LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 12a977b28b..ab67c93897 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -37,13 +37,9 @@ class LLFolderViewModelItemInventory
: public LLFolderViewModelItemCommon
{
public:
- LLFolderViewModelItemInventory()
- : mRootViewModel(NULL)
+ LLFolderViewModelItemInventory(class LLFolderViewModelInventory& root_view_model)
+ : mRootViewModel(root_view_model)
{}
- void setRootViewModel(class LLFolderViewModelInventory* root_view_model)
- {
- mRootViewModel = root_view_model;
- }
virtual const LLUUID& getUUID() const = 0;
virtual time_t getCreationDate() const = 0; // UTC seconds
virtual void setCreationDate(time_t creation_date_utc) = 0;
@@ -63,14 +59,14 @@ public:
virtual bool passedFilter(S32 filter_generation = -1);
virtual bool descendantsPassedFilter(S32 filter_generation = -1);
virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
- virtual bool filter( LLFolderViewFilter& filter);
- virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
+ virtual void filter( LLFolderViewFilter& filter);
+ virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
protected:
- class LLFolderViewModelInventory* mRootViewModel;
+ class LLFolderViewModelInventory& mRootViewModel;
};
class LLInventorySort
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index a25ea0ab46..7005ab7b6a 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -89,7 +89,7 @@ public:
virtual bool hasChildren() const { return FALSE; }
virtual bool potentiallyVisible() { return true; }
- virtual bool filter( LLFolderViewFilter& filter) { return true; }
+ virtual void filter( LLFolderViewFilter& filter) { }
virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) { }
virtual bool passedFilter(S32 filter_generation = -1) { return true; }
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d17c25d9f3..9f1d4bdec9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -190,7 +190,8 @@ LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,
mUUID(uuid),
mRoot(root),
mInvType(LLInventoryType::IT_NONE),
- mIsLink(FALSE)
+ mIsLink(FALSE),
+ LLFolderViewModelItemInventory(inventory->getRootViewModel())
{
mInventoryPanel = inventory->getInventoryPanelHandle();
const LLInventoryObject* obj = getInventoryObject();
@@ -1158,7 +1159,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
if (new_listener)
{
new_listener->mInvType = inv_type;
- new_listener->setRootViewModel(view_model);
}
return new_listener;
@@ -6484,7 +6484,6 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
&& actual_asset_type != LLAssetType::AT_LINK_FOLDER)
{
new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid);
- new_listener->setRootViewModel(view_model);
}
else
{
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 4fcc93b0c4..910325cdbc 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -104,6 +104,7 @@ public:
public:
LLInventoryModel* getModel() { return mInventory; }
+ LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
// LLView methods
void draw();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index ca20051a51..473b5d9479 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -155,7 +155,8 @@ LLTaskInvFVBridge::LLTaskInvFVBridge(
LLPanelObjectInventory* panel,
const LLUUID& uuid,
const std::string& name,
- U32 flags):
+ U32 flags)
+: LLFolderViewModelItemInventory(panel->getRootViewModel()),
mUUID(uuid),
mName(name),
mPanel(panel),
@@ -1534,6 +1535,8 @@ void LLPanelObjectInventory::clearContents()
LLToolDragAndDrop::getInstance()->endDrag();
}
+ clearItemIDs();
+
if( mScroller )
{
// removes mFolders
@@ -1549,8 +1552,6 @@ void LLPanelObjectInventory::reset()
{
clearContents();
- //setBorderVisible(FALSE);
-
mCommitCallbackRegistrar.pushScope(); // push local callbacks
LLRect dummy_rect(0, 1, 1, 0);
@@ -1565,7 +1566,12 @@ void LLPanelObjectInventory::reset()
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
// this ensures that we never say "searching..." or "no items found"
//TODO RN: make this happen by manipulating filter object directly
- static_cast<LLInventoryFilter*>(mFolders->getFolderViewModel()->getFilter())->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ LLInventoryFilter* inventoryFilter = dynamic_cast<LLInventoryFilter*>(mFolders->getFolderViewModel()->getFilter());
+ if(inventoryFilter)
+ {
+ inventoryFilter->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ }
+
mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
if (hasFocus())
@@ -1610,7 +1616,7 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
iter != inventory->end(); )
{
LLInventoryObject* item = *iter++;
- LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID());
+ LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properties", item->getUUID());
if(floater)
{
floater->refresh();
@@ -1625,15 +1631,20 @@ void LLPanelObjectInventory::updateInventory()
// << " panel UUID: " << panel->mTaskUUID << "\n"
// << " task UUID: " << object->mID << llendl;
// We're still interested in this task's inventory.
+ std::vector<LLUUID> selected_item_ids;
std::set<LLFolderViewItem*> selected_items;
BOOL inventory_has_focus = FALSE;
- if (mHaveInventory)
+ if (mHaveInventory && mFolders)
{
selected_items = mFolders->getSelectionList();
inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
}
-
- reset();
+ for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(), end_it = selected_items.end();
+ it != end_it;
+ ++it)
+ {
+ selected_item_ids.push_back(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
LLViewerObject* objectp = gObjectList.findObject(mTaskUUID);
if (objectp)
@@ -1641,10 +1652,11 @@ void LLPanelObjectInventory::updateInventory()
LLInventoryObject* inventory_root = objectp->getInventoryRoot();
LLInventoryObject::object_list_t contents;
objectp->getInventoryContents(contents);
- mHaveInventory = TRUE;
if (inventory_root && !contents.empty())
{
+ reset();
+
createFolderViews(inventory_root, contents);
mIsInventoryEmpty = FALSE;
mFolders->setEnabled(TRUE);
@@ -1654,6 +1666,8 @@ void LLPanelObjectInventory::updateInventory()
// TODO: create an empty inventory
mIsInventoryEmpty = TRUE;
}
+
+ mHaveInventory = TRUE;
}
else
{
@@ -1663,11 +1677,12 @@ void LLPanelObjectInventory::updateInventory()
}
// restore previous selection
- std::set<LLFolderViewItem*>::iterator selection_it;
- BOOL first_item = TRUE;
- for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it)
+ std::vector<LLUUID>::iterator selection_it;
+ bool first_item = true;
+ for (selection_it = selected_item_ids.begin(); selection_it != selected_item_ids.end(); ++selection_it)
{
- LLFolderViewItem* selected_item = (*selection_it);
+ LLFolderViewItem* selected_item = getItemByID(*selection_it);
+
if (selected_item)
{
//HACK: "set" first item then "change" each other one to get keyboard focus right
@@ -1683,7 +1698,10 @@ void LLPanelObjectInventory::updateInventory()
}
}
- mFolders->requestArrange();
+ if (mFolders)
+ {
+ mFolders->requestArrange();
+ }
mInventoryNeedsUpdate = FALSE;
// Edit menu handler is set in onFocusReceived
}
@@ -1755,6 +1773,7 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
view = LLUICtrlFactory::create<LLFolderViewItem> (params);
}
view->addToFolder(folder);
+ addItemID(obj->getUUID(), view);
}
}
@@ -1910,7 +1929,10 @@ void LLPanelObjectInventory::idle(void* user_data)
{
LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data;
-
+ if (self->mFolders)
+ {
+ self->mFolders->update();
+ }
if (self->mInventoryNeedsUpdate)
{
self->updateInventory();
@@ -1935,3 +1957,32 @@ void LLPanelObjectInventory::onFocusReceived()
LLPanel::onFocusReceived();
}
+
+
+LLFolderViewItem* LLPanelObjectInventory::getItemByID( const LLUUID& id )
+{
+ std::map<LLUUID, LLFolderViewItem*>::iterator map_it;
+ map_it = mItemMap.find(id);
+ if (map_it != mItemMap.end())
+ {
+ return map_it->second;
+ }
+
+ return NULL;
+}
+
+void LLPanelObjectInventory::removeItemID( const LLUUID& id )
+{
+ mItemMap.erase(id);
+}
+
+void LLPanelObjectInventory::addItemID( const LLUUID& id, LLFolderViewItem* itemp )
+{
+ mItemMap[id] = itemp;
+}
+
+void LLPanelObjectInventory::clearItemIDs()
+{
+ mItemMap.clear();
+}
+
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index 7e857f8b31..f497c695b3 100644
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -56,6 +56,8 @@ public:
virtual BOOL postBuild();
+ LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
+
void doToSelected(const LLSD& userdata);
void refresh();
@@ -86,8 +88,15 @@ protected:
LLInventoryObject* parent,
LLFolderViewFolder* folder);
void clearContents();
+ LLFolderViewItem* getItemByID(const LLUUID& id);
+
+ void addItemID( const LLUUID& id, LLFolderViewItem* itemp );
+ void removeItemID(const LLUUID& id);
+ void clearItemIDs();
private:
+ std::map<LLUUID, LLFolderViewItem*> mItemMap;
+
LLScrollContainer* mScroller;
LLFolderView* mFolders;
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index af29ab7ea9..1a5f64e295 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -165,7 +165,6 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, root, uuid, flags);
- new_listener->setRootViewModel(view_model);
break;
case LLAssetType::AT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
@@ -183,7 +182,6 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
break;
}
new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid);
- new_listener->setRootViewModel(view_model);
break;
default:
new_listener = LLInventoryFVBridgeBuilder::createBridge(