diff options
Diffstat (limited to 'indra/newview/llpanelpick.cpp')
-rw-r--r-- | indra/newview/llpanelpick.cpp | 597 |
1 files changed, 237 insertions, 360 deletions
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 43ecd273c2..65be4718ef 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -35,481 +35,358 @@ // profile. #include "llviewerprecompiledheaders.h" - -#include "llpanelpick.h" - -#include "lldir.h" -#include "llparcel.h" +#include "llpanel.h" #include "message.h" - #include "llagent.h" -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llviewercontrol.h" -#include "lllineeditor.h" -#include "lltabcontainervertical.h" -#include "lltextbox.h" -#include "llviewertexteditor.h" +#include "llparcel.h" +#include "llviewerparcelmgr.h" #include "lltexturectrl.h" #include "lluiconstants.h" -#include "llviewergenericmessage.h" -#include "lluictrlfactory.h" -#include "llviewerparcelmgr.h" -#include "llworldmap.h" -#include "llfloaterworldmap.h" -#include "llviewerregion.h" -#include "llviewerwindow.h" +#include "llavatarpropertiesprocessor.h" +#include "llpanelpick.h" +#include "llpanelmeprofile.h" -//static -std::list<LLPanelPick*> LLPanelPick::sAllPanels; - -LLPanelPick::LLPanelPick(BOOL top_pick) -: LLPanel(std::string("Top Picks Panel")), - mTopPick(top_pick), - mPickID(), - mCreatorID(), - mParcelID(), - mDataRequested(FALSE), - mDataReceived(FALSE), - mPosGlobal(), - mSnapshotCtrl(NULL), - mNameEditor(NULL), - mDescEditor(NULL), - mLocationEditor(NULL), - mTeleportBtn(NULL), - mMapBtn(NULL), - //mLandmarkBtn(NULL), - mSortOrderText(NULL), - mSortOrderEditor(NULL), - mEnabledCheck(NULL), - mSetBtn(NULL) -{ - sAllPanels.push_back(this); - std::string pick_def_file; - if (top_pick) +#define XML_PANEL_EDIT_PICK "panel_edit_pick.xml" +#define XML_PANEL_PICK_INFO "panel_pick_info.xml" + +#define XML_NAME "pick_name" +#define XML_DESC "pick_desc" +#define XML_SNAPSHOT "pick_snapshot" +#define XML_LOCATION "pick_location" + + +LLPanelPick::LLPanelPick(BOOL edit_mode/* = FALSE */) +: LLPanel(), LLAvatarPropertiesObserver(), + mEditMode(edit_mode), + mSnapshotCtrl(NULL), + mPickId(LLUUID::null), + mCreatorId(LLUUID::null), + mDataReceived(FALSE) +{ + if (edit_mode) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_top_pick.xml"); + LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_EDIT_PICK); + LLAvatarPropertiesProcessor::instance().addObserver(gAgentID, this); } else { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_pick.xml"); - } -} + LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_PICK_INFO); + } +} LLPanelPick::~LLPanelPick() { - sAllPanels.remove(this); + if (!mCreatorId.isNull()) LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorId, this); } - void LLPanelPick::reset() { - mPickID.setNull(); - mCreatorID.setNull(); - mParcelID.setNull(); - - // Don't request data, this isn't valid - mDataRequested = TRUE; + mPickId.setNull(); + mCreatorId.setNull(); + mParcelId.setNull(); + mDataReceived = FALSE; mPosGlobal.clearVec(); - - clearCtrls(); } - BOOL LLPanelPick::postBuild() { - mSnapshotCtrl = getChild<LLTextureCtrl>("snapshot_ctrl"); - mSnapshotCtrl->setCommitCallback(onCommitAny); - mSnapshotCtrl->setCallbackUserData(this); - - mNameEditor = getChild<LLLineEditor>("given_name_editor"); - mNameEditor->setCommitOnFocusLost(TRUE); - mNameEditor->setCommitCallback(onCommitAny); - mNameEditor->setCallbackUserData(this); - - mDescEditor = getChild<LLTextEditor>("desc_editor"); - mDescEditor->setCommitOnFocusLost(TRUE); - mDescEditor->setCommitCallback(onCommitAny); - mDescEditor->setCallbackUserData(this); - mDescEditor->setTabsToNextField(TRUE); + mSnapshotCtrl = getChild<LLTextureCtrl>(XML_SNAPSHOT); - mLocationEditor = getChild<LLLineEditor>("location_editor"); + if (mEditMode) + { + childSetAction("cancel_btn", onClickCancel, this); + childSetAction("set_to_curr_location_btn", onClickSet, this); + childSetAction("save_changes_btn", onClickSave, this); + } + else + { + childSetAction("edit_btn", onClickEdit, this); + childSetAction("teleport_btn", onClickTeleport, this); + childSetAction("show_on_map_btn", onClickMap, this); + childSetAction("back_btn", onClickBack, this); + //*TODO set on menu + } - mSetBtn = getChild<LLButton>( "set_location_btn"); - mSetBtn->setClickedCallback(onClickSet); - mSetBtn->setCallbackUserData(this); + return TRUE; +} - mTeleportBtn = getChild<LLButton>( "pick_teleport_btn"); - mTeleportBtn->setClickedCallback(onClickTeleport); - mTeleportBtn->setCallbackUserData(this); +void LLPanelPick::init(LLUUID creator_id, LLUUID pick_id) +{ + mCreatorId = creator_id; + mPickId = pick_id; - mMapBtn = getChild<LLButton>( "pick_map_btn"); - mMapBtn->setClickedCallback(onClickMap); - mMapBtn->setCallbackUserData(this); + // on Pick Info panel (for non-Agent picks) edit_btn should be invisible + if (!mEditMode) + { + if (mCreatorId != gAgentID) + { + childSetEnabled("edit_btn", FALSE); + childSetVisible("edit_btn", FALSE); + } + else + { + childSetEnabled("edit_btn", TRUE); + childSetVisible("edit_btn", TRUE); + } + } - mSortOrderText = getChild<LLTextBox>("sort_order_text"); + LLAvatarPropertiesProcessor::instance().addObserver(mCreatorId, this); + LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorId, APT_PICK_INFO, &mPickId); +} - mSortOrderEditor = getChild<LLLineEditor>("sort_order_editor"); - mSortOrderEditor->setPrevalidate(LLLineEditor::prevalidateInt); - mSortOrderEditor->setCommitOnFocusLost(TRUE); - mSortOrderEditor->setCommitCallback(onCommitAny); - mSortOrderEditor->setCallbackUserData(this); +void LLPanelPick::init(LLPickData *pick_data) +{ + mPickId = pick_data->pick_id; + mCreatorId = pick_data->creator_id; - mEnabledCheck = getChild<LLCheckBoxCtrl>( "enabled_check"); - mEnabledCheck->setCommitCallback(onCommitAny); - mEnabledCheck->setCallbackUserData(this); + setName(pick_data->name); + setDesc(pick_data->desc); + setLocation(pick_data->location_text); + mSnapshotCtrl->setImageAssetID(pick_data->snapshot_id); - return TRUE; + mPosGlobal = pick_data->pos_global; + mSimName = pick_data->sim_name; + mParcelId = pick_data->parcel_id; } - // Fill in some reasonable defaults for a new pick. -void LLPanelPick::initNewPick() +void LLPanelPick::createNewPick() { - mPickID.generate(); - - mCreatorID = gAgent.getID(); - + mPickId.generate(); + mCreatorId = gAgent.getID(); mPosGlobal = gAgent.getPositionGlobal(); // Try to fill in the current parcel LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if (parcel) { - mNameEditor->setText(parcel->getName()); - mDescEditor->setText(parcel->getDesc()); + setName(parcel->getName()); + setDesc(parcel->getDesc()); mSnapshotCtrl->setImageAssetID(parcel->getSnapshotID()); } - // Commit to the database, since we've got "new" values. - sendPickInfoUpdate(); + sendUpdate(); } - -void LLPanelPick::setPickID(const LLUUID& pick_id, const LLUUID& creator_id) +/*virtual*/ void LLPanelPick::processProperties(void* data, EAvatarProcessorType type) { - mPickID = pick_id; - mCreatorID = creator_id; -} + if (APT_PICK_INFO != type) return; + if (!data) return; + LLPickData* pick_data = static_cast<LLPickData *>(data); + if (!pick_data) return; + if (mPickId != pick_data->pick_id) return; -// Schedules the panel to request data -// from the server next time it is drawn. -void LLPanelPick::markForServerRequest() -{ - mDataRequested = FALSE; - mDataReceived = FALSE; + init(pick_data); + mDataReceived = TRUE; + LLAvatarPropertiesProcessor::instance().removeObserver(gAgentID, this); } -std::string LLPanelPick::getPickName() +void LLPanelPick::setEditMode( BOOL edit_mode ) { - return mNameEditor->getText(); -} + if (mEditMode == edit_mode) return; + mEditMode = edit_mode; + if (edit_mode) + { + // preserve data before killing controls + std::string name = getName(); + std::string desc = getDesc(); + std::string location = getLocation(); + LLUUID snapshot_id = mSnapshotCtrl->getImageAssetID(); + LLRect old_rect = getRect(); + + deleteAllChildren(); + + LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_EDIT_PICK); + + //*NOTE this code is from LLPanelMeProfile.togglePanel()... doubt this is a right way to do things + reshape(old_rect.getWidth(), old_rect.getHeight()); + old_rect.setLeftTopAndSize(0, old_rect.getHeight(), old_rect.getWidth(), old_rect.getHeight()); + setRect(old_rect); + + // time to restore data + setName(name); + setDesc(desc); + setLocation(location); + mSnapshotCtrl->setImageAssetID(snapshot_id); + } + else + { + // returning to VIEW mode - need to perform cleanup + // this is the case when that panel is reused between viewing/editing different picks + deleteAllChildren(); + reset(); + LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_PICK_INFO); + } +} -void LLPanelPick::sendPickInfoRequest() +//*HACK need to be redone - control panel toggling from parent (Me Panel/Avatar Profile Panel) +void LLPanelPick::setPanelMeProfile(LLPanelMeProfile* meProfilePanel) { - // Must ask for a pick based on the creator id because - // the pick database is distributed to the inventory cluster. JC - std::vector<std::string> strings; - strings.push_back( mCreatorID.asString() ); - strings.push_back( mPickID.asString() ); - send_generic_message("pickinforequest", strings); - - mDataRequested = TRUE; + mMeProfilePanel = meProfilePanel; } - -void LLPanelPick::sendPickInfoUpdate() +void LLPanelPick::setName(std::string name) { - // If we don't have a pick id yet, we'll need to generate one, - // otherwise we'll keep overwriting pick_id 00000 in the database. - if (mPickID.isNull()) + if (mEditMode) { - mPickID.generate(); - } - - LLMessageSystem* msg = gMessageSystem; - - msg->newMessage("PickInfoUpdate"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("PickID", mPickID); - msg->addUUID("CreatorID", mCreatorID); - msg->addBOOL("TopPick", mTopPick); - // fills in on simulator if null - msg->addUUID("ParcelID", mParcelID); - msg->addString("Name", mNameEditor->getText()); - msg->addString("Desc", mDescEditor->getText()); - msg->addUUID("SnapshotID", mSnapshotCtrl->getImageAssetID()); - msg->addVector3d("PosGlobal", mPosGlobal); - - // Only top picks have a sort order - S32 sort_order; - if (mTopPick) - { - sort_order = atoi(mSortOrderEditor->getText().c_str()); + childSetValue(XML_NAME, name); } else { - sort_order = 0; + childSetWrappedText(XML_NAME, name); } - msg->addS32("SortOrder", sort_order); - msg->addBOOL("Enabled", mEnabledCheck->get()); - gAgent.sendReliableMessage(); } - -//static -void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **) +void LLPanelPick::setDesc(std::string desc) { - // Extract the agent id and verify the message is for this - // client. - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id ); - if (agent_id != gAgent.getID()) - { - llwarns << "Agent ID mismatch in processPickInfoReply" - << llendl; - return; - } - - LLUUID pick_id; - msg->getUUID("Data", "PickID", pick_id); - - LLUUID creator_id; - msg->getUUID("Data", "CreatorID", creator_id); - - BOOL top_pick; - msg->getBOOL("Data", "TopPick", top_pick); - - LLUUID parcel_id; - msg->getUUID("Data", "ParcelID", parcel_id); - - std::string name; - msg->getString("Data", "Name", name); - - std::string desc; - msg->getString("Data", "Desc", desc); - - LLUUID snapshot_id; - msg->getUUID("Data", "SnapshotID", snapshot_id); - - // "Location text" is actually the owner name, the original - // name that owner gave the parcel, and the location. - std::string location_text; - msg->getString("Data", "User", location_text); - location_text.append(", "); - - std::string original_name; - msg->getString("Data", "OriginalName", original_name); - if (!original_name.empty()) + if (mEditMode) { - location_text.append(original_name); - location_text.append(", "); + childSetValue(XML_DESC, desc); } - - std::string sim_name; - msg->getString("Data", "SimName", sim_name); - location_text.append(sim_name); - location_text.append(" "); - - LLVector3d pos_global; - msg->getVector3d("Data", "PosGlobal", pos_global); - - S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS; - S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS; - S32 region_z = llround((F32)pos_global.mdV[VZ]); - - location_text.append(llformat("(%d, %d, %d)", region_x, region_y, region_z)); - - S32 sort_order; - msg->getS32("Data", "SortOrder", sort_order); - - BOOL enabled; - msg->getBOOL("Data", "Enabled", enabled); - - // Look up the panel to fill in - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + else { - LLPanelPick* self = *iter; - // For top picks, must match pick id - if (self->mPickID != pick_id) - { - continue; - } - - self->mDataReceived = TRUE; - - // Found the panel, now fill in the information - self->mPickID = pick_id; - self->mCreatorID = creator_id; - self->mParcelID = parcel_id; - self->mSimName.assign(sim_name); - self->mPosGlobal = pos_global; - - // Update UI controls - self->mNameEditor->setText(std::string(name)); - self->mDescEditor->setText(std::string(desc)); - self->mSnapshotCtrl->setImageAssetID(snapshot_id); - self->mLocationEditor->setText(location_text); - self->mEnabledCheck->set(enabled); - - self->mSortOrderEditor->setText(llformat("%d", sort_order)); - } + childSetWrappedText(XML_DESC, desc); + } } -void LLPanelPick::draw() +void LLPanelPick::setLocation(std::string location) { - refresh(); - - LLPanel::draw(); + childSetWrappedText(XML_LOCATION, location); } - -void LLPanelPick::refresh() +std::string LLPanelPick::getName() { - if (!mDataRequested) - { - sendPickInfoRequest(); - } - - // Check for god mode - BOOL godlike = gAgent.isGodlike(); - BOOL is_self = (gAgent.getID() == mCreatorID); - - // Set button visibility/enablement appropriately - if (mTopPick) - { - mSnapshotCtrl->setEnabled(godlike); - mNameEditor->setEnabled(godlike); - mDescEditor->setEnabled(godlike); + return childGetValue(XML_NAME).asString(); +} - mSortOrderText->setVisible(godlike); +std::string LLPanelPick::getDesc() +{ + return childGetValue(XML_DESC).asString(); +} - mSortOrderEditor->setVisible(godlike); - mSortOrderEditor->setEnabled(godlike); +std::string LLPanelPick::getLocation() +{ + return childGetValue(XML_LOCATION).asString(); +} - mEnabledCheck->setVisible(godlike); - mEnabledCheck->setEnabled(godlike); +void LLPanelPick::sendUpdate() +{ + LLPickData pick_data; - mSetBtn->setVisible(godlike); - mSetBtn->setEnabled(godlike); - } - else - { - mSnapshotCtrl->setEnabled(is_self); - mNameEditor->setEnabled(is_self); - mDescEditor->setEnabled(is_self); + // If we don't have a pick id yet, we'll need to generate one, + // otherwise we'll keep overwriting pick_id 00000 in the database. + if (mPickId.isNull()) mPickId.generate(); + + pick_data.agent_id = gAgent.getID(); + pick_data.session_id = gAgent.getSessionID(); + pick_data.pick_id = mPickId; + pick_data.creator_id = gAgentID; + + //legacy var need to be deleted + pick_data.top_pick = FALSE; + pick_data.parcel_id = mParcelId; + pick_data.name = getName(); + pick_data.desc = getDesc(); + pick_data.snapshot_id = mSnapshotCtrl->getImageAssetID(); + pick_data.pos_global = mPosGlobal; + pick_data.sort_order = 0; + pick_data.enabled = TRUE; + + LLAvatarPropertiesProcessor::instance().sendDataUpdate(&pick_data, APT_PICK_INFO); +} - mSortOrderText->setVisible(FALSE); - mSortOrderEditor->setVisible(FALSE); - mSortOrderEditor->setEnabled(FALSE); +//----------------------------------------- +// "PICK INFO" (VIEW MODE) BUTTON HANDLERS +//----------------------------------------- - mEnabledCheck->setVisible(FALSE); - mEnabledCheck->setEnabled(FALSE); +//static +void LLPanelPick::onClickEdit(void* data) +{ + LLPanelPick* self = (LLPanelPick*)data; + if (!self) return; + if (self->mEditMode) return; + if (!self->mDataReceived) return; - mSetBtn->setVisible(is_self); - mSetBtn->setEnabled(is_self); - } + self->setEditMode(TRUE); } - -// static +//static void LLPanelPick::onClickTeleport(void* data) { - LLPanelPick* self = (LLPanelPick*)data; - - if (!self->mPosGlobal.isExactlyZero()) - { - gAgent.teleportViaLocation(self->mPosGlobal); - gFloaterWorldMap->trackLocation(self->mPosGlobal); - } + //LLPanelPick* self = (LLPanelPick*)data; + //*TODO implement } - -// static +//static void LLPanelPick::onClickMap(void* data) { + //LLPanelPick* self = (LLPanelPick*)data; + //*TODO implement +} + +//*HACK need to move panel toggling to parent panels +//static +void LLPanelPick::onClickBack(void* data) +{ LLPanelPick* self = (LLPanelPick*)data; - gFloaterWorldMap->trackLocation(self->mPosGlobal); - LLFloaterWorldMap::show(NULL, TRUE); + if (!self) return; + self->mMeProfilePanel->togglePanel(self); } -// static -/* -void LLPanelPick::onClickLandmark(void* data) + + +//----------------------------------------- +// "EDIT PICK" (EDIT MODE) BUTTON HANDLERS +//----------------------------------------- + +//static +void LLPanelPick::onClickCancel(void* data) { - LLPanelPick* self = (LLPanelPick*)data; - create_landmark(self->mNameEditor->getText(), "", self->mPosGlobal); + LLPanelPick* self = (LLPanelPick*) data; + if (!self) return; + if (!self->mEditMode) return; + self->mMeProfilePanel->togglePanel(self); } -*/ // static void LLPanelPick::onClickSet(void* data) { - LLPanelPick* self = (LLPanelPick*)data; + //TODO check whether pick data was received before + + LLPanelPick* self = (LLPanelPick*) data; + if (!self) return; + if (!self->mEditMode) return; // Save location for later. self->mPosGlobal = gAgent.getPositionGlobal(); - std::string location_text; - location_text.assign("(will update after save)"); - location_text.append(", "); - - S32 region_x = llround((F32)self->mPosGlobal.mdV[VX]) % REGION_WIDTH_UNITS; - S32 region_y = llround((F32)self->mPosGlobal.mdV[VY]) % REGION_WIDTH_UNITS; + S32 region_x = llround((F32)self->mPosGlobal.mdV[VX]) % REGION_WIDTH_UNITS; + S32 region_y = llround((F32)self->mPosGlobal.mdV[VY]) % REGION_WIDTH_UNITS; S32 region_z = llround((F32)self->mPosGlobal.mdV[VZ]); + std::string location_text = "(will update after save), "; location_text.append(self->mSimName); - location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z)); - - // if sim name in pick is different from current sim name - // make sure it's clear that all that's being changed - // is the location and nothing else - if ( gAgent.getRegion ()->getName () != self->mSimName ) - { - LLNotifications::instance().add("SetPickLocation"); - }; - - self->mLocationEditor->setText(location_text); + location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z)); - onCommitAny(NULL, data); + self->setLocation(location_text); } - // static -void LLPanelPick::onCommitAny(LLUICtrl* ctrl, void* data) +void LLPanelPick::onClickSave(void* data) { LLPanelPick* self = (LLPanelPick*)data; + if (!self->mEditMode) return; + if (!self->mDataReceived) return; - // have we received up to date data for this pick? - if (self->mDataReceived) - { - self->sendPickInfoUpdate(); - - // Big hack - assume that top picks are always in a browser, - // and non-top-picks are always in a tab container. - /*if (self->mTopPick) - { - LLPanelDirPicks* panel = (LLPanelDirPicks*)self->getParent(); - panel->renamePick(self->mPickID, self->mNameEditor->getText()); - } - else - {*/ - LLTabContainer* tab = (LLTabContainer*)self->getParent(); - if (tab) - { - if(tab) tab->setCurrentTabName(self->mNameEditor->getText()); - } - //} - } + //*TODO check if data was received before + self->sendUpdate(); + self->mMeProfilePanel->togglePanel(self); } |