172 lines
4.7 KiB
C++
172 lines
4.7 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
|
|
|
|
#include "cgradientview.h"
|
|
#include "cdrawcontext.h"
|
|
#include "cgraphicspath.h"
|
|
|
|
namespace VSTGUI {
|
|
|
|
//-----------------------------------------------------------------------------
|
|
CGradientView::CGradientView (const CRect& size)
|
|
: CView (size)
|
|
{
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CGradientView::attributeChanged ()
|
|
{
|
|
invalid ();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setGradientStyle (GradientStyle style)
|
|
{
|
|
if (gradientStyle != style)
|
|
{
|
|
gradientStyle = style;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CGradientView::setGradient (CGradient* newGradient)
|
|
{
|
|
if (gradient != newGradient)
|
|
{
|
|
gradient = newGradient;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setFrameColor (const CColor& newColor)
|
|
{
|
|
if (newColor != frameColor)
|
|
{
|
|
frameColor = newColor;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setGradientAngle (double angle)
|
|
{
|
|
if (angle != gradientAngle)
|
|
{
|
|
gradientAngle = angle;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setRoundRectRadius (CCoord radius)
|
|
{
|
|
if (radius != roundRectRadius)
|
|
{
|
|
roundRectRadius = radius;
|
|
path = nullptr;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setFrameWidth (CCoord width)
|
|
{
|
|
if (width != frameWidth)
|
|
{
|
|
frameWidth = width;
|
|
path = nullptr;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setDrawAntialiased (bool state)
|
|
{
|
|
if (state != drawAntialiased)
|
|
{
|
|
drawAntialiased = state;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setRadialCenter (const CPoint& center)
|
|
{
|
|
if (radialCenter != center)
|
|
{
|
|
radialCenter = center;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setRadialRadius (CCoord radius)
|
|
{
|
|
if (radialRadius != radius)
|
|
{
|
|
radialRadius = radius;
|
|
attributeChanged ();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::setViewSize (const CRect& rect, bool invalid)
|
|
{
|
|
if (rect != getViewSize ())
|
|
{
|
|
CView::setViewSize (rect, invalid);
|
|
path = nullptr;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGradientView::draw (CDrawContext* context)
|
|
{
|
|
auto lineWidth = getFrameWidth ();
|
|
if (lineWidth < 0.)
|
|
lineWidth = context->getHairlineSize ();
|
|
if (path == nullptr)
|
|
{
|
|
CRect r = getViewSize ();
|
|
r.inset (lineWidth / 2., lineWidth / 2.);
|
|
path = owned (context->createRoundRectGraphicsPath (r, roundRectRadius));
|
|
}
|
|
if (path && gradient)
|
|
{
|
|
context->setDrawMode (drawAntialiased ? kAntiAliasing : kAliasing);
|
|
|
|
if (gradientStyle == kLinearGradient)
|
|
{
|
|
CPoint colorStartPoint (0, 0);
|
|
colorStartPoint.x = getViewSize ().left + getViewSize ().getWidth () / 2 + cos (radians (gradientAngle-90)) * getViewSize ().getWidth () / 2;
|
|
colorStartPoint.y = getViewSize ().top + getViewSize ().getHeight () / 2 + sin (radians (gradientAngle-90)) * getViewSize ().getHeight () / 2;
|
|
CPoint colorEndPoint (0, getViewSize ().getHeight ());
|
|
colorEndPoint.x = getViewSize ().left + getViewSize ().getWidth () / 2 + cos (radians (gradientAngle+90)) * getViewSize ().getWidth () / 2;
|
|
colorEndPoint.y = getViewSize ().top + getViewSize ().getHeight () / 2 + sin (radians (gradientAngle+90)) * getViewSize ().getHeight () / 2;
|
|
context->fillLinearGradient (path, *gradient, colorStartPoint, colorEndPoint, false);
|
|
}
|
|
else
|
|
{
|
|
CPoint center (radialCenter);
|
|
center.x *= getViewSize ().getWidth ();
|
|
center.y *= getViewSize ().getHeight ();
|
|
center.offset (getViewSize ().left, getViewSize ().top);
|
|
context->fillRadialGradient (path, *gradient, center, radialRadius * std::max (getViewSize ().getWidth (), getViewSize ().getHeight ()));
|
|
}
|
|
|
|
if (frameColor.alpha != 0 && lineWidth > 0.)
|
|
{
|
|
context->setDrawMode (drawAntialiased ? kAntiAliasing : kAliasing);
|
|
context->setFrameColor (frameColor);
|
|
context->setLineWidth (lineWidth);
|
|
context->setLineStyle (kLineSolid);
|
|
context->drawGraphicsPath (path, CDrawContext::kPathStroked);
|
|
}
|
|
}
|
|
}
|
|
|
|
} // VSTGUI
|