diff options
Diffstat (limited to 'lib/kopainter/koColorSlider.cc')
-rw-r--r-- | lib/kopainter/koColorSlider.cc | 365 |
1 files changed, 365 insertions, 0 deletions
diff --git a/lib/kopainter/koColorSlider.cc b/lib/kopainter/koColorSlider.cc new file mode 100644 index 00000000..08c8020a --- /dev/null +++ b/lib/kopainter/koColorSlider.cc @@ -0,0 +1,365 @@ +/* This file is part of the KDE project + Copyright (c) 1999 Matthias Elter ([email protected]) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include "koColorSlider.h" + +#include <qpainter.h> +#include <qcursor.h> +#include <qpen.h> + +#include <kdebug.h> +#include <kpixmapeffect.h> + +KoColorFrame::KoColorFrame(QWidget *parent): +QFrame(parent) +{ + setFrameStyle(Panel | Sunken); + setBackgroundMode(NoBackground); + + /* default values */ + mC1 = QColor(0, 0, 0); + mC2 = QColor(255, 255, 255); + + mColorChanged = false; + mPixChanged = false; + mDragging = false; +} + +const QColor KoColorFrame::colorAt(const QPoint &p) +{ + if(mPixChanged) + { + mImage = mPixmap.convertToImage(); + mPixChanged = false; + } + + if(p.x() >= mPixmap.width() || p.y() >= mPixmap.height()) + return QColor(255,255,255); + + return QColor(mImage.pixel(p.x(), p.y())); +} + +void KoColorFrame::slotSetColor1(const QColor &c) +{ + mC1 = c; + mColorChanged = true; + mPixChanged = true; + repaint(); +} + +void KoColorFrame::slotSetColor2(const QColor &c) +{ + mC2 = c; + mColorChanged = true; + repaint(); +} + +void KoColorFrame::drawContents(QPainter *p) +{ + QRect r = contentsRect(); + + if((mPixmap.size() != r.size()) || mColorChanged) + { + mPixmap.resize(r.width() + 1, r.height() + 1); + KPixmapEffect::gradient(mPixmap, mC1, mC2, KPixmapEffect::HorizontalGradient); + mColorChanged = false; + mPixChanged = true; + } + + p->drawPixmap(r.left(), r.top(), mPixmap); +} + +void KoColorFrame::mousePressEvent(QMouseEvent *e) +{ + if(e->button() & LeftButton) + { + emit clicked(e->pos()); + + mDragging = true; + QPoint pos = QPoint(e->pos().x() - contentsRect().left(), e->pos().y() - contentsRect().top()); + + if(pos.x() < 0) + pos.setX(0); + else if(pos.x() >= contentsRect().width()) + pos.setX(contentsRect().width()-1); + + if(pos.y() < 0) + pos.setY(0); + else if(pos.y() >= contentsRect().height()) + pos.setY(contentsRect().height()-1); + + QColor c = colorAt(pos); + emit colorSelected(c); + } + else + QFrame::mousePressEvent(e); +} + +void KoColorFrame::mouseReleaseEvent(QMouseEvent *e) +{ + if(e->button() & LeftButton) + mDragging = false; + else + QFrame::mouseReleaseEvent(e); +} + +void KoColorFrame::mouseMoveEvent(QMouseEvent *e) +{ + if(mDragging) + { + bool set = false; + int x = e->pos().x(); + int y = e->pos().y(); + + int left = contentsRect().left(); + int right = contentsRect().left() + contentsRect().width(); + int top = contentsRect().top(); + int bottom = contentsRect().top() + contentsRect().height(); + + if(x < left) + { + x = left; + set = true; + } + else if(x > right) + { + x = right; + set = true; + } + if(y < top) + { + y = top; + set = true; + } + else if(y > bottom) + { + y = bottom; + set = true; + } + +// if(set) +// QCursor::setPos(mapToGlobal(QPoint(x,y))); + + QPoint pos = QPoint(x - contentsRect().left(), y - contentsRect().top()); + + QColor c = colorAt(pos); + emit colorSelected(c); + } + else + QFrame::mouseMoveEvent(e); +} + +/***********************************************************************************/ + +KoSliderWidget::KoSliderWidget(QWidget *parent): +QWidget(parent) +{ + mDragging = false; + setFixedHeight(6); + setFixedWidth(11); +} + +void KoSliderWidget::paintEvent(QPaintEvent *) +{ + QPainter p; + QPen pen(black, 1); + p.begin(this); + + p.setPen(pen); + p.drawLine(0, 5, 5, 0); + p.drawLine(10, 5, 5, 0); + p.drawLine(0, 5, 10, 5); + p.end(); +} + +void KoSliderWidget::mousePressEvent(QMouseEvent *e) +{ + if(e->button() & LeftButton) + { + mPos = e->pos(); + mDragging = true; + } + else + QWidget::mousePressEvent(e); +} + +void KoSliderWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if(e->button() & LeftButton) + mDragging = false; + else + QWidget::mouseReleaseEvent(e); +} + +void KoSliderWidget::mouseMoveEvent(QMouseEvent *e) +{ + if(mDragging) + { + QWidget *p = parentWidget(); + + if(!p) + return; + + QPoint newPos = p->mapFromGlobal(QCursor::pos()) - mPos; + + /* don't drag vertically */ + newPos.setY(pos().y()); + + if(newPos.x() < 0) + newPos.setX(0); + if(newPos.x() > p->width() - width()) + newPos.setX(p->width() - width()); + + move(newPos); + emit positionChanged(newPos.x()); + } + else + QWidget::mouseMoveEvent(e); +} + +/***********************************************************************************/ + +KoColorSlider::KoColorSlider(QWidget *parent): +QWidget(parent) +{ + mColorFrame = new KoColorFrame(this); + mSlider = new KoSliderWidget(this); + + mMin = 0; + mMax = 255; + mValue = 0; + + connect(mSlider, SIGNAL(positionChanged(int)), this, SLOT(slotSliderMoved(int))); + connect(mColorFrame, SIGNAL(clicked(const QPoint &)), this, SLOT(slotFrameClicked(const QPoint &))); +} + +KoColorSlider::~KoColorSlider() +{ + delete mColorFrame; + delete mSlider; +} + +int KoColorSlider::minValue() +{ + return mMin; +} + +int KoColorSlider::maxValue() +{ + return mMax; +} + +void KoColorSlider::slotSetRange(int min, int max) +{ + if(min >= max) + return; + + mMin = min; + mMax = max; +} + +void KoColorSlider::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + // m_pSlider->width()/2 * 2 seems stupid but is not because for example + // m_pSlider->width() == 11 I get 10. + mColorFrame->setGeometry(mSlider->width() / 2, 0, width() - mSlider->width() / 2 * 2, height() - mSlider->height()); + slotSetValue(mValue); +} + +void KoColorSlider::slotSetColor1(const QColor &c) +{ + mColorFrame->slotSetColor1(c); +} + +void KoColorSlider::slotSetColor2(const QColor &c) +{ + mColorFrame->slotSetColor2(c); +} + +void KoColorSlider::slotSetValue(int value) +{ + if(value < mMin) + value = mMin; + if(value > mMax) + value = mMax; + + mValue = value; + + int range = mMax - mMin; + float v = value; + if(mMin < 0) + v += -mMin; + + float factor = v / range; + int x = static_cast<int>(factor * mColorFrame->contentsRect().width()); + + mSlider->move(QPoint(x, height() - mSlider->height())); +} + +void KoColorSlider::slotSliderMoved(int x) +{ + if(x < 0) + x = 0; + if(x > mColorFrame->contentsRect().width()) + x = mColorFrame->contentsRect().width(); + + float factor = x; + factor /= mColorFrame->contentsRect().width(); + int range = mMax - mMin; + + mValue = static_cast<int>(factor * range); + + emit valueChanged(mValue); + emit colorSelected(mColorFrame->colorAt(QPoint(x, mColorFrame->contentsRect().height()/2))); +} + +void KoColorSlider::slotFrameClicked(const QPoint &p) +{ + QPoint local = mColorFrame->mapToParent(p); + QPoint pos = QPoint(local.x() - mSlider->width() / 2, height() - mSlider->height()); + + if(pos.x() < 0) + pos.setX(0); + else if(pos.x() > width() - mSlider->width()) + pos.setX(width() - mSlider->width()); + + mSlider->move(pos); + slotSliderMoved(pos.x()); +} + +void KoColorSlider::mousePressEvent(QMouseEvent *e) +{ + if(e->button() & LeftButton) + { + QPoint pos = QPoint(e->pos().x() - mSlider->width() / 2, height() - mSlider->height()); + + if(pos.x() < 0) + pos.setX(0); + else if(pos.x() > width() - mSlider->width()) + pos.setX(width() - mSlider->width()); + + mSlider->move(pos); + slotSliderMoved(pos.x()); + } + else + QWidget::mousePressEvent(e); +} + +#include "koColorSlider.moc" |