qtgradientstopswidget.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 884 行 · 第 1/2 页

CPP
884
字号
    viewport()->update();}void QtGradientStopsWidget::mouseReleaseEvent(QMouseEvent *e){    if (!d_ptr->m_model)        return;    if (e->button() != Qt::LeftButton)        return;    d_ptr->m_dragging = false;    d_ptr->m_rubber->hide();    d_ptr->m_dragStops.clear();    d_ptr->m_dragOriginal.clear();}void QtGradientStopsWidget::mouseMoveEvent(QMouseEvent *e){    if (!d_ptr->m_model)        return;    if (!(e->buttons() & Qt::LeftButton))        return;    if (!d_ptr->m_dragging)        return;    if (!d_ptr->m_dragStops.isEmpty()) {        double maxOffset = 0.0;        double minOffset = 0.0;        bool first = true;        QMap<QtGradientStop *, qreal>::ConstIterator itStop = d_ptr->m_dragStops.constBegin();        while (itStop != d_ptr->m_dragStops.constEnd()) {            double offset = itStop.value();            if (first) {                maxOffset = offset;                minOffset = offset;                first = false;            } else {                if (maxOffset < offset)                    maxOffset = offset;                else if (minOffset > offset)                    minOffset = offset;            }            itStop++;        }        double viewportMin = d_ptr->toViewport(-minOffset);        double viewportMax = d_ptr->toViewport(1.0 - maxOffset);        QMap<qreal, QtGradientStop *> newPositions;        int viewportX = e->pos().x() - d_ptr->m_dragOffset;        if (viewportX > viewport()->size().width())            viewportX = viewport()->size().width();        else if (viewportX < 0)            viewportX = 0;        double posX = d_ptr->fromViewport(viewportX);        if (viewportX > viewportMax)            posX = 1.0 - maxOffset;        else if (viewportX < viewportMin)            posX = -minOffset;        itStop = d_ptr->m_dragStops.constBegin();        while (itStop != d_ptr->m_dragStops.constEnd()) {            QtGradientStop *stop = itStop.key();            newPositions[posX + itStop.value()] = stop;            itStop++;        }        bool forward = true;        QMap<qreal, QtGradientStop *>::ConstIterator itNewPos = newPositions.constBegin();        if (itNewPos.value()->position() < itNewPos.key())            forward = false;        itNewPos = forward ? newPositions.constBegin() : newPositions.constEnd();        while (itNewPos != (forward ? newPositions.constEnd() : newPositions.constBegin())) {            if (!forward)                itNewPos--;            QtGradientStop *stop = itNewPos.value();            double newPos = itNewPos.key();            if (newPos > 1)                newPos = 1;            else if (newPos < 0)                newPos = 0;            QtGradientStop *existingStop = d_ptr->m_model->at(newPos);            if (existingStop && !d_ptr->m_dragStops.contains(existingStop))                    d_ptr->m_model->removeStop(existingStop);            d_ptr->m_model->moveStop(stop, newPos);            if (forward)                itNewPos++;        }        QMap<qreal, QColor>::ConstIterator itOld = d_ptr->m_dragOriginal.constBegin();        while (itOld != d_ptr->m_dragOriginal.constEnd()) {            double position = itOld.key();            if (!d_ptr->m_model->at(position))                d_ptr->m_model->addStop(position, itOld.value());            itOld++;        }    } else {        QRect r(QRect(d_ptr->m_clickPos, e->pos()).normalized());        r.translate(1, 0);        d_ptr->m_rubber->setGeometry(r);        //d_ptr->m_model->clearSelection();        int xv1 = d_ptr->m_clickPos.x();        int xv2 = e->pos().x();        if (xv1 > xv2) {            int temp = xv1;            xv1 = xv2;            xv2 = temp;        }        int yv1 = d_ptr->m_clickPos.y();        int yv2 = e->pos().y();        if (yv1 > yv2) {            int temp = yv1;            yv1 = yv2;            yv2 = temp;        }        QPoint p1, p2;        if (yv2 < d_ptr->m_handleSize / 2) {            p1 = QPoint(xv1, yv2);            p2 = QPoint(xv2, yv2);        } else if (yv1 > d_ptr->m_handleSize / 2) {            p1 = QPoint(xv1, yv1);            p2 = QPoint(xv2, yv1);        } else {            p1 = QPoint(xv1, qRound(d_ptr->m_handleSize / 2));            p2 = QPoint(xv2, qRound(d_ptr->m_handleSize / 2));        }        QList<QtGradientStop *> beginList = d_ptr->stopsAt(p1);        QList<QtGradientStop *> endList = d_ptr->stopsAt(p2);        double x1 = d_ptr->fromViewport(xv1);        double x2 = d_ptr->fromViewport(xv2);        QListIterator<QtGradientStop *> itStop(d_ptr->m_stops);        while (itStop.hasNext()) {            QtGradientStop *stop = itStop.next();            if ((stop->position() >= x1 && stop->position() <= x2) ||                        beginList.contains(stop) || endList.contains(stop))                d_ptr->m_model->selectStop(stop, true);            else                d_ptr->m_model->selectStop(stop, false);        }    }}void QtGradientStopsWidget::mouseDoubleClickEvent(QMouseEvent *e){    if (!d_ptr->m_model)        return;    if (e->button() != Qt::LeftButton)        return;    if (d_ptr->m_clickPos != e->pos()) {        mousePressEvent(e);        return;    }    d_ptr->m_dragging = true;    d_ptr->m_dragStops.clear();    d_ptr->m_dragOriginal.clear();    QtGradientStop *stop = d_ptr->newStop(e->pos());    if (!stop)        return;    d_ptr->m_model->clearSelection();    d_ptr->m_model->selectStop(stop, true);    d_ptr->setupDrag(stop, e->pos().x());    viewport()->update();}void QtGradientStopsWidget::keyPressEvent(QKeyEvent *e){    if (!d_ptr->m_model)        return;    if (e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace) {        d_ptr->m_model->deleteStops();    } else if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right ||                e->key() == Qt::Key_Home || e->key() == Qt::Key_End) {        QMap<qreal, QtGradientStop *> stops = d_ptr->m_model->stops();        if (stops.isEmpty())            return;        QtGradientStop *newCurrent = 0;        QtGradientStop *current = d_ptr->m_model->currentStop();        if (!current || e->key() == Qt::Key_Home || e->key() == Qt::Key_End) {            if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Home)                newCurrent = stops.constBegin().value();            else if (e->key() == Qt::Key_Right || e->key() == Qt::Key_End)                newCurrent = (--stops.constEnd()).value();        } else {            QMap<qreal, QtGradientStop *>::ConstIterator itStop = stops.constBegin();            while (itStop.value() != current)                itStop++;            if (e->key() == Qt::Key_Left && itStop != stops.constBegin())                itStop--;            else if (e->key() == Qt::Key_Right && itStop != --stops.constEnd())                itStop++;            newCurrent = itStop.value();        }        d_ptr->m_model->clearSelection();        d_ptr->m_model->selectStop(newCurrent, true);        d_ptr->m_model->setCurrentStop(newCurrent);        d_ptr->ensureVisible(newCurrent);    } else if (e->key() == Qt::Key_A) {        if (e->modifiers() & Qt::ControlModifier)            d_ptr->m_model->selectAll();    }}void QtGradientStopsWidget::paintEvent(QPaintEvent *e){    Q_UNUSED(e)    if (!d_ptr->m_model)        return;    QSize size = viewport()->size();    int w = size.width();    double h = size.height() - d_ptr->m_handleSize;    if (w <= 0)        return;    QPixmap pix(size);    QPainter p(viewport());    if (!d_ptr->m_backgroundTransparent) {        int pixSize = 20;        QPixmap pm(2 * pixSize, 2 * pixSize);        QPainter pmp(&pm);        pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);        pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);        pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);        pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);        p.end();        p.begin(&pix);        p.setBrushOrigin((size.width() % pixSize + pixSize) / 2, (size.height() % pixSize + pixSize) / 2);        p.fillRect(viewport()->rect(), pm);        p.setBrushOrigin(0, 0);    }    double viewBegin = (double)w * horizontalScrollBar()->value() / d_ptr->m_scaleFactor;    QListIterator<QtGradientStop *> itStop(d_ptr->m_stops);    if (h > 0) {        QLinearGradient lg(0, 0, w, 0);        while (itStop.hasNext()) {            QtGradientStop *stop = itStop.next();            lg.setColorAt(stop->position(), stop->color());        }        QImage img(w, 1, QImage::Format_ARGB32_Premultiplied);        QPainter p1(&img);        p1.setCompositionMode(QPainter::CompositionMode_Source);        if (viewBegin != 0)            p1.translate(-viewBegin, 0);        if (d_ptr->m_zoom != 1)            p1.scale(d_ptr->m_zoom, 1);        p1.fillRect(0, 0, w, 1, lg);        p.fillRect(QRectF(0, d_ptr->m_handleSize, w, h), QPixmap::fromImage(img));    }    //p2.fillRect(QRectF(0, 0, w, size.height()), QPixmap::fromImage(img));    // handles    int val = horizontalScrollBar()->value();    int max = horizontalScrollBar()->maximum();    double begin = (double)val / (d_ptr->m_scaleFactor + max);    double end = (double)(val + d_ptr->m_scaleFactor) / (d_ptr->m_scaleFactor + max);    double handleWidth = d_ptr->m_handleSize * d_ptr->m_scaleFactor / (w * (d_ptr->m_scaleFactor + max));    QColor insideColor = QColor::fromRgb(0x20, 0x20, 0x20, 0xFF);    QColor borderColor = QColor(Qt::white);    QColor drawColor;    QColor back1 = QColor(Qt::lightGray);    QColor back2 = QColor(Qt::darkGray);    QColor back = QColor::fromRgb((back1.red() + back2.red()) / 2,            (back1.green() + back2.green()) / 2,            (back1.blue() + back2.blue()) / 2);    QPen pen;    p.setRenderHint(QPainter::Antialiasing);    itStop.toBack();    while (itStop.hasPrevious()) {        QtGradientStop *stop = itStop.previous();        double x = stop->position();        if (x >= begin - handleWidth / 2 && x <= end + handleWidth / 2) {            double viewX = x * w * (d_ptr->m_scaleFactor + max) / d_ptr->m_scaleFactor - viewBegin;            p.save();            QColor c = stop->color();            if ((0.3 * c.redF() + 0.59 * c.greenF() + 0.11 * c.blueF()) * c.alphaF() +                (0.3 * back.redF() + 0.59 * back.greenF() + 0.11 * back.blueF()) * (1.0 - c.alphaF()) < 0.5) {                drawColor = QColor::fromRgb(0xC0, 0xC0, 0xC0, 0xB0);            } else {                drawColor = QColor::fromRgb(0x40, 0x40, 0x40, 0x80);            }            QRectF rect(viewX - d_ptr->m_handleSize / 2, 0, d_ptr->m_handleSize, d_ptr->m_handleSize);            rect.adjust(0.5, 0.5, -0.5, -0.5);            if (h > 0) {                pen.setWidthF(1);                QLinearGradient lg(0, d_ptr->m_handleSize, 0, d_ptr->m_handleSize + h / 2);                lg.setColorAt(0, drawColor);                QColor alphaZero = drawColor;                alphaZero.setAlpha(0);                lg.setColorAt(1, alphaZero);                pen.setBrush(lg);                p.setPen(pen);                p.drawLine(QPointF(viewX, d_ptr->m_handleSize), QPointF(viewX, d_ptr->m_handleSize + h / 2));                pen.setWidthF(1);                pen.setBrush(drawColor);                p.setPen(pen);                QRectF r1 = rect.adjusted(0.5, 0.5, -0.5, -0.5);                QRectF r2 = rect.adjusted(1.5, 1.5, -1.5, -1.5);                QColor inColor = QColor::fromRgb(0x80, 0x80, 0x80, 0x80);                if (!d_ptr->m_model->isSelected(stop)) {                    p.setBrush(stop->color());                    p.drawEllipse(rect);                } else {                    pen.setBrush(insideColor);                    pen.setWidthF(2);                    p.setPen(pen);                    p.setBrush(Qt::NoBrush);                    p.drawEllipse(r1);                    pen.setBrush(inColor);                    pen.setWidthF(1);                    p.setPen(pen);                    p.setBrush(stop->color());                    p.drawEllipse(r2);                }                if (d_ptr->m_model->currentStop() == stop) {                    p.setBrush(Qt::NoBrush);                    pen.setWidthF(5);                    pen.setBrush(drawColor);                    int corr = 4;                    if (!d_ptr->m_model->isSelected(stop)) {                        corr = 3;                        pen.setWidthF(7);                    }                    p.setPen(pen);                    p.drawEllipse(rect.adjusted(corr, corr, -corr, -corr));                }            }            p.restore();        }    }    if (!d_ptr->m_backgroundTransparent) {        p.end();        p.begin(viewport());        p.drawPixmap(0, 0, pix);    }}void QtGradientStopsWidget::focusInEvent(QFocusEvent *e){    Q_UNUSED(e)    viewport()->update();}void QtGradientStopsWidget::focusOutEvent(QFocusEvent *e){    Q_UNUSED(e)    viewport()->update();}void QtGradientStopsWidget::contextMenuEvent(QContextMenuEvent *e){    if (!d_ptr->m_model)        return;    d_ptr->m_clickPos = e->pos();    QMenu menu(this);    QAction *newStopAction = new QAction(tr("New Stop"), &menu);    QAction *deleteAction = new QAction(tr("Delete"), &menu);    QAction *selectAllAction = new QAction(tr("Select All"), &menu);    if (d_ptr->m_model->selectedStops().isEmpty() && !d_ptr->m_model->currentStop())        deleteAction->setEnabled(false);    connect(newStopAction, SIGNAL(triggered()), this, SLOT(slotNewStop()));    connect(deleteAction, SIGNAL(triggered()), this, SLOT(slotDelete()));    connect(selectAllAction, SIGNAL(triggered()), this, SLOT(slotSelectAll()));    menu.addAction(newStopAction);    menu.addAction(deleteAction);    menu.addAction(selectAllAction);    menu.exec(e->globalPos());}void QtGradientStopsWidget::setZoom(double zoom){    double z = zoom;    if (z < 1)        z = 1;    else if (z > 100)        z = 100;    if (d_ptr->m_zoom == z)        return;    d_ptr->m_zoom = z;    int oldMax = horizontalScrollBar()->maximum();    int oldVal = horizontalScrollBar()->value();    horizontalScrollBar()->setRange(0, qRound(d_ptr->m_scaleFactor * (d_ptr->m_zoom - 1)));    int newMax = horizontalScrollBar()->maximum();    double newVal = (oldVal + (double)d_ptr->m_scaleFactor / 2) * (newMax + d_ptr->m_scaleFactor)                / (oldMax + d_ptr->m_scaleFactor) - (double)d_ptr->m_scaleFactor / 2;    horizontalScrollBar()->setValue(qRound(newVal));    viewport()->update();}double QtGradientStopsWidget::zoom() const{    return d_ptr->m_zoom;}#include "moc_qtgradientstopswidget.cpp"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?