diff options
-rw-r--r-- | indra/newview/llinventorygallery.cpp | 64 | ||||
-rw-r--r-- | indra/newview/llinventorygallery.h | 4 | ||||
-rw-r--r-- | indra/newview/llinventorypanel.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 13 | ||||
-rw-r--r-- | indra/newview/llviewerinventory.cpp | 6 | ||||
-rw-r--r-- | indra/newview/llviewerinventory.h | 2 |
6 files changed, 73 insertions, 18 deletions
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index f6a1f49306..b4a23f7c55 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -728,7 +728,7 @@ void LLInventoryGallery::updateAddedItem(LLUUID item_id) LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getIsLinkType(), is_worn); mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item)); item->setRightMouseDownCallback(boost::bind(&LLInventoryGallery::showContextMenu, this, _1, _2, _3, item_id)); - item->setFocusReceivedCallback(boost::bind(&LLInventoryGallery::changeItemSelection, this, item_id)); + item->setFocusReceivedCallback(boost::bind(&LLInventoryGallery::changeItemSelection, this, item_id, false)); if (mGalleryCreated) { applyFilter(item, mFilterSubString); @@ -816,21 +816,60 @@ void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLU } } -void LLInventoryGallery::changeItemSelection(const LLUUID& item_id) +void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_to_selection) { - if ((mItemMap.count(item_id) == 0) || (mSelectedItemID == item_id)) + if ((mItemMap.count(item_id) == 0)) + { + mItemToSelect = item_id; return; - - if (mItemMap[mSelectedItemID]) + } + if (mSelectedItemID != item_id) { - mItemMap[mSelectedItemID]->setSelected(FALSE); + + if (mItemMap[mSelectedItemID]) + { + mItemMap[mSelectedItemID]->setSelected(FALSE); + } + if (mItemMap[item_id]) + { + mItemMap[item_id]->setSelected(TRUE); + } + mSelectedItemID = item_id; + signalSelectionItemID(item_id); + + mItemToSelect = LLUUID::null; + if(scroll_to_selection) + { + scrollToShowItem(mSelectedItemID); + } } - if (mItemMap[item_id]) +} + +void LLInventoryGallery::scrollToShowItem(const LLUUID& item_id) +{ + LLInventoryGalleryItem* item = mItemMap[item_id]; + if(item) { - mItemMap[item_id]->setSelected(TRUE); + const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect(); + + LLRect item_rect; + item->localRectToOtherView(item->getLocalRect(), &item_rect, this); + LLRect overlap_rect(item_rect); + overlap_rect.intersectWith(visible_content_rect); + + //Scroll when the selected item is outside the visible area + if (overlap_rect.getHeight() + 5 < item->getRect().getHeight()) + { + LLRect content_rect = mScrollPanel->getContentWindowRect(); + LLRect constraint_rect; + constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight()); + + LLRect item_doc_rect; + item->localRectToOtherView(item->getLocalRect(), &item_doc_rect, this); + + mScrollPanel->scrollToShowRect( item_doc_rect, constraint_rect ); + } } - mSelectedItemID = item_id; - signalSelectionItemID(item_id); } void LLInventoryGallery::updateMessageVisibility() @@ -886,6 +925,11 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id) updateChangedItemName(*items_iter, obj->getName()); } + + if(mItemToSelect.notNull()) + { + changeItemSelection(mItemToSelect, true); + } updateMessageVisibility(); } diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index fdab616720..07613b20aa 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -116,7 +116,8 @@ public: void computeDifference(const LLInventoryModel::cat_array_t vcats, const LLInventoryModel::item_array_t vitems, uuid_vec_t& vadded, uuid_vec_t& vremoved); void deselectItem(const LLUUID& category_id); - void changeItemSelection(const LLUUID& item_id); + void changeItemSelection(const LLUUID& item_id, bool scroll_to_selection = false); + void scrollToShowItem(const LLUUID& item_id); void signalSelectionItemID(const LLUUID& category_id); boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb); LLUUID getSelectedItemID() { return mSelectedItemID; } @@ -138,6 +139,7 @@ protected: LLThumbnailsObserver* mThumbnailsObserver; LLGalleryGestureObserver* mGestureObserver; LLUUID mSelectedItemID; + LLUUID mItemToSelect; bool mIsInitialized; selection_change_signal_t mSelectionChangeSignal; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 2193743a38..4b525b09d1 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1801,7 +1801,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L { LLSidepanelInventory *inventory_panel = inventory_floater->findChild<LLSidepanelInventory>("main_panel"); LLPanelMainInventory* main_panel = inventory_panel->getMainInventoryPanel(); - if(main_panel->isSingleFolderMode() && (main_panel->isGalleryViewMode() || main_panel->isCombinationViewMode())) + if(main_panel->isSingleFolderMode() && main_panel->isGalleryViewMode()) { main_panel->setGallerySelection(obj_id); return; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index f67b09d121..9d1e861344 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -497,7 +497,7 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata) reset_inventory_filter(); if(mSingleFolderMode) { - if(isListViewMode()) + if(isListViewMode() || isCombinationViewMode()) { LLFolderViewItem* current_folder = getActivePanel()->getRootFolder(); if (current_folder) @@ -508,7 +508,12 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata) } else { - menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata); + std::function<void(const LLUUID&)> callback_cat_created = [this](const LLUUID &new_category_id) + { + gInventory.notifyObservers(); + setGallerySelection(new_category_id); + }; + menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_cat_created); } } else @@ -2350,13 +2355,13 @@ void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id) { if(mSingleFolderMode && isGalleryViewMode()) { - mInventoryGalleryPanel->changeItemSelection(item_id); + mInventoryGalleryPanel->changeItemSelection(item_id, true); } else if(mSingleFolderMode && isCombinationViewMode()) { if(mCombinationGalleryPanel->getFilter().checkAgainstFilterThumbnails(item_id)) { - mCombinationGalleryPanel->changeItemSelection(item_id); + mCombinationGalleryPanel->changeItemSelection(item_id, true); } else { diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 01ad4f0f09..8b0d14b3e9 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1727,7 +1727,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge, menu_create_inventory_item(panel, bridge ? bridge->getUUID() : LLUUID::null, userdata, default_parent_uuid); } -void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid) +void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid, std::function<void(const LLUUID&)> folder_created_cb) { std::string type_name = userdata.asString(); @@ -1763,6 +1763,10 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const L } }; } + else if(folder_created_cb != NULL) + { + callback_cat_created = folder_created_cb; + } gInventory.createNewCategory( parent_id, preferred_type, diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 95a4c84999..d788f23d0c 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -456,7 +456,7 @@ void menu_create_inventory_item(LLInventoryPanel* root, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null); -void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null); +void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null, std::function<void(const LLUUID&)> folder_created_cb = NULL); void slam_inventory_folder(const LLUUID& folder_id, const LLSD& contents, |