void QtGradientStopsWidgetPrivate::setupMove(QtGradientStop *stop, int x) { m_model->setCurrentStop(stop); int viewportX = qRound(toViewport(stop->position())); m_moveOffset = x - viewportX; QList<QtGradientStop *> stops = m_stops; m_stops.clear(); QListIterator<QtGradientStop *> itStop(stops); while (itStop.hasNext()) { QtGradientStop *s = itStop.next(); if (m_model->isSelected(s) || s == stop) { m_moveStops[s] = s->position() - stop->position(); m_stops.append(s); } else { m_moveOriginal[s->position()] = s->color(); } } itStop.toFront(); while (itStop.hasNext()) { QtGradientStop *s = itStop.next(); if (!m_model->isSelected(s)) m_stops.append(s); } m_stops.removeAll(stop); m_stops.prepend(stop); }
void QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox() { QtGradientStop *current = m_model->currentStop(); if (!current) return; qreal min = 0.0; qreal max = 1.0; const qreal pos = current->position(); QtGradientStop *first = m_model->firstSelected(); QtGradientStop *last = m_model->lastSelected(); if (first && last) { const qreal minPos = pos - first->position() - 0.0004999; const qreal maxPos = pos + 1.0 - last->position() + 0.0004999; if (max > maxPos) max = maxPos; if (min < minPos) min = minPos; if (first->position() == 0.0) min = pos; if (last->position() == 1.0) max = pos; } const int spinMin = qRound(m_ui->positionSpinBox->minimum() * 1000); const int spinMax = qRound(m_ui->positionSpinBox->maximum() * 1000); const int newMin = qRound(min * 1000); const int newMax = qRound(max * 1000); m_ui->positionSpinBox->blockSignals(true); if (spinMin != newMin || spinMax != newMax) { m_ui->positionSpinBox->setRange((double)newMin / 1000, (double)newMax / 1000); } if (m_ui->positionSpinBox->value() != pos) m_ui->positionSpinBox->setValue(pos); m_ui->positionSpinBox->blockSignals(false); }
QGradientStops QtGradientStopsController::gradientStops() const { QGradientStops stops; QList<QtGradientStop *> stopsList = d_ptr->m_model->stops().values(); QListIterator<QtGradientStop *> itStop(stopsList); while (itStop.hasNext()) { QtGradientStop *stop = itStop.next(); stops << QPair<qreal, QColor>(stop->position(), stop->color()); } return stops; }
QtGradientStopsControllerPrivate::PositionColorMap QtGradientStopsControllerPrivate::stopsData(const PositionStopMap &stops) const { PositionColorMap data; PositionStopMap::ConstIterator itStop = stops.constBegin(); while (itStop != stops.constEnd()) { QtGradientStop *stop = itStop.value(); data[stop->position()] = stop->color(); ++itStop; } return data; }
QtGradientStop *QtGradientStopsWidgetPrivate::stopAt(const QPoint &viewportPos) const { double posY = m_handleSize / 2; QListIterator<QtGradientStop *> itStop(m_stops); while (itStop.hasNext()) { QtGradientStop *stop = itStop.next(); double posX = toViewport(stop->position()); double x = viewportPos.x() - posX; double y = viewportPos.y() - posY; if ((m_handleSize * m_handleSize / 4) > (x * x + y * y)) return stop; } return 0; }
void QtGradientStopsModel::moveStops(double newPosition) { QtGradientStop *current = currentStop(); if (!current) return; double newPos = newPosition; if (newPos > 1) newPos = 1; else if (newPos < 0) newPos = 0; if (newPos == current->position()) return; double offset = newPos - current->position(); QtGradientStop *first = firstSelected(); QtGradientStop *last = lastSelected(); if (first && last) { // multiselection double maxOffset = 1.0 - last->position(); double minOffset = -first->position(); if (offset > maxOffset) offset = maxOffset; else if (offset < minOffset) offset = minOffset; } if (offset == 0) return; bool forward = (offset > 0) ? false : true; PositionStopMap stopList; QList<QtGradientStop *> selected = selectedStops(); QListIterator<QtGradientStop *> it(selected); while (it.hasNext()) { QtGradientStop *stop = it.next(); stopList[stop->position()] = stop; } stopList[current->position()] = current; PositionStopMap::ConstIterator itStop = forward ? stopList.constBegin() : stopList.constEnd(); while (itStop != (forward ? stopList.constEnd() : stopList.constBegin())) { if (!forward) --itStop; QtGradientStop *stop = itStop.value(); double pos = stop->position() + offset; if (pos > 1) pos = 1; if (pos < 0) pos = 0; if (current == stop) pos = newPos; QtGradientStop *oldStop = at(pos); if (oldStop && !stopList.values().contains(oldStop)) removeStop(oldStop); moveStop(stop, pos); if (forward) ++itStop; } }