diff options
| -rw-r--r-- | indra/llui/llfloater.cpp | 69 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 13 | ||||
| -rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llfloateravatarpicker.cpp | 55 | ||||
| -rw-r--r-- | indra/newview/llfloatercolorpicker.cpp | 52 | ||||
| -rw-r--r-- | indra/newview/llfloatereditextdaycycle.cpp | 84 | ||||
| -rw-r--r-- | indra/newview/llfloatereditextdaycycle.h | 5 | ||||
| -rw-r--r-- | indra/newview/llfloaterexperiencepicker.cpp | 55 | ||||
| -rw-r--r-- | indra/newview/llsettingspicker.cpp | 59 | ||||
| -rw-r--r-- | indra/newview/llsettingspicker.h | 3 | ||||
| -rw-r--r-- | indra/newview/lltexturectrl.cpp | 58 | ||||
| -rw-r--r-- | indra/newview/lltrackpicker.cpp | 126 | ||||
| -rw-r--r-- | indra/newview/lltrackpicker.h | 58 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_pick_track.xml | 129 | 
14 files changed, 493 insertions, 275 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index a245dd8f78..d6c2c7bc55 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -37,6 +37,7 @@  #include "lluictrlfactory.h"  #include "llbutton.h"  #include "llcheckboxctrl.h" +#include "llcriticaldamp.h" // LLSmoothInterpolation  #include "lldir.h"  #include "lldraghandle.h"  #include "llfloaterreg.h" @@ -64,6 +65,10 @@  // use this to control "jumping" behavior when Ctrl-Tabbing  const S32 TABBED_FLOATER_OFFSET = 0; +const F32 LLFloater::CONTEXT_CONE_IN_ALPHA = 0.0f; +const F32 LLFloater::CONTEXT_CONE_OUT_ALPHA = 1.f; +const F32 LLFloater::CONTEXT_CONE_FADE_TIME = 0.08f; +  namespace LLInitParam  {  	void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues() @@ -2116,6 +2121,70 @@ void LLFloater::updateTitleButtons()  	}  } +void LLFloater::drawConeToOwner(F32 &context_cone_opacity, +                                F32 max_cone_opacity, +                                LLView *owner_view, +                                F32 fade_time, +                                F32 contex_cone_in_alpha, +                                F32 contex_cone_out_alpha) +{ +    if (owner_view +        && owner_view->isInVisibleChain() +        && hasFocus() +        && context_cone_opacity > 0.001f +        && gFocusMgr.childHasKeyboardFocus(this)) +    { +        // draw cone of context pointing back to owner (e.x. texture swatch) +        LLRect owner_rect; +        owner_view->localRectToOtherView(owner_view->getLocalRect(), &owner_rect, this); +        LLRect local_rect = getLocalRect(); + +        gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +        LLGLEnable(GL_CULL_FACE); +        gGL.begin(LLRender::QUADS); +        { +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity); +            gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); +            gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity); +            gGL.vertex2i(local_rect.mRight, local_rect.mTop); +            gGL.vertex2i(local_rect.mLeft, local_rect.mTop); + +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity); +            gGL.vertex2i(local_rect.mLeft, local_rect.mTop); +            gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity); +            gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); +            gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); + +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity); +            gGL.vertex2i(local_rect.mRight, local_rect.mBottom); +            gGL.vertex2i(local_rect.mRight, local_rect.mTop); +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity); +            gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); +            gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); + + +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity); +            gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); +            gGL.vertex2i(local_rect.mRight, local_rect.mBottom); +            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity); +            gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); +            gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); +        } +        gGL.end(); +    } + +    if (gFocusMgr.childHasMouseCapture(getDragHandle())) +    { +        context_cone_opacity = lerp(context_cone_opacity, max_cone_opacity, LLSmoothInterpolation::getInterpolant(fade_time)); +    } +    else +    { +        context_cone_opacity = lerp(context_cone_opacity, 0.f, LLSmoothInterpolation::getInterpolant(fade_time)); +    } +} +  void LLFloater::buildButtons(const Params& floater_params)  {  	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0); diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 165f67499b..f8c04e8a2f 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -395,6 +395,15 @@ protected:  	virtual void	updateTitleButtons(); +	// Draws a cone from this floater to parent floater or view (owner) +	// Modifies context_cone_opacity (interpolates according to fade time and returns new value) +	void			drawConeToOwner(F32 &context_cone_opacity, +									F32 max_cone_opacity, +									LLView *owner_view, +									F32 context_fade_time = CONTEXT_CONE_FADE_TIME, +									F32 contex_cone_in_alpha = CONTEXT_CONE_IN_ALPHA, +									F32 contex_cone_out_alpha = CONTEXT_CONE_OUT_ALPHA); +  private:  	void			setForeground(BOOL b);	// called only by floaterview  	void			cleanupHandles(); // remove handles to dead floaters @@ -424,6 +433,10 @@ private:  	void			updateTransparency(LLView* view, ETypeTransparency transparency_type);  public: +	static const F32 CONTEXT_CONE_IN_ALPHA; +	static const F32 CONTEXT_CONE_OUT_ALPHA; +	static const F32 CONTEXT_CONE_FADE_TIME; +  	// Called when floater is opened, passes mKey  	// Public so external views or floaters can watch for this floater opening  	commit_signal_t mOpenSignal; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 967ba2d8d9..9d4b58d216 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -605,6 +605,7 @@ set(viewer_SOURCE_FILES      lltoolselectland.cpp      lltoolselectrect.cpp      lltracker.cpp +    lltrackpicker.cpp      lltransientdockablefloater.cpp      lltransientfloatermgr.cpp      lltranslate.cpp @@ -1219,6 +1220,7 @@ set(viewer_HEADER_FILES      lltoolselectland.h      lltoolselectrect.h      lltracker.h +    lltrackpicker.h      lltransientdockablefloater.h      lltransientfloatermgr.h      lltranslate.h diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index c5561fe011..abf7b7f39d 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -361,59 +361,8 @@ void LLFloaterAvatarPicker::populateFriend()  void LLFloaterAvatarPicker::drawFrustum()  { -    if(mFrustumOrigin.get()) -    { -        LLView * frustumOrigin = mFrustumOrigin.get(); -        LLRect origin_rect; -        frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this); -        // draw context cone connecting color picker with color swatch in parent floater -        LLRect local_rect = getLocalRect(); -        if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f) -        { -            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -            LLGLEnable(GL_CULL_FACE); -            gGL.begin(LLRender::QUADS); -            { -                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); -                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); -                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -                gGL.vertex2i(local_rect.mRight, local_rect.mTop); -                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); - -                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); -                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); - -                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -                gGL.vertex2i(local_rect.mRight, local_rect.mTop); -                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); -                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); - -                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); -                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); -            } -            gGL.end(); -        } - -        if (gFocusMgr.childHasMouseCapture(getDragHandle())) -        { -            mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(mContextConeFadeTime)); -        } -        else -        { -            mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(mContextConeFadeTime)); -        } -    } +    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +    drawConeToOwner(mContextConeOpacity, max_opacity, mFrustumOrigin.get(), mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);  }  void LLFloaterAvatarPicker::draw() diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index ec2c9740af..1a784223c2 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -485,56 +485,8 @@ BOOL LLFloaterColorPicker::isColorChanged()  //  void LLFloaterColorPicker::draw()  { -	LLRect swatch_rect; -	mSwatch->localRectToOtherView(mSwatch->getLocalRect(), &swatch_rect, this); -	// draw context cone connecting color picker with color swatch in parent floater -	LLRect local_rect = getLocalRect(); -	if (hasFocus() && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f) -	{ -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		LLGLEnable(GL_CULL_FACE); -		gGL.begin(LLRender::QUADS); -		{ -			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop); -			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -			gGL.vertex2i(local_rect.mRight, local_rect.mTop); -			gGL.vertex2i(local_rect.mLeft, local_rect.mTop); - -			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -			gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom); -			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop); - -			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -			gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -			gGL.vertex2i(local_rect.mRight, local_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop); -			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom); - -			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -			gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom); -			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom); -		} -		gGL.end(); -	} - -	if (gFocusMgr.childHasMouseCapture(getDragHandle())) -	{ -		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"),  -                                        LLSmoothInterpolation::getInterpolant(mContextConeFadeTime)); -	} -	else -	{ -		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(mContextConeFadeTime)); -	} +	static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +	drawConeToOwner(mContextConeOpacity, max_opacity, mSwatch, mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);  	mPipetteBtn->setToggleState(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());  	mApplyImmediateCheck->setEnabled(mActive && mCanApplyImmediately); diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index d6c104547d..51bbc9fb90 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -48,6 +48,7 @@  #include "llviewerparcelmgr.h"  #include "llsettingspicker.h" +#include "lltrackpicker.h"  // newview  #include "llagent.h" @@ -425,6 +426,7 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)  void LLFloaterEditExtDayCycle::onClose(bool app_quitting)  {      doCloseInventoryFloater(app_quitting); +    doCloseTrackFloater(app_quitting);      // there's no point to change environment if we're quitting      // or if we already restored environment      stopPlay(); @@ -802,7 +804,48 @@ void LLFloaterEditExtDayCycle::onRemoveFrame()  void LLFloaterEditExtDayCycle::onCloneTrack()  { +    const LLEnvironment::altitude_list_t &altitudes = LLEnvironment::instance().getRegionAltitudes(); +    bool use_altitudes = altitudes.size() > 0 && ((mEditContext == CONTEXT_PARCEL) || (mEditContext == CONTEXT_REGION)); + +    LLSD args = LLSD::emptyArray(); + +    S32 populated_counter = 0; +    for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++) +    { +        LLSD track; +        track["id"] = LLSD::Integer(i); +        bool populated = (!mEditDay->isTrackEmpty(i)) && (i != mCurrentTrack); +        track["enabled"] = populated; +        if (populated) +        { +            populated_counter++; +        } +        if (use_altitudes) +        { +            track["altitude"] = altitudes[i - 1]; +        } +        args.append(track); +    } +    if (populated_counter > 1) +    { +        doOpenTrackFloater(args); +    } +    else if (populated_counter > 0) +    { +        for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++) +        { +            if ((!mEditDay->isTrackEmpty(i)) && (i != mCurrentTrack)) +            { +                onPickerCommitTrackId(i); +            } +        } +    } +    else +    { +        // Should not happen +        LL_WARNS("ENVDAYEDIT") << "Tried to copy tracks, but there are no available sources" << LL_ENDL; +    }  } @@ -1049,6 +1092,8 @@ void LLFloaterEditExtDayCycle::cloneTrack(const LLSettingsDay::ptr_t &source_day          mEditDay->setSettingsAtKeyframe(psky->buildDerivedClone(), track_frame.first, dest_index);      } +    setDirtyFlag(); +      updateSlider();      updateTabs();      updateButtons(); @@ -1228,8 +1273,7 @@ void LLFloaterEditExtDayCycle::updateButtons()      }      can_clear = (mCurrentTrack > 1) ? (!mEditDay->getCycleTrack(mCurrentTrack).empty()) : (mEditDay->getCycleTrack(mCurrentTrack).size() > 1); -    mCloneTrack->setEnabled(can_clone && false); -    mCloneTrack->setVisible(false); +    mCloneTrack->setEnabled(can_clone);      mLoadTrack->setEnabled(can_load);      mClearTrack->setEnabled(can_clear); @@ -1509,6 +1553,7 @@ void LLFloaterEditExtDayCycle::synchronizeTabs()      mEditSky = psettingS;      doCloseInventoryFloater(); +    doCloseTrackFloater();      setTabsData(tabs, psettingS, canedit);      LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, mEditSky, mEditWater); @@ -1741,6 +1786,7 @@ bool LLFloaterEditExtDayCycle::canApplyParcel() const  void LLFloaterEditExtDayCycle::startPlay()  {      doCloseInventoryFloater(); +    doCloseTrackFloater();      mIsPlaying = true;      mFramesSlider->resetCurSlider(); @@ -1814,6 +1860,38 @@ void LLFloaterEditExtDayCycle::clearDirtyFlag()  } +void LLFloaterEditExtDayCycle::doOpenTrackFloater(const LLSD &args) +{ +    LLFloaterTrackPicker *picker = static_cast<LLFloaterTrackPicker *>(mTrackFloater.get()); + +    // Show the dialog +    if (!picker) +    { +        picker = new LLFloaterTrackPicker(this); + +        mTrackFloater = picker->getHandle(); + +        picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitTrackId(data.asInteger()); }); +    } + +    picker->showPicker(args); +} + +void LLFloaterEditExtDayCycle::doCloseTrackFloater(bool quitting) +{ +    LLFloater* floaterp = mTrackFloater.get(); + +    if (floaterp) +    { +        floaterp->closeFloater(quitting); +    } +} + +void LLFloaterEditExtDayCycle::onPickerCommitTrackId(U32 track_id) +{ +    cloneTrack(track_id, mCurrentTrack); +} +  void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID curritem)  {  //  LLUI::sWindow->setCursor(UI_CURSOR_WAIT); @@ -1832,9 +1910,9 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ      picker->setSettingsFilter(type);      picker->setSettingsItemId(curritem); +    picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);      picker->openFloater();      picker->setFocus(TRUE); -    picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);  }  void LLFloaterEditExtDayCycle::doCloseInventoryFloater(bool quitting) diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h index e808ab8a46..f50c9f7e5f 100644 --- a/indra/newview/llfloatereditextdaycycle.h +++ b/indra/newview/llfloatereditextdaycycle.h @@ -160,6 +160,10 @@ private:      void                        onInventoryCreated(LLUUID asset_id, LLUUID inventory_id, LLSD results);      void                        onInventoryUpdated(LLUUID asset_id, LLUUID inventory_id, LLSD results); +    void                        doOpenTrackFloater(const LLSD &args); +    void                        doCloseTrackFloater(bool quitting = false); +    void                        onPickerCommitTrackId(U32 track_id); +      void                        doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID curritem);      void                        doCloseInventoryFloater(bool quitting = false);      void                        onPickerCommitSetting(LLUUID item_id, S32 track); @@ -218,6 +222,7 @@ private:      LLFlyoutComboBtnCtrl *      mFlyoutControl;      LLHandle<LLFloater>         mInventoryFloater; +    LLHandle<LLFloater>         mTrackFloater;      LLTrackBlenderLoopingManual::ptr_t  mSkyBlender;      LLTrackBlenderLoopingManual::ptr_t  mWaterBlender; diff --git a/indra/newview/llfloaterexperiencepicker.cpp b/indra/newview/llfloaterexperiencepicker.cpp index bb54c57baf..c642da7b83 100644 --- a/indra/newview/llfloaterexperiencepicker.cpp +++ b/indra/newview/llfloaterexperiencepicker.cpp @@ -74,59 +74,8 @@ LLFloaterExperiencePicker* LLFloaterExperiencePicker::show( select_callback_t ca  void LLFloaterExperiencePicker::drawFrustum()  { -	if(mFrustumOrigin.get()) -	{ -		LLView * frustumOrigin = mFrustumOrigin.get(); -		LLRect origin_rect; -		frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this); -		// draw context cone connecting color picker with color swatch in parent floater -		LLRect local_rect = getLocalRect(); -		if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f) -		{ -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			LLGLEnable(GL_CULL_FACE); -			gGL.begin(LLRender::QUADS); -			{ -				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -				gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); -				gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); -				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -				gGL.vertex2i(local_rect.mRight, local_rect.mTop); -				gGL.vertex2i(local_rect.mLeft, local_rect.mTop); - -				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -				gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -				gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); -				gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); - -				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -				gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -				gGL.vertex2i(local_rect.mRight, local_rect.mTop); -				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -				gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); -				gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); - -				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); -				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -				gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); -				gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); -				gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); -			} -			gGL.end(); -		} - -		if (gFocusMgr.childHasMouseCapture(getDragHandle())) -		{ -			mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(mContextConeFadeTime)); -		} -		else -		{ -			mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime)); -		} -	} +    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +    drawConeToOwner(mContextConeOpacity, max_opacity, mFrustumOrigin.get(), mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);  }  void LLFloaterExperiencePicker::draw() diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index 7aa9cf0ae8..5812fc59cd 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -55,10 +55,6 @@ namespace      const std::string BTN_SELECT("btn_select");      const std::string BTN_CANCEL("btn_cancel"); -    const F32 CONTEXT_CONE_IN_ALPHA(0.0f); -    const F32 CONTEXT_CONE_OUT_ALPHA(1.0f); -    const F32 CONTEXT_FADE_TIME(0.08f); -      // strings in xml      const std::string STR_TITLE_PREFIX = "pick title"; @@ -194,59 +190,8 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)  void LLFloaterSettingsPicker::draw()  {      LLView *owner = mOwnerHandle.get(); -    if (owner) -    { -        // draw cone of context pointing back to texture swatch	 -        LLRect owner_rect; -        owner->localRectToOtherView(owner->getLocalRect(), &owner_rect, this); -        LLRect local_rect = getLocalRect(); -        if (gFocusMgr.childHasKeyboardFocus(this) && owner->isInVisibleChain() && mContextConeOpacity > 0.001f) -        { -            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -            LLGLEnable(GL_CULL_FACE); -            gGL.begin(LLRender::QUADS); -            { -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -                gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); -                gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -                gGL.vertex2i(local_rect.mRight, local_rect.mTop); -                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); - -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -                gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); -                gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); - -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -                gGL.vertex2i(local_rect.mRight, local_rect.mTop); -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -                gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); -                gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); - - -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -                gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); -                gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); -            } -            gGL.end(); -        } -    } - -    if (gFocusMgr.childHasMouseCapture(getDragHandle())) -    { -        mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -    } -    else -    { -        mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -    } +    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +    drawConeToOwner(mContextConeOpacity, max_opacity, owner);      LLFloater::draw();  } diff --git a/indra/newview/llsettingspicker.h b/indra/newview/llsettingspicker.h index 941fe752b0..f5aecf4417 100644 --- a/indra/newview/llsettingspicker.h +++ b/indra/newview/llsettingspicker.h @@ -45,7 +45,6 @@ class LLInventoryPanel;  class LLFloaterSettingsPicker : public LLFloater  {  public: -    typedef std::function<void (LLUUID id)>                 commit_callback_t;      typedef std::function<void()>                           close_callback_t;      typedef std::function<void(const LLUUID& item_id)>     id_changed_callback_t; @@ -117,8 +116,6 @@ private:      F32                     mContextConeOpacity;      PermissionMask          mImmediateFilterPermMask; -//     PermissionMask          mDnDFilterPermMask; -//     PermissionMask          mNonImmediateFilterPermMask;      bool                    mActive;      bool				    mNoCopySettingsSelected; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a5a2eec246..5ca77ad3c3 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -70,9 +70,6 @@  #include "lllocalbitmaps.h"  #include "llerror.h" -static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f; -static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; -static const F32 CONTEXT_FADE_TIME = 0.08f;  static const S32 LOCAL_TRACKING_ID_COLUMN = 1; @@ -410,59 +407,8 @@ BOOL LLFloaterTexturePicker::postBuild()  // virtual  void LLFloaterTexturePicker::draw()  { -	if (mOwner) -	{ -		// draw cone of context pointing back to texture swatch	 -		LLRect owner_rect; -		mOwner->localRectToOtherView(mOwner->getLocalRect(), &owner_rect, this); -		LLRect local_rect = getLocalRect(); -		if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f) -		{ -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			LLGLEnable(GL_CULL_FACE); -			gGL.begin(LLRender::QUADS); -			{ -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); -				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -				gGL.vertex2i(local_rect.mRight, local_rect.mTop); -				gGL.vertex2i(local_rect.mLeft, local_rect.mTop); - -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -				gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); -				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); - -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -				gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -				gGL.vertex2i(local_rect.mRight, local_rect.mTop); -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop); -				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); - - -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); -				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -				gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); -				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom); -				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom); -			} -			gGL.end(); -		} -	} - -	if (gFocusMgr.childHasMouseCapture(getDragHandle())) -	{ -		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -	} -	else -	{ -		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -	} +    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +    drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);  	updateImageStats(); diff --git a/indra/newview/lltrackpicker.cpp b/indra/newview/lltrackpicker.cpp new file mode 100644 index 0000000000..bc918f4bd7 --- /dev/null +++ b/indra/newview/lltrackpicker.cpp @@ -0,0 +1,126 @@ +/**  +* @author AndreyK Productengine +* @brief LLTrackPicker class header file including related functions +* +* $LicenseInfo:firstyear=2018&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2018, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "lltrackpicker.h" + +#include "llradiogroup.h" +#include "llviewercontrol.h" + + +//========================================================================= +namespace +{ +    const std::string FLOATER_DEFINITION_XML("floater_pick_track.xml"); + +    const std::string BTN_SELECT("btn_select"); +    const std::string BTN_CANCEL("btn_cancel"); +    const std::string RDO_TRACK_SELECTION("track_selection"); +    const std::string RDO_TRACK_PREFIX("radio_sky"); +} +//========================================================================= + +LLFloaterTrackPicker::LLFloaterTrackPicker(LLView * owner, const LLSD ¶ms) : +    LLFloater(params), +    mContextConeOpacity(0.0f), +    mOwnerHandle() +{ +    mOwnerHandle = owner->getHandle(); +    buildFromFile(FLOATER_DEFINITION_XML); +} + +LLFloaterTrackPicker::~LLFloaterTrackPicker() +{ +} + +BOOL LLFloaterTrackPicker::postBuild() +{ +    childSetAction(BTN_CANCEL, [this](LLUICtrl*, const LLSD& param){ onButtonCancel(); }); +    childSetAction(BTN_SELECT, [this](LLUICtrl*, const LLSD& param){ onButtonSelect(); }); +    return TRUE; +} + +void LLFloaterTrackPicker::onClose(bool app_quitting) +{ +    if (app_quitting) +        return; + +    LLView *owner = mOwnerHandle.get(); +    if (owner) +    { +        owner->setFocus(TRUE); +    } +} + +void LLFloaterTrackPicker::showPicker(const LLSD &args) +{ +    LLSD::array_const_iterator iter; +    LLSD::array_const_iterator end = args.endArray(); + +    for (iter = args.beginArray(); iter != end; ++iter) +    { +        S32 track_id = (*iter)["id"].asInteger(); +        bool can_enable = (*iter)["enabled"].asBoolean(); +        LLView *view = getChild<LLCheckBoxCtrl>(RDO_TRACK_PREFIX + llformat("%d", track_id), true); +        view->setEnabled(can_enable); +        view->setLabelArg("[ALT]", (*iter).has("altitude") ? ((*iter)["altitude"].asString() + "m") : " "); +    } + +    openFloater(getKey()); +    setFocus(TRUE); +} + +void LLFloaterTrackPicker::draw() +{ +    LLView *owner = mOwnerHandle.get(); +    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f); +    drawConeToOwner(mContextConeOpacity, max_opacity, owner); + +    LLFloater::draw(); +} + +void LLFloaterTrackPicker::onButtonCancel() +{ +    closeFloater(); +} + +void LLFloaterTrackPicker::onButtonSelect() +{ +    if (mCommitSignal) +    { +        (*mCommitSignal)(this, getChild<LLRadioGroup>(RDO_TRACK_SELECTION, true)->getSelectedValue()); +    } +    closeFloater(); +} + +void LLFloaterTrackPicker::onFocusLost() +{ +    if (isInVisibleChain()) +    { +        closeFloater(); +    } +} diff --git a/indra/newview/lltrackpicker.h b/indra/newview/lltrackpicker.h new file mode 100644 index 0000000000..dab3b72915 --- /dev/null +++ b/indra/newview/lltrackpicker.h @@ -0,0 +1,58 @@ +/**  + * @file lltrackpicker.h + * @author AndreyK Productengine + * @brief LLTrackPicker class header file including related functions + * + * $LicenseInfo:firstyear=2018&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2018, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_TRACKPICKER_H +#define LL_TRACKPICKER_H + +#include "llfloater.h" + + +//========================================================================= + +class LLFloaterTrackPicker : public LLFloater +{ +public: +    LLFloaterTrackPicker(LLView * owner, const LLSD ¶ms = LLSD()); +    virtual ~LLFloaterTrackPicker() override; + +    virtual BOOL postBuild() override; +    virtual void onClose(bool app_quitting) override; +    void         showPicker(const LLSD &args); + +    virtual void            draw() override; + +    void         onButtonCancel(); +    void         onButtonSelect(); + +private: +    void                    onFocusLost() override; + +    F32              mContextConeOpacity; +    LLHandle<LLView> mOwnerHandle; +}; + +#endif  // LL_TRACKPICKER_H diff --git a/indra/newview/skins/default/xui/en/floater_pick_track.xml b/indra/newview/skins/default/xui/en/floater_pick_track.xml new file mode 100644 index 0000000000..d8a9877be2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_pick_track.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + +<floater +        legacy_header_height="0" +        can_minimize="false" +        can_resize="true" +        height="140" +        layout="topleft" +        min_height="140" +        min_width="225" +        name="track picker" +        help_topic="track_picker" +        title="PICK: TRACK" +        width="225"> +    <layout_stack name="adjuster" +            follows="all" +            animate="false" +            top="0" +            left="6" +            right="-6" +            bottom="-10" +            orientation="vertical"> +        <layout_panel name="pnl_desc" +                border="false" +                auto_resize="false" +                user_resize="false" +                height="11" +                min_height="10" +                bg_alpha_color="blue" +                background_visible="false"> +            <text +                type="string" +                length="1" +                follows="left|top" +                height="10" +                layout="topleft" +                left="5" +                name="select_description" +                mouse_opaque="false" +                top="0" +                width="300"> +                Select source sky: +            </text> +        </layout_panel> +        <layout_panel name="pnl_traks" +                border="false" +                auto_resize="true" +                user_resize="false" +                height="29" +                min_height="29" +                bg_alpha_color="blue" +                background_visible="false"> +            <radio_group +                follows="all" +                height="60" +                layout="topleft" +                top="0" +                left="3" +                right="-3" +                bottom="-3" +                name="track_selection" +                width="100"> +                <radio_item +                    height="20" +                    label="Sky4 [ALT]" +                    layout="topleft" +                    left="0" +                    name="radio_sky4" +                    value="4" +                    top="0" +                    width="90" /> +                <radio_item +                    height="20" +                    label="Sky3 [ALT]" +                    layout="topleft" +                    left="0" +                    name="radio_sky3" +                    value="3" +                    top_delta="20" +                    width="90" /> +                <radio_item +                    height="20" +                    label="Sky2 [ALT]" +                    layout="topleft" +                    left="0" +                    name="radio_sky2" +                    value="2" +                    top_delta="20" +                    width="90" /> +                <radio_item +                    height="20" +                    label="Ground" +                    layout="topleft" +                    left="0" +                    name="radio_sky1" +                    value="1" +                    top_delta="20" +                    width="90" /> +            </radio_group> +        </layout_panel> +        <layout_panel name="pnl_ok_cancel" +                border="false" +                auto_resize="false" +                user_resize="false" +                height="29" +                min_height="29"> +            <button +                    follows="top|left" +                    height="20" +                    label="OK" +                    label_selected="OK" +                    layout="topleft" +                    left="2" +                    top="2" +                    name="btn_select" +                    width="100" /> +            <button +                    follows="top|left" +                    height="20" +                    label="Cancel" +                    label_selected="Cancel" +                    layout="topleft" +                    left_delta="110" +                    top_delta="0" +                    name="btn_cancel" +                    width="100" /> +        </layout_panel> +    </layout_stack> +</floater> | 
