diff options
Diffstat (limited to 'muse2/awl/slider.cpp')
-rw-r--r-- | muse2/awl/slider.cpp | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/muse2/awl/slider.cpp b/muse2/awl/slider.cpp new file mode 100644 index 00000000..7686e850 --- /dev/null +++ b/muse2/awl/slider.cpp @@ -0,0 +1,251 @@ +//============================================================================= +// Awl +// Audio Widget Library +// $Id:$ +// +// Copyright (C) 2002-2006 by Werner Schweer and others +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +//============================================================================= + +#include "slider.h" + +namespace Awl { + +//--------------------------------------------------------- +// Slider +//--------------------------------------------------------- + +Slider::Slider(QWidget* parent) + : AbstractSlider(parent), orient(Qt::Vertical), _sliderSize(14,14) + { + init(); + } + +//--------------------------------------------------------- +// Slider +//--------------------------------------------------------- + +Slider::Slider(Qt::Orientation orientation, QWidget* parent) + : AbstractSlider(parent), orient(orientation), _sliderSize(14,14) + { + init(); + } + +//--------------------------------------------------------- +// Slider +//--------------------------------------------------------- + +void Slider::init() + { + if (orient == Qt::Vertical) + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + else + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + dragMode = false; + points = 0; + updateKnob(); + } + +//--------------------------------------------------------- +// sizeHint +//--------------------------------------------------------- + +QSize Slider::sizeHint() const + { + int w = _sliderSize.width() + scaleWidth(); + return orient == Qt::Vertical ? QSize(w, 200) : QSize(200, w); + } + +//--------------------------------------------------------- +// Slider +//--------------------------------------------------------- + +Slider::~Slider() + { + if (points) + delete points; + } + +//--------------------------------------------------------- +// setOrientation +//--------------------------------------------------------- + +void Slider::setOrientation(Qt::Orientation o) + { + orient = o; + updateKnob(); + update(); + } + +//--------------------------------------------------------- +// updateKnob +//--------------------------------------------------------- + +void Slider::updateKnob() + { + if (points) + delete points; + points = new QPainterPath; + int kh = _sliderSize.height(); + int kw = _sliderSize.width(); + points->moveTo(0.0, 0.0); + if (orient == Qt::Vertical) { + int kh = _sliderSize.height(); + int kh2 = kh / 2; + points->lineTo(kw, -kh2); + points->lineTo(kw, kh2); + } + else { + int kw2 = kw/2; + points->lineTo(-kw2, kh); + points->lineTo(kw2, kh); + } + points->lineTo(0.0, 0.0); + } + +//--------------------------------------------------------- +// setInvertedAppearance +//--------------------------------------------------------- + +void Slider::setInvertedAppearance(bool val) + { + AbstractSlider::setInvertedAppearance(val); + update(); + } + +//--------------------------------------------------------- +// setSliderSize +//--------------------------------------------------------- + +void Slider::setSliderSize(const QSize& s) + { + _sliderSize = s; + update(); + } + +//--------------------------------------------------------- +// mousePressEvent +//--------------------------------------------------------- + +void Slider::mousePressEvent(QMouseEvent* ev) + { + startDrag = ev->pos(); +// if (points->boundingRect().toRect().contains(startDrag)) { + emit sliderPressed(_id); + dragMode = true; + int pixel = (orient == Qt::Vertical) ? height() - _sliderSize.height() : width() - _sliderSize.width(); + dragppos = int(pixel * (_value - minValue()) / (maxValue() - minValue())); + if (_invert) + dragppos = pixel - dragppos; +// } + } + +//--------------------------------------------------------- +// mouseReleaseEvent +//--------------------------------------------------------- + +void Slider::mouseReleaseEvent(QMouseEvent*) + { + if (dragMode) { + emit sliderReleased(_id); + dragMode = false; + } + } + +//--------------------------------------------------------- +// mouseMoveEvent +//--------------------------------------------------------- + +void Slider::mouseMoveEvent(QMouseEvent* ev) + { + if (!dragMode) + return; + int delta = startDrag.y() - ev->y(); + +// if (_invert) +// delta = -delta; + if (orient == Qt::Horizontal) + delta = -delta; + int ppos = dragppos + delta; + if (ppos < 0) + ppos = 0; + + int pixel = (orient == Qt::Vertical) ? height() - _sliderSize.height() : width() - _sliderSize.width(); + if (ppos > pixel) + ppos = pixel; + int pos = _invert ? (pixel - ppos) : ppos; + _value = (pos * (maxValue() - minValue()) / pixel) + minValue() - 0.000001; + update(); + valueChange(); + } + +//--------------------------------------------------------- +// paint +// r - phys coord system +//--------------------------------------------------------- + +void Slider::paintEvent(QPaintEvent* ev) + { + int h = height(); + int w = width(); + int kw = _sliderSize.width(); + int kh = _sliderSize.height(); + int pixel = (orient == Qt::Vertical) ? h - kh : w - kw; + double range = maxValue() - minValue(); + int ppos = int(pixel * (_value - minValue()) / range); + if ((orient == Qt::Vertical && _invert) || (orient == Qt::Horizontal && !_invert)) + ppos = pixel - ppos; + + QRect rr(ev->rect()); + QPainter p(this); + + QColor sc(isEnabled() ? _scaleColor : Qt::gray); + QColor svc(isEnabled() ? _scaleValueColor : Qt::gray); + p.setBrush(svc); + + int kh2 = kh/2; + + //--------------------------------------------------- + // draw scale + //--------------------------------------------------- + + if (orient == Qt::Vertical) { + int xm = (w - _scaleWidth - _sliderSize.height()) / 2; + int y1 = kh2; + int y2 = h - (ppos + y1); + int y3 = h - y1; + p.fillRect(xm, y1, _scaleWidth, y2-y1, _invert ? svc : sc); + p.fillRect(xm, y2, _scaleWidth, y3-y2, _invert ? sc : svc); + p.translate(QPointF(xm + _scaleWidth/2, y2)); + } + else { + int ym = (h - _scaleWidth - _sliderSize.height()) / 2; + int x1 = kh2; + int x2 = w - (ppos + x1); + int x3 = w - x1; + p.fillRect(x1, ym, x2-x1, _scaleWidth, _invert ? sc : svc); + p.fillRect(x2, ym, x3-x2, _scaleWidth, _invert ? svc : sc); + p.translate(QPointF(x2, ym + _scaleWidth/2)); + } + + //--------------------------------------------------- + // draw slider + //--------------------------------------------------- + + p.setRenderHint(QPainter::Antialiasing, true); + p.setPen(QPen(svc, 0)); + p.drawPath(*points); + } +} + |