//------------------------------------------------------------------------------
// emSplitter.h
//
// Copyright (C) 2005-2010,2014,2016 Oliver Hamann.
//
// Homepage: http://eaglemode.sourceforge.net/
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License version 3 as published by the
// Free Software Foundation.
//
// This program 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 General Public License version 3 for
// more details.
//
// You should have received a copy of the GNU General Public License version 3
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//------------------------------------------------------------------------------
#ifndef emSplitter_h
#define emSplitter_h
#ifndef emBorder_h
#include <emCore/emBorder.h>
#endif
//==============================================================================
//================================= emSplitter =================================
//==============================================================================
class emSplitter : public emBorder {
public:
// Class for a splitter panel. Such a panel can get two child panels
// which are laid out automatically, either horizontally or vertically,
// filling the whole content area. Between the two child panels is a
// grip which can be dragged by the user, for making one of the panels
// larger while the other gets smaller.
emSplitter(
ParentArg parent, const emString & name,
const emString & caption=emString(),
const emString & description=emString(),
const emImage & icon=emImage(),
bool vertical=false, double minPos=0.0, double maxPos=1.0,
double pos=0.5
);
// Constructor.
// Arguments:
// parent - Parent for this panel (emPanel or emView).
// name - The name for this panel.
// caption - The label's caption, or empty.
// description - The label's description, or empty.
// icon - The label's icon, or empty.
// vertical - See SetVertical.
// minPos - See SetMinMaxPos.
// maxPos - See SetMinMaxPos.
// pos - See SetPos.
virtual ~emSplitter();
// Destructor.
bool IsVertical() const;
void SetVertical(bool vertical=true);
// Whether the child panels are laid out left-right (false) or
// on top of each other (true).
double GetMinPos() const;
double GetMaxPos() const;
double GetPos() const;
void SetMinMaxPos(double minPos, double maxPos);
void SetPos(double pos);
// Get/set minimum, maximum and current position of the grip.
// The position ranges from 0.0 to 1.0 (0.0 = first child panel
// collapsed, 1.0 = second child panel collapsed).
const emSignal & GetPosSignal() const;
// This signal is signaled after each change of the grip
// position.
protected:
virtual void Input(emInputEvent & event, const emInputState & state,
double mx, double my);
virtual emCursor GetCursor() const;
virtual void PaintContent(
const emPainter & painter, double x, double y, double w,
double h, emColor canvasColor
) const;
virtual void LayoutChildren();
private:
void CalcGripRect(
double contentX, double contentY, double contentW,
double contentH, double * pX, double * pY, double * pW,
double * pH
) const;
bool Vertical;
double MinPos;
double MaxPos;
double Pos;
emSignal PosSignal;
bool Pressed;
double MousePosInGrip;
bool MouseInGrip;
};
inline bool emSplitter::IsVertical() const
{
return Vertical;
}
inline double emSplitter::GetMinPos() const
{
return MinPos;
}
inline double emSplitter::GetMaxPos() const
{
return MaxPos;
}
inline double emSplitter::GetPos() const
{
return Pos;
}
inline const emSignal & emSplitter::GetPosSignal() const
{
return PosSignal;
}
#endif