summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui')
-rw-r--r--indra/llui/llbutton.cpp24
-rw-r--r--indra/llui/llbutton.h13
-rw-r--r--indra/llui/llfloaterreg.cpp23
-rw-r--r--indra/llui/llfloaterreg.h1
-rw-r--r--indra/llui/lltoolbar.cpp89
-rw-r--r--indra/llui/lltoolbar.h12
-rw-r--r--indra/llui/llui.cpp1
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();