Blob Blame Raw


#ifndef FREE_LAYOUT_H
#define FREE_LAYOUT_H

// TnzCore includes
#include "tcommon.h"

// Qt includes
#include <QList>
#include <QLayout>
#include <QWidget>

#undef DVAPI
#undef DVVAR
#ifdef TOONZQT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

//************************************************************************************
//    DummyLayout   declaration
//************************************************************************************

/*!
  \brief    The DummyLayout class implements a layout whose items' geometry is not
            enforced at all, ignoring parent size bounds or geometry.

  \details  A DummyLayout serves as a simple, inert container of layout items.
            It does not enforce geometry to items added to it, allowing objects
            using this layout to appear as a 'viewport' for free-geometry items.

  \note     As this layout does not effectively manage its objects' geometry, these
            must be managed outside.
*/

class DVAPI DummyLayout : public QLayout
{
public:
	DummyLayout();
	virtual ~DummyLayout();

	QSize sizeHint() const;

	QSize minimumSize() const { return QSize(0, 0); }
	QSize maximumSize() const { return QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); }

	int count() const { return m_items.count(); }
	void addItem(QLayoutItem *item) { m_items.push_back(item); }
	QLayoutItem *itemAt(int index) const { return (index < count()) ? m_items.at(index) : 0; }
	QLayoutItem *takeAt(int index) { return (index < count()) ? m_items.takeAt(index) : 0; }

	void setGeometry(const QRect &r) {}
	//Qt::Orientations	expandingDirections () const { return Qt::Orientations(); }

protected:
	QList<QLayoutItem *> m_items;
};

//************************************************************************************
//    FreeLayout   declaration
//************************************************************************************

/*!
  \brief    The FreeLayout class implements a layout whose items can be freely
            positioned, ignoring parent size bounds or geometry.

  \details  A FreeLayout instance can be used to achieve results similar to that
            of a QScrollArea, with a more straightforward API and without restriction
            to just one item at a time. Please observe that layouts can be inserted too.

            Specifically, FreeLayout is a convenience subclass of DummyLayout whose items'
            sizes are enforced to their sizeHint() - in order to spare users from having to deal
            with it externally. This complies with the idea that its items are comfortly
            free to adapt to their preferred size, as it would be in a scrollable environment.
*/

class FreeLayout : public DummyLayout
{
public:
	FreeLayout() : DummyLayout() {}
	~FreeLayout() {}

	void setGeometry(const QRect &r);
};

#endif // FREE_LAYOUT_H