// static void LLPreviewGesture::onCommitChat(LLUICtrl* ctrl, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; LLScrollListItem* step_item = self->mStepList->getFirstSelected(); if (!step_item) return; LLGestureStep* step = (LLGestureStep*)step_item->getUserdata(); if (step->getType() != STEP_CHAT) return; LLGestureStepChat* chat_step = (LLGestureStepChat*)step; chat_step->mChatText = self->mChatEditor->getText(); chat_step->mFlags = 0x0; // Update the UI label in the list updateLabel(step_item); self->mDirty = TRUE; self->refresh(); }
// static void LLPreviewGesture::onCommitActive(LLUICtrl* ctrl, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; if (!gGestureManager.isGestureActive(self->mItemUUID)) { gGestureManager.activateGesture(self->mItemUUID); } else { gGestureManager.deactivateGesture(self->mItemUUID); } // Make sure the (active) label in the inventory gets updated. LLViewerInventoryItem* item = gInventory.getItem(self->mItemUUID); if (item) { gInventory.updateItem(item); gInventory.notifyObservers(); } self->refresh(); }
// static void LLPreviewGesture::onClickAdd(void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; LLScrollListItem* library_item = self->mLibraryList->getFirstSelected(); if (!library_item) return; S32 library_item_index = self->mLibraryList->getFirstSelectedIndex(); const LLScrollListCell* library_cell = library_item->getColumn(0); const std::string& library_text = library_cell->getValue().asString(); if( library_item_index >= STEP_EOF ) { llerrs << "Unknown step type: " << library_text << llendl; return; } self->addStep( (EStepType)library_item_index ); self->mDirty = TRUE; self->refresh(); }
// static void LLPreviewGesture::handleSaveChangesDialog(S32 option, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; switch(option) { case 0: // "Yes" gGestureManager.stopGesture(self->mPreviewGesture); self->mCloseAfterSave = TRUE; onClickSave(data); break; case 1: // "No" gGestureManager.stopGesture(self->mPreviewGesture); self->mDirty = FALSE; // Force the dirty flag because user has clicked NO on confirm save dialog... self->close(); break; case 2: // "Cancel" default: // If we were quitting, we didn't really mean it. app_abort_quit(); break; } }
// static void LLPreviewGesture::onCommitSound(LLUICtrl* ctrl, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; LLScrollListItem* step_item = self->mStepList->getFirstSelected(); if (step_item) { LLGestureStep* step = (LLGestureStep*)step_item->getUserdata(); if (step->getType() == STEP_SOUND) { // Assign the sound name LLGestureStepSound* sound_step = (LLGestureStepSound*)step; sound_step->mSoundName = self->mSoundCombo->getSimple(); sound_step->mSoundAssetID = self->mSoundCombo->getCurrentID(); sound_step->mFlags = 0x0; // Update the UI label in the list updateLabel(step_item); self->mDirty = TRUE; self->refresh(); } } }
//virtual void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content) { llinfos << "LLUpdateAgentInventoryResponder::result from capabilities" << llendl; LLUUID item_id = mPostData["item_id"]; LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(item_id); if(!item) { llwarns << "Inventory item for " << mVFileID << " is no longer in agent inventory." << llendl; return; } // Update viewer inventory item LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); new_item->setAssetUUID(content["new_asset"].asUUID()); gInventory.updateItem(new_item); gInventory.notifyObservers(); llinfos << "Inventory item " << item->getName() << " saved into " << content["new_asset"].asString() << llendl; LLInventoryType::EType inventory_type = new_item->getInventoryType(); switch(inventory_type) { case LLInventoryType::IT_NOTECARD: { // Update the UI with the new asset. LLPreviewNotecard* nc; nc = (LLPreviewNotecard*)LLPreview::find(new_item->getUUID()); if(nc) { // *HACK: we have to delete the asset in the VFS so // that the viewer will redownload it. This is only // really necessary if the asset had to be modified by // the uploader, so this can be optimized away in some // cases. A better design is to have a new uuid if the // script actually changed the asset. if(nc->hasEmbeddedInventory()) { gVFS->removeFile( content["new_asset"].asUUID(), LLAssetType::AT_NOTECARD); } nc->refreshFromInventory(); } } break; case LLInventoryType::IT_LSL: { // Find our window and close it if requested. LLPreviewLSL* preview = (LLPreviewLSL*)LLPreview::find(item_id); if (preview) { // Bytecode save completed if (content["compiled"]) { preview->callbackLSLCompileSucceeded(); } else { preview->callbackLSLCompileFailed(content["errors"]); } } } break; case LLInventoryType::IT_GESTURE: { // If this gesture is active, then we need to update the in-memory // active map with the new pointer. if (gGestureManager.isGestureActive(item_id)) { LLUUID asset_id = new_item->getAssetUUID(); gGestureManager.replaceGesture(item_id, asset_id); gInventory.notifyObservers(); } //gesture will have a new asset_id LLPreviewGesture* previewp = (LLPreviewGesture*)LLPreview::find(item_id); if(previewp) { previewp->onUpdateSucceeded(); } } break; case LLInventoryType::IT_WEARABLE: default: break; } }
// static void LLPreviewGesture::onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status) { LLUUID* item_idp = (LLUUID*)user_data; LLPreview* preview = LLPreview::find(*item_idp); if (preview) { LLPreviewGesture* self = (LLPreviewGesture*)preview; if (0 == status) { LLVFile file(vfs, asset_uuid, type, LLVFile::READ); S32 size = file.getSize(); char* buffer = new char[size+1]; file.read((U8*)buffer, size); /*Flawfinder: ignore*/ buffer[size] = '\0'; LLMultiGesture* gesture = new LLMultiGesture(); LLDataPackerAsciiBuffer dp(buffer, size+1); BOOL ok = gesture->deserialize(dp); if (ok) { // Everything has been successful. Load up the UI. self->loadUIFromGesture(gesture); self->mStepList->selectFirstItem(); self->mDirty = FALSE; self->refresh(); } else { llwarns << "Unable to load gesture" << llendl; } delete gesture; gesture = NULL; delete [] buffer; buffer = NULL; self->mAssetStatus = PREVIEW_ASSET_LOADED; } else { if( gViewerStats ) { gViewerStats->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); } if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || LL_ERR_FILE_EMPTY == status) { LLNotifyBox::showXml("GestureMissing"); } else { LLNotifyBox::showXml("UnableToLoadGesture"); } llwarns << "Problem loading gesture: " << status << llendl; self->mAssetStatus = PREVIEW_ASSET_ERROR; } } delete item_idp; item_idp = NULL; }
// static LLPreviewGesture* LLPreviewGesture::show(const std::string& title, const LLUUID& item_id, const LLUUID& object_id, BOOL take_focus) { LLPreviewGesture* previewp = (LLPreviewGesture*)LLPreview::find(item_id); if (previewp) { previewp->open(); /*Flawfinder: ignore*/ if (take_focus) { previewp->setFocus(TRUE); } return previewp; } LLPreviewGesture* self = new LLPreviewGesture(); // Finish internal construction self->init(item_id, object_id); // Builds and adds to gFloaterView gUICtrlFactory->buildFloater(self, "floater_preview_gesture.xml"); self->setTitle(title); // Move window to top-left of screen LLMultiFloater* hostp = self->getHost(); if (hostp == NULL) { LLRect r = self->getRect(); LLRect screen = gFloaterView->getRect(); r.setLeftTopAndSize(0, screen.getHeight(), r.getWidth(), r.getHeight()); self->setRect(r); } else { // re-add to host to update title hostp->addFloater(self, TRUE); } // this will call refresh when we have everything. LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); if(item && !item->isComplete()) { LLInventoryGestureAvailable* observer; observer = new LLInventoryGestureAvailable(); observer->watchItem(item_id); gInventory.addObserver(observer); item->fetchFromServer(); } else { // not sure this is necessary. self->refresh(); } if (take_focus) { self->setFocus(TRUE); } return self; }
// static void LLPreviewGesture::onClickSave(void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; self->saveIfNeeded(); }
// static void LLPreviewGesture::onCommitSetDirty(LLUICtrl* ctrl, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; self->mDirty = TRUE; self->refresh(); }
// TODO: This is very similar to LLPreviewNotecard::onSaveComplete. // Could merge code. // static void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) { LLSaveInfo* info = (LLSaveInfo*)user_data; if (info && (status == 0)) { if(info->mObjectUUID.isNull()) { // Saving into user inventory LLViewerInventoryItem* item; item = (LLViewerInventoryItem*)gInventory.getItem(info->mItemUUID); if(item) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); new_item->setDescription(info->mDesc); new_item->setTransactionID(info->mTransactionID); new_item->setAssetUUID(asset_uuid); new_item->updateServer(FALSE); gInventory.updateItem(new_item); gInventory.notifyObservers(); } else { llwarns << "Inventory item for gesture " << info->mItemUUID << " is no longer in agent inventory." << llendl; } } else { // Saving into in-world object inventory LLViewerObject* object = gObjectList.findObject(info->mObjectUUID); LLViewerInventoryItem* item = NULL; if(object) { item = (LLViewerInventoryItem*)object->getInventoryObject(info->mItemUUID); } if(object && item) { item->setDescription(info->mDesc); item->setAssetUUID(asset_uuid); item->setTransactionID(info->mTransactionID); object->updateInventory(item, TASK_INVENTORY_ITEM_KEY, false); dialog_refresh_all(); } else { LLNotifications::instance().add("GestureSaveFailedObjectNotFound"); } } // Find our window and close it if requested. LLPreviewGesture* previewp = (LLPreviewGesture*)LLPreview::find(info->mItemUUID); if (previewp && previewp->mCloseAfterSave) { previewp->close(); } } else { llwarns << "Problem saving gesture: " << status << llendl; LLSD args; args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); LLNotifications::instance().add("GestureSaveFailedReason", args); } delete info; info = NULL; }
// static LLPreviewGesture* LLPreviewGesture::show(const std::string& title, const LLUUID& item_id, const LLUUID& object_id, BOOL take_focus) { LLPreviewGesture* previewp = (LLPreviewGesture*)LLPreview::find(item_id); if (previewp) { previewp->open(); /*Flawfinder: ignore*/ if (take_focus) { previewp->setFocus(TRUE); } return previewp; } LLPreviewGesture* self = new LLPreviewGesture(); // Finish internal construction self->init(item_id, object_id); // Builds and adds to gFloaterView LLUICtrlFactory::getInstance()->buildFloater(self, "floater_preview_gesture.xml"); self->setTitle(title); // Move window to top-left of screen LLMultiFloater* hostp = self->getHost(); if (hostp == NULL) { LLRect r = self->getRect(); LLRect screen = gFloaterView->getRect(); r.setLeftTopAndSize(0, screen.getHeight(), r.getWidth(), r.getHeight()); self->setRect(r); } else { // re-add to host to update title hostp->addFloater(self, TRUE); } // Start speculative download of sounds and animations const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION); LLInventoryModelBackgroundFetch::instance().start(animation_folder_id); const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND); LLInventoryModelBackgroundFetch::instance().start(sound_folder_id); // this will call refresh when we have everything. LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); if(item && !item->isFinished()) { LLInventoryGestureAvailable* observer; observer = new LLInventoryGestureAvailable(); observer->watchItem(item_id); gInventory.addObserver(observer); item->fetchFromServer(); } else { // not sure this is necessary. self->refresh(); } if (take_focus) { self->setFocus(TRUE); } return self; }
// static void LLPreviewGesture::onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status) { LLUUID* item_idp = (LLUUID*)user_data; LLPreview* preview = LLPreview::find(*item_idp); if (preview) { LLPreviewGesture* self = (LLPreviewGesture*)preview; if (0 == status) { LLVFile file(vfs, asset_uuid, type, LLVFile::READ); S32 size = file.getSize(); std::vector<char> buffer(size+1); file.read((U8*)&buffer[0], size); buffer[size] = '\0'; LLMultiGesture* gesture = new LLMultiGesture(); LLDataPackerAsciiBuffer dp(&buffer[0], size+1); BOOL ok = gesture->deserialize(dp); if (ok) { // Everything has been successful. Load up the UI. self->loadUIFromGesture(gesture); self->mStepList->selectFirstItem(); self->mDirty = FALSE; self->refresh(); self->refreshFromItem(self->getItem()); // to update description and title } else { llwarns << "Unable to load gesture" << llendl; } delete gesture; gesture = NULL; self->mAssetStatus = PREVIEW_ASSET_LOADED; } else { LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || LL_ERR_FILE_EMPTY == status) { LLDelayedGestureError::gestureMissing( *item_idp ); } else { LLDelayedGestureError::gestureFailedToLoad( *item_idp ); } llwarns << "Problem loading gesture: " << status << llendl; self->mAssetStatus = PREVIEW_ASSET_ERROR; } } delete item_idp; item_idp = NULL; }