diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index c8ec607f7851e9ec29ac9058198727c63ab12320..c8af7447dd40a6347bd55f543cc84edc822eaf97 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -77,6 +77,7 @@ LLButton::Params::Params() image_pressed_selected("image_pressed_selected"), image_overlay("image_overlay"), image_overlay_alignment("image_overlay_alignment", std::string("center")), + image_overlay_enable("image_overlay_enable", true), image_top_pad("image_top_pad"), image_bottom_pad("image_bottom_pad"), imgoverlay_label_space("imgoverlay_label_space", 1), @@ -129,6 +130,7 @@ LLButton::LLButton(const LLButton::Params& p) mGLFont(p.font), mHeldDownDelay(p.held_down_delay.seconds), // seconds until held-down callback is called mHeldDownFrameDelay(p.held_down_delay.frames), + mImageOverlayEnable(p.image_overlay_enable), mImageUnselected(p.image_unselected), mImageSelected(p.image_selected), mImageDisabled(p.image_disabled), @@ -847,7 +849,7 @@ void LLButton::draw() S32 text_width = getRect().getWidth() - mLeftHPad - mRightHPad; // draw overlay image - if (mImageOverlay.notNull()) + if (mImageOverlayEnable && mImageOverlay.notNull()) { // get max width and height (discard level 0) S32 overlay_width; diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 7629ed1fea8d01865ef8a8abbc564252b8551fa0..e5bccfe725093214c222d705832a33929afd1429 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -87,7 +87,8 @@ class LLButton image_overlay; Optional<std::string> image_overlay_alignment; - + Optional<bool> image_overlay_enable; + // colors Optional<LLUIColor> label_color, label_color_selected, @@ -307,6 +308,7 @@ class LLButton S32 mHeldDownFrameDelay; // frames, after which held-down callbacks get called S32 mLastDrawCharsCount; + bool mImageOverlayEnable; LLPointer<LLUIImage> mImageOverlay; LLFontGL::HAlign mImageOverlayAlignment; LLUIColor mImageOverlayColor; diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 89a33b7b6728c8f4313393256ec5dd9e466cd0f5..57316e9138de57e7153e56e52c6c3455afa2c59e 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -27,7 +27,6 @@ #include "linden_common.h" -#include <boost/foreach.hpp> #include "lltoolbar.h" #include "llcommandmanager.h" @@ -64,6 +63,8 @@ namespace LLInitParam { declare("icons_with_text", BTNTYPE_ICONS_WITH_TEXT); declare("icons_only", BTNTYPE_ICONS_ONLY); + declare("icons_only_small", BTNTYPE_ICONS_ONLY_SMALL); + declare("text_only", BTNTYPE_TEXT_ONLY); } void TypeValues<SideType>::declareValues() @@ -73,14 +74,24 @@ namespace LLInitParam declare("right", SIDE_RIGHT); declare("top", SIDE_TOP); } + + void TypeValues<LayoutType>::declareValues() + { + declare("none", LAYOUT_NONE); + declare("left", LAYOUT_LEFT); + declare("right", LAYOUT_RIGHT); + declare("fill", LAYOUT_FILL); + } } LLToolBar::Params::Params() : button_display_mode("button_display_mode"), - commands("command"), side("side", SIDE_TOP), + button_layout_mode("button_layout_mode", LLToolBarEnums::LAYOUT_NONE), button_icon("button_icon"), + button_icon_small("button_icon_small"), button_icon_and_text("button_icon_and_text"), + button_text("button_text"), read_only("read_only", false), wrap("wrap", true), pad_left("pad_left"), @@ -89,40 +100,48 @@ LLToolBar::Params::Params() pad_bottom("pad_bottom"), pad_between("pad_between"), min_girth("min_girth"), + commands("command"), button_panel("button_panel") {} LLToolBar::LLToolBar(const LLToolBar::Params& p) : LLUICtrl(p), mReadOnly(p.read_only), - mButtonType(p.button_display_mode), mSideType(p.side), mWrap(p.wrap), - mNeedsLayout(false), - mModified(false), - mButtonPanel(NULL), - mCenteringStack(NULL), mPadLeft(p.pad_left), mPadRight(p.pad_right), mPadTop(p.pad_top), mPadBottom(p.pad_bottom), mPadBetween(p.pad_between), mMinGirth(p.min_girth), - mPopupMenuHandle(), - mRightMouseTargetButton(NULL), mStartDragItemCallback(NULL), mHandleDragItemCallback(NULL), mHandleDropCallback(NULL), + mDragAndDropTarget(false), + mDragRank(0), + mDragx(0), + mDragy(0), + mDragGirth(0), + mButtonType(p.button_display_mode), + mLayoutType(p.button_layout_mode), + mCenteringStack(nullptr), + mCenterPanel(nullptr), + mButtonPanel(nullptr), + mPopupMenuHandle(), + mRightMouseTargetButton(nullptr), + mNeedsLayout(false), + mModified(false), mButtonAddSignal(NULL), mButtonEnterSignal(NULL), mButtonLeaveSignal(NULL), mButtonRemoveSignal(NULL), - mDragAndDropTarget(false), - mCaretIcon(NULL), - mCenterPanel(NULL) + mCaretIcon(nullptr) { mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text; mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon; + mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY_SMALL] = p.button_icon_small; + mButtonParams[LLToolBarEnums::BTNTYPE_TEXT_ONLY] = p.button_text; } LLToolBar::~LLToolBar() @@ -146,12 +165,15 @@ void LLToolBar::createContextMenu() // Setup bindings specific to this instance for the context menu options LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg; - commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2)); + commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onButtonTypeChanged, this, _2)); + commit_reg.add("Toolbars.ChangeLayout", boost::bind(&LLToolBar::onLayoutChanged, this, _2)); commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this)); LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg; - enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2)); - + enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isButtonTypeChecked, this, _2)); + enable_reg.add("Toolbars.CheckLayout", boost::bind(&LLToolBar::isLayoutChecked, this, _2)); + enable_reg.add("Toolbars.CheckOrientation", boost::bind(&LLToolBar::checkOrientation, this, _2)); + // Create the context menu llassert(LLMenuGL::sMenuContainer != NULL); LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance()); @@ -193,13 +215,14 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p) addChild(mCenteringStack); LLLayoutPanel::Params border_panel_p; - border_panel_p.name = "border_panel"; + border_panel_p.name = "border_panel_left_top"; border_panel_p.rect = getLocalRect(); border_panel_p.auto_resize = true; border_panel_p.user_resize = false; border_panel_p.mouse_opaque = false; - mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p)); + mLeftTopPanel = LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p); + mCenteringStack->addChild(mLeftTopPanel); LLLayoutPanel::Params center_panel_p; center_panel_p.name = "center_panel"; @@ -217,9 +240,11 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p) mCenterPanel->setButtonPanel(mButtonPanel); mCenterPanel->addChild(mButtonPanel); - mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p)); + border_panel_p.name = "border_panel_right_bottom"; + mRightBottomPanel = LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p); + mCenteringStack->addChild(mRightBottomPanel); - BOOST_FOREACH(LLCommandId id, p.commands) + for (LLCommandId id : p.commands) { addCommand(id); } @@ -417,7 +442,7 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask) // Determine which button the mouse was over during the click in case the context menu action // is intended to affect the button. mRightMouseTargetButton = NULL; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + for (LLToolBarButton* button : mButtons) { LLRect button_rect; button->localRectToOtherView(button->getLocalRect(), &button_rect, this); @@ -444,7 +469,7 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask) return handle_it_here; } -BOOL LLToolBar::isSettingChecked(const LLSD& userdata) +BOOL LLToolBar::isButtonTypeChecked(const LLSD& userdata) { BOOL retval = FALSE; @@ -458,11 +483,19 @@ BOOL LLToolBar::isSettingChecked(const LLSD& userdata) { retval = (mButtonType == BTNTYPE_ICONS_ONLY); } + else if (setting_name == "icons_only_small") + { + retval = (mButtonType == BTNTYPE_ICONS_ONLY_SMALL); + } + else if (setting_name == "text_only") + { + retval = (mButtonType == BTNTYPE_TEXT_ONLY); + } return retval; } -void LLToolBar::onSettingEnable(const LLSD& userdata) +void LLToolBar::onButtonTypeChanged(const LLSD& userdata) { llassert(!mReadOnly); @@ -476,6 +509,81 @@ void LLToolBar::onSettingEnable(const LLSD& userdata) { setButtonType(BTNTYPE_ICONS_ONLY); } + else if (setting_name == "icons_only_small") + { + setButtonType(BTNTYPE_ICONS_ONLY_SMALL); + } + else if (setting_name == "text_only") + { + setButtonType(BTNTYPE_TEXT_ONLY); + } +} + +BOOL LLToolBar::isLayoutChecked(const LLSD& userdata) +{ + BOOL retval = FALSE; + + const std::string& layout_name = userdata.asString(); + + if (layout_name == "fill") + { + retval = (mLayoutType == LAYOUT_FILL); + } + else if (layout_name == "left") + { + retval = (mLayoutType == LAYOUT_LEFT); + } + else if (layout_name == "right") + { + retval = (mLayoutType == LAYOUT_RIGHT); + } + else if (layout_name == "none") + { + retval = (mLayoutType == LAYOUT_NONE); + } + + return retval; +} + +BOOL LLToolBar::checkOrientation(const LLSD& userdata) const +{ + switch (getOrientation(mSideType)) + { + case LLLayoutStack::HORIZONTAL: + return userdata.asString() == "horizontal"; + case LLLayoutStack::VERTICAL: + return userdata.asString() == "vertical"; + default: + return FALSE; + } +} + +void LLToolBar::onLayoutChanged(const LLSD& userdata) +{ + llassert(!mReadOnly); + + const std::string& layout_name = userdata.asString(); + + if (layout_name == "fill") + { + setLayoutType(LAYOUT_FILL); + } + else if (layout_name == "left") + { + setLayoutType(LAYOUT_LEFT); + } + else if (layout_name == "right") + { + setLayoutType(LAYOUT_RIGHT); + } + else if (layout_name == "none") + { + setLayoutType(LAYOUT_NONE); + } + else + { + LL_WARNS("Toolbar") << "Unrecognized layout '" << layout_name << "'" << LL_ENDL; + } } void LLToolBar::onRemoveSelectedCommand() @@ -502,10 +610,16 @@ void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type) } } +void LLToolBar::setLayoutType(LLToolBarEnums::LayoutType layout_type) +{ + mLayoutType = layout_type; + mNeedsLayout = true; +} + void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth) { // make buttons in current row all same girth - BOOST_FOREACH(LLToolBarButton* button, buttons_in_row) + for (LLToolBarButton* button : buttons_in_row) { if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL) { @@ -692,13 +806,47 @@ void LLToolBar::updateLayoutAsNeeded() LLRect panel_rect = mButtonPanel->getLocalRect(); std::vector<LLToolBarButton*> buttons_in_row; + S32 equalized_width = 0; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + switch (mLayoutType) + { + case LLToolBarEnums::LAYOUT_FILL: + if (!mButtons.empty()) + { + equalized_width = (max_length - mPadBetween * (mButtons.size() + 1)) / mButtons.size(); + } + break; + case LLToolBarEnums::LAYOUT_LEFT: + mLeftTopPanel->setVisible(false); + mRightBottomPanel->setVisible(true); + break; + case LLToolBarEnums::LAYOUT_RIGHT: + mLeftTopPanel->setVisible(true); + mRightBottomPanel->setVisible(false); + break; + case LLToolBarEnums::LAYOUT_NONE: + mLeftTopPanel->setVisible(true); + mRightBottomPanel->setVisible(true); + break; + } + + for (LLToolBarButton* button : mButtons) { - button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight); + if (equalized_width) + { + button->mWidthRange.setRange(button->mWidthRange.getMin(), equalized_width); + button->reshape(equalized_width, button->mDesiredHeight); + } + else + { + button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight); + } button->autoResize(); - S32 button_clamped_width = button->mWidthRange.clamp(button->getRect().getWidth()); + S32 button_clamped_width = equalized_width ? equalized_width + : button->mWidthRange.clamp(button->getRect().getWidth()); + + S32 button_length = (orientation == LLLayoutStack::HORIZONTAL) ? button_clamped_width : button->getRect().getHeight(); @@ -707,8 +855,8 @@ void LLToolBar::updateLayoutAsNeeded() : button_clamped_width; // wrap if needed - if (mWrap - && row_running_length + button_length > max_length // out of room... + if (mWrap && mLayoutType != LAYOUT_FILL // if we aren't trying to fill the bar + && row_running_length + button_length > max_length // ...and out of room... && cur_start != row_pad_start) // ...and not first button in row { if (orientation == LLLayoutStack::VERTICAL) @@ -753,7 +901,10 @@ void LLToolBar::updateLayoutAsNeeded() max_row_length = llmax(max_row_length, row_running_length - mPadBetween + row_pad_end); - resizeButtonsInRow(buttons_in_row, max_row_girth); + if (equalized_width == 0) + { + resizeButtonsInRow(buttons_in_row, max_row_girth); + } // grow and optionally shift toolbar to accommodate buttons if (orientation == LLLayoutStack::HORIZONTAL) @@ -878,7 +1029,7 @@ void LLToolBar::createButtons() { std::set<LLUUID> set_flashing; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + for (LLToolBarButton* button : mButtons) { if (button->getFlashTimer() && button->getFlashTimer()->isFlashingInProgress()) { @@ -896,7 +1047,7 @@ void LLToolBar::createButtons() mButtonMap.clear(); mRightMouseTargetButton = NULL; - BOOST_FOREACH(LLCommandId& command_id, mButtonCommands) + for (LLCommandId& command_id : mButtonCommands) { LLToolBarButton* button = createButton(command_id); mButtons.push_back(button); diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 6ba3c662d414d40356f25f973f0a77933a0b6645..1b218e2f141d22d8ca60d3b94b5ec91613618a6d 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -43,7 +43,7 @@ typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_start typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t; typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t; -class LLToolBarButton : public LLButton +class LLToolBarButton final : public LLButton { friend class LLToolBar; public: @@ -113,6 +113,8 @@ namespace LLToolBarEnums { BTNTYPE_ICONS_WITH_TEXT = 0, BTNTYPE_ICONS_ONLY, + BTNTYPE_ICONS_ONLY_SMALL, + BTNTYPE_TEXT_ONLY, BTNTYPE_COUNT }; @@ -124,6 +126,14 @@ namespace LLToolBarEnums SIDE_RIGHT, SIDE_TOP, }; + + enum LayoutType + { + LAYOUT_NONE, + LAYOUT_LEFT, + LAYOUT_RIGHT, + LAYOUT_FILL + }; enum EToolBarLocation { @@ -156,10 +166,16 @@ namespace LLInitParam { static void declareValues(); }; + + template<> + struct TypeValues<LLToolBarEnums::LayoutType> : public TypeValuesHelper<LLToolBarEnums::LayoutType> + { + static void declareValues(); + }; } -class LLToolBar +class LLToolBar final : public LLUICtrl { friend class LLToolBarButton; @@ -171,7 +187,7 @@ class LLToolBar typedef boost::function<void(LLToolBarEnums::EToolBarLocation tb, const LLRect& rect)> reshape_callback_t; virtual ~LLCenterLayoutPanel() {} - /*virtual*/ void handleReshape(const LLRect& rect, bool by_user); + /*virtual*/ void handleReshape(const LLRect& rect, bool by_user) override; void setLocationId(LLToolBarEnums::EToolBarLocation id) { mLocationId = id; } void setReshapeCallback(reshape_callback_t cb) { mReshapeCallback = cb; } @@ -179,7 +195,7 @@ class LLToolBar protected: friend class LLUICtrlFactory; - LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mButtonPanel(NULL) {} + LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mLocationId(LLToolBarEnums::TOOLBAR_NONE), mButtonPanel(nullptr) {} private: reshape_callback_t mReshapeCallback; @@ -191,10 +207,14 @@ class LLToolBar { Mandatory<LLToolBarEnums::ButtonType> button_display_mode; Mandatory<LLToolBarEnums::SideType> side; + + Optional<LLToolBarEnums::LayoutType> button_layout_mode; Optional<LLToolBarButton::Params> button_icon, - button_icon_and_text; - + button_icon_small, + button_icon_and_text, + button_text; + Optional<bool> read_only, wrap; @@ -214,14 +234,14 @@ class LLToolBar }; // virtuals - void draw(); - void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + void draw() override; + void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE) override; + BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, - std::string& tooltip_msg); + std::string& tooltip_msg) override; static const int RANK_NONE = -1; bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE); @@ -251,13 +271,16 @@ class LLToolBar LLToolBarEnums::SideType getSideType() const { return mSideType; } bool hasButtons() const { return !mButtons.empty(); } bool isModified() const { return mModified; } + BOOL checkOrientation(const LLSD& userdata) const; int getRankFromPosition(S32 x, S32 y); int getRankFromPosition(const LLCommandId& id); // Methods used in loading and saving toolbar settings void setButtonType(LLToolBarEnums::ButtonType button_type); - LLToolBarEnums::ButtonType getButtonType() { return mButtonType; } + void setLayoutType(LLToolBarEnums::LayoutType layout_type); + LLToolBarEnums::ButtonType getButtonType() const { return mButtonType; } + LLToolBarEnums::LayoutType getLayoutType() const { return mLayoutType; } command_id_list_t& getCommandsList() { return mButtonCommands; } void clearCommandsList(); @@ -271,8 +294,10 @@ class LLToolBar void updateLayoutAsNeeded(); void createButtons(); void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth); - BOOL isSettingChecked(const LLSD& userdata); - void onSettingEnable(const LLSD& userdata); + BOOL isButtonTypeChecked(const LLSD& userdata); + void onButtonTypeChanged(const LLSD& userdata); + BOOL isLayoutChecked(const LLSD& userdata); + void onLayoutChanged(const LLSD& userdata); void onRemoveSelectedCommand(); private: @@ -304,10 +329,13 @@ class LLToolBar command_id_map mButtonMap; LLToolBarEnums::ButtonType mButtonType; + LLToolBarEnums::LayoutType mLayoutType; LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT]; // related widgets LLLayoutStack* mCenteringStack; + LLLayoutPanel* mLeftTopPanel; + LLLayoutPanel* mRightBottomPanel; LLCenterLayoutPanel* mCenterPanel; LLPanel* mButtonPanel; LLHandle<class LLContextMenu> mPopupMenuHandle; diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml index eec0d81e8b001a7e5ed3aaa4127b43d00866fa24..72531ba4a188f6d97fd75494961e556e382219c1 100644 --- a/indra/newview/app_settings/toolbars.xml +++ b/indra/newview/app_settings/toolbars.xml @@ -4,23 +4,21 @@ button_display_mode="icons_with_text"> <command name="chat"/> <command name="speak"/> - <command name="destinations"/> <command name="people"/> <command name="profile"/> <command name="move"/> <command name="view"/> - <command name="howto"/> + <command name="snapshot"/> </bottom_toolbar> <left_toolbar - button_display_mode="icons_only"> - <command name="avatar"/> + button_display_mode="icons_only_small"> <command name="appearance"/> <command name="inventory"/> <command name="search"/> <command name="places"/> - <command name="voice"/> <command name="minimap"/> - <command name="snapshot"/> + <command name="myenvironments"/> + <command name="stats"/> </left_toolbar> <right_toolbar button_display_mode="icons_only"> diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index e11f1bd00fae6a3e5df38307beeda33895d39502..9d14a548f9338394606f38554752c31aa86fa5f4 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -45,8 +45,6 @@ #include "llfloaterreg.h" // HACK for destinations guide on startup #include "llviewercontrol.h" // HACK for destinations guide on startup -#include <boost/foreach.hpp> - LLToolBarView* gToolBarView = NULL; static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view"); @@ -58,6 +56,7 @@ bool isToolDragged() LLToolBarView::Toolbar::Toolbar() : button_display_mode("button_display_mode"), + button_layout_mode("button_layout_mode"), commands("command") {} @@ -285,7 +284,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands) + if (toolbar_set.left_toolbar.button_layout_mode.isProvided()) + { + LLToolBarEnums::LayoutType layout_type = toolbar_set.left_toolbar.button_layout_mode; + mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setLayoutType(layout_type); + } + for (const LLCommandId::Params& command_params : toolbar_set.left_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT])) { @@ -300,7 +304,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands) + if (toolbar_set.right_toolbar.button_layout_mode.isProvided()) + { + LLToolBarEnums::LayoutType layout_type = toolbar_set.right_toolbar.button_layout_mode; + mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setLayoutType(layout_type); + } + for (const LLCommandId::Params& command_params : toolbar_set.right_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])) { @@ -315,7 +324,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands) + if (toolbar_set.bottom_toolbar.button_layout_mode.isProvided()) + { + LLToolBarEnums::LayoutType layout_type = toolbar_set.bottom_toolbar.button_layout_mode; + mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setLayoutType(layout_type); + } + for (const LLCommandId::Params& command_params : toolbar_set.bottom_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])) { @@ -330,11 +344,11 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.top_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setButtonType(button_type); } - //if (toolbar_set.top_toolbar.button_layout_mode.isProvided()) - //{ - // LLToolBarEnums::LayoutType layout_type = toolbar_set.top_toolbar.button_layout_mode; - // mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setLayoutType(layout_type); - //} + if (toolbar_set.top_toolbar.button_layout_mode.isProvided()) + { + LLToolBarEnums::LayoutType layout_type = toolbar_set.top_toolbar.button_layout_mode; + mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setLayoutType(layout_type); + } for (const LLCommandId::Params& command_params : toolbar_set.top_toolbar.commands) { if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_TOP])) @@ -404,22 +418,25 @@ void LLToolBarView::saveToolbars() const if (mToolbars[LLToolBarEnums::TOOLBAR_LEFT]) { toolbar_set.left_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getButtonType(); + toolbar_set.left_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getLayoutType(); addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar); } if (mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]) { toolbar_set.right_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getButtonType(); + toolbar_set.right_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getLayoutType(); addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar); } if (mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]) { toolbar_set.bottom_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getButtonType(); + toolbar_set.bottom_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getLayoutType(); addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar); } if (mToolbars[LLToolBarEnums::TOOLBAR_TOP]) { toolbar_set.top_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getButtonType(); - //toolbar_set.top_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getLayoutType(); + toolbar_set.top_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getLayoutType(); addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getCommandsList(), toolbar_set.top_toolbar); } @@ -433,7 +450,7 @@ void LLToolBarView::saveToolbars() const { const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml"); LLFILE *fp = LLFile::fopen(filename, "w"); - if (fp != NULL) + if (fp != nullptr) { LLXMLNode::writeHeaderToFile(fp); output_node->writeToFile(fp); diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index a4f7039011a43da5b950c1464a623cc2e0738696..77e4116950d8bfb6663462f9c7c81f6e4425ef4a 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -52,6 +52,7 @@ class LLToolBarView : public LLUICtrl struct Toolbar : public LLInitParam::Block<Toolbar> { Mandatory<LLToolBarEnums::ButtonType> button_display_mode; + Optional<LLToolBarEnums::LayoutType> button_layout_mode; Multiple<LLCommandId::Params> commands; Toolbar(); diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml index fbe40a7244fcc47d89f297d99be9549b7283198c..f6c816a5f70de833e266a4b907bd3c8af3a4a728 100644 --- a/indra/newview/skins/default/xui/en/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml @@ -32,4 +32,80 @@ <on_check function="Toolbars.CheckSetting" parameter="icons_only" /> </menu_item_check> + <menu_item_check label="Small Icons only" + layout="topleft" + name="icons_only_small"> + <on_click function="Toolbars.EnableSetting" + parameter="icons_only_small" /> + <on_check function="Toolbars.CheckSetting" + parameter="icons_only_small" /> + </menu_item_check> + <menu_item_check label="Text only" + layout="topleft" + name="text_only"> + <on_click function="Toolbars.EnableSetting" + parameter="text_only" /> + <on_check function="Toolbars.CheckSetting" + parameter="text_only" /> + </menu_item_check> + <menu_item_separator + name="layout_separator" /> + <menu_item_check label="Buttons auto-layout" + layout="topleft" + name="autolayout"> + <on_click function="Toolbars.ChangeLayout" + parameter="none" /> + <on_check function="Toolbars.CheckLayout" + parameter="none" /> + </menu_item_check> + <menu_item_check label="Buttons fill width" + layout="topleft" + name="filllayout"> + <on_click function="Toolbars.ChangeLayout" + parameter="fill" /> + <on_check function="Toolbars.CheckLayout" + parameter="fill" /> + <on_visible function="Toolbars.CheckOrientation" + parameter="horizontal" /> + </menu_item_check> + <menu_item_check label="Buttons left align" + layout="topleft" + name="left_align"> + <on_click function="Toolbars.ChangeLayout" + parameter="left" /> + <on_check function="Toolbars.CheckLayout" + parameter="left" /> + <on_visible function="Toolbars.CheckOrientation" + parameter="horizontal" /> + </menu_item_check> + <menu_item_check label="Buttons right align" + layout="topleft" + name="right_align"> + <on_click function="Toolbars.ChangeLayout" + parameter="right" /> + <on_check function="Toolbars.CheckLayout" + parameter="right" /> + <on_visible function="Toolbars.CheckOrientation" + parameter="horizontal" /> + </menu_item_check> + <menu_item_check label="Buttons top aligned" + layout="topleft" + name="top_align"> + <on_click function="Toolbars.ChangeLayout" + parameter="left" /> + <on_check function="Toolbars.CheckLayout" + parameter="left" /> + <on_visible function="Toolbars.CheckOrientation" + parameter="vertical" /> + </menu_item_check> + <menu_item_check label="Buttons bottom aligned" + layout="topleft" + name="bottom_align"> + <on_click function="Toolbars.ChangeLayout" + parameter="right" /> + <on_check function="Toolbars.CheckLayout" + parameter="right" /> + <on_visible function="Toolbars.CheckOrientation" + parameter="vertical" /> + </menu_item_check> </context_menu> diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml index 0ace37a5dc10685e052652f87dc6a56a4741a63b..f60a8da1e62ad0a91502f35c49d4f48ed91a49c1 100644 --- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml +++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml @@ -54,4 +54,45 @@ button_flash_count="4" button_flash_rate="0.5" flash_color="BeaconColor"/> + <button_icon_small pad_left="3" + pad_right="3" + image_bottom_pad="3" + image_top_pad="3" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + image_disabled_selected="PushButton_Selected_Disabled" + image_disabled="PushButton_Disabled" + desired_height="30" + button_width.min="30" + button_width.max="30" + follows="left|top" + label="" + halign="left" + chrome="true" + use_ellipses="true" + auto_resize="true" + button_flash_count="4" + button_flash_rate="0.5" + flash_color="BeaconColor"/> + <button_text label_color_selected="White" + halign="center" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + image_disabled_selected="PushButton_Selected_Disabled" + image_disabled="PushButton_Disabled" + button_width.min="63" + button_width.max="140" + desired_height="24" + pad_left="10" + pad_right="10" + follows="left|top" + chrome="true" + image_overlay_enable="false" + use_ellipses="true" + auto_resize="true" + button_flash_count="4" + button_flash_rate="0.5" + flash_color="BeaconColor"/> </toolbar>