/* Processes such actions: cut/rename/delete/paste actions Rules: 1. We can't perform any action in Library 2. For Landmarks we can: - cut/rename/delete in any other accordions - paste - only in Favorites, Landmarks accordions 3. For Folders we can: perform any action in Landmarks accordion, except Received folder 4. We can paste folders from Clipboard (processed by LLFolderView::canPaste()) 5. Check LLFolderView/Inventory Bridges rules */ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const { // validate own rules first if (!item) return false; // nothing can be modified in Library if (mLibraryInventoryPanel == mCurrentSelectedList) return false; bool can_be_modified = false; // landmarks can be modified in any other accordion... if (static_cast<LLFolderViewModelItemInventory*>(item->getViewModelItem())->getInventoryType() == LLInventoryType::IT_LANDMARK) { can_be_modified = true; // we can modify landmarks anywhere except paste to My Inventory if ("paste" == command_name) { can_be_modified = (mCurrentSelectedList != mMyInventoryPanel); } } else { // ...folders only in the Landmarks accordion... can_be_modified = mLandmarksInventoryPanel == mCurrentSelectedList; // ...except "Received" folder can_be_modified &= !isReceivedFolderSelected(); } // then ask LLFolderView permissions LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); if ("copy" == command_name) { // we shouldn't be able to copy folders from My Inventory Panel return can_be_modified && root_folder->canCopy(); } else if ("collapse" == command_name) { return item->isOpen(); } else if ("expand" == command_name) { return !item->isOpen(); } if (can_be_modified) { LLFolderViewModelItemInventory* listenerp = static_cast<LLFolderViewModelItemInventory*>(item->getViewModelItem()); if ("cut" == command_name) { can_be_modified = root_folder->canCut(); } else if ("rename" == command_name) { can_be_modified = listenerp ? listenerp->isItemRenameable() : false; } else if ("delete" == command_name) { can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false; } else if("paste" == command_name) { can_be_modified = root_folder->canPaste(); } else { LL_WARNS() << "Unprocessed command has come: " << command_name << LL_ENDL; } } return can_be_modified; }
bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const { std::string command_name = userdata.asString(); LLFolderView* root_folder_view = mCurrentSelectedList ? mCurrentSelectedList->getRootFolder() : NULL; if ("collapse_all" == command_name) { bool disable_collapse_all = !has_expanded_folders(mFavoritesInventoryPanel->getRootFolder()) && !has_expanded_folders(mLandmarksInventoryPanel->getRootFolder()) && !has_expanded_folders(mMyInventoryPanel->getRootFolder()) && !has_expanded_folders(mLibraryInventoryPanel->getRootFolder()); if (disable_collapse_all) { for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) { if ((*iter)->isExpanded()) { disable_collapse_all = false; break; } } } return !disable_collapse_all; } else if ("expand_all" == command_name) { bool disable_expand_all = !has_collapsed_folders(mFavoritesInventoryPanel->getRootFolder()) && !has_collapsed_folders(mLandmarksInventoryPanel->getRootFolder()) && !has_collapsed_folders(mMyInventoryPanel->getRootFolder()) && !has_collapsed_folders(mLibraryInventoryPanel->getRootFolder()); if (disable_expand_all) { for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) { if (!(*iter)->isExpanded()) { disable_expand_all = false; break; } } } return !disable_expand_all; } else if ("sort_by_date" == command_name) { // disable "sort_by_date" for Favorites accordion because // it has its own items order. EXT-1758 if (mCurrentSelectedList == mFavoritesInventoryPanel) { return false; } } else if ( "paste" == command_name || "cut" == command_name || "copy" == command_name || "delete" == command_name || "collapse" == command_name || "expand" == command_name ) { if (!root_folder_view) return false; std::set<LLFolderViewItem*> selected_uuids = root_folder_view->getSelectionList(); // Allow to execute the command only if it can be applied to all selected items. for (std::set<LLFolderViewItem*>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter) { LLFolderViewItem* item = *iter; if (!item) return false; if (!canItemBeModified(command_name, item)) return false; } return true; } else if ( "teleport" == command_name || "more_info" == command_name || "show_on_map" == command_name || "copy_slurl" == command_name || "rename" == command_name ) { // disable some commands for multi-selection. EXT-1757 bool is_single_selection = root_folder_view && root_folder_view->getSelectedCount() == 1; if (!is_single_selection) { return false; } if ("show_on_map" == command_name) { LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem(); if (!cur_item) return false; LLViewerInventoryItem* inv_item = dynamic_cast<LLViewerInventoryItem*>(cur_item->getInventoryObject()); if (!inv_item) return false; LLUUID asset_uuid = inv_item->getAssetUUID(); if (asset_uuid.isNull()) return false; // Disable "Show on Map" if landmark loading is in progress. return !gLandmarkList.isAssetInLoadedCallbackMap(asset_uuid); } else if ("rename" == command_name) { LLFolderViewItem* selected_item = getCurSelectedItem(); if (!selected_item) return false; return canItemBeModified(command_name, selected_item); } return true; } else if("category" == command_name) { // we can add folder only in Landmarks Accordion if (mCurrentSelectedList == mLandmarksInventoryPanel) { // ... but except Received folder return !isReceivedFolderSelected(); } //"Add a folder" is enabled by default (case when My Landmarks is empty) else return true; } else if("create_pick" == command_name) { if (mCurrentSelectedList) { std::set<LLFolderViewItem*> selection = mCurrentSelectedList->getRootFolder()->getSelectionList(); if (!selection.empty()) { return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() ); } } return false; } else { LL_WARNS() << "Unprocessed command has come: " << command_name << LL_ENDL; } return true; }
/* Processes such actions: cut/rename/delete/paste actions Rules: 1. We can't perform any action in Library 2. For Landmarks we can: - cut/rename/delete in any other accordions - paste - only in Favorites, Landmarks accordions 3. For Folders we can: perform any action in Landmarks accordion, except Received folder 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste()) 5. Check LLFolderView/Inventory Bridges rules */ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const { // validate own rules first if (!item) return false; // nothing can be modified in Library if (mLibraryInventoryPanel == mCurrentSelectedList) return false; bool can_be_modified = false; // landmarks can be modified in any other accordion... if (item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) { can_be_modified = true; // we can modify landmarks anywhere except paste to My Inventory if ("paste" == command_name) { can_be_modified = (mCurrentSelectedList != mMyInventoryPanel); } } else { // ...folders only in the Landmarks accordion... can_be_modified = mLandmarksInventoryPanel == mCurrentSelectedList; // ...except "Received" folder can_be_modified &= !isReceivedFolderSelected(); } // then ask LLFolderView permissions LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); if ("copy" == command_name) { return root_folder->canCopy(); } else if ("collapse" == command_name) { return item->isOpen(); } else if ("expand" == command_name) { return !item->isOpen(); } if (can_be_modified) { LLFolderViewEventListener* listenerp = item->getListener(); if ("cut" == command_name) { // "Cut" disabled for folders. See EXT-8697. can_be_modified = root_folder->canCut() && listenerp->getInventoryType() != LLInventoryType::IT_CATEGORY; } else if ("rename" == command_name) { can_be_modified = listenerp ? listenerp->isItemRenameable() : false; } else if ("delete" == command_name) { can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false; } else if("paste" == command_name) { can_be_modified = root_folder->canPaste(); } else { llwarns << "Unprocessed command has come: " << command_name << llendl; } } return can_be_modified; }