1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/* ====================================================================
* 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 <QtGui/QLayout>
// 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 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 enableHandle( bool enable = true );
void addItem(QLayoutItem *item);
QLayoutItem* itemAt( int index ) const;
QLayoutItem* takeAt( int index );
int count() const;
QSize sizeHint() const;
QSize minimumSize() const;
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
|