diff options
-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" /> |