You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
366 lines
7.8 KiB
366 lines
7.8 KiB
/* This file is part of the KDE project
|
|
Copyright (c) 1999 Matthias Elter (me@kde.org)
|
|
|
|
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"
|