157 lines
5.2 KiB
C++
157 lines
5.2 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 "iviewlistener.h"
|
|
#include "controls/icontrollistener.h"
|
|
|
|
namespace VSTGUI {
|
|
class CScrollContainer;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CScrollView Declaration
|
|
//! @brief a scrollable container view with scrollbars
|
|
/// @ingroup containerviews
|
|
//-----------------------------------------------------------------------------
|
|
class CScrollView : public CViewContainer, public IControlListener, public ViewListenerAdapter
|
|
{
|
|
protected:
|
|
enum
|
|
{
|
|
kHorizontalScrollbarFlag,
|
|
kVerticalScrollbarFlag,
|
|
kDontDrawFrameFlag,
|
|
kAutoDragScollingFlag,
|
|
kOverlayScrollbarsFlag,
|
|
kFollowFocusViewFlag,
|
|
kAutoHideScrollbarsFlag,
|
|
|
|
kLastScrollViewStyleFlag
|
|
};
|
|
|
|
public:
|
|
CScrollView (const CRect& size, const CRect& containerSize, int32_t style,
|
|
CCoord scrollbarWidth = 16, CBitmap* pBackground = nullptr);
|
|
|
|
/** Scroll View Style Flags */
|
|
enum CScrollViewStyle
|
|
{
|
|
/** add a horizontal scrollbar */
|
|
kHorizontalScrollbar = 1 << kHorizontalScrollbarFlag,
|
|
/** add a vertical scrollbar */
|
|
kVerticalScrollbar = 1 << kVerticalScrollbarFlag,
|
|
/** don't draw frame */
|
|
kDontDrawFrame = 1 << kDontDrawFrameFlag,
|
|
/** automatic scrolling for drag moves */
|
|
kAutoDragScrolling = 1 << kAutoDragScollingFlag,
|
|
/** scrollbars are overlayed of the content */
|
|
kOverlayScrollbars = 1 << kOverlayScrollbarsFlag,
|
|
/** scroll to focus view when focus view changes */
|
|
kFollowFocusView = 1 << kFollowFocusViewFlag,
|
|
/** automatically hides the scrollbar if the container size is smaller than the size of the scrollview */
|
|
kAutoHideScrollbars = 1 << kAutoHideScrollbarsFlag
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @name CScrollView Methods
|
|
//-----------------------------------------------------------------------------
|
|
//@{
|
|
int32_t getStyle () const;
|
|
void setStyle (int32_t newStyle);
|
|
|
|
int32_t getActiveScrollbars () const;
|
|
|
|
CCoord getScrollbarWidth () const;
|
|
void setScrollbarWidth (CCoord width);
|
|
|
|
/** set the virtual size of this container */
|
|
virtual void setContainerSize (const CRect& cs, bool keepVisibleArea = false);
|
|
const CRect& getContainerSize () const;
|
|
/** get scroll offset */
|
|
const CPoint& getScrollOffset () const;
|
|
/** set scroll offset */
|
|
void setScrollOffset (CPoint newOffset);
|
|
void resetScrollOffset ();
|
|
|
|
/** get the vertical scrollbar */
|
|
CScrollbar* getVerticalScrollbar () const;
|
|
/** get the horizontal scrollbar */
|
|
CScrollbar* getHorizontalScrollbar () const;
|
|
|
|
/** set scrollview to show rect */
|
|
virtual void makeRectVisible (const CRect& rect);
|
|
|
|
/** calculate the maximum rect where the scrollbars are inactive */
|
|
CRect calculateOptimalContainerSize () const;
|
|
|
|
/** returns the visible rect of the client */
|
|
CRect getVisibleClientRect () const;
|
|
|
|
enum class Edge
|
|
{
|
|
Top,
|
|
Left,
|
|
};
|
|
/** set a static edge view
|
|
*
|
|
* An edge view can be set for the top and left edge. The top edge view will have the same
|
|
* width as the scroll view. The bottom of the left edge view will always be the bottom
|
|
* of the scroll view and its top will either be the bottom of the top edge view or the top of
|
|
* the scroll view itself.
|
|
*
|
|
* @param edge the edge where to place the view
|
|
* @param view the view to set (if this is a nullptr then the previously set view is removed)
|
|
*
|
|
* @ingroup new_in_4_15
|
|
*/
|
|
void setEdgeView (Edge edge, CView* view);
|
|
CView* getEdgeView (Edge edge) const;
|
|
//@}
|
|
|
|
// overwrite
|
|
bool attached (CView* parent) override;
|
|
bool addView (CView* pView, CView* pBefore = nullptr) override;
|
|
bool removeView (CView* pView, bool withForget = true) override;
|
|
bool removeAll (bool withForget = true) override;
|
|
uint32_t getNbViews () const override;
|
|
CView* getView (uint32_t index) const override;
|
|
bool changeViewZOrder (CView* view, uint32_t newIndex) override;
|
|
void drawBackgroundRect (CDrawContext* pContext, const CRect& _updateRect) override;
|
|
void onMouseWheelEvent (MouseWheelEvent& event) override;
|
|
void valueChanged (CControl* pControl) override;
|
|
void setTransparency (bool val) override;
|
|
void setBackgroundColor (const CColor& color) override;
|
|
void setViewSize (const CRect& rect, bool invalid = true) override;
|
|
void setAutosizeFlags (int32_t flags) override;
|
|
CMessageResult notify (CBaseObject* sender, IdStringPtr message) override;
|
|
|
|
CLASS_METHODS_NOCOPY (CScrollView, CViewContainer)
|
|
//-----------------------------------------------------------------------------
|
|
protected:
|
|
~CScrollView () noexcept override;
|
|
|
|
void recalculateLayout ();
|
|
void preLayouting () const;
|
|
void syncScrollbars (bool keepVisibleArea);
|
|
void syncHScrollbar (bool keepVisibleArea);
|
|
void syncVScrollbar (bool keepVisibleArea);
|
|
|
|
void viewSizeChanged (CView* view, const CRect& oldSize) override;
|
|
void viewWillDelete (CView* view) override;
|
|
|
|
CScrollContainer* getScrollContainer () const;
|
|
|
|
static constexpr int32_t kHSBTag = 0;
|
|
static constexpr int32_t kVSBTag = 1;
|
|
|
|
private:
|
|
struct Impl;
|
|
std::unique_ptr<Impl> impl;
|
|
};
|
|
|
|
} // VSTGUI
|