// 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 "../cbitmap.h" #include "../cdrawcontext.h" #include "../cgraphicspath.h" #include "../cvstguitimer.h" #include "../events.h" #include "cslider.h" #include namespace VSTGUI { //------------------------------------------------------------------------ bool CSliderBase::kAlwaysUseZoomFactor = false; //------------------------------------------------------------------------ struct CSliderBase::Impl { SharedPointer rampTimer; Styles style {}; float zoomFactor {10.f}; CSliderMode mode {CSliderMode::UseGlobal}; CPoint offsetHandle; CPoint handleSize {1., 1.}; CCoord rangeHandle {0.}; CCoord minTmp {0.}; CCoord maxTmp {0.}; CCoord minPos {0.}; // mouse editing values CPoint meStartPoint; float mePreviousVal; float meStartValue; CButtonState meOldButton; CCoord meDelta {0.}; static CSliderMode globalMode; }; //------------------------------------------------------------------------ CSliderMode CSliderBase::Impl::globalMode = CSliderMode::FreeClick; //------------------------------------------------------------------------ CSliderBase::CSliderBase (const CRect& size, IControlListener* listener, int32_t tag) : CControl (size, listener, tag) { impl = std::unique_ptr (new Impl); } //------------------------------------------------------------------------ CSliderBase::CSliderBase (const CSliderBase& v) : CControl (v) { impl = std::unique_ptr (new Impl (*v.impl)); } //------------------------------------------------------------------------ CSliderBase::~CSliderBase () noexcept { } //------------------------------------------------------------------------ void CSliderBase::setHandleRangePrivate (CCoord range) { impl->rangeHandle = range; updateInternalHandleValues (); } //------------------------------------------------------------------------ void CSliderBase::setHandleMinPosPrivate (CCoord pos) { impl->minPos = pos; updateInternalHandleValues (); } //------------------------------------------------------------------------ CCoord CSliderBase::getHandleMinPosPrivate () const { return impl->minPos; } //------------------------------------------------------------------------ void CSliderBase::setOffsetHandle (const CPoint& val) { impl->offsetHandle = val; updateInternalHandleValues (); } //------------------------------------------------------------------------ CPoint CSliderBase::getOffsetHandle () const { return impl->offsetHandle; } //------------------------------------------------------------------------ void CSliderBase::setHandleSizePrivate (CCoord width, CCoord height) { impl->handleSize.x = width; impl->handleSize.y = height; updateInternalHandleValues (); } //------------------------------------------------------------------------ CPoint CSliderBase::getHandleSizePrivate () const { return impl->handleSize; } //------------------------------------------------------------------------ CPoint CSliderBase::getControlSizePrivate () const { return {getWidth (), getHeight ()}; } //------------------------------------------------------------------------ void CSliderBase::setStyle (Styles _style) { vstgui_assert (((_style & kHorizontal) || (_style & kVertical)) && !((_style & kVertical) && (_style & kHorizontal))); impl->style = _style; } //------------------------------------------------------------------------ auto CSliderBase::getStyle () const -> Styles { return impl->style; } //------------------------------------------------------------------------ bool CSliderBase::isStyleHorizontal () const { return impl->style & kHorizontal; } //------------------------------------------------------------------------ bool CSliderBase::isStyleRight () const { return impl->style & kRight; } //------------------------------------------------------------------------ bool CSliderBase::isStyleBottom () const { return impl->style & kBottom; } //------------------------------------------------------------------------ bool CSliderBase::isInverseStyle () const { if (isStyleHorizontal ()) return getStyle () & kRight; return getStyle () & kTop; } //------------------------------------------------------------------------ void CSliderBase::setZoomFactor (float val) { impl->zoomFactor = val; } //------------------------------------------------------------------------ float CSliderBase::getZoomFactor () const { return impl->zoomFactor; } //------------------------------------------------------------------------ void CSliderBase::setSliderMode (CSliderMode newMode) { impl->mode = newMode; } //------------------------------------------------------------------------ CSliderMode CSliderBase::getSliderMode () const { return impl->mode; } //------------------------------------------------------------------------ CSliderMode CSliderBase::getEffectiveSliderMode () const { if (impl->mode == CSliderMode::UseGlobal) return Impl::globalMode; return impl->mode; } //------------------------------------------------------------------------ void CSliderBase::setGlobalMode (CSliderMode mode) { vstgui_assert (mode != CSliderMode::UseGlobal, "do not set the global mode to use global"); Impl::globalMode = mode; } //------------------------------------------------------------------------ CSliderMode CSliderBase::getGlobalMode () { return Impl::globalMode; } //------------------------------------------------------------------------ void CSliderBase::setViewSize (const CRect& rect, bool invalid) { CControl::setViewSize (rect, invalid); if (isStyleHorizontal ()) { impl->minPos = rect.left - getViewSize ().left; impl->rangeHandle = rect.getWidth () - (impl->handleSize.x + impl->offsetHandle.x * 2); } else { impl->minPos = rect.top - getViewSize ().top; impl->rangeHandle = rect.getHeight () - (impl->handleSize.y + impl->offsetHandle.y * 2); } updateInternalHandleValues (); } //------------------------------------------------------------------------ void CSliderBase::updateInternalHandleValues () { if (isStyleHorizontal ()) { impl->minTmp = impl->offsetHandle.x + impl->minPos; impl->maxTmp = impl->minTmp + impl->rangeHandle + impl->handleSize.x; } else { impl->minTmp = impl->offsetHandle.y + impl->minPos; impl->maxTmp = impl->minTmp + impl->rangeHandle + impl->handleSize.y; } } //------------------------------------------------------------------------ CRect CSliderBase::calculateHandleRect (float normValue) const { if (isStyleRight () || isStyleBottom ()) normValue = 1.f - normValue; CRect r; if (isStyleHorizontal ()) { r.top = impl->offsetHandle.y; r.bottom = r.top + impl->handleSize.y; r.left = impl->offsetHandle.x + floor (normValue * impl->rangeHandle); r.left = (r.left < impl->minTmp) ? impl->minTmp : r.left; r.right = r.left + impl->handleSize.x; r.right = (r.right > impl->maxTmp) ? impl->maxTmp : r.right; } else { r.left = impl->offsetHandle.x; r.right = r.left + impl->handleSize.x; r.top = impl->offsetHandle.y + floor (normValue * impl->rangeHandle); r.top = (r.top < impl->minTmp) ? impl->minTmp : r.top; r.bottom = r.top + impl->handleSize.y; r.bottom = (r.bottom > impl->maxTmp) ? impl->maxTmp : r.bottom; } r.offset (getViewSize ().left, getViewSize ().top); return r; } //------------------------------------------------------------------------ float CSliderBase::calculateDelta (const CPoint& where, CRect* handleRect) const { CCoord result; if (isStyleHorizontal ()) result = getViewSize ().left + impl->offsetHandle.x; else result = getViewSize ().top + impl->offsetHandle.y; if (getEffectiveSliderMode () != CSliderMode::FreeClick) { float normValue = getValueNormalized (); if (isStyleRight () || isStyleBottom ()) normValue = 1.f - normValue; CCoord actualPos; actualPos = result + (int32_t) (normValue * impl->rangeHandle); if (isStyleHorizontal ()) { if (handleRect) { handleRect->left = actualPos; handleRect->top = getViewSize ().top + impl->offsetHandle.y; handleRect->right = handleRect->left + impl->handleSize.x; handleRect->bottom = handleRect->top + impl->handleSize.y; } result += where.x - actualPos; } else { if (handleRect) { handleRect->left = getViewSize ().left + impl->offsetHandle.x; handleRect->top = actualPos; handleRect->right = handleRect->left + impl->handleSize.x; handleRect->bottom = handleRect->top + impl->handleSize.y; } result += where.y - actualPos; } } else { if (isStyleHorizontal ()) result += impl->handleSize.x / 2 - 1; else result += impl->handleSize.y / 2 - 1; } return (float)result; } //------------------------------------------------------------------------ void CSliderBase::doRamping () { float distance = 1.f; float normValue = getValueNormalized (); auto handleRect = calculateHandleRect (normValue); if (isStyleHorizontal ()) distance = impl->meStartPoint.x < handleRect.getCenter ().x ? -0.1f : 0.1f; else distance = impl->meStartPoint.y < handleRect.getCenter ().y ? 0.1f : -0.1f; if (isInverseStyle ()) distance *= -1.f; CCoord delta; if (isStyleHorizontal ()) delta = getViewSize ().left + impl->offsetHandle.x + impl->handleSize.x / 2 - 1; else delta = getViewSize ().top + impl->offsetHandle.y + impl->handleSize.y / 2 - 1; float clickValue; if (isStyleHorizontal ()) clickValue = (float)(impl->meStartPoint.x - delta) / (float)impl->rangeHandle; else clickValue = (float)(impl->meStartPoint.y - delta) / (float)impl->rangeHandle; if (isStyleRight () || isStyleBottom ()) clickValue = 1.f - clickValue; normValue += distance * getWheelInc (); if ((clickValue > normValue && distance < 0.f) || (clickValue < normValue && distance > 0.f)) { normValue = clickValue; impl->rampTimer = nullptr; impl->meDelta = delta; } setValueNormalized (normValue); if (isDirty ()) { valueChanged (); invalid (); } } //------------------------------------------------------------------------ CMouseEventResult CSliderBase::onMouseDown (CPoint& where, const CButtonState& buttons) { if (!(buttons & kLButton)) return kMouseEventNotHandled; invalidMouseWheelEditTimer (this); CRect handleRect; impl->meDelta = calculateDelta ( where, getEffectiveSliderMode () != CSliderMode::FreeClick ? &handleRect : nullptr); if (getEffectiveSliderMode () == CSliderMode::Touch && !handleRect.pointInside (where)) return kMouseDownEventHandledButDontNeedMovedOrUpEvents; impl->mePreviousVal = getMin () - 1; impl->meOldButton = buttons; if (getEffectiveSliderMode () == CSliderMode::Ramp && !handleRect.pointInside (where)) { impl->rampTimer = owned (new CVSTGUITimer ([this] (CVSTGUITimer*) { doRamping (); }, 16)); } impl->meStartValue = getValue (); beginEdit (); impl->meStartPoint = where; if (buttons & kZoomModifier) return kMouseEventHandled; return onMouseMoved (where, buttons); } //------------------------------------------------------------------------ CMouseEventResult CSliderBase::onMouseCancel () { if (isEditing ()) { value = impl->meStartValue; if (isDirty ()) { valueChanged (); invalid (); } impl->meOldButton = 0; impl->rampTimer = nullptr; endEdit (); } return kMouseEventHandled; } //------------------------------------------------------------------------ CMouseEventResult CSliderBase::onMouseUp (CPoint& where, const CButtonState& buttons) { if (isEditing ()) { impl->meOldButton = 0; impl->rampTimer = nullptr; endEdit (); } return kMouseEventHandled; } //------------------------------------------------------------------------ CMouseEventResult CSliderBase::onMouseMoved (CPoint& where, const CButtonState& _buttons) { if (_buttons.isLeftButton () && isEditing ()) { CButtonState buttons (_buttons); if (kAlwaysUseZoomFactor) buttons |= kZoomModifier; if (buttons.isLeftButton ()) { if (impl->rampTimer) { impl->meStartPoint = where; return kMouseEventHandled; } if (kAlwaysUseZoomFactor) { CCoord distance = fabs (isStyleHorizontal () ? where.y - impl->meStartPoint.y : where.x - impl->meStartPoint.x); float newZoomFactor = 1.f; if (distance > (isStyleHorizontal () ? getHeight () : getWidth ())) { newZoomFactor = (float)(distance / (isStyleHorizontal () ? getHeight () : getWidth ())); newZoomFactor = static_cast (newZoomFactor * 10.f) / 10.f; } if (impl->zoomFactor != newZoomFactor) { impl->zoomFactor = newZoomFactor; impl->mePreviousVal = (value - getMin ()) / getRange (); impl->meDelta = calculateDelta (where); } } if (impl->mePreviousVal == getMin () - 1) impl->mePreviousVal = (value - getMin ()) / getRange (); if ((impl->meOldButton != buttons) && (buttons & kZoomModifier)) { impl->mePreviousVal = (value - getMin ()) / getRange (); impl->meOldButton = buttons; } else if (!(buttons & kZoomModifier)) impl->mePreviousVal = (value - getMin ()) / getRange (); float normValue; if (isStyleHorizontal ()) normValue = (float)(where.x - impl->meDelta) / (float)impl->rangeHandle; else normValue = (float)(where.y - impl->meDelta) / (float)impl->rangeHandle; if (isStyleRight () || isStyleBottom ()) normValue = 1.f - normValue; if (buttons & kZoomModifier) normValue = impl->mePreviousVal + ((normValue - impl->mePreviousVal) / impl->zoomFactor); setValueNormalized (normValue); if (isDirty ()) { valueChanged (); invalid (); } } return kMouseEventHandled; } return kMouseEventNotHandled; } //------------------------------------------------------------------------ void CSliderBase::onMouseWheelEvent (MouseWheelEvent& event) { auto distance = isStyleHorizontal () ? event.deltaX : event.deltaY; if (distance == 0.) return; onMouseWheelEditing (this); if (isStyleHorizontal ()) distance *= -1.; if (isInverseStyle ()) distance *= -1.; float normValue = getValueNormalized (); if (buttonStateFromEventModifiers (event.modifiers) & kZoomModifier) normValue += 0.1f * static_cast (distance) * getWheelInc (); else normValue += static_cast (distance) * getWheelInc (); setValueNormalized (normValue); if (isDirty ()) { invalid (); valueChanged (); } event.consumed = true; } //------------------------------------------------------------------------ void CSliderBase::onKeyboardEvent (KeyboardEvent& event) { if (event.type != EventType::KeyDown) return; switch (event.virt) { case VirtualKey::Up: [[fallthrough]]; case VirtualKey::Right: [[fallthrough]]; case VirtualKey::Down: [[fallthrough]]; case VirtualKey::Left: { float distance = 1.f; bool isInverse = isInverseStyle (); if ((event.virt == VirtualKey::Down && !isInverse) || (event.virt == VirtualKey::Up && isInverse) || (event.virt == VirtualKey::Left && !isInverse) || (event.virt == VirtualKey::Right && isInverse)) { distance = -distance; } float normValue = getValueNormalized (); if (buttonStateFromEventModifiers (event.modifiers) & kZoomModifier) normValue += 0.1f * distance * getWheelInc (); else normValue += distance * getWheelInc (); setValueNormalized (normValue); if (isDirty ()) { invalid (); // begin of edit parameter beginEdit (); valueChanged (); // end of edit parameter endEdit (); } event.consumed = true; } case VirtualKey::Escape: { if (isEditing ()) { onMouseCancel (); event.consumed = true; } break; } default: break; } } //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ struct CSlider::Impl { CPoint backgroundOffset; SharedPointer pHandle; CCoord frameWidth {1.}; int32_t drawStyle {0}; CColor frameColor {kGreyCColor}; CColor backColor {kBlackCColor}; CColor valueColor {kWhiteCColor}; }; //------------------------------------------------------------------------ // CSlider //------------------------------------------------------------------------ /*! @class CSlider Define a slider with a given background and handle. The range of variation of the handle should be defined. By default the handler is drawn with transparency. By clicking Alt+Left Mouse the default value is used. */ //------------------------------------------------------------------------ /** * CSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param iMinPos min position in pixel * @param iMaxPos max position in pixel * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kBottom,kRight,kTop,kLeft,kHorizontal,kVertical) */ //------------------------------------------------------------------------ CSlider::CSlider (const CRect& rect, IControlListener* listener, int32_t tag, int32_t iMinPos, int32_t iMaxPos, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSliderBase (rect, listener, tag) { impl = std::unique_ptr (new Impl); setBackgroundOffset (offset); setBackground (background); setStyle (style); setHandle (handle); if (style & kHorizontal) { setHandleMinPosPrivate (iMinPos - getViewSize ().left); setHandleRangePrivate ((CCoord)iMaxPos - iMinPos); } else { setHandleMinPosPrivate (iMinPos - getViewSize ().top); setHandleRangePrivate ((CCoord)iMaxPos - iMinPos); } setWantsFocus (true); } //------------------------------------------------------------------------ /** * CSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param offsetHandle handle offset * @param _rangeHandle size of handle range * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kBottom,kRight,kTop,kLeft,kHorizontal,kVertical) */ //------------------------------------------------------------------------ CSlider::CSlider (const CRect& rect, IControlListener* listener, int32_t tag, const CPoint& offsetHandle, int32_t _rangeHandle, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSliderBase (rect, listener, tag) { impl = std::unique_ptr (new Impl); setBackgroundOffset (offset); setBackground (background); setStyle (style); setHandle (handle); if (isStyleHorizontal ()) setHandleRangePrivate (_rangeHandle - getHandleSizePrivate ().x); else setHandleRangePrivate (_rangeHandle - getHandleSizePrivate ().y); setOffsetHandle (offsetHandle); setWantsFocus (true); } //------------------------------------------------------------------------ CSlider::CSlider (const CSlider& v) : CSliderBase (v) { impl = std::unique_ptr (new Impl (*v.impl)); } //------------------------------------------------------------------------ CSlider::~CSlider () noexcept { } #if VSTGUI_ENABLE_DEPRECATED_METHODS //------------------------------------------------------------------------ void CSlider::setOffset (const CPoint& val) { setBackgroundOffset (val); } //------------------------------------------------------------------------ CPoint CSlider::getOffset () const { return getBackgroundOffset (); } #endif //------------------------------------------------------------------------ bool CSlider::sizeToFit () { if (getDrawBackground ()) { CRect vs (getViewSize ()); vs.setWidth (getDrawBackground ()->getWidth ()); vs.setHeight (getDrawBackground ()->getHeight ()); setViewSize (vs, true); setMouseableArea (vs); return true; } return false; } //------------------------------------------------------------------------ void CSlider::setBackgroundOffset (const CPoint& offset) { impl->backgroundOffset = offset; } //------------------------------------------------------------------------ CPoint CSlider::getBackgroundOffset () const { return impl->backgroundOffset; } //------------------------------------------------------------------------ void CSlider::draw (CDrawContext* pContext) { CDrawContext* drawContext = pContext; // draw background if (getDrawBackground ()) { CRect rect (0, 0, getControlSizePrivate ().x, getControlSizePrivate ().y); rect.offset (getViewSize ().left, getViewSize ().top); getDrawBackground ()->draw (drawContext, rect, getBackgroundOffset ()); } if (impl->drawStyle != 0) { auto lineWidth = getFrameWidth (); if (lineWidth < 0.) lineWidth = pContext->getHairlineSize (); CRect r (getViewSize ()); pContext->setDrawMode (kAntiAliasing); pContext->setLineStyle (kLineSolid); pContext->setLineWidth (lineWidth); if (impl->drawStyle & kDrawFrame || impl->drawStyle & kDrawBack) { pContext->setFrameColor (impl->frameColor); pContext->setFillColor (impl->backColor); if (auto path = owned (pContext->createGraphicsPath ())) { if (impl->drawStyle & kDrawFrame) r.inset (lineWidth / 2., lineWidth / 2.); path->addRect (r); if (impl->drawStyle & kDrawBack) pContext->drawGraphicsPath (path, CDrawContext::kPathFilled); if (impl->drawStyle & kDrawFrame) pContext->drawGraphicsPath (path, CDrawContext::kPathStroked); } else { CDrawStyle d = kDrawFilled; if (impl->drawStyle & kDrawFrame && impl->drawStyle & kDrawBack) d = kDrawFilledAndStroked; else if (impl->drawStyle & kDrawFrame) d = kDrawStroked; pContext->drawRect (r, d); } } if (impl->drawStyle & kDrawValue) { pContext->setDrawMode (kAliasing); if (impl->drawStyle & kDrawFrame) r.inset (lineWidth / 2., lineWidth / 2.); float drawValue = getValueNormalized (); if (impl->drawStyle & kDrawValueFromCenter) { if (impl->drawStyle & kDrawInverted) drawValue = 1.f - drawValue; if (getStyle () & kHorizontal) { CCoord width = r.getWidth (); r.right = r.left + r.getWidth () * drawValue; r.left += width / 2.; r.normalize (); } else { CCoord height = r.getHeight (); r.bottom = r.top + r.getHeight () * drawValue; r.top += height / 2.; r.normalize (); } } else { if (getStyle () & kHorizontal) { if (impl->drawStyle & kDrawInverted) r.left = r.right - r.getWidth () * drawValue; else r.right = r.left + r.getWidth () * drawValue; } else { if (impl->drawStyle & kDrawInverted) r.bottom = r.top + r.getHeight () * drawValue; else r.top = r.bottom - r.getHeight () * drawValue; } } r.normalize (); if (r.getWidth () >= 0.5 && r.getHeight () >= 0.5) { pContext->setFillColor (impl->valueColor); if (auto path = owned (pContext->createGraphicsPath ())) { path->addRect (r); pContext->drawGraphicsPath (path, CDrawContext::kPathFilled); } else pContext->drawRect (r, kDrawFilled); } } } if (impl->pHandle) { // calc new coords of slider CRect rectNew = calculateHandleRect (getValueNormalized ()); // draw slider at new position impl->pHandle->draw (drawContext, rectNew); } setDirty (false); } //------------------------------------------------------------------------ void CSlider::setHandle (CBitmap* _pHandle) { impl->pHandle = _pHandle; if (impl->pHandle) { setHandleSizePrivate (impl->pHandle->getWidth (), impl->pHandle->getHeight ()); setViewSize (getViewSize (), true); } else { setHandleSizePrivate (1., 1.); } } //------------------------------------------------------------------------ CBitmap* CSlider::getHandle () const { return impl->pHandle; } //------------------------------------------------------------------------ void CSlider::setDrawStyle (int32_t style) { if (style != impl->drawStyle) { impl->drawStyle = style; invalid (); } } //------------------------------------------------------------------------ void CSlider::setFrameWidth (CCoord width) { if (impl->frameWidth != width) { impl->frameWidth = width; invalid (); } } //------------------------------------------------------------------------ void CSlider::setFrameColor (CColor color) { if (color != impl->frameColor) { impl->frameColor = color; invalid (); } } //------------------------------------------------------------------------ void CSlider::setBackColor (CColor color) { if (color != impl->backColor) { impl->backColor = color; invalid (); } } //------------------------------------------------------------------------ void CSlider::setValueColor (CColor color) { if (color != impl->valueColor) { impl->valueColor = color; invalid (); } } //------------------------------------------------------------------------ int32_t CSlider::getDrawStyle () const { return impl->drawStyle; } //------------------------------------------------------------------------ CCoord CSlider::getFrameWidth () const { return impl->frameWidth; } //------------------------------------------------------------------------ CColor CSlider::getFrameColor () const { return impl->frameColor; } //------------------------------------------------------------------------ CColor CSlider::getBackColor () const { return impl->backColor; } //------------------------------------------------------------------------ CColor CSlider::getValueColor () const { return impl->valueColor; } //------------------------------------------------------------------------ // CVerticalSlider //------------------------------------------------------------------------ /*! @class CVerticalSlider This is the vertical slider. See CSlider. */ //------------------------------------------------------------------------ /** * CVerticalSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param iMinPos min position in pixel * @param iMaxPos max position in pixel * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kLeft, kRight) */ //------------------------------------------------------------------------ CVerticalSlider::CVerticalSlider (const CRect& rect, IControlListener* listener, int32_t tag, int32_t iMinPos, int32_t iMaxPos, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSlider (rect, listener, tag, iMinPos, iMaxPos, handle, background, offset, style | kVertical) { } //------------------------------------------------------------------------ /** * CVerticalSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param offsetHandle handle offset * @param rangeHandle size of handle range * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kLeft, kRight) */ //------------------------------------------------------------------------ CVerticalSlider::CVerticalSlider (const CRect& rect, IControlListener* listener, int32_t tag, const CPoint& offsetHandle, int32_t rangeHandle, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSlider (rect, listener, tag, offsetHandle, rangeHandle, handle, background, offset, style | kVertical) { } //------------------------------------------------------------------------ // CHorizontalSlider //------------------------------------------------------------------------ /*! @class CHorizontalSlider This is the horizontal slider. See CSlider. */ //------------------------------------------------------------------------ /** * CHorizontalSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param iMinPos min position in pixel * @param iMaxPos max position in pixel * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kLeft, kRight) */ //------------------------------------------------------------------------ CHorizontalSlider::CHorizontalSlider (const CRect& rect, IControlListener* listener, int32_t tag, int32_t iMinPos, int32_t iMaxPos, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSlider (rect, listener, tag, iMinPos, iMaxPos, handle, background, offset, style | kHorizontal) { } //------------------------------------------------------------------------ /** * CHorizontalSlider constructor. * @param rect the size of this view * @param listener the listener * @param tag the control tag * @param offsetHandle handle offset * @param rangeHandle size of handle range * @param handle bitmap of the slider * @param background bitmap of the background * @param offset offset of the background * @param style style (kLeft, kRight) */ //------------------------------------------------------------------------ CHorizontalSlider::CHorizontalSlider (const CRect& rect, IControlListener* listener, int32_t tag, const CPoint& offsetHandle, int32_t rangeHandle, CBitmap* handle, CBitmap* background, const CPoint& offset, Styles style) : CSlider (rect, listener, tag, offsetHandle, rangeHandle, handle, background, offset, style | kHorizontal) { } } // VSTGUI