void LLFlatListViewEx::filterItems() { typedef std::vector <LLPanel*> item_panel_list_t; std::string cur_filter = mFilterSubString; LLStringUtil::toUpper(cur_filter); LLSD action; action.with("match_filter", cur_filter); item_panel_list_t items; getItems(items); mHasMatchedItems = false; for (item_panel_list_t::iterator iter = items.begin(), iter_end = items.end(); iter != iter_end; ++iter) { LLPanel* pItem = (*iter); // 0 signifies that filter is matched, // i.e. we don't hide items that don't support 'match_filter' action, separators etc. if (0 == pItem->notify(action)) { mHasMatchedItems = true; pItem->setVisible(true); } else { // TODO: implement (re)storing of current selection. if(!mForceShowingUnmatchedItems) { selectItem(pItem, false); } pItem->setVisible(mForceShowingUnmatchedItems); } } sort(); notifyParentItemsRectChanged(); }
void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items) { LLSD action; action.with("detach", LLSD()); // Clear detached_items list detached_items.clear(); // Go through items and detach valid items, remove them from items panel // and add to detached_items. for (pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end(); iter != iter_end; ++iter) { LLPanel* pItem = (*iter)->first; if (1 == pItem->notify(action)) { selectItemPair((*iter), false); mItemsPanel->removeChild(pItem); detached_items.push_back(pItem); } } if (!detached_items.empty()) { // Some items were detached, clean ourself from unusable memory if (detached_items.size() == mItemPairs.size()) { // This way will be faster if all items were disconnected for (pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end(); iter != iter_end; ++iter) { (*iter)->first = NULL; delete *iter; } mItemPairs.clear(); // Also set items panel height to zero. // Reshape it to allow reshaping of non-item children. LLRect rc = mItemsPanel->getRect(); rc.mBottom = rc.mTop; mItemsPanel->reshape(rc.getWidth(), rc.getHeight()); mItemsPanel->setRect(rc); setNoItemsCommentVisible(true); } else { for (std::vector<LLPanel*>::const_iterator detached_iter = detached_items.begin(), detached_iter_end = detached_items.end(); detached_iter != detached_iter_end; ++detached_iter) { LLPanel* pDetachedItem = *detached_iter; for (pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end(); iter != iter_end; ++iter) { item_pair_t* item_pair = *iter; if (item_pair->first == pDetachedItem) { mItemPairs.erase(iter); item_pair->first = NULL; delete item_pair; break; } } } rearrangeItems(); } notifyParentItemsRectChanged(); } }