diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llbutton.cpp | 24 | ||||
| -rw-r--r-- | indra/llui/llbutton.h | 13 | ||||
| -rw-r--r-- | indra/llui/llfloaterreg.cpp | 23 | ||||
| -rw-r--r-- | indra/llui/llfloaterreg.h | 1 | ||||
| -rw-r--r-- | indra/llui/lltoolbar.cpp | 89 | ||||
| -rw-r--r-- | indra/llui/lltoolbar.h | 12 | ||||
| -rw-r--r-- | indra/llui/llui.cpp | 1 | 
7 files changed, 142 insertions, 21 deletions
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index f259e8027e..c9ee62296f 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -83,7 +83,6 @@ LLButton::Params::Params()  	label_color_selected("label_color_selected"),	// requires is_toggle true  	label_color_disabled("label_color_disabled"),  	label_color_disabled_selected("label_color_disabled_selected"), -	highlight_color("highlight_color"),  	image_color("image_color"),  	image_color_disabled("image_color_disabled"),  	image_overlay_color("image_overlay_color", LLColor4::white), @@ -99,10 +98,13 @@ LLButton::Params::Params()  	scale_image("scale_image", true),  	hover_glow_amount("hover_glow_amount"),  	commit_on_return("commit_on_return", true), +	display_pressed_state("display_pressed_state", true),  	use_draw_context_alpha("use_draw_context_alpha", true),  	badge("badge"),  	handle_right_mouse("handle_right_mouse"), -	held_down_delay("held_down_delay") +	held_down_delay("held_down_delay"), +	button_flash_count("button_flash_count"), +	button_flash_rate("button_flash_rate")  {  	addSynonym(is_toggle, "toggle");  	changeDefault(initial_value, LLSD(false)); @@ -136,7 +138,6 @@ LLButton::LLButton(const LLButton::Params& p)  	mSelectedLabelColor(p.label_color_selected()),  	mDisabledLabelColor(p.label_color_disabled()),  	mDisabledSelectedLabelColor(p.label_color_disabled_selected()), -	mHighlightColor(p.highlight_color()),  	mImageColor(p.image_color()),  	mFlashBgColor(p.flash_color()),  	mDisabledImageColor(p.image_color_disabled()), @@ -159,12 +160,15 @@ LLButton::LLButton(const LLButton::Params& p)  	mCommitOnReturn(p.commit_on_return),  	mFadeWhenDisabled(FALSE),  	mForcePressedState(false), +	mDisplayPressedState(p.display_pressed_state),  	mLastDrawCharsCount(0),  	mMouseDownSignal(NULL),  	mMouseUpSignal(NULL),  	mHeldDownSignal(NULL),  	mUseDrawContextAlpha(p.use_draw_context_alpha), -	mHandleRightMouse(p.handle_right_mouse) +	mHandleRightMouse(p.handle_right_mouse), +	mButtonFlashCount(p.button_flash_count), +	mButtonFlashRate(p.button_flash_rate)  {  	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);  	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>()); @@ -570,15 +574,13 @@ void LLButton::draw()  {  	F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency();  	bool flash = FALSE; -	static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0); -	static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0);  	if( mFlashing )  	{  		F32 elapsed = mFlashingTimer.getElapsedTimeF32(); -		S32 flash_count = S32(elapsed * button_flash_rate * 2.f); +		S32 flash_count = S32(elapsed * mButtonFlashRate * 2.f);  		// flash on or off? -		flash = (flash_count % 2 == 0) || flash_count > S32((F32)button_flash_count * 2.f); +		flash = (flash_count % 2 == 0) || flash_count > S32((F32)mButtonFlashCount * 2.f);  	}  	bool pressed_by_keyboard = FALSE; @@ -607,7 +609,7 @@ void LLButton::draw()  	LLColor4 glow_color = LLColor4::white;  	LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA;  	LLUIImage* imagep = NULL; -	if (pressed) +	if (pressed && mDisplayPressedState)  	{  		imagep = selected ? mImagePressedSelected : mImagePressed;  	} @@ -800,7 +802,7 @@ void LLButton::draw()  		S32 center_y = getLocalRect().getCenterY();  		//FUGLY HACK FOR "DEPRESSED" BUTTONS -		if (pressed) +		if (pressed && mDisplayPressedState)  		{  			center_y--;  			center_x++; @@ -873,7 +875,7 @@ void LLButton::draw()  		S32 y_offset = 2 + (getRect().getHeight() - 20)/2; -		if (pressed) +		if (pressed && mDisplayPressedState)  		{  			y_offset--;  			x++; diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 08b45e01b3..14c1d01c7e 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -91,7 +91,6 @@ public:  								label_color_selected,  								label_color_disabled,  								label_color_disabled_selected, -								highlight_color,  								image_color,  								image_color_disabled,  								image_overlay_color, @@ -120,7 +119,8 @@ public:  		// misc  		Optional<bool>			is_toggle,  								scale_image, -								commit_on_return; +								commit_on_return, +								display_pressed_state;  		Optional<F32>				hover_glow_amount;  		Optional<TimeIntervalParam>	held_down_delay; @@ -131,6 +131,9 @@ public:  		Optional<bool>				handle_right_mouse; +		Optional<S32>				button_flash_count; +		Optional<F32>				button_flash_rate; +  		Params();  	}; @@ -273,6 +276,9 @@ protected:  	void getOverlayImageSize(S32& overlay_width, S32& overlay_height);  	LLFrameTimer	mMouseDownTimer; +	bool			mNeedsHighlight; +	S32				mButtonFlashCount; +	F32				mButtonFlashRate;  private:  	void			drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size); @@ -322,7 +328,6 @@ private:  	   flash icon name is set in attributes(by default it isn't). First way is used otherwise. */  	LLPointer<LLUIImage>		mImageFlash; -	LLUIColor					mHighlightColor;  	LLUIColor					mFlashBgColor;  	LLUIColor					mImageColor; @@ -355,10 +360,10 @@ private:  	F32							mHoverGlowStrength;  	F32							mCurGlowStrength; -	bool						mNeedsHighlight;  	bool						mCommitOnReturn;  	bool						mFadeWhenDisabled;  	bool						mForcePressedState; +	bool						mDisplayPressedState;  	LLFrameTimer				mFlashingTimer; diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 27e96856b3..d0ae9413a3 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -478,6 +478,7 @@ void LLFloaterReg::toggleToolbarFloaterInstance(const LLSD& sdname)  	if (LLFloater::isMinimized(instance))  	{  		instance->setMinimized(FALSE); +		instance->setFocus(TRUE);  	}  	else if (!LLFloater::isShown(instance))  	{ @@ -494,6 +495,28 @@ void LLFloaterReg::toggleToolbarFloaterInstance(const LLSD& sdname)  }  //static +bool LLFloaterReg::floaterInstanceOpen(const LLSD& sdname) +{ +	LLSD key; +	std::string name = sdname.asString(); +	parse_name_key(name, key); + +	bool visible_or_minimized = instanceVisible(name, key); + +	if (!visible_or_minimized) +	{ +		LLFloater* instance = findInstance(name, key);  + +		if (instance != NULL) +		{ +			visible_or_minimized = LLFloater::isMinimized(instance); +		} +	} + +	return visible_or_minimized; +} + +//static  bool LLFloaterReg::floaterInstanceVisible(const LLSD& sdname)  {  	LLSD key; diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 6239d98a7d..07ae45cc4c 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -128,6 +128,7 @@ public:  	static void hideFloaterInstance(const LLSD& sdname);  	static void toggleFloaterInstance(const LLSD& sdname);  	static void toggleToolbarFloaterInstance(const LLSD& sdname); +	static bool floaterInstanceOpen(const LLSD& sdname);  	static bool floaterInstanceVisible(const LLSD& sdname);  	static bool floaterInstanceMinimized(const LLSD& sdname); diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index a544aa9ec7..0ec2eefc19 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -471,7 +471,33 @@ void LLToolBar::updateLayoutAsNeeded()  void LLToolBar::draw()  { -	if (mButtons.empty()) return; +	if (mButtons.empty()) +	{ +		return; +	} + +	// Update enable/disable state and highlight state for editable toolbars +	if (!mReadOnly) +	{ +		for (toolbar_button_list::iterator btn_it = mButtons.begin(); btn_it != mButtons.end(); ++btn_it) +		{ +			LLToolBarButton* btn = *btn_it; +			LLCommand* command = LLCommandManager::instance().getCommand(btn->mId); + +			if (command && btn->mIsEnabledSignal) +			{ +				const bool button_command_enabled = (*btn->mIsEnabledSignal)(btn, command->isEnabledParameters()); +				btn->setEnabled(button_command_enabled); +			} + +			if (command && btn->mIsRunningSignal) +			{ +				const bool button_command_running = (*btn->mIsRunningSignal)(btn, command->isRunningParameters()); +				btn->setFlashing(button_command_running); +			} +		} +	} +  	updateLayoutAsNeeded();  	// rect may have shifted during layout  	LLUI::popMatrix(); @@ -527,14 +553,47 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)  		LLUICtrl::CommitCallbackParam cbParam;  		cbParam.function_name = commandp->executeFunctionName();  		cbParam.parameter = commandp->executeParameters(); +  		button->setCommitCallback(cbParam);  		button->setStartDragCallback(mStartDragItemCallback);  		button->setHandleDragCallback(mHandleDragItemCallback); + +		const std::string& isEnabledFunction = commandp->isEnabledFunctionName(); +		if (isEnabledFunction.length() > 0) +		{ +			LLUICtrl::EnableCallbackParam isEnabledParam; +			isEnabledParam.function_name = isEnabledFunction; +			isEnabledParam.parameter = commandp->isEnabledParameters(); +			enable_signal_t::slot_type isEnabledCB = initEnableCallback(isEnabledParam); + +			if (NULL == button->mIsEnabledSignal) +			{ +				button->mIsEnabledSignal = new enable_signal_t(); +			} + +			button->mIsEnabledSignal->connect(isEnabledCB); +		} + +		const std::string& isRunningFunction = commandp->isRunningFunctionName(); +		if (isRunningFunction.length() > 0) +		{ +			LLUICtrl::EnableCallbackParam isRunningParam; +			isRunningParam.function_name = isRunningFunction; +			isRunningParam.parameter = commandp->isRunningParameters(); +			enable_signal_t::slot_type isRunningCB = initEnableCallback(isRunningParam); + +			if (NULL == button->mIsRunningSignal) +			{ +				button->mIsRunningSignal = new enable_signal_t(); +			} + +			button->mIsRunningSignal->connect(isRunningCB); +		}  	}  	button->setCommandId(id); -	return button; +	return button;  }  BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, @@ -568,9 +627,22 @@ LLToolBarButton::LLToolBarButton(const Params& p)  	mMouseDownY(0),  	mWidthRange(p.button_width),  	mDesiredHeight(p.desired_height), -	mId("") +	mId(""), +	mIsEnabledSignal(NULL), +	mIsRunningSignal(NULL), +	mIsStartingSignal(NULL)  {  	mUUID = LLUUID::generateNewID(p.name); + +	mButtonFlashRate = 0.0; +	mButtonFlashCount = 0; +} + +LLToolBarButton::~LLToolBarButton() +{ +	delete mIsEnabledSignal; +	delete mIsRunningSignal; +	delete mIsStartingSignal;  }  BOOL LLToolBarButton::handleMouseDown(S32 x, S32 y, MASK mask) @@ -594,10 +666,10 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)  			handled = TRUE;  		}  		else  -			{ +		{  			handled = mHandleDragItemCallback(x,y,mUUID,LLAssetType::AT_WIDGET); -			}  		} +	}  	else  	{  		handled = LLButton::handleHover(x, y, mask); @@ -605,3 +677,10 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)  	return handled;  } +void LLToolBarButton::onMouseEnter(S32 x, S32 y, MASK mask) +{ +	LLUICtrl::onMouseEnter(x, y, mask); + +	// Always highlight toolbar buttons, even if they are disabled +	mNeedsHighlight = TRUE; +} diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 3c317e10a2..b649ab28ff 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -56,6 +56,7 @@ public:  	};  	LLToolBarButton(const Params& p); +	~LLToolBarButton();  	BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	BOOL handleHover(S32 x, S32 y, MASK mask); @@ -63,6 +64,9 @@ public:  	void setStartDragCallback(startdrag_callback_t cb) { mStartDragItemCallback = cb; }  	void setHandleDragCallback(handledrag_callback_t cb) { mHandleDragItemCallback = cb; } + +	void onMouseEnter(S32 x, S32 y, MASK mask); +  private:  	LLCommandId		mId;  	S32				mMouseDownX; @@ -73,6 +77,10 @@ private:  	startdrag_callback_t		mStartDragItemCallback;  	handledrag_callback_t		mHandleDragItemCallback;  	LLUUID						mUUID; + +	enable_signal_t*	mIsEnabledSignal; +	enable_signal_t*	mIsRunningSignal; +	enable_signal_t*	mIsStartingSignal;  }; @@ -153,6 +161,7 @@ public:  	bool addCommand(const LLCommandId& commandId);  	bool hasCommand(const LLCommandId& commandId) const;  	bool enableCommand(const LLCommandId& commandId, bool enabled); +  	void setStartDragCallback(startdrag_callback_t cb) { mStartDragItemCallback = cb; }  	void setHandleDragCallback(handledrag_callback_t cb) { mHandleDragItemCallback = cb; }  	void setHandleDropCallback(handledrop_callback_t cb) { mHandleDropCallback = cb; } @@ -188,7 +197,8 @@ private:  	LLUUID							mUUID;  	const bool						mReadOnly; -	std::list<LLToolBarButton*>		mButtons; +	typedef std::list<LLToolBarButton*> toolbar_button_list; +	toolbar_button_list				mButtons;  	command_id_list_t				mButtonCommands;  	typedef std::map<LLCommandId, LLToolBarButton*> command_id_map;  	command_id_map					mButtonMap; diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 76a12e649b..9c0253f074 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1637,6 +1637,7 @@ void LLUI::initClass(const settings_map_t& settings,  	// Used by menus along with Floater.Toggle to display visibility as a checkmark  	LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2)); +	LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.IsOpen", boost::bind(&LLFloaterReg::floaterInstanceOpen, _2));  	// Parse the master list of commands  	LLCommandManager::load();  | 
