summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui')
-rw-r--r--indra/llui/llfloater.cpp34
-rw-r--r--indra/llui/llfloater.h3
-rw-r--r--indra/llui/llmenugl.cpp64
-rw-r--r--indra/llui/llmenugl.h69
-rw-r--r--indra/llui/llpanel.cpp20
-rw-r--r--indra/llui/llscrolllistctrl.cpp67
-rw-r--r--indra/llui/llscrolllistctrl.h41
7 files changed, 173 insertions, 125 deletions
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 22d898c5ce..b56ae5167b 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1218,24 +1218,36 @@ void LLFloater::onClickEdit(void *userdata)
}
// static
-void LLFloater::closeByMenu( void* userdata )
+void LLFloater::closeFocusedFloater()
{
- LLFloater* self = (LLFloater*) userdata;
- if (!self || self->getHost()) return;
+ LLFloater* focused_floater = NULL;
+
+ std::map<LLViewHandle, LLFloater*>::iterator iter;
+ for(iter = sFloaterMap.begin(); iter != sFloaterMap.end(); ++iter)
+ {
+ focused_floater = iter->second;
+ if (focused_floater->hasFocus())
+ {
+ break;
+ }
+ }
- LLFloaterView* parent = (LLFloaterView*) self->getParent();
+ if (iter == sFloaterMap.end())
+ {
+ // nothing found, return
+ return;
+ }
- // grab focus status before close just in case floater is deleted
- BOOL has_focus = gFocusMgr.childHasKeyboardFocus(self);
- self->close();
+ focused_floater->close();
- // if this floater used to have focus and now nothing took focus
+ // if nothing took focus after closing focused floater
// give it to next floater (to allow closing multiple windows via keyboard in rapid succession)
- if (has_focus && gFocusMgr.getKeyboardFocus() == NULL)
+ if (gFocusMgr.getKeyboardFocus() == NULL)
{
- parent->focusFrontFloater();
+ // HACK: use gFloaterView directly in case we are using Ctrl-W to close snapshot window
+ // which sits in gSnapshotFloaterView, and needs to pass focus on to normal floater view
+ gFloaterView->focusFrontFloater();
}
-
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index a743081335..05e513ed1d 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -183,7 +183,8 @@ public:
/*virtual*/ LLView* getRootMostFastFrameView();
- static void closeByMenu(void *userdata);
+ static void closeFocusedFloater();
+
static void onClickClose(void *userdata);
static void onClickMinimize(void *userdata);
static void onClickTearOff(void *userdata);
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 7aaa306f05..9161ecb19f 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1155,70 +1155,6 @@ void LLMenuItemToggleGL::doIt( void )
}
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLMenuItemBranchGL
-//
-// The LLMenuItemBranchGL represents a menu item that has a
-// sub-menu. This is used to make cascading menus.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLMenuItemBranchGL : public LLMenuItemGL
-{
-protected:
- LLMenuGL* mBranch;
-
-public:
- LLMenuItemBranchGL( const LLString& name, const LLString& label, LLMenuGL* branch,
- KEY key = KEY_NONE, MASK mask = MASK_NONE );
- virtual LLXMLNodePtr getXML(bool save_children = true) const;
-
- virtual LLView* getChildByName(const LLString& name, BOOL recurse) const;
-
- virtual LLString getType() const { return "menu"; }
-
- virtual EWidgetType getWidgetType() const;
- virtual LLString getWidgetTag() const;
-
- virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
-
- virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
-
- // check if we've used these accelerators already
- virtual BOOL addToAcceleratorList(std::list <LLKeyBinding*> *listp);
-
- // called to rebuild the draw label
- virtual void buildDrawLabel( void );
-
- // doIt() - do the primary funcationality of the menu item.
- virtual void doIt( void );
-
- virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
- virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
-
- // set the hover status (called by it's menu) and if the object is
- // active. This is used for behavior transfer.
- virtual void setHighlight( BOOL highlight );
-
- virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
-
- virtual BOOL isActive() const;
-
- virtual BOOL isOpen() const;
-
- LLMenuGL *getBranch() const { return mBranch; }
-
- virtual void updateBranchParent( LLView* parentp );
-
- // LLView Functionality
- virtual void onVisibilityChange( BOOL curVisibilityIn );
-
- virtual void draw();
-
- virtual void setEnabledSubMenus(BOOL enabled);
-
- virtual void openMenu();
-};
-
LLMenuItemBranchGL::LLMenuItemBranchGL( const LLString& name, const LLString& label, LLMenuGL* branch,
KEY key, MASK mask ) :
LLMenuItemGL( name, label, key, mask ),
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index d43b4553c3..1b0b844bdc 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -542,6 +542,75 @@ protected:
KEY mJumpKey;
};
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLMenuItemBranchGL
+//
+// The LLMenuItemBranchGL represents a menu item that has a
+// sub-menu. This is used to make cascading menus.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLMenuItemBranchGL : public LLMenuItemGL
+{
+protected:
+ LLMenuGL* mBranch;
+
+public:
+ LLMenuItemBranchGL( const LLString& name, const LLString& label, LLMenuGL* branch,
+ KEY key = KEY_NONE, MASK mask = MASK_NONE );
+ virtual LLXMLNodePtr getXML(bool save_children = true) const;
+
+ virtual LLView* getChildByName(const LLString& name, BOOL recurse) const;
+
+ virtual LLString getType() const { return "menu"; }
+
+ virtual EWidgetType getWidgetType() const;
+ virtual LLString getWidgetTag() const;
+
+ virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+
+ virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
+
+ // check if we've used these accelerators already
+ virtual BOOL addToAcceleratorList(std::list <LLKeyBinding*> *listp);
+
+ // called to rebuild the draw label
+ virtual void buildDrawLabel( void );
+
+ // doIt() - do the primary funcationality of the menu item.
+ virtual void doIt( void );
+
+ virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
+
+ // set the hover status (called by it's menu) and if the object is
+ // active. This is used for behavior transfer.
+ virtual void setHighlight( BOOL highlight );
+
+ virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
+
+ virtual BOOL isActive() const;
+
+ virtual BOOL isOpen() const;
+
+ LLMenuGL *getBranch() const { return mBranch; }
+
+ virtual void updateBranchParent( LLView* parentp );
+
+ // LLView Functionality
+ virtual void onVisibilityChange( BOOL curVisibilityIn );
+
+ virtual void draw();
+
+ virtual void setEnabledSubMenus(BOOL enabled);
+
+ virtual void openMenu();
+};
+
+
+
+
//-----------------------------------------------------------------------------
// class LLPieMenu
// A circular menu of items, icons, etc.
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 91bf6befe7..de65ce14f6 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -338,16 +338,6 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask, BOOL called_from_parent )
gFocusMgr.childHasKeyboardFocus(this) && !called_from_parent )
{
LLUICtrl* cur_focus = gFocusMgr.getKeyboardFocus();
- if (key == KEY_RETURN && mask == MASK_NONE)
- {
- // set keyboard focus to self to trigger commitOnFocusLost behavior on current ctrl
- if (cur_focus && cur_focus->acceptsTextInput())
- {
- cur_focus->onCommit();
- handled = TRUE;
- }
- }
-
// If we have a default button, click it when
// return is pressed, unless current focus is a return-capturing button
// in which case *that* button will handle the return key
@@ -363,6 +353,16 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask, BOOL called_from_parent )
handled = TRUE;
}
}
+
+ if (key == KEY_RETURN && mask == MASK_NONE)
+ {
+ // set keyboard focus to self to trigger commitOnFocusLost behavior on current ctrl
+ if (cur_focus && cur_focus->acceptsTextInput())
+ {
+ cur_focus->onCommit();
+ handled = TRUE;
+ }
+ }
}
return handled;
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 2b7cbe5cef..c168bbe5a8 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -137,10 +137,11 @@ BOOL LLScrollListCheck::handleClick()
//
U32 LLScrollListText::sCount = 0;
-LLScrollListText::LLScrollListText( const LLString& text, const LLFontGL* font, S32 width, U8 font_style, LLColor4& color, BOOL use_color, BOOL visible)
+LLScrollListText::LLScrollListText( const LLString& text, const LLFontGL* font, S32 width, U8 font_style, LLFontGL::HAlign font_alignment, LLColor4& color, BOOL use_color, BOOL visible)
: mText( text ),
mFont( font ),
mFontStyle( font_style ),
+ mFontAlignment( font_alignment ),
mWidth( width ),
mVisible( visible ),
mHighlightCount( 0 ),
@@ -163,10 +164,6 @@ LLScrollListText::LLScrollListText( const LLString& text, const LLFontGL* font,
{
mRoundedRectImage = LLUI::sImageProvider->getUIImageByID(LLUUID(LLUI::sAssetsGroup->getString("rounded_square.tga")));
}
-
- // Yes, that's four dots, because we want it to have a little
- // padding, in proportion to the font size.
- mEllipsisWidth = (S32)mFont->getWidth("....");
}
LLScrollListText::~LLScrollListText()
@@ -202,7 +199,19 @@ void LLScrollListText::drawToWidth(S32 width, const LLColor4& color, const LLCol
{
mRoundedRectImage->bind();
glColor4fv(highlight_color.mV);
- S32 left = mFont->getWidth(mText.getString(), 0, mHighlightOffset);
+ S32 left = 0;
+ switch(mFontAlignment)
+ {
+ case LLFontGL::LEFT:
+ left = mFont->getWidth(mText.getString(), 0, mHighlightOffset);
+ break;
+ case LLFontGL::RIGHT:
+ left = width - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX);
+ break;
+ case LLFontGL::HCENTER:
+ left = (width - mFont->getWidth(mText.getString())) / 2;
+ break;
+ }
gl_segmented_rect_2d_tex(left - 2,
llround(mFont->getLineHeight()) + 1,
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
@@ -215,21 +224,28 @@ void LLScrollListText::drawToWidth(S32 width, const LLColor4& color, const LLCol
// Try to draw the entire string
F32 right_x;
U32 string_chars = mText.length();
- U32 drawn_chars = mFont->render(mText.getWString(), 0, 0, 2,
- *display_color,
- LLFontGL::LEFT,
- LLFontGL::BOTTOM,
- mFontStyle,
- string_chars,
- width - mEllipsisWidth,
- &right_x, FALSE);
-
- // If we didn't get the whole string, abbreviate
- if (drawn_chars < string_chars && drawn_chars)
- {
- mFont->renderUTF8("...", 0, right_x, 0.f, color, LLFontGL::LEFT, LLFontGL::BOTTOM, mFontStyle,
- S32_MAX, S32_MAX, NULL, FALSE);
- }
+ F32 start_x = 0.f;
+ switch(mFontAlignment)
+ {
+ case LLFontGL::LEFT:
+ start_x = 0.f;
+ break;
+ case LLFontGL::RIGHT:
+ start_x = (F32)width;
+ break;
+ case LLFontGL::HCENTER:
+ start_x = (F32)width * 0.5f;
+ break;
+ }
+ mFont->render(mText.getWString(), 0,
+ start_x, 2.f,
+ *display_color,
+ mFontAlignment,
+ LLFontGL::BOTTOM,
+ mFontStyle,
+ string_chars,
+ width,
+ &right_x, FALSE, TRUE);
}
@@ -2171,7 +2187,7 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
NULL,
multi_select,
draw_border);
-
+
scroll_list->setDisplayHeading(draw_heading);
if (node->hasAttribute("heading_height"))
{
@@ -2226,6 +2242,8 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
F32 columnrelwidth = 0.f;
child->getAttributeF32("relwidth", columnrelwidth);
+ LLFontGL::HAlign h_align = LLFontGL::LEFT;
+ h_align = LLView::selectFontHAlign(child);
columns[index]["name"] = columnname;
columns[index]["sort"] = sortname;
@@ -2234,6 +2252,7 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
columns[index]["width"] = columnwidth;
columns[index]["relwidth"] = columnrelwidth;
columns[index]["dynamicwidth"] = columndynamicwidth;
+ columns[index]["halign"] = (S32)h_align;
index++;
}
}
@@ -2580,6 +2599,7 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p
S32 index = column_itor->second.mIndex;
S32 width = column_itor->second.mWidth;
+ LLFontGL::HAlign font_alignment = column_itor->second.mFontAlignment;
LLSD value = (*itor)["value"];
LLString fontname = (*itor)["font"].asString();
@@ -2607,7 +2627,7 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p
}
else
{
- new_item->setColumn(index, new LLScrollListText(value.asString(), font, width, font_style));
+ new_item->setColumn(index, new LLScrollListText(value.asString(), font, width, font_style, font_alignment));
}
}
@@ -2715,3 +2735,4 @@ void LLScrollListCtrl::onFocusLost()
}
}
}
+
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 985ccc12a5..9c16e4dff9 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -46,9 +46,8 @@ public:
class LLScrollListText : public LLScrollListCell
{
- static U32 sCount;
public:
- LLScrollListText( const LLString& text, const LLFontGL* font, S32 width = 0, U8 font_style = LLFontGL::NORMAL, LLColor4& color = LLColor4::black, BOOL use_color = FALSE, BOOL visible = TRUE);
+ LLScrollListText( const LLString& text, const LLFontGL* font, S32 width = 0, U8 font_style = LLFontGL::NORMAL, LLFontGL::HAlign font_alignment = LLFontGL::LEFT, LLColor4& color = LLColor4::black, BOOL use_color = FALSE, BOOL visible = TRUE);
/*virtual*/ ~LLScrollListText();
virtual void drawToWidth(S32 width, const LLColor4& color, const LLColor4& highlight_color) const;
@@ -65,13 +64,15 @@ private:
const LLFontGL* mFont;
LLColor4* mColor;
const U8 mFontStyle;
+ LLFontGL::HAlign mFontAlignment;
S32 mWidth;
- S32 mEllipsisWidth; // in pixels, of "..."
BOOL mVisible;
S32 mHighlightCount;
S32 mHighlightOffset;
LLPointer<LLImageGL> mRoundedRectImage;
+
+ static U32 sCount;
};
class LLScrollListIcon : public LLScrollListCell
@@ -116,9 +117,10 @@ class LLScrollListColumn
{
public:
// Default constructor
- LLScrollListColumn() : mName(""), mSortingColumn(""), mLabel(""), mWidth(-1), mRelWidth(-1.0), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL) { }
+ LLScrollListColumn() : mName(""), mSortingColumn(""), mLabel(""), mWidth(-1), mRelWidth(-1.0), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL), mFontAlignment(LLFontGL::LEFT)
+ { }
- LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth)
+ LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth)
: mName(name), mSortingColumn(name), mLabel(label), mWidth(width), mRelWidth(relwidth), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL) { }
LLScrollListColumn(const LLSD &sd)
@@ -150,20 +152,27 @@ public:
mDynamicWidth = FALSE;
mRelWidth = -1;
}
+
+ if (sd.has("halign"))
+ {
+ mFontAlignment = (LLFontGL::HAlign)llclamp(sd.get("halign").asInteger(), (S32)LLFontGL::LEFT, (S32)LLFontGL::HCENTER);
+ }
+
mIndex = -1;
mParentCtrl = NULL;
mButton = NULL;
}
- LLString mName;
- LLString mSortingColumn;
- LLString mLabel;
- S32 mWidth;
- F32 mRelWidth;
- BOOL mDynamicWidth;
- S32 mIndex;
- LLScrollListCtrl *mParentCtrl;
- LLButton *mButton;
+ LLString mName;
+ LLString mSortingColumn;
+ LLString mLabel;
+ S32 mWidth;
+ F32 mRelWidth;
+ BOOL mDynamicWidth;
+ S32 mIndex;
+ LLScrollListCtrl* mParentCtrl;
+ LLButton* mButton;
+ LLFontGL::HAlign mFontAlignment;
};
class LLScrollListItem
@@ -190,8 +199,8 @@ public:
// If width = 0, just use the width of the text. Otherwise override with
// specified width in pixels.
- void addColumn( const LLString& text, const LLFontGL* font, S32 width = 0 , U8 font_style = LLFontGL::NORMAL, BOOL visible = TRUE)
- { mColumns.push_back( new LLScrollListText(text, font, width, font_style, LLColor4::black, FALSE, visible) ); }
+ void addColumn( const LLString& text, const LLFontGL* font, S32 width = 0 , U8 font_style = LLFontGL::NORMAL, LLFontGL::HAlign font_alignment = LLFontGL::LEFT, BOOL visible = TRUE)
+ { mColumns.push_back( new LLScrollListText(text, font, width, font_style, font_alignment, LLColor4::black, FALSE, visible) ); }
void addColumn( LLImageGL* icon, S32 width = 0 )
{ mColumns.push_back( new LLScrollListIcon(icon, width) ); }