diff options
author | seth_productengine <none@none> | 2011-08-02 00:16:13 +0300 |
---|---|---|
committer | seth_productengine <none@none> | 2011-08-02 00:16:13 +0300 |
commit | 1b7b319ae22ac7598b7b3d75ccbec75263450e07 (patch) | |
tree | 9a3e656c90635062cf5f2d7c11c1bb0a24efff7a | |
parent | 6c7653c65bd3f9907bcd4a8a54e4e5c1d172d15e (diff) |
SH-2170 WIP Object and land data added to new weights floater.
The data is updated upon object selection change. The land data is displayed for the land containing the primary selected object.
Loading indicators added for land impacts.
-rw-r--r-- | indra/newview/llfloaterobjectweights.cpp | 135 | ||||
-rw-r--r-- | indra/newview/llfloaterobjectweights.h | 22 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_object_weights.xml | 38 |
3 files changed, 183 insertions, 12 deletions
diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index 93aa8dcf08..80a753757e 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -27,8 +27,34 @@ #include "llfloaterobjectweights.h" +#include "llparcel.h" + +#include "llfloaterreg.h" #include "lltextbox.h" +#include "llselectmgr.h" +#include "llviewerparcelmgr.h" + +/** + * Class LLLandImpactsObserver + * + * An observer class to monitor parcel selection and update + * the land impacts data from a parcel containing the selected object. + */ +class LLLandImpactsObserver : public LLParcelObserver +{ +public: + virtual void changed() + { + LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance<LLFloaterObjectWeights>("object_weights"); + if(object_weights_floater) + { + object_weights_floater->updateLandImpacts(); + } + } +}; + + LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) : LLFloater(key), mSelectedObjects(NULL), @@ -40,12 +66,22 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) mSelectedOnLand(NULL), mRezzedOnLand(NULL), mRemainingCapacity(NULL), - mTotalCapacity(NULL) + mTotalCapacity(NULL), + mLandImpactsObserver(NULL) { + mLandImpactsObserver = new LLLandImpactsObserver(); + LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver); } LLFloaterObjectWeights::~LLFloaterObjectWeights() { + mObjectSelection = NULL; + mParcelSelection = NULL; + + mSelectMgrConnection.disconnect(); + + LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); + delete mLandImpactsObserver; } // virtual @@ -59,10 +95,10 @@ BOOL LLFloaterObjectWeights::postBuild() mSelectedServerWeight = getChild<LLTextBox>("server"); mSelectedDisplayWeight = getChild<LLTextBox>("display"); - mSelectedOnLand = getChild<LLTextBox>("used_download_weight"); - mRezzedOnLand = getChild<LLTextBox>("used_download_weight"); - mRemainingCapacity = getChild<LLTextBox>("used_download_weight"); - mTotalCapacity = getChild<LLTextBox>("used_download_weight"); + mSelectedOnLand = getChild<LLTextBox>("selected"); + mRezzedOnLand = getChild<LLTextBox>("rezzed_on_land"); + mRemainingCapacity = getChild<LLTextBox>("remaining_capacity"); + mTotalCapacity = getChild<LLTextBox>("total_capacity"); return TRUE; } @@ -70,15 +106,94 @@ BOOL LLFloaterObjectWeights::postBuild() // virtual void LLFloaterObjectWeights::onOpen(const LLSD& key) { - updateIfNothingSelected(); + mSelectMgrConnection = LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLFloaterObjectWeights::refresh, this)); + + mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); + mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection(); + + refresh(); +} + +// virtual +void LLFloaterObjectWeights::onClose(bool app_quitting) +{ + mSelectMgrConnection.disconnect(); + + mObjectSelection = NULL; + mParcelSelection = NULL; } -void LLFloaterObjectWeights::toggleLoadingIndicators(bool visible) +void LLFloaterObjectWeights::updateLandImpacts() +{ + LLParcel *parcel = mParcelSelection->getParcel(); + if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + updateIfNothingSelected(); + } + else + { + S32 selected_prims = parcel->getSelectedPrimCount(); + S32 rezzed_prims = parcel->getSimWidePrimCount(); + S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); + + mSelectedOnLand->setText(llformat("%d", selected_prims)); + mRezzedOnLand->setText(llformat("%d", rezzed_prims)); + mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims)); + mTotalCapacity->setText(llformat("%d", total_capacity)); + + toggleLandImpactsLoadingIndicators(false); + } +} + +void LLFloaterObjectWeights::refresh() +{ + if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + updateIfNothingSelected(); + } + else + { + S32 prim_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + + mSelectedObjects->setText(llformat("%d", link_count)); + mSelectedPrims->setText(llformat("%d", prim_count)); + + LLViewerObject* selected_object = mObjectSelection->getPrimaryObject(); + if (selected_object) + { + // Select a parcel at the currently selected object's position. + LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); + + toggleLandImpactsLoadingIndicators(true); + } + } +} + +void LLFloaterObjectWeights::toggleWeightsLoadingIndicators(bool visible) { childSetVisible("download_loading_indicator", visible); childSetVisible("physics_loading_indicator", visible); childSetVisible("server_loading_indicator", visible); childSetVisible("display_loading_indicator", visible); + + mSelectedDownloadWeight->setVisible(!visible); + mSelectedPhysicsWeight->setVisible(!visible); + mSelectedServerWeight->setVisible(!visible); + mSelectedDisplayWeight->setVisible(!visible); +} + +void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible) +{ + childSetVisible("selected_loading_indicator", visible); + childSetVisible("rezzed_on_land_loading_indicator", visible); + childSetVisible("remaining_capacity_loading_indicator", visible); + childSetVisible("total_capacity_loading_indicator", visible); + + mSelectedOnLand->setVisible(!visible); + mRezzedOnLand->setVisible(!visible); + mRemainingCapacity->setVisible(!visible); + mTotalCapacity->setVisible(!visible); } void LLFloaterObjectWeights::updateIfNothingSelected() @@ -94,6 +209,10 @@ void LLFloaterObjectWeights::updateIfNothingSelected() mSelectedDisplayWeight->setText(text); mSelectedOnLand->setText(text); + mRezzedOnLand->setText(text); + mRemainingCapacity->setText(text); + mTotalCapacity->setText(text); - toggleLoadingIndicators(false); + toggleWeightsLoadingIndicators(false); + toggleLandImpactsLoadingIndicators(false); } diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index 10e35ad7a7..82743a8aa7 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -29,6 +29,9 @@ #include "llfloater.h" +class LLLandImpactsObserver; +class LLObjectSelection; +class LLParcelSelection; class LLTextBox; class LLFloaterObjectWeights : public LLFloater @@ -36,15 +39,25 @@ class LLFloaterObjectWeights : public LLFloater public: LOG_CLASS(LLFloaterObjectWeights); + typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle; + typedef LLSafeHandle<LLParcelSelection> LLParcelSelectionHandle; + LLFloaterObjectWeights(const LLSD& key); ~LLFloaterObjectWeights(); /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); + + void updateLandImpacts(); private: - void toggleLoadingIndicators(bool visible); + void refresh(); + + void toggleWeightsLoadingIndicators(bool visible); + void toggleLandImpactsLoadingIndicators(bool visible); + void updateIfNothingSelected(); LLTextBox *mSelectedObjects; @@ -59,6 +72,13 @@ private: LLTextBox *mRezzedOnLand; LLTextBox *mRemainingCapacity; LLTextBox *mTotalCapacity; + + LLLandImpactsObserver *mLandImpactsObserver; + + LLObjectSelectionHandle mObjectSelection; + LLParcelSelectionHandle mParcelSelection; + + boost::signals2::connection mSelectMgrConnection; }; #endif //LL_LLFLOATEROBJECTWEIGHTS_H diff --git a/indra/newview/skins/default/xui/en/floater_object_weights.xml b/indra/newview/skins/default/xui/en/floater_object_weights.xml index f377386679..a73db3af32 100644 --- a/indra/newview/skins/default/xui/en/floater_object_weights.xml +++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml @@ -222,6 +222,14 @@ top_pad="3" value="--" width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="selected_loading_indicator" + top_delta="0" + width="16" /> <text follows="left|top" height="16" @@ -241,6 +249,14 @@ top_pad="3" value="--" width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="rezzed_on_land_loading_indicator" + top_delta="0" + width="16" /> <text follows="left|top" height="16" @@ -260,12 +276,20 @@ top_pad="3" value="--" width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="remaining_capacity_loading_indicator" + top_delta="0" + width="16" /> <text follows="left|top" height="16" layout="topleft" left_pad="10" - name="remaining_capacity" + name="remaining_capacity_label" top_delta="0" value="Remaining capacity" width="130" /> @@ -279,12 +303,20 @@ top_pad="3" value="--" width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="total_capacity_loading_indicator" + top_delta="0" + width="16" /> <text follows="left|top" height="16" layout="topleft" left_pad="10" - name="total_capacity" + name="total_capacity_label" top_delta="0" value="Total capacity" width="130" /> @@ -303,7 +335,7 @@ height="16" layout="topleft" left="10" - name="total_capacity" + name="help_SLURL" top_pad="10" value="[secondlife:///www.secondlife.com What is all this?...]" width="180" /> |