/* ====================================================================
* Copyright (c) 2003-2006, Martin Hauner
* http://subcommander.tigris.org
*
* Subcommander is licensed as described in the file doc/COPYING, which
* you should have received as part of this distribution.
* ====================================================================
*/
#ifndef _SPLIT_LAYOUT_H
#define _SPLIT_LAYOUT_H
// qt
#include <qlayout.h>
// sys
#include <vector>
class SplitLayoutHandle
{
public:
virtual ~SplitLayoutHandle(){}
virtual void recalculate() = 0;
virtual int calcMovePos( int curX, int diffX ) = 0;
virtual int calcJumpPos( int curX ) = 0;
};
///////////////////////////////////////////////////////////////////////////////
typedef std::vector<QLayoutItem*> TLayoutItems;
class SplitLayoutIterator :public QGLayoutIterator
{
public:
SplitLayoutIterator( TLayoutItems* l ) : _idx(0), _items(l)
{
}
QLayoutItem *current()
{
return _idx < (int)_items->size() ? _items->at(_idx) : 0;
}
QLayoutItem *next()
{
_idx++;
return current();
}
QLayoutItem* takeCurrent()
{
return (*_items)[_idx];
}
private:
int _idx;
TLayoutItems* _items;
};
///////////////////////////////////////////////////////////////////////////////
class SplitLayout : public QLayout, public SplitLayoutHandle
{
public:
enum Pos
{
pOne = 0,
pHandle = 1,
pTwo = 2
};
SplitLayout( QWidget* parent, Pos );
virtual ~SplitLayout();
// SplitLayoutHandle
void recalculate();
int calcMovePos( int curPos, int diffPos );
int calcJumpPos( int curPos );
void addWidgetOne( QWidget* w, bool hide = false, int stretch = 1 );
void addWidgetTwo( QWidget* w, bool hide = false, int stretch = 1 );
void addItem(QLayoutItem *item);
void enableHandle( bool enable = true );
QSize sizeHint() const;
QSize minimumSize() const;
QLayoutIterator iterator();
void jumpPos( bool visible );
void setGeometry( const QRect &newRect );
void setHandlePos( int pos );
int getHandlePos() const;
protected:
virtual int getPos( const QRect& r ) const = 0;
virtual int getSize( const QRect& r ) const = 0;
virtual int getSize( const QSize& s ) const = 0;
virtual void adjustSize( QSize& out, const QSize& item ) const = 0;
virtual QRect calcRect( int pos, int size, const QRect& r ) const = 0;
TLayoutItems _items;
private:
int _stretchOne;
int _stretchTwo;
Pos _hide;
QRect _lastRect;
bool _initialized; // initial layout done?
int _handlePos; // -1 = unset
};
class HSplitLayout : public SplitLayout
{
public:
HSplitLayout( QWidget* parent, Pos pos = pOne );
int getPos( const QRect& r ) const;
int getSize( const QRect& r ) const;
int getSize( const QSize& s ) const;
void adjustSize( QSize& out, const QSize& item ) const;
QRect calcRect( int pos, int size, const QRect& r ) const;
};
class VSplitLayout : public SplitLayout
{
public:
VSplitLayout( QWidget* parent, Pos pos = pOne );
int getPos( const QRect& r ) const;
int getSize( const QRect& r ) const;
int getSize( const QSize& s ) const;
void adjustSize( QSize& out, const QSize& item ) const;
QRect calcRect( int pos, int size, const QRect& r ) const;
};
#endif // _SPLIT_LAYOUT_H
syntax highlighted by Code2HTML, v. 0.9.1