phoenix-firestorm/indra/llui/lldraghandle.h

145 lines
4.6 KiB
C++

/**
* @file lldraghandle.h
* @brief LLDragHandle base class
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
// A widget for dragging a view around the screen using the mouse.
#ifndef LL_DRAGHANDLE_H
#define LL_DRAGHANDLE_H
#include "llview.h"
#include "v4color.h"
#include "llrect.h"
#include "llcoord.h"
class LLTextBox;
class LLDragHandle : public LLView
{
public:
struct Params
: public LLInitParam::Block<Params, LLView::Params>
{
Optional<std::string> label;
Optional<LLUIColor> drag_highlight_color;
Optional<LLUIColor> drag_shadow_color;
Optional<S32> label_v_padding; // <FS:Zi> Make vertical label padding a per-skin option
Params()
: label("label"),
label_v_padding("label_v_padding", -1), // <FS:Zi> Make vertical label padding a per-skin option
drag_highlight_color("drag_highlight_color", LLUIColorTable::instance().getColor("DefaultHighlightLight")),
drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark"))
{
changeDefault(mouse_opaque, true);
changeDefault(follows.flags, FOLLOWS_ALL);
}
};
void initFromParams(const Params&);
virtual ~LLDragHandle();
virtual void setValue(const LLSD& value);
void setForeground(bool b) { mForeground = b; }
bool getForeground() const { return mForeground; }
void setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }
S32 getMaxTitleWidth() const { return mMaxTitleWidth; }
void setButtonsRect(const LLRect& rect){ mButtonsRect = rect; }
LLRect getButtonsRect() const { return mButtonsRect; }
void setTitleVisible(bool visible);
virtual void setTitle( const std::string& title ) = 0;
virtual std::string getTitle() const = 0;
virtual bool handleHover(S32 x, S32 y, MASK mask);
virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
virtual bool handleMouseUp(S32 x, S32 y, MASK mask);
protected:
LLDragHandle(const Params&);
friend class LLUICtrlFactory;
protected:
LLTextBox* mTitleBox;
private:
LLRect mButtonsRect;
S32 mDragLastScreenX;
S32 mDragLastScreenY;
S32 mLastMouseScreenX;
S32 mLastMouseScreenY;
LLCoordGL mLastMouseDir;
LLUIColor mDragHighlightColor;
LLUIColor mDragShadowColor;
S32 mMaxTitleWidth;
bool mForeground;
// Pixels near the edge to snap floaters.
static S32 sSnapMargin;
protected:
S32 mLabelVPadding; // <FS:Zi> Make vertical label padding a per-skin option
};
// Use this one for traditional top-of-window draggers
class LLDragHandleTop
: public LLDragHandle
{
protected:
LLDragHandleTop(const Params& p) : LLDragHandle(p) {}
friend class LLUICtrlFactory;
public:
virtual void setTitle( const std::string& title );
virtual std::string getTitle() const;
virtual void draw();
virtual void reshape(S32 width, S32 height, bool called_from_parent = true);
private:
void reshapeTitleBox();
};
// Use this for left-side, vertical text draggers
class LLDragHandleLeft
: public LLDragHandle
{
protected:
LLDragHandleLeft(const Params& p) : LLDragHandle(p) {}
friend class LLUICtrlFactory;
public:
virtual void setTitle( const std::string& title );
virtual std::string getTitle() const;
virtual void draw();
virtual void reshape(S32 width, S32 height, bool called_from_parent = true);
};
const S32 DRAG_HANDLE_HEIGHT = 16;
const S32 DRAG_HANDLE_WIDTH = 16;
#endif // LL_DRAGHANDLE_H