diff options
-rw-r--r-- | indra/llui/llfloater.cpp | 117 | ||||
-rw-r--r-- | indra/llui/llfloater.h | 35 | ||||
-rw-r--r-- | indra/newview/lllocationinputctrl.cpp | 57 | ||||
-rw-r--r-- | indra/newview/lllocationinputctrl.h | 2 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/widgets/floater.xml | 17 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/widgets/location_input.xml | 11 |
6 files changed, 172 insertions, 67 deletions
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 262afbe661..04bef39c2c 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -66,27 +66,6 @@ // use this to control "jumping" behavior when Ctrl-Tabbing const S32 TABBED_FLOATER_OFFSET = 0; -std::string LLFloater::sButtonActiveImageNames[BUTTON_COUNT] = -{ - "Icon_Close_Foreground", //BUTTON_CLOSE - "Icon_Restore_Foreground", //BUTTON_RESTORE - "Icon_Minimize_Foreground", //BUTTON_MINIMIZE - "tearoffbox.tga", //BUTTON_TEAR_OFF - "Icon_Dock_Foreground", //BUTTON_DOCK - "Icon_Undock_Foreground", //BUTTON_UNDOCK - "Icon_Help_Foreground" //BUTTON_HELP -}; - -std::string LLFloater::sButtonPressedImageNames[BUTTON_COUNT] = -{ - "Icon_Close_Press", //BUTTON_CLOSE - "Icon_Restore_Press", //BUTTON_RESTORE - "Icon_Minimize_Press", //BUTTON_MINIMIZE - "tearoff_pressed.tga", //BUTTON_TEAR_OFF - "Icon_Dock_Press", //BUTTON_DOCK - "Icon_Undock_Press", //BUTTON_UNDOCK - "Icon_Help_Press" //BUTTON_HELP -}; std::string LLFloater::sButtonNames[BUTTON_COUNT] = { @@ -195,6 +174,20 @@ LLFloater::Params::Params() can_dock("can_dock", false), header_height("header_height", 0), legacy_header_height("legacy_header_height", 0), + close_image("close_image"), + restore_image("restore_image"), + minimize_image("minimize_image"), + tear_off_image("tear_off_image"), + dock_image("dock_image"), + undock_image("undock_image"), + help_image("help_image"), + close_pressed_image("close_pressed_image"), + restore_pressed_image("restore_pressed_image"), + minimize_pressed_image("minimize_pressed_image"), + tear_off_pressed_image("tear_off_pressed_image"), + dock_pressed_image("dock_pressed_image"), + undock_pressed_image("undock_pressed_image"), + help_pressed_image("help_pressed_image"), open_callback("open_callback"), close_callback("close_callback") { @@ -263,11 +256,9 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) // prior rectangle to be used on restore. mExpandedRect.set(0,0,0,0); - for (S32 i = 0; i < BUTTON_COUNT; i++) - { - mButtonsEnabled[i] = FALSE; - mButtons[i] = NULL; - } + memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool)); + memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*)); + addDragHandle(); addResizeCtrls(); @@ -276,11 +267,11 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) // chrome floaters don't take focus at all setFocusRoot(!getIsChrome()); - initFloater(); + initFloater(p); } // Note: Floaters constructed from XML call init() twice! -void LLFloater::initFloater() +void LLFloater::initFloater(const Params& p) { // Close button. if (mCanClose) @@ -305,7 +296,7 @@ void LLFloater::initFloater() mButtonsEnabled[BUTTON_DOCK] = TRUE; } - buildButtons(); + buildButtons(p); // Floaters are created in the invisible state setVisible(FALSE); @@ -1280,7 +1271,7 @@ void LLFloater::removeDependentFloater(LLFloater* floaterp) floaterp->mDependeeHandle = LLHandle<LLFloater>(); } -BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index) +BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index) { if( mButtonsEnabled[index] ) { @@ -1798,7 +1789,7 @@ void LLFloater::updateButtons() mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1))); } -void LLFloater::buildButtons() +void LLFloater::buildButtons(const Params& floater_params) { static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0); static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0); @@ -1832,17 +1823,18 @@ void LLFloater::buildButtons() LLButton::Params p; p.name(sButtonNames[i]); p.rect(btn_rect); - p.image_unselected.name(sButtonActiveImageNames[i]); + p.image_unselected = getButtonImage(floater_params, (EFloaterButton)i); // Selected, no matter if hovered or not, is "pressed" - p.image_selected.name(sButtonPressedImageNames[i]); - p.image_hover_selected.name(sButtonPressedImageNames[i]); + LLUIImage* pressed_image = getButtonPressedImage(floater_params, (EFloaterButton)i); + p.image_selected = pressed_image; + p.image_hover_selected = pressed_image; // Use a glow effect when the user hovers over the button // These icons are really small, need glow amount increased p.hover_glow_amount( 0.33f ); p.click_callback.function(boost::bind(sButtonCallbacks[i], this)); p.tab_stop(false); p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT); - p.tool_tip(sButtonToolTips[i]); + p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i); p.scale_image(true); p.chrome(true); @@ -1854,6 +1846,59 @@ void LLFloater::buildButtons() updateButtons(); } +// static +LLUIImage* LLFloater::getButtonImage(const Params& p, EFloaterButton e) +{ + switch(e) + { + default: + case BUTTON_CLOSE: + return p.close_image; + case BUTTON_RESTORE: + return p.restore_image; + case BUTTON_MINIMIZE: + return p.minimize_image; + case BUTTON_TEAR_OFF: + return p.tear_off_image; + case BUTTON_DOCK: + return p.dock_image; + case BUTTON_UNDOCK: + return p.undock_image; + case BUTTON_HELP: + return p.help_image; + } +} + +// static +LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e) +{ + switch(e) + { + default: + case BUTTON_CLOSE: + return p.close_pressed_image; + case BUTTON_RESTORE: + return p.restore_pressed_image; + case BUTTON_MINIMIZE: + return p.minimize_pressed_image; + case BUTTON_TEAR_OFF: + return p.tear_off_pressed_image; + case BUTTON_DOCK: + return p.dock_pressed_image; + case BUTTON_UNDOCK: + return p.undock_pressed_image; + case BUTTON_HELP: + return p.help_pressed_image; + } +} + +// static +std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e) +{ + // TODO: per-floater localizable tooltips set in XML + return sButtonToolTips[e]; +} + ///////////////////////////////////////////////////// // LLFloaterView @@ -2672,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o setupParams(params, parent); initFromParams(params); - initFloater(); + initFloater(params); LLMultiFloater* last_host = LLFloater::getFloaterHost(); if (node->hasName("multi_floater")) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 95c8dd84f6..d2d346d2a7 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -97,7 +97,7 @@ public: |*==========================================================================*/ }; - enum EFloaterButtons + enum EFloaterButton { BUTTON_CLOSE = 0, BUTTON_RESTORE, @@ -128,6 +128,22 @@ public: can_dock; Optional<S32> header_height, legacy_header_height; // HACK see initFromXML() + + // Images for top-right controls + Optional<LLUIImage*> close_image, + restore_image, + minimize_image, + tear_off_image, + dock_image, + undock_image, + help_image; + Optional<LLUIImage*> close_pressed_image, + restore_pressed_image, + minimize_pressed_image, + tear_off_pressed_image, + dock_pressed_image, + undock_pressed_image, + help_pressed_image; Optional<CommitCallbackParam> open_callback, close_callback; @@ -158,7 +174,7 @@ public: /*virtual*/ void setIsChrome(BOOL is_chrome); /*virtual*/ void setRect(const LLRect &rect); - void initFloater(); + void initFloater(const Params& p); void openFloater(const LLSD& key = LLSD()); @@ -308,8 +324,15 @@ private: void cleanupHandles(); // remove handles to dead floaters void createMinimizeButton(); void updateButtons(); - void buildButtons(); - BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index); + void buildButtons(const Params& p); + + // Images and tooltips are named in the XML, but we want to look them + // up by index. + static LLUIImage* getButtonImage(const Params& p, EFloaterButton e); + static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e); + static std::string getButtonTooltip(const Params& p, EFloaterButton e); + + BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index); void addResizeCtrls(); void layoutResizeCtrls(); void enableResizeCtrls(bool enable); @@ -367,7 +390,7 @@ private: typedef std::set<LLHandle<LLFloater> >::iterator handle_set_iter_t; handle_set_t mDependents; - BOOL mButtonsEnabled[BUTTON_COUNT]; + bool mButtonsEnabled[BUTTON_COUNT]; LLButton* mButtons[BUTTON_COUNT]; F32 mButtonScale; BOOL mAutoFocus; @@ -381,8 +404,6 @@ private: static LLMultiFloater* sHostp; static BOOL sQuitting; - static std::string sButtonActiveImageNames[BUTTON_COUNT]; - static std::string sButtonPressedImageNames[BUTTON_COUNT]; static std::string sButtonNames[BUTTON_COUNT]; static std::string sButtonToolTips[BUTTON_COUNT]; static std::string sButtonToolTipsIndex[BUTTON_COUNT]; diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index a57aea5734..bb713aba19 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -161,6 +161,7 @@ LLLocationInputCtrl::Params::Params() add_landmark_hpad("add_landmark_hpad", 0), icon_hpad("icon_hpad", 0), add_landmark_button("add_landmark_button"), + for_sale_button("for_sale_button"), info_button("info_button"), voice_icon("voice_icon"), fly_icon("fly_icon"), @@ -176,9 +177,10 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) : LLComboBox(p), mIconHPad(p.icon_hpad), mAddLandmarkHPad(p.add_landmark_hpad), - mInfoBtn(NULL), mLocationContextMenu(NULL), mAddLandmarkBtn(NULL), + mForSaleBtn(NULL), + mInfoBtn(NULL), mLandmarkImageOn(NULL), mLandmarkImageOff(NULL) { @@ -239,6 +241,11 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params); enableAddLandmarkButton(true); addChild(mAddLandmarkBtn); + + LLButton::Params for_sale_button = p.for_sale_button; + mForSaleBtn = LLUICtrlFactory::create<LLButton>( for_sale_button ); + // *TODO: Make clickable? + addChild(mForSaleBtn); // Parcel property icons LLIconCtrl::Params voice_icon = p.voice_icon; @@ -607,17 +614,30 @@ void LLLocationInputCtrl::refreshLocation() setText(location_name); } +// returns new right edge +static S32 layout_widget(LLUICtrl* widget, S32 right) +{ + if (widget->getVisible()) + { + LLRect rect = widget->getRect(); + rect.mLeft = right - rect.getWidth(); + rect.mRight = right; + widget->setRect( rect ); + right -= rect.getWidth(); + } + return right; +} + void LLLocationInputCtrl::refreshParcelIcons() { // Our "cursor" moving right to left - S32 x = mAddLandmarkBtn->getRect().mLeft - mAddLandmarkHPad; + S32 x = mAddLandmarkBtn->getRect().mLeft - mIconHPad; static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false); if (show_properties) { LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); - // *TODO buy - //bool allow_buy = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false); + bool allow_buy = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false); bool allow_voice = vpm->allowAgentVoice(); bool allow_fly = vpm->allowAgentFly(); bool allow_push = vpm->allowAgentPush(); @@ -626,6 +646,7 @@ void LLLocationInputCtrl::refreshParcelIcons() bool allow_damage = vpm->allowAgentDamage(); // Most icons are "block this ability" + mForSaleBtn->setVisible(allow_buy); mParcelIcon[VOICE_ICON]->setVisible( !allow_voice ); mParcelIcon[FLY_ICON]->setVisible( !allow_fly ); mParcelIcon[PUSH_ICON]->setVisible( !allow_push ); @@ -634,28 +655,22 @@ void LLLocationInputCtrl::refreshParcelIcons() mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage ); mDamageText->setVisible(allow_damage); - // Slide the parcel icons rect from right to left, adjusting rectangles of - // visible icons. Assumes all icon rects are the same. + x = layout_widget(mForSaleBtn, x); + // Padding goes to left of both landmark star and for sale btn + x -= mAddLandmarkHPad; + + // Slide the parcel icons rect from right to left, adjusting rectangles for (S32 i = 0; i < ICON_COUNT; ++i) { - LLIconCtrl* icon = mParcelIcon[i]; - if (icon->getVisible()) - { - LLRect r = icon->getRect(); - r.mLeft = x - r.getWidth(); - r.mRight = x; - icon->setRect( r ); - x -= r.getWidth() + mIconHPad; - } + x = layout_widget(mParcelIcon[i], x); + x -= mIconHPad; } - LLRect text_rect = mDamageText->getRect(); - text_rect.mLeft = x - text_rect.getWidth(); - text_rect.mRight = x; - mDamageText->setRect(text_rect); - x -= text_rect.getWidth() + mIconHPad; + x = layout_widget(mDamageText, x); + x -= mIconHPad; } else { + mForSaleBtn->setVisible(false); for (S32 i = 0; i < ICON_COUNT; ++i) { mParcelIcon[i]->setVisible(false); @@ -666,8 +681,6 @@ void LLLocationInputCtrl::refreshParcelIcons() S32 left_pad, right_pad; mTextEntry->getTextPadding(&left_pad, &right_pad); right_pad = mTextEntry->getRect().mRight - x; - llinfos << "JAMESDEBUG text entry rect " << mTextEntry->getRect() - << " x " << x << " left_pad " << left_pad << " right_pad " << right_pad << llendl; mTextEntry->setTextPadding(left_pad, right_pad); } diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 608176290e..442a64f521 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -68,6 +68,7 @@ public: Optional<S32> icon_hpad, add_landmark_hpad; Optional<LLButton::Params> add_landmark_button, + for_sale_button, info_button; Optional<LLIconCtrl::Params> voice_icon, fly_icon, @@ -139,6 +140,7 @@ private: LLMenuGL* mLocationContextMenu; LLButton* mAddLandmarkBtn; + LLButton* mForSaleBtn; LLButton* mInfoBtn; S32 mIconHPad; // pad between all icons S32 mAddLandmarkHPad; // pad to left of landmark star diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml index 6660fbf1a8..2263866471 100644 --- a/indra/newview/skins/default/xui/en/widgets/floater.xml +++ b/indra/newview/skins/default/xui/en/widgets/floater.xml @@ -7,4 +7,19 @@ bg_alpha_image="Window_Background" background_visible="true" background_opaque="false" - header_height="25" /> + header_height="25" + close_image="Icon_Close_Foreground" + restore_image="Icon_Restore_Foreground" + minimize_image="Icon_Minimize_Foreground" + tear_off_image="tearoffbox.tga" + dock_image="Icon_Dock_Foreground" + undock_image="Icon_Undock_Foreground" + help_image="Icon_Help_Foreground" + close_pressed_image="Icon_Close_Press" + restore_pressed_image="Icon_Restore_Press" + minimize_pressed_image="Icon_Minimize_Press" + tear_off_pressed_image="tearoff_pressed.tga" + dock_pressed_image="Icon_Dock_Press" + undock_pressed_image="Icon_Undock_Press" + help_pressed_image="Icon_Help_Press" + /> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 5984634e4c..90887dead6 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -11,7 +11,7 @@ add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" add_landmark_image_selected="Favorite_Star_Press" - add_landmark_hpad="8" + add_landmark_hpad="10" icon_hpad="2" allow_text_entry="true" list_position="below" @@ -39,6 +39,15 @@ scale_image="false" top="19" left="-3" /> + <for_sale_button + name="for_sale_btn" + image_unselected="parcel_lght_ForSale" + width="22" + height="18" + follows="right|top" + scale_image="false" + top="21" + /> <voice_icon name="voice_icon" width="22" |