From 3962ca7a0b1469a40b5f7cb0587c65c4ebf33cb6 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Fri, 2 Apr 2010 00:43:32 +0300 Subject: Low bug (EXT-6677) Crash when selecting empty outfit edit panel - Added NULL check for selected item pointer. Reviewed by Neal Orman https://codereview.productengine.com/secondlife/r/162/ --HG-- branch : product-engine --- indra/newview/llpaneloutfitedit.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'indra/newview/llpaneloutfitedit.cpp') diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index ba22adc01c..2b25c544e3 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -413,7 +413,11 @@ void LLPanelOutfitEdit::onLookItemSelectionChange(void) { S32 left_offset = -4; S32 top_offset = -10; - LLRect rect = mLookContents->getLastSelectedItem()->getRect(); + LLScrollListItem* item = mLookContents->getLastSelectedItem(); + if (!item) + return; + + LLRect rect = item->getRect(); LLRect btn_rect( left_offset + rect.mRight - 50, top_offset + rect.mTop, -- cgit v1.3 From 43d756a7dcd60215204f8f02c9bd6ba26b5b4ca0 Mon Sep 17 00:00:00 2001 From: Igor Borovkov Date: Fri, 2 Apr 2010 13:58:16 +0300 Subject: done EXT-6674 Switch Edit Outfit panel (list at the top) to show content of the Current Outfit system folder reviewed at https://codereview.productengine.com/secondlife/r/159/ --HG-- branch : product-engine --- indra/newview/llpaneloutfitedit.cpp | 50 +++++++++------------- indra/newview/llpaneloutfitedit.h | 13 +++--- indra/newview/llpaneloutfitsinventory.cpp | 21 +++------ indra/newview/llpaneloutfitsinventory.h | 2 +- indra/newview/llsidepanelappearance.cpp | 6 +-- .../skins/default/xui/en/panel_outfit_edit.xml | 5 ++- .../default/xui/en/panel_outfits_inventory.xml | 2 +- 7 files changed, 41 insertions(+), 58 deletions(-) (limited to 'indra/newview/llpaneloutfitedit.cpp') diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 2b25c544e3..1ab2100a41 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -113,9 +113,9 @@ private: LLPanelOutfitEdit::LLPanelOutfitEdit() -: LLPanel(), mLookID(), mFetchLook(NULL), mSearchFilter(NULL), +: LLPanel(), mCurrentOutfitID(), mFetchLook(NULL), mSearchFilter(NULL), mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToLookBtn(NULL), -mRemoveFromLookBtn(NULL), mLookObserver(NULL), mNumItemsInLook(0) +mRemoveFromLookBtn(NULL), mLookObserver(NULL) { mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(FALSE); @@ -157,7 +157,7 @@ BOOL LLPanelOutfitEdit::postBuild() { // gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels - mLookName = getChild("curr_look_name"); + mCurrentOutfitName = getChild("curr_outfit_name"); childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL); @@ -206,7 +206,7 @@ BOOL LLPanelOutfitEdit::postBuild() mLookContents = getChild("look_items_list"); mLookContents->sortByColumn("look_item_sort", TRUE); mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onLookItemSelectionChange, this)); - + /* LLButton::Params remove_params; remove_params.name("remove_from_look"); @@ -220,12 +220,12 @@ BOOL LLPanelOutfitEdit::postBuild() //childSetAction("remove_from_look_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this); mRemoveFromLookBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this)); //getChild("look_info_group_bar")->addChild(mRemoveFromLookBtn); remove_item_btn - + mEditWearableBtn = getChild("edit_wearable_btn"); mEditWearableBtn->setEnabled(FALSE); mEditWearableBtn->setVisible(FALSE); mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this)); - + childSetAction("remove_item_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this); return TRUE; @@ -302,7 +302,7 @@ void LLPanelOutfitEdit::onAddToLookClicked(void) { LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem(); LLFolderViewEventListener* listenerp = curr_item->getListener(); - link_inventory_item(gAgent.getID(), listenerp->getUUID(), mLookID, listenerp->getName(), + link_inventory_item(gAgent.getID(), listenerp->getUUID(), mCurrentOutfitID, listenerp->getName(), LLAssetType::AT_LINK, LLPointer(NULL)); updateLookInfo(); } @@ -445,7 +445,7 @@ void LLPanelOutfitEdit::lookFetched(void) // collectDescendentsIf takes non-const reference: LLFindCOFValidItems is_cof_valid; - gInventory.collectDescendentsIf(mLookID, + gInventory.collectDescendentsIf(mCurrentOutfitID, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, @@ -468,12 +468,6 @@ void LLPanelOutfitEdit::lookFetched(void) mLookContents->addElement(row); } - - if (mLookContents->getItemCount() != mNumItemsInLook) - { - mNumItemsInLook = mLookContents->getItemCount(); - LLAppearanceMgr::instance().updateCOF(mLookID); - } } void LLPanelOutfitEdit::updateLookInfo() @@ -483,7 +477,7 @@ void LLPanelOutfitEdit::updateLookInfo() mLookContents->clearRows(); uuid_vec_t folders; - folders.push_back(mLookID); + folders.push_back(mCurrentOutfitID); mFetchLook->fetchDescendents(folders); if (mFetchLook->isEverythingComplete()) { @@ -496,28 +490,26 @@ void LLPanelOutfitEdit::updateLookInfo() } } -void LLPanelOutfitEdit::displayLookInfo(const LLInventoryCategory* pLook) +void LLPanelOutfitEdit::displayCurrentOutfit() { - if (!pLook) - { - return; - } - if (!getVisible()) { setVisible(TRUE); } - if (mLookID != pLook->getUUID()) + mCurrentOutfitID = LLAppearanceMgr::getInstance()->getCOF(); + + std::string current_outfit_name; + if (LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name)) { - mLookID = pLook->getUUID(); - mLookName->setText(pLook->getName()); - updateLookInfo(); + mCurrentOutfitName->setText(current_outfit_name); + } + else + { + mCurrentOutfitName->setText(getString("No Outfit")); } -} -void LLPanelOutfitEdit::reset() -{ - mLookID.setNull(); + updateLookInfo(); } + diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 5c00f84e0e..ba382d7320 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -81,10 +81,6 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void changed(U32 mask); - void reset(); - // Ignore all old information, useful if you are - // recycling an existing dialog and need to clear it. - /*virtual*/ void setParcelID(const LLUUID& parcel_id); // Sends a request for data about the given parcel, which will // only update the location if there is none already available. @@ -100,7 +96,7 @@ public: void onEditWearableClicked(void); void onUpClicked(void); - void displayLookInfo(const LLInventoryCategory* pLook); + void displayCurrentOutfit(); void lookFetched(void); @@ -108,8 +104,10 @@ public: private: - LLUUID mLookID; - LLTextBox* mLookName; + //*TODO got rid of mCurrentOutfitID + LLUUID mCurrentOutfitID; + + LLTextBox* mCurrentOutfitName; LLScrollListCtrl* mLookContents; LLInventoryPanel* mInventoryItemsPanel; LLFilterEditor* mSearchFilter; @@ -119,7 +117,6 @@ private: LLButton* mRemoveFromLookBtn; LLButton* mUpBtn; LLButton* mEditWearableBtn; - S32 mNumItemsInLook; LLLookFetchObserver* mFetchLook; LLInventoryLookObserver* mLookObserver; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index dd320f8328..a67270202e 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -192,7 +192,7 @@ void LLPanelOutfitsInventory::updateVerbs() if (mListCommands) { - mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor); + mListCommands->childSetVisible("edit_current_outfit_btn",sShowDebugEditor); updateListCommands(); } } @@ -306,19 +306,12 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::dequegetCurSelectedItem(); - - LLFolderViewEventListener* listenerp = cur_item->getListener(); - if (getIsCorrectType(listenerp)) - { - LLSD key; - key["type"] = "look"; - key["id"] = listenerp->getUUID(); - - LLSideTray::getInstance()->showPanel("sidepanel_appearance", key); - } + LLSD key; + key["type"] = "edit_outfit"; + + LLSideTray::getInstance()->showPanel("sidepanel_appearance", key); } LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() @@ -365,7 +358,7 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this)); mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); - mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this)); + mListCommands->childSetAction("edit_current_outfit_btn", boost::bind(&LLPanelOutfitsInventory::showEditOutfitPanel, this)); LLDragAndDropButton* trash_btn = mListCommands->getChild("trash_btn"); trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index ab25ef0a49..83c4b8f9cd 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -64,7 +64,7 @@ public: void onSaveCommit(const std::string& item_name); void onSelectionChange(const std::deque &items, BOOL user_action); - void onSelectorButtonClicked(); + void showEditOutfitPanel(); // If a compatible listener type is selected, then return a pointer to that. // Otherwise, return NULL. diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index a80687da4d..308034225b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -182,11 +182,9 @@ void LLSidepanelAppearance::onOpen(const LLSD& key) mLookInfoType = key["type"].asString(); - if (mLookInfoType == "look") + if (mLookInfoType == "edit_outfit") { - LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID()); - if (pLook) - mOutfitEdit->displayLookInfo(pLook); + mOutfitEdit->displayCurrentOutfit(); } } diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index 4d3ee07195..c1800384a3 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -12,6 +12,9 @@ name="outfit_edit" top="0" width="320"> + @@ -94,7 +97,7 @@ font="SansSerifHugeBold" height="26" layout="topleft" - name="curr_look_name" + name="curr_outfit_name" text_color="LtGray" top_pad="0" value="[Current Outfit]" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index f9ad525642..66ed43efec 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -122,7 +122,7 @@ label="Edit Outfit" layout="topleft" right="-140" - name="look_edit_btn" + name="edit_current_outfit_btn" top="26" visible="false" width="50" /> -- cgit v1.3 From 785d4c34b62b7ca76b292e0001c516ba8fa738bc Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Tue, 6 Apr 2010 10:19:15 -0400 Subject: EXT-4151 : Immediately check if a fetchObserver filter is done, else add to observer list automatically Preliminary work to clean up naming conventions. --- indra/newview/llagentwearables.cpp | 4 ++-- indra/newview/llagentwearablesfetch.cpp | 20 ++++++++--------- indra/newview/llappearancemgr.h | 8 +++---- indra/newview/llfloatergesture.cpp | 4 ++-- indra/newview/llfriendcard.cpp | 2 +- indra/newview/llgesturemgr.cpp | 2 +- indra/newview/llinventorybridge.cpp | 10 ++++----- indra/newview/llinventorymodel.cpp | 2 +- indra/newview/llinventorymodelbackgroundfetch.cpp | 2 +- indra/newview/llinventoryobserver.cpp | 26 +++++++++++------------ indra/newview/llinventoryobserver.h | 8 +++---- indra/newview/llpaneloutfitedit.cpp | 2 +- indra/newview/llsidepanelappearance.cpp | 2 +- indra/newview/llstartup.cpp | 2 +- indra/newview/lltooldraganddrop.cpp | 8 +++---- indra/newview/llviewerinventory.cpp | 2 +- indra/newview/llviewerinventory.h | 2 +- indra/newview/llviewermenu.cpp | 2 +- indra/newview/llviewermessage.cpp | 12 +++++------ 19 files changed, 59 insertions(+), 61 deletions(-) (limited to 'indra/newview/llpaneloutfitedit.cpp') diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 0542e73bfd..9d3b5763e8 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -954,7 +954,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs // that will trigger when the complete information is fetched. uuid_vec_t folders; folders.push_back(current_outfit_id); - outfit->fetchDescendents(folders); + outfit->fetch(folders); if(outfit->isEverythingComplete()) { // everything is already here - call done. @@ -2070,7 +2070,7 @@ void LLAgentWearables::populateMyOutfitsFolder(void) folders.push_back(outfits->mMyOutfitsID); gInventory.addObserver(outfits); - outfits->fetchDescendents(folders); + outfits->fetch(folders); if (outfits->isEverythingComplete()) { outfits->done(); diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 1f22ba040d..3d6740f5a1 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -69,7 +69,7 @@ void LLInitialWearablesFetch::processContents() LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t wearable_array; LLFindWearables is_wearable; - gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, + gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH, is_wearable); LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true); @@ -173,7 +173,7 @@ void LLInitialWearablesFetch::processWearablesMessage() // Need to fetch the inventory items for ids, then create links to them after they arrive. LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids); - fetcher->fetchItems(ids); + fetcher->fetch(ids); // If no items to be fetched, done will never be triggered. // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. if (fetcher->isEverythingComplete()) @@ -282,13 +282,13 @@ void LLLibraryOutfitsFetch::folderDone() mLibraryClothingID = cat->getUUID(); } - mCompleteFolders.clear(); + mComplete.clear(); // Get the complete information on the items in the inventory. uuid_vec_t folders; folders.push_back(mClothingID); folders.push_back(mLibraryClothingID); - fetchDescendents(folders); + fetch(folders); if (isEverythingComplete()) { done(); @@ -336,9 +336,9 @@ void LLLibraryOutfitsFetch::outfitsDone() mImportedClothingID = cat->getUUID(); } - mCompleteFolders.clear(); + mComplete.clear(); - fetchDescendents(folders); + fetch(folders); if (isEverythingComplete()) { done(); @@ -433,9 +433,9 @@ void LLLibraryOutfitsFetch::importedFolderFetch() uuid_vec_t folders; folders.push_back(mImportedClothingID); - mCompleteFolders.clear(); + mComplete.clear(); - fetchDescendents(folders); + fetch(folders); if (isEverythingComplete()) { done(); @@ -463,8 +463,8 @@ void LLLibraryOutfitsFetch::importedFolderDone() mImportedClothingFolders.push_back(cat->getUUID()); } - mCompleteFolders.clear(); - fetchDescendents(folders); + mComplete.clear(); + fetch(folders); if (isEverythingComplete()) { done(); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 423d9bde69..40b8844731 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -282,14 +282,14 @@ public: // happen. LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), + gInventory.collectDescendents(mComplete.front(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); S32 count = item_array.count(); if(!count) { - llwarns << "Nothing fetched in category " << mCompleteFolders.front() + llwarns << "Nothing fetched in category " << mComplete.front() << llendl; //dec_busy_count(); gInventory.removeObserver(this); @@ -307,7 +307,7 @@ public: gInventory.removeObserver(this); // do the fetch - stage2->fetchItems(ids); + stage2->fetch(ids); if(stage2->isEverythingComplete()) { // everything is already here - call done. @@ -331,7 +331,7 @@ void callAfterCategoryFetch(const LLUUID& cat_id, T callable) CallAfterCategoryFetchStage1 *stage1 = new CallAfterCategoryFetchStage1(callable); uuid_vec_t folders; folders.push_back(cat_id); - stage1->fetchDescendents(folders); + stage1->fetch(folders); if (stage1->isEverythingComplete()) { stage1->done(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 0aca12bc5e..8ee8d13a9c 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -148,7 +148,7 @@ void LLFloaterGesture::done() if (!unloaded_folders.empty()) { LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL; - fetchDescendents(unloaded_folders); + fetch(unloaded_folders); } else { @@ -202,7 +202,7 @@ BOOL LLFloaterGesture::postBuild() folders.push_back(mGestureFolderID); //perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details. gInventory.addObserver(this); - fetchDescendents(folders); + fetch(folders); if (mGestureList) { diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index a848128d67..6f069cca17 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -413,7 +413,7 @@ void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_i uuid_vec_t folders; folders.push_back(folder_id); - fetch->fetchDescendents(folders); + fetch->fetch(folders); if(fetch->isEverythingComplete()) { // everything is already here - call done. diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index c13ebba923..a4342a4bc9 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1033,7 +1033,7 @@ void LLGestureMgr::onLoadComplete(LLVFS *vfs, // Watch this item and set gesture name when item exists in inventory uuid_vec_t ids; ids.push_back(item_id); - self.fetchItems(ids); + self.fetch(ids); } self.mActive[item_id] = gesture; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 09168b4f31..b552b5ac07 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1974,7 +1974,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() { // Avoid passing a NULL-ref as mCompleteFolders.front() down to // gInventory.collectDescendents() - if( mCompleteFolders.empty() ) + if( mComplete.empty() ) { llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; dec_busy_count(); @@ -1988,7 +1988,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() // happen. LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), + gInventory.collectDescendents(mComplete.front(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); @@ -2007,7 +2007,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() #endif LLRightClickInventoryFetchObserver* outfit; - outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); + outfit = new LLRightClickInventoryFetchObserver(mComplete.front(), mCopyItems); uuid_vec_t ids; for(S32 i = 0; i < count; ++i) { @@ -2026,7 +2026,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() inc_busy_count(); // do the fetch - outfit->fetchItems(ids); + outfit->fetch(ids); outfit->done(); //Not interested in waiting and this will be right 99% of the time. //Uncomment the following code for laggy Inventory UI. /* if(outfit->isEverythingComplete()) @@ -2723,7 +2723,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { folders.push_back(category->getUUID()); } - fetch->fetchDescendents(folders); + fetch->fetch(folders); inc_busy_count(); if(fetch->isEverythingComplete()) { diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b6202c6a8c..e63da1ebb9 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1326,7 +1326,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) //{ // known_descendents += items->count(); //} - return cat->fetchDescendents(); + return cat->fetch(); } void LLInventoryModel::cache( diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 72e5c0dd75..cfbc2c3e05 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -257,7 +257,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch() { // category exists but has no children yet, fetch the descendants // for now, just request every time and rely on retry timer to throttle - if (cat->fetchDescendents()) + if (cat->fetch()) { mFetchTimer.reset(); mTimelyFetchPending = TRUE; diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 128f16ecf5..83e1bbd5a0 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -223,8 +223,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd) } } -void LLInventoryFetchObserver::fetchItems( - const uuid_vec_t& ids) +void LLInventoryFetchObserver::fetch(const uuid_vec_t& ids) { LLUUID owner_id; LLSD items_llsd; @@ -266,30 +265,29 @@ void LLInventoryFetchObserver::fetchItems( // virtual void LLInventoryFetchDescendentsObserver::changed(U32 mask) { - for(uuid_vec_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) + for(uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end();) { LLViewerInventoryCategory* cat = gInventory.getCategory(*it); if(!cat) { - it = mIncompleteFolders.erase(it); + it = mIncomplete.erase(it); continue; } if(isComplete(cat)) { - mCompleteFolders.push_back(*it); - it = mIncompleteFolders.erase(it); + mComplete.push_back(*it); + it = mIncomplete.erase(it); continue; } ++it; } - if(mIncompleteFolders.empty()) + if(mIncomplete.empty()) { done(); } } -void LLInventoryFetchDescendentsObserver::fetchDescendents( - const uuid_vec_t& ids) +void LLInventoryFetchDescendentsObserver::fetch(const uuid_vec_t& ids) { for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { @@ -297,19 +295,19 @@ void LLInventoryFetchDescendentsObserver::fetchDescendents( if(!cat) continue; if(!isComplete(cat)) { - cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it. - mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer. + cat->fetch(); //blindly fetch it without seeing if anything else is fetching it. + mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer. } else { - mCompleteFolders.push_back(*it); + mComplete.push_back(*it); } } } bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const { - return mIncompleteFolders.empty(); + return mIncomplete.empty(); } bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) @@ -413,7 +411,7 @@ void LLInventoryFetchComboObserver::fetch( if(!cat) continue; if(!gInventory.isCategoryComplete(*fit)) { - cat->fetchDescendents(); + cat->fetch(); lldebugs << "fetching folder " << *fit <fetchDescendents(folders); + mFetchLook->fetch(folders); if (mFetchLook->isEverythingComplete()) { mFetchLook->done(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 89c60fed34..a11b0b44d5 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -389,7 +389,7 @@ void LLSidepanelAppearance::fetchInventory() } LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(this); - fetch_worn->fetchItems(ids); + fetch_worn->fetch(ids); // If no items to be fetched, done will never be triggered. // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. if (fetch_worn->isEverythingComplete()) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4f1bcde302..d7c8b5fcd4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1771,7 +1771,7 @@ bool idle_startup() } } // no need to add gesture to inventory observer, it's already made in constructor - LLGestureMgr::instance().fetchItems(item_ids); + LLGestureMgr::instance().fetch(item_ids); } } gDisplaySwapBuffers = TRUE; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index c977377f3a..1e81e675e6 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -306,8 +306,8 @@ void LLCategoryDropDescendentsObserver::done() { gInventory.removeObserver(this); - uuid_vec_t::iterator it = mCompleteFolders.begin(); - uuid_vec_t::iterator end = mCompleteFolders.end(); + uuid_vec_t::iterator it = mComplete.begin(); + uuid_vec_t::iterator end = mComplete.end(); LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; for(; it != end; ++it) @@ -332,7 +332,7 @@ void LLCategoryDropDescendentsObserver::done() std::copy(unique_ids.begin(), unique_ids.end(), copier); LLCategoryDropObserver* dropper; dropper = new LLCategoryDropObserver(mObjectID, mSource); - dropper->fetchItems(ids); + dropper->fetch(ids); if (dropper->isEverythingComplete()) { dropper->done(); @@ -2577,7 +2577,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( ids.push_back(item->getUUID()); } LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource); - dropper->fetchItems(ids); + dropper->fetch(ids); if (dropper->isEverythingComplete()) { dropper->done(); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 353ffee66f..444d397146 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -519,7 +519,7 @@ void LLViewerInventoryCategory::removeFromServer( void ) gAgent.sendReliableMessage(); } -bool LLViewerInventoryCategory::fetchDescendents() +bool LLViewerInventoryCategory::fetch() { if((VERSION_UNKNOWN == mVersion) && mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads. diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 3577bd8791..2db88c2ff8 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -212,7 +212,7 @@ public: void setVersion(S32 version) { mVersion = version; } // Returns true if a fetch was issued. - bool fetchDescendents(); + bool fetch(); // used to help make cacheing more robust - for example, if // someone is getting 4 packets but logs out after 3. the viewer diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 24a6b12905..d91b6d0b1e 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6158,7 +6158,7 @@ class LLAttachmentEnableDrop : public view_listener_t items.push_back((*attachment_iter)->getItemID()); - wornItemFetched->fetchItems(items); + wornItemFetched->fetch(items); gInventory.addObserver(wornItemFetched); } } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 598e55e2c8..a471876ce1 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1207,7 +1207,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& uuid_vec_t items; items.push_back(mObjectID); LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string); - open_agent_offer->fetchItems(items); + open_agent_offer->fetch(items); if(catp || (itemp && itemp->isComplete())) { open_agent_offer->done(); @@ -1605,7 +1605,7 @@ void inventory_offer_handler(LLOfferInfo* info) uuid_vec_t items; items.push_back(info->mObjectID); LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver(); - fetch_item->fetchItems(items); + fetch_item->fetch(items); if(fetch_item->isEverythingComplete()) { fetch_item->done(); @@ -2124,7 +2124,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) uuid_vec_t items; items.push_back(info->mObjectID); LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver(); - fetch_item->fetchItems(items); + fetch_item->fetch(items); delete fetch_item; // Same as closing window @@ -2855,8 +2855,8 @@ public: LLInventoryModel::cat_array_t land_cats; LLInventoryModel::item_array_t land_items; - uuid_vec_t::iterator it = mCompleteFolders.begin(); - uuid_vec_t::iterator end = mCompleteFolders.end(); + uuid_vec_t::iterator it = mComplete.begin(); + uuid_vec_t::iterator end = mComplete.end(); for(; it != end; ++it) { gInventory.collectDescendentsIf( @@ -2927,7 +2927,7 @@ BOOL LLPostTeleportNotifiers::tick() if(!folders.empty()) { LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea; - fetcher->fetchDescendents(folders); + fetcher->fetch(folders); if(fetcher->isEverythingComplete()) { fetcher->done(); -- cgit v1.3 From 05a4e9dd8bb13caadd25ef3e71aab43e9b857cd1 Mon Sep 17 00:00:00 2001 From: Dmitry Zaporozhan Date: Wed, 7 Apr 2010 10:45:39 +0300 Subject: (work in progress) EXT-6564(major) - Fix wearable editing panels. Updated layout of all Edit Wearable panels. Disabled editing of no-modify wearable. Disabled "Save As" for no-copy wearable. Reviewed by Mike Antipov https://codereview.productengine.com/secondlife/r/170/ --HG-- branch : product-engine --- indra/newview/llpaneleditwearable.cpp | 21 +++++++- indra/newview/llpaneleditwearable.h | 4 ++ indra/newview/llpaneloutfitedit.cpp | 25 ++++++--- .../skins/default/xui/en/panel_edit_alpha.xml | 53 ++++++++++--------- .../skins/default/xui/en/panel_edit_eyes.xml | 55 +++++++++++++------ .../skins/default/xui/en/panel_edit_gloves.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_hair.xml | 55 ++++++++++++++----- .../skins/default/xui/en/panel_edit_jacket.xml | 61 +++++++++++++++------- .../skins/default/xui/en/panel_edit_pants.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_shape.xml | 4 +- .../skins/default/xui/en/panel_edit_shirt.xml | 47 ++++++++++++----- .../skins/default/xui/en/panel_edit_shoes.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_skin.xml | 57 +++++++++++++++----- .../skins/default/xui/en/panel_edit_skirt.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_socks.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_tattoo.xml | 37 +++++++------ .../skins/default/xui/en/panel_edit_underpants.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_undershirt.xml | 51 +++++++++++++----- .../skins/default/xui/en/panel_edit_wearable.xml | 4 +- 19 files changed, 556 insertions(+), 224 deletions(-) (limited to 'indra/newview/llpaneloutfitedit.cpp') diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index c0528da999..da74295f9e 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -270,6 +270,8 @@ LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, LLPanelEditWearable::LLPanelEditWearable() : LLPanel() + , mWearablePtr(NULL) + , mWearableItem(NULL) { } @@ -338,8 +340,7 @@ BOOL LLPanelEditWearable::isDirty() const //virtual void LLPanelEditWearable::draw() { - BOOL is_dirty = isDirty(); - mBtnRevert->setEnabled(is_dirty); + updateVerbs(); LLPanel::draw(); } @@ -401,6 +402,9 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) return; } + mWearableItem = gInventory.getItem(mWearablePtr->getItemID()); + llassert(mWearableItem); + EWearableType type = wearable->getType(); LLPanel *targetPanel = NULL; std::string title; @@ -489,6 +493,7 @@ void LLPanelEditWearable::initializePanel() updateScrollingPanelUI(); } + updateVerbs(); } void LLPanelEditWearable::updateScrollingPanelUI() @@ -645,7 +650,19 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value } } +void LLPanelEditWearable::updateVerbs() +{ + bool can_copy = false; + if(mWearableItem) + { + can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID); + } + BOOL is_dirty = isDirty(); + mBtnRevert->setEnabled(is_dirty); + childSetEnabled("save_as_button", is_dirty && can_copy); +} +// EOF diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 4178659617..8b63685177 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -41,6 +41,7 @@ class LLWearable; class LLTextEditor; class LLTextBox; +class LLViewerInventoryItem; class LLViewerVisualParam; class LLVisualParamHint; class LLViewerJointMesh; @@ -73,9 +74,12 @@ private: LLPanel* getPanel(EWearableType type); void getSortedParams(value_map_t &sorted_params, const std::string &edit_group); void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab); + // update bottom bar buttons ("Save", "Revert", etc) + void updateVerbs(); // the pointer to the wearable we're editing. NULL means we're not editing a wearable. LLWearable *mWearablePtr; + LLViewerInventoryItem* mWearableItem; // these are constant no matter what wearable we're editing LLButton *mBtnRevert; diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 1ab2100a41..b956004129 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -367,19 +367,32 @@ void LLPanelOutfitEdit::onUpClicked(void) void LLPanelOutfitEdit::onEditWearableClicked(void) { LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID(); - LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit); if (item_to_edit) { // returns null if not a wearable (attachment, etc). LLWearable* wearable_to_edit = gAgentWearables.getWearableFromAssetID(item_to_edit->getAssetUUID()); - if (!wearable_to_edit || !wearable_to_edit->getPermissions().allowModifyBy(gAgent.getID()) ) - { - LLSidepanelAppearance::editWearable(wearable_to_edit, getParent()); - if (mEditWearableBtn->getVisible()) + if(wearable_to_edit) + { + bool can_modify = false; + bool is_complete = item_to_edit->isComplete(); + // if item_to_edit is a link, its properties are not appropriate, + // lets get original item with actual properties + LLViewerInventoryItem* original_item = gInventory.getItem(wearable_to_edit->getItemID()); + if(original_item) { - mEditWearableBtn->setVisible(FALSE); + can_modify = original_item->getPermissions().allowModifyBy(gAgentID); + is_complete = original_item->isComplete(); + } + + if (can_modify && is_complete) + { + LLSidepanelAppearance::editWearable(wearable_to_edit, getParent()); + if (mEditWearableBtn->getVisible()) + { + mEditWearableBtn->setVisible(FALSE); + } } } } diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml index 40647e1b81..1d0c0a02b0 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml @@ -1,33 +1,38 @@ + width="333" > + width="313" > + width="94" /> + width="94" /> + top="120" + width="94" /> + top="120" + width="94" /> + top="230" + width="94" /> + width="333" > + width="313" > - - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml index 7aca40e8d9..7d8eed5085 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml index e7d1c05301..cd81aa2c4f 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > + + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> + diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index ed92b1e0f8..ba03865937 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > + width="74" /> + width="74" /> + width="74" /> - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml index b764188e04..5b02d1f968 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml index 9a3b5c26ec..e1c574001a 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml @@ -4,7 +4,7 @@ follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_shape_panel" top_pad="10" width="333" > @@ -14,7 +14,7 @@ bg_opaque_color="DkGray2" background_visible="true" background_opaque="true" - follows="top|left" + follows="top|left|right" height="50" left="10" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml index 4b7235545f..7da8de4c0b 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > + + single_expansion="true" + top="0" + width="313"> + diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml index e886afa010..84fe26f7f6 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml index 918606b54c..b5c8c95473 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > + + top="0" + single_expansion="true" + width="313"> + diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml index 6cccab1843..16f6950bd5 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml index fc7de00714..e4f916703b 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml index b214cd3de0..ed990eb095 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml @@ -1,57 +1,62 @@ + width="333" > + width="313" > + width="94" /> + width="94" /> + top_pad="10" + width="94" /> diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml index 03e0bb70ef..d43497c943 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml index 20c56142fb..45c6ef4526 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml @@ -1,21 +1,26 @@ + width="333" > + width="313" > - + + + diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index b4272bb10a..dc2f085356 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -155,7 +155,7 @@ left="0" bg_opaque_color="DkGray2" background_visible="true" background_opaque="true" - follows="top|left" + follows="top|left|right" height="60" label="Shirt" layout="topleft" @@ -164,7 +164,7 @@ left="0" top_pad="10" width="313">