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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user