132 lines
4.4 KiB
C++
132 lines
4.4 KiB
C++
// This file is part of VSTGUI. It is subject to the license terms
|
|
// in the LICENSE file found in the top-level directory of this
|
|
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
|
|
|
|
#pragma once
|
|
|
|
#include "vstguifwd.h"
|
|
#include "cviewcontainer.h"
|
|
#include "viewlayouter/baseviewlayouter.h"
|
|
|
|
namespace VSTGUI {
|
|
class CSplitViewSeparatorView;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/** @brief a split container view with separators between its child views
|
|
@ingroup containerviews
|
|
@ingroup new_in_4_0
|
|
*/
|
|
//-----------------------------------------------------------------------------
|
|
class CSplitView : public CViewContainer
|
|
{
|
|
public:
|
|
enum Style {
|
|
/** subviews will be horizontally arranged */
|
|
kHorizontal,
|
|
/** subviews will be vertically arranged */
|
|
kVertical
|
|
};
|
|
|
|
/** Method how to resize the subviews if the size of the split view changes */
|
|
enum ResizeMethod {
|
|
/** only the first view will be resized */
|
|
kResizeFirstView,
|
|
/** only the second view will be resized */
|
|
kResizeSecondView,
|
|
/** only the last view will be resized */
|
|
kResizeLastView,
|
|
/** all views will be resized equally */
|
|
kResizeAllViews
|
|
};
|
|
|
|
CSplitView (const CRect& size, Style style = kHorizontal, CCoord separatorWidth = 10., ISplitViewSeparatorDrawer* drawer = nullptr);
|
|
~CSplitView () noexcept override = default;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @name CSplitView Methods
|
|
//-----------------------------------------------------------------------------
|
|
//@{
|
|
/** set the style of the split view, see @ref CSplitView::Style */
|
|
virtual void setStyle (Style s);
|
|
/** get the style of the split view, see @ref CSplitView::Style */
|
|
Style getStyle () const { return style; }
|
|
|
|
/** set the resize method, see @ref CSplitView::ResizeMethod */
|
|
virtual void setResizeMethod (ResizeMethod method);
|
|
/** get the resize method, see @ref CSplitView::ResizeMethod */
|
|
ResizeMethod getResizeMethod () const { return resizeMethod; }
|
|
|
|
/** set the width of the separators */
|
|
virtual void setSeparatorWidth (CCoord width);
|
|
/** get the width of the separators */
|
|
CCoord getSeparatorWidth () const { return separatorWidth; }
|
|
|
|
ISplitViewSeparatorDrawer* getDrawer ();
|
|
void storeViewSizes ();
|
|
|
|
bool addViewToSeparator (int32_t sepIndex, CView* view);
|
|
//@}
|
|
|
|
// overrides
|
|
bool addView (CView* pView, CView* pBefore = nullptr) override;
|
|
bool removeView (CView* pView, bool withForget = true) override;
|
|
bool removeAll (bool withForget = true) override;
|
|
void setViewSize (const CRect& rect, bool invalid = true) override;
|
|
bool sizeToFit () override;
|
|
bool removed (CView* parent) override;
|
|
bool attached (CView* parent) override;
|
|
|
|
bool requestNewSeparatorSize (CSplitViewSeparatorView* separatorView, CRect newSize);
|
|
//-----------------------------------------------------------------------------
|
|
protected:
|
|
struct SplitViewLayouter;
|
|
|
|
Style style;
|
|
ResizeMethod resizeMethod;
|
|
CCoord separatorWidth;
|
|
ISplitViewSeparatorDrawer* separatorDrawer;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/** @brief Split View Controller
|
|
|
|
controls the size of the subviews of the split view
|
|
|
|
Extension to IController
|
|
*/
|
|
//-----------------------------------------------------------------------------
|
|
class ISplitViewController
|
|
{
|
|
public:
|
|
virtual ~ISplitViewController () noexcept = default;
|
|
|
|
/** return the minimum and maximum size (width or height) of a view. */
|
|
virtual bool getSplitViewSizeConstraint (int32_t index, CCoord& minSize, CCoord& maxSize, CSplitView* splitView) = 0;
|
|
/** return the separator drawer. */
|
|
virtual ISplitViewSeparatorDrawer* getSplitViewSeparatorDrawer (CSplitView* splitView) = 0;
|
|
/** store the size of the view. */
|
|
virtual bool storeViewSize (int32_t index, const CCoord& size, CSplitView* splitView) = 0;
|
|
/** restore the size of the view. */
|
|
virtual bool restoreViewSize (int32_t index, CCoord& size, CSplitView* splitView) = 0;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/** TODO: Doc
|
|
*/
|
|
//-----------------------------------------------------------------------------
|
|
class ISplitViewSeparatorDrawer
|
|
{
|
|
public:
|
|
virtual ~ISplitViewSeparatorDrawer () noexcept = default;
|
|
|
|
enum Flags {
|
|
kMouseOver = 1 << 0,
|
|
kMouseDown = 1 << 1
|
|
};
|
|
/** TODO: Doc
|
|
*/
|
|
virtual void drawSplitViewSeparator (CDrawContext* context, const CRect& size, int32_t flags, int32_t index, CSplitView* splitView) = 0;
|
|
};
|
|
|
|
} // VSTGUI
|