Derive LLScrollColumnHeader from a button

Fixes the issue with single-click sorting not working
Fixes internal issue with initial column header names being used as their labels
This commit is contained in:
Lirusaito
2013-07-14 17:27:51 -04:00
parent 02253563ce
commit 75c4503a46
3 changed files with 20 additions and 171 deletions

View File

@@ -39,23 +39,22 @@ const S32 MIN_COLUMN_WIDTH = 20;
//---------------------------------------------------------------------------
// LLScrollColumnHeader
//---------------------------------------------------------------------------
LLScrollColumnHeader::LLScrollColumnHeader(const std::string& label, const LLRect& rect, LLScrollListColumn* column, const LLFontGL* fontp)
: LLComboBox(label, rect, label),
LLScrollColumnHeader::LLScrollColumnHeader(const std::string& name, const LLRect& rect, LLScrollListColumn* column)
: LLButton("", rect),
mColumn(column),
mOrigLabel(label),
mHasResizableElement(FALSE)
{
mListPosition = LLComboBox::ABOVE;
setCommitCallback(boost::bind(&LLScrollColumnHeader::onSelectSort, this));
mButton->setTabStop(FALSE);
mButton->setClickedCallback(boost::bind(&LLScrollColumnHeader::onClick, this, _2));
mButton->setToolTip(label);
mAscendingText = std::string("[LOW]...[HIGH](Ascending)"); // *TODO: Translate
mDescendingText = std::string("[HIGH]...[LOW](Descending)"); // *TODO: Translate
mList->reshape(llmax(mList->getRect().getWidth(), 110, getRect().getWidth()), mList->getRect().getHeight());
setClickedCallback(boost::bind(&LLScrollColumnHeader::onClick, this, _2));
setName(name); // Singu Note: Passing this to LLButton set the label, too, which we don't want in the case of column headers with images.
// Set base images for column header button
{
LLPointer<LLUIImage> selected = LLUI::getUIImage("square_btn_selected_32x128.tga");
LLPointer<LLUIImage> unselected = LLUI::getUIImage("square_btn_32x128.tga");
setImageUnselected(unselected);
setImageSelected(selected);
setImageDisabled(unselected);
setImageDisabledSelected(selected);
}
// resize handles on left and right
const S32 RESIZE_BAR_THICKNESS = 3;
@@ -67,9 +66,6 @@ LLScrollColumnHeader::LLScrollColumnHeader(const std::string& label, const LLRec
resize_bar_p.enabled(false);
mResizeBar = LLUICtrlFactory::create<LLResizeBar>(resize_bar_p);
addChild(mResizeBar);
mImageOverlayAlignment = LLFontGL::HCENTER;
mImageOverlayColor = LLColor4::white;
}
LLScrollColumnHeader::~LLScrollColumnHeader()
@@ -86,111 +82,15 @@ void LLScrollColumnHeader::draw()
BOOL is_ascending = mColumn->mParentCtrl->getSortAscending();
if (draw_arrow)
{
mButton->setImageOverlay(is_ascending ? "up_arrow.tga" : "down_arrow.tga", LLFontGL::RIGHT, LLColor4::white);
setImageOverlay(is_ascending ? "up_arrow.tga" : "down_arrow.tga", LLFontGL::RIGHT, LLColor4::white);
}
else
{
mButton->setImageOverlay(LLUUID::null);
setImageOverlay(LLUUID::null);
}
mArrowImage = mButton->getImageOverlay();
// Draw children
LLComboBox::draw();
if (mImageOverlay.notNull()) //Ugly dupe code from llbutton...
{
BOOL pressed_by_keyboard = FALSE;
if (mButton->hasFocus())
{
pressed_by_keyboard = gKeyboard->getKeyDown(' ') || (mButton->getCommitOnReturn() && gKeyboard->getKeyDown(KEY_RETURN));
}
// Unselected image assignments
S32 local_mouse_x;
S32 local_mouse_y;
LLUI::getMousePositionLocal(mButton, &local_mouse_x, &local_mouse_y);
BOOL pressed = pressed_by_keyboard
|| (mButton->hasMouseCapture() && mButton->pointInView(local_mouse_x, local_mouse_y))
|| mButton->getToggleState();
// Now draw special overlay..
// let overlay image and text play well together
S32 button_width = mButton->getRect().getWidth();
S32 button_height = mButton->getRect().getHeight();
S32 text_left = mButton->getLeftHPad();
S32 text_right = button_width - mButton->getRightHPad();
S32 text_width = text_right - text_left;
// draw overlay image
// get max width and height (discard level 0)
S32 overlay_width = mImageOverlay->getWidth();
S32 overlay_height = mImageOverlay->getHeight();
F32 scale_factor = llmin((F32)button_width / (F32)overlay_width, (F32)button_height / (F32)overlay_height, 1.f);
overlay_width = llround((F32)overlay_width * scale_factor);
overlay_height = llround((F32)overlay_height * scale_factor);
S32 center_x = mButton->getLocalRect().getCenterX();
S32 center_y = mButton->getLocalRect().getCenterY();
//FUGLY HACK FOR "DEPRESSED" BUTTONS
if (pressed)
{
center_y--;
center_x++;
}
// fade out overlay images on disabled buttons
LLColor4 overlay_color = mImageOverlayColor;
if (!mButton->getEnabled())
{
overlay_color.mV[VALPHA] = 0.5f;
}
switch(mImageOverlayAlignment)
{
case LLFontGL::LEFT:
text_left += overlay_width + 1;
text_width -= overlay_width + 1;
mImageOverlay->draw(
text_left,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
overlay_color);
break;
case LLFontGL::HCENTER:
mImageOverlay->draw(
center_x - (overlay_width / 2),
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
overlay_color);
break;
case LLFontGL::RIGHT:
text_right -= overlay_width + 1;
text_width -= overlay_width + 1;
mImageOverlay->draw(
text_right - overlay_width,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
overlay_color);
break;
default:
// draw nothing
break;
}
}
if (mList->getVisible())
{
// sync sort order with list selection every frame
mColumn->mParentCtrl->sortByColumn(mColumn->mSortingColumn, getCurrentIndex() == 0);
}
LLButton::draw();
}
BOOL LLScrollColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask)
@@ -210,53 +110,14 @@ BOOL LLScrollColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask)
return TRUE;
}
void LLScrollColumnHeader::setImage(const std::string& image_name)
{
if (mButton)
{
mButton->setImageSelected(LLUI::getUIImage(image_name));
mButton->setImageUnselected(LLUI::getUIImage(image_name));
}
}
void LLScrollColumnHeader::setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment, const LLColor4& color)
{
if (image_name.empty())
{
mImageOverlay = NULL;
}
else
{
mImageOverlay = LLUI::getUIImage(image_name);
mImageOverlayAlignment = alignment;
mImageOverlayColor = color;
}
}
void LLScrollColumnHeader::onClick(const LLSD& data)
{
if (mColumn)
{
if (mList->getVisible()) hideList();
LLScrollListCtrl::onClickColumn(mColumn);
// propagate new sort order to sort order list
mList->selectNthItem(mColumn->mParentCtrl->getSortAscending() ? 0 : 1);
mList->setFocus(true);
}
}
void LLScrollColumnHeader::onSelectSort()
{
if (!mColumn) return;
LLScrollListCtrl* parent = mColumn->mParentCtrl;
if (!parent) return;
parent->sortByColumn(mColumn->mSortingColumn, getCurrentIndex() == 0);
// restore original column header
setLabel(mOrigLabel);
}
LLView* LLScrollColumnHeader::findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding)
{
// this logic assumes dragging on right

View File

@@ -30,48 +30,36 @@
#include "llrect.h"
#include "lluistring.h"
#include "llcombobox.h"
#include "llbutton.h"
class LLScrollListColumn;
class LLResizeBar;
class LLScrollListCtrl;
class LLScrollColumnHeader : public LLComboBox
class LLScrollColumnHeader : public LLButton
{
public:
LLScrollColumnHeader(const std::string& label, const LLRect& rect, LLScrollListColumn* column, const LLFontGL* font = NULL);
LLScrollColumnHeader(const std::string& name, const LLRect& rect, LLScrollListColumn* column);
~LLScrollColumnHeader();
/*virtual*/ void draw();
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
/*virtual*/ void showList() {}; // block the normal showList() behavior
/*virtual*/ LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding);
/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
void setImage(const std::string& image_name);
void setImageOverlay(const std::string& overlay_image, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
LLScrollListColumn* getColumn() { return mColumn; }
void setHasResizableElement(BOOL resizable);
void updateResizeBars();
BOOL canResize();
void enableResizeBar(BOOL enable);
std::string getLabel() { return mOrigLabel; }
void onSelectSort();
void onClick(const LLSD& data);
private:
LLScrollListColumn* mColumn;
LLResizeBar* mResizeBar;
std::string mOrigLabel;
LLUIString mAscendingText;
LLUIString mDescendingText;
BOOL mHasResizableElement;
LLPointer<LLUIImage> mImageOverlay;
LLFontGL::HAlign mImageOverlayAlignment;
LLColor4 mImageOverlayColor;
};
/*

View File

@@ -2853,7 +2853,7 @@ void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos)
if(!column["image"].asString().empty())
{
new_column->mHeader->setImage(column["image"].asString());
new_column->mHeader->setImages(column["image"].asString(), column["image"].asString());
}
else if(!column["image_overlay"].asString().empty())
{