bool LLFlatListView::selectItemByValue(const LLSD& value, bool select /*= true*/) { if (value.isUndefined()) return false; item_pair_t* item_pair = getItemPair(value); if (!item_pair) return false; return selectItemPair(item_pair, select); }
bool LLFlatListView::selectItem(LLPanel* item, bool select /*= true*/) { if (!item) return false; if (item->getParent() != mItemsPanel) return false; item_pair_t* item_pair = getItemPair(item); if (!item_pair) return false; return selectItemPair(item_pair, select); }
void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) { if (!item_pair) return; if (!item_pair->first) { llwarning("Attempt to selet an item pair containing null panel item", 0); return; } setFocus(TRUE); bool select_item = !isSelected(item_pair); //*TODO find a better place for that enforcing stuff if (mKeepOneItemSelected && numSelected() == 1 && !select_item) return; if (!(mask & MASK_CONTROL) || !mMultipleSelection) resetSelection(); selectItemPair(item_pair, select_item); }
void LLFlatListView::selectLastItem () { // No items - no actions! if (0 == size()) return; // Select last visible item for (pairs_list_t::reverse_iterator r_iter = mItemPairs.rbegin(), r_iter_end = mItemPairs.rend(); r_iter != r_iter_end; ++r_iter) { // skip invisible items if ( (*r_iter)->first->getVisible() ) { selectItemPair(*r_iter, true); ensureSelectedVisible(); break; } } }
void LLFlatListView::selectFirstItem () { // No items - no actions! if (0 == size()) return; // Select first visible item for (pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end(); iter != iter_end; ++iter) { // skip invisible items if ( (*iter)->first->getVisible() ) { selectItemPair(*iter, true); ensureSelectedVisible(); break; } } }
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(); } }
// virtual bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection) { // No items - no actions! if ( !mItemPairs.size() ) return false; item_pair_t* to_sel_pair = NULL; item_pair_t* cur_sel_pair = NULL; if ( mSelectedItemPairs.size() ) { // Take the last selected pair cur_sel_pair = mSelectedItemPairs.back(); // Bases on given direction choose next item to select if ( is_up_direction ) { // Find current selected item position in mItemPairs list pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair); for (;++sel_it != mItemPairs.rend();) { // skip invisible items if ( (*sel_it)->first->getVisible() ) { to_sel_pair = *sel_it; break; } } } else { // Find current selected item position in mItemPairs list pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair); for (;++sel_it != mItemPairs.end();) { // skip invisible items if ( (*sel_it)->first->getVisible() ) { to_sel_pair = *sel_it; break; } } } } else { // If there weren't selected items then choose the first one bases on given direction cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front(); // Force selection to first item to_sel_pair = cur_sel_pair; } if ( to_sel_pair ) { bool select = true; if ( reset_selection ) { // Reset current selection if we were asked about it resetSelection(); } else { // If item already selected and no reset request than we should deselect last selected item. select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair)); } // Select/Deselect next item selectItemPair(select ? to_sel_pair : cur_sel_pair, select); return true; } return false; }
void LLFlatListView::selectLastItem () { selectItemPair(mItemPairs.back(), true); ensureSelectedVisible(); }
void LLFlatListView::selectFirstItem () { selectItemPair(mItemPairs.front(), true); ensureSelectedVisible(); }
void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) { if (!item_pair) return; if (!item_pair->first) { llwarning("Attempt to selet an item pair containing null panel item", 0); return; } setFocus(TRUE); bool select_item = !isSelected(item_pair); //*TODO find a better place for that enforcing stuff if (mKeepOneItemSelected && numSelected() == 1 && !select_item) return; if ( (mask & MASK_SHIFT) && !(mask & MASK_CONTROL) && mMultipleSelection && !mSelectedItemPairs.empty() ) { item_pair_t* last_selected_pair = mSelectedItemPairs.back(); // If item_pair is already selected - do nothing if (last_selected_pair == item_pair) return; bool grab_items = false; bool reverse = false; pairs_list_t pairs_to_select; // Pick out items from list between last selected and current clicked item_pair. for (pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end(); iter != iter_end; ++iter) { item_pair_t* cur = *iter; if (cur == last_selected_pair || cur == item_pair) { // We've got reverse selection if last grabed item isn't a new selection. reverse = grab_items && (cur != item_pair); grab_items = !grab_items; // Skip last selected and current clicked item pairs. continue; } if (!cur->first->getVisible()) { // Skip invisible item pairs. continue; } if (grab_items) { pairs_to_select.push_back(cur); } } if (reverse) { pairs_to_select.reverse(); } pairs_to_select.push_back(item_pair); for (pairs_iterator_t iter = pairs_to_select.begin(), iter_end = pairs_to_select.end(); iter != iter_end; ++iter) { item_pair_t* pair_to_select = *iter; if (isSelected(pair_to_select)) { // Item was already selected but there is a need to keep order from last selected pair to new selection. // Do it here to prevent extra mCommitOnSelectionChange in selectItemPair(). mSelectedItemPairs.remove(pair_to_select); mSelectedItemPairs.push_back(pair_to_select); } else { selectItemPair(pair_to_select, true); } } if (!select_item) { // Update last selected item border. mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1)); } return; } //no need to do additional commit on selection reset if (!(mask & MASK_CONTROL) || !mMultipleSelection) resetSelection(true); //only CTRL usage allows to deselect an item, usual clicking on an item cannot deselect it if (mask & MASK_CONTROL) selectItemPair(item_pair, select_item); else selectItemPair(item_pair, true); }