diff options
Diffstat (limited to 'indra/newview/llpanelenvironment.cpp')
-rw-r--r-- | indra/newview/llpanelenvironment.cpp | 128 |
1 files changed, 85 insertions, 43 deletions
diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index 1beba9db0c..aa8c6cf724 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -65,6 +65,7 @@ const std::string LLPanelEnvironmentInfo::BTN_EDIT("btn_edit"); const std::string LLPanelEnvironmentInfo::SLD_DAYLENGTH("sld_day_length"); const std::string LLPanelEnvironmentInfo::SLD_DAYOFFSET("sld_day_offset"); const std::string LLPanelEnvironmentInfo::SLD_ALTITUDES("sld_altitudes"); +const std::string LLPanelEnvironmentInfo::ICN_GROUND("icon_ground"); const std::string LLPanelEnvironmentInfo::CHK_ALLOWOVERRIDE("chk_allow_override"); const std::string LLPanelEnvironmentInfo::BTN_APPLY("btn_apply"); const std::string LLPanelEnvironmentInfo::BTN_CANCEL("btn_cancel"); @@ -94,12 +95,8 @@ const U32 LLPanelEnvironmentInfo::DIRTY_FLAG_MASK( LLPanelEnvironmentInfo::DIRTY_FLAG_DAYOFFSET | LLPanelEnvironmentInfo::DIRTY_FLAG_ALTITUDES); -#if 0 -// Because the OSX is Very cranky when I don't use a variable. const U32 ALTITUDE_SLIDER_COUNT = 3; -#endif - const std::string alt_sliders[] = { "sld1", "sld2", @@ -249,6 +246,7 @@ void LLPanelEnvironmentInfo::refresh() updateAltLabel(alt_labels[idx], idx + 2, altitudes[idx+1]); mAltitudes[alt_sliders[idx]] = AltitudeData(idx+1, idx, altitudes[idx+1]); } + readjustAltLabels(); } #endif @@ -363,6 +361,7 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(false); getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(false); getChild<LLUICtrl>(PNL_DISABLED)->setVisible(true); + getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(FALSE); updateEditFloater(mCurrentEnvironment); @@ -372,6 +371,13 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(true); getChild<LLUICtrl>(PNL_DISABLED)->setVisible(false); +#if 1 + // hiding the controls until Rider can get the simulator code to adjust altitudes done. + getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(FALSE); +#else + getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(isRegion()); +#endif + S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex(); getChild<LLUICtrl>(RDG_ENVIRONMENT_SELECT)->setEnabled(enabled); @@ -383,6 +389,7 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) getChild<LLUICtrl>(BTN_EDIT)->setEnabled(enabled); getChild<LLUICtrl>(SLD_DAYLENGTH)->setEnabled(enabled && (rdo_selection != 0) && !is_legacy); getChild<LLUICtrl>(SLD_DAYOFFSET)->setEnabled(enabled && (rdo_selection != 0) && !is_legacy); + getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setEnabled(enabled && isRegion() && !is_legacy); getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setEnabled(enabled && isRegion() && !is_legacy); getChild<LLUICtrl>(BTN_APPLY)->setEnabled(enabled && (mDirtyFlag != 0)); getChild<LLUICtrl>(BTN_CANCEL)->setEnabled(enabled && (mDirtyFlag != 0)); @@ -426,10 +433,10 @@ void LLPanelEnvironmentInfo::updateAltLabel(const std::string &alt_name, U32 sky { LLMultiSliderCtrl *sld = getChild<LLMultiSliderCtrl>(SLD_ALTITUDES); LLRect sld_rect = sld->getRect(); - U32 sld_range = sld_rect.getHeight(); - U32 sld_bottom = sld_rect.mBottom; - U32 sld_offset = sld_rect.getWidth(); // Roughly identical to thumb's width in slider. - U32 pos = (sld_range - sld_offset) * ((alt_value - 100) / (4000 - 100)); + S32 sld_range = sld_rect.getHeight(); + S32 sld_bottom = sld_rect.mBottom; + S32 sld_offset = sld_rect.getWidth(); // Roughly identical to thumb's width in slider. + S32 pos = (sld_range - sld_offset) * ((alt_value - 100) / (4000 - 100)); // get related text box LLTextBox* text = getChild<LLTextBox>(alt_name); @@ -437,7 +444,7 @@ void LLPanelEnvironmentInfo::updateAltLabel(const std::string &alt_name, U32 sky { // move related text box LLRect rect = text->getRect(); - U32 height = rect.getHeight(); + S32 height = rect.getHeight(); rect.mBottom = sld_bottom + (sld_offset / 2 + 1) + pos - (height / 2); rect.mTop = rect.mBottom + height; text->setRect(rect); @@ -453,6 +460,59 @@ void LLPanelEnvironmentInfo::updateAltLabel(const std::string &alt_name, U32 sky } } +void LLPanelEnvironmentInfo::readjustAltLabels() +{ + // Restore ground label position + LLView* icon = getChild<LLView>(ICN_GROUND); + LLTextBox* text = getChild<LLTextBox>(alt_labels[ALTITUDE_SLIDER_COUNT]); // one more field then sliders + LLRect ground_text_rect = text->getRect(); + LLRect icon_rect = icon->getRect(); + S32 height = ground_text_rect.getHeight(); + ground_text_rect.mBottom = icon_rect.mBottom + (icon_rect.getHeight()/2) - (height/2); + ground_text_rect.mTop = ground_text_rect.mBottom + height; + text->setRect(ground_text_rect); + + // Re-adjust all labels + // Very simple "adjust after the fact" method + // Note: labels are unordered, labels are 1 above sliders due to 'ground' + + for (U32 i = 0; i < ALTITUDE_SLIDER_COUNT; i++) + { + LLTextBox* text_cmp = getChild<LLTextBox>(alt_labels[i]); + + for (U32 j = i + 1; j <= ALTITUDE_SLIDER_COUNT; j++) + { + LLTextBox* text_intr = getChild<LLTextBox>(alt_labels[j]); + if (text_cmp && text_intr) + { + LLRect cmp_rect = text_cmp->getRect(); + LLRect intr_rect = text_intr->getRect(); + S32 shift = 0; + if (cmp_rect.mBottom <= intr_rect.mTop && cmp_rect.mBottom >= intr_rect.mBottom) + { + // Aproximate shift + // We probably will need more cycle runs over all labels to get accurate one + // At the moment single cycle should do since we have too little elements to do something complicated + shift = (cmp_rect.mBottom - intr_rect.mTop) / 2; + } + else if (cmp_rect.mTop >= intr_rect.mBottom && cmp_rect.mTop <= intr_rect.mTop) + { + // Aproximate shift + shift = (cmp_rect.mTop - intr_rect.mBottom) / 2; + } + if (shift != 0) + { + cmp_rect.translate(0, -shift); + text_cmp->setRect(cmp_rect); + + intr_rect.translate(0, shift); + text_intr->setRect(intr_rect); + } + } + } + } +} + void LLPanelEnvironmentInfo::onSwitchDefaultSelection() { bool can_edit = canEdit(); @@ -491,51 +551,33 @@ void LLPanelEnvironmentInfo::onAltSliderCallback(LLUICtrl *cntrl, const LLSD &da LLMultiSliderCtrl *sld = (LLMultiSliderCtrl *)cntrl; std::string sld_name = sld->getCurSlider(); F32 sld_value = sld->getCurSliderValue(); - U32 alt_index = 1; mAltitudes[sld_name].mAltitude = sld_value; - // find index of sky layer/altitude - altitudes_data_t::iterator iter = mAltitudes.begin(); + // update all labels since we could have jumped multiple and we will need to readjust + // (or sort by altitude, too little elements, so I didn't bother with efficiency) altitudes_data_t::iterator end = mAltitudes.end(); - while (iter!=end) - { - if (sld_value > iter->second.mAltitude) - { - alt_index++; - } - iter++; - } - - if (mAltitudes[sld_name].mAltitudeIndex != alt_index) + altitudes_data_t::iterator iter = mAltitudes.begin(); + altitudes_data_t::iterator iter2; + U32 new_index; + while (iter != end) { - // update all labels since we could have jumped multiple - // (or sort by altitude, too little elements, so I didn't bother with efficiency) - altitudes_data_t::iterator iter = mAltitudes.begin(); - altitudes_data_t::iterator iter2; - U32 new_index; - while (iter != end) + iter2 = mAltitudes.begin(); + new_index = 1; + while (iter2 != end) { - iter2 = mAltitudes.begin(); - new_index = 1; - while (iter2 != end) + if (iter->second.mAltitude > iter2->second.mAltitude) { - if (iter->second.mAltitude > iter2->second.mAltitude) - { - new_index++; - } - iter2++; + new_index++; } - iter->second.mAltitudeIndex = new_index; - updateAltLabel(alt_labels[iter->second.mLabelIndex], iter->second.mAltitudeIndex + 1, iter->second.mAltitude); - iter++; + iter2++; } - } - else - { - updateAltLabel(alt_labels[mAltitudes[sld_name].mLabelIndex], alt_index + 1, sld_value); + iter->second.mAltitudeIndex = new_index; + updateAltLabel(alt_labels[iter->second.mLabelIndex], iter->second.mAltitudeIndex + 1, iter->second.mAltitude); + iter++; } + readjustAltLabels(); setDirtyFlag(DIRTY_FLAG_ALTITUDES); } |