qtgradientstopsmodel.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 425 行
CPP
425 行
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qtgradientstopsmodel.h"#include <QColor>#include "qdebug.h"using namespace qdesigner_internal;namespace qdesigner_internal {class QtGradientStopPrivate{public: qreal m_position; QColor m_color; QtGradientStopsModel *m_model;};}qreal QtGradientStop::position() const{ return d_ptr->m_position;}QColor QtGradientStop::color() const{ return d_ptr->m_color;}QtGradientStopsModel *QtGradientStop::gradientModel() const{ return d_ptr->m_model;}void QtGradientStop::setColor(const QColor &color){ d_ptr->m_color = color;}void QtGradientStop::setPosition(qreal position){ d_ptr->m_position = position;}QtGradientStop::QtGradientStop(QtGradientStopsModel *model){ d_ptr = new QtGradientStopPrivate(); d_ptr->m_position = 0; d_ptr->m_color = Qt::white; d_ptr->m_model = model;}QtGradientStop::~QtGradientStop(){ delete d_ptr;}namespace qdesigner_internal {class QtGradientStopsModelPrivate{ QtGradientStopsModel *q_ptr; Q_DECLARE_PUBLIC(QtGradientStopsModel)public: QMap<qreal, QtGradientStop *> m_posToStop; QMap<QtGradientStop *, qreal> m_stopToPos; QMap<QtGradientStop *, bool> m_selection; QtGradientStop *m_current;};}QtGradientStopsModel::QtGradientStopsModel(QObject *parent) : QObject(parent){ d_ptr = new QtGradientStopsModelPrivate; d_ptr->q_ptr = this; d_ptr->m_current = 0;}QtGradientStopsModel::~QtGradientStopsModel(){ clear(); delete d_ptr;}QMap<qreal, QtGradientStop *> QtGradientStopsModel::stops() const{ return d_ptr->m_posToStop;}QtGradientStop *QtGradientStopsModel::at(qreal pos) const{ if (d_ptr->m_posToStop.contains(pos)) return d_ptr->m_posToStop[pos]; return 0;}QColor QtGradientStopsModel::color(qreal pos) const{ QMap<qreal, QtGradientStop *> gradStops = stops(); if (gradStops.isEmpty()) return QColor::fromRgbF(pos, pos, pos, 1.0); if (gradStops.contains(pos)) return gradStops[pos]->color(); gradStops[pos] = 0; QMap<qreal, QtGradientStop *>::ConstIterator itStop = gradStops.constFind(pos); if (itStop == gradStops.constBegin()) { itStop++; return itStop.value()->color(); } if (itStop == --gradStops.constEnd()) { itStop--; return itStop.value()->color(); } QMap<qreal, QtGradientStop *>::ConstIterator itPrev = itStop; QMap<qreal, QtGradientStop *>::ConstIterator itNext = itStop; itPrev--; itNext++; double prevX = itPrev.key(); double nextX = itNext.key(); double coefX = (pos - prevX) / (nextX - prevX); QColor prevCol = itPrev.value()->color(); QColor nextCol = itNext.value()->color(); QColor newColor; newColor.setRgbF((nextCol.redF() - prevCol.redF() ) * coefX + prevCol.redF(), (nextCol.greenF() - prevCol.greenF()) * coefX + prevCol.greenF(), (nextCol.blueF() - prevCol.blueF() ) * coefX + prevCol.blueF(), (nextCol.alphaF() - prevCol.alphaF()) * coefX + prevCol.alphaF()); return newColor;}QList<QtGradientStop *> QtGradientStopsModel::selectedStops() const{ return d_ptr->m_selection.keys();}QtGradientStop *QtGradientStopsModel::currentStop() const{ return d_ptr->m_current;}bool QtGradientStopsModel::isSelected(QtGradientStop *stop) const{ if (d_ptr->m_selection.contains(stop)) return true; return false;}QtGradientStop *QtGradientStopsModel::addStop(qreal pos, const QColor &color){ qreal newPos = pos; if (pos < 0.0) newPos = 0.0; if (pos > 1.0) newPos = 1.0; if (d_ptr->m_posToStop.contains(newPos)) return 0; QtGradientStop *stop = new QtGradientStop(); stop->setPosition(newPos); stop->setColor(color); d_ptr->m_posToStop[newPos] = stop; d_ptr->m_stopToPos[stop] = newPos; emit stopAdded(stop); return stop;}void QtGradientStopsModel::removeStop(QtGradientStop *stop){ if (!d_ptr->m_stopToPos.contains(stop)) return; if (currentStop() == stop) setCurrentStop(0); selectStop(stop, false); emit stopRemoved(stop); qreal pos = d_ptr->m_stopToPos[stop]; d_ptr->m_stopToPos.remove(stop); d_ptr->m_posToStop.remove(pos); delete stop;}void QtGradientStopsModel::moveStop(QtGradientStop *stop, qreal newPos){ if (!d_ptr->m_stopToPos.contains(stop)) return; if (d_ptr->m_posToStop.contains(newPos)) return; if (newPos > 1.0) newPos = 1.0; else if (newPos < 0.0) newPos = 0.0; emit stopMoved(stop, newPos); qreal oldPos = stop->position(); stop->setPosition(newPos); d_ptr->m_stopToPos[stop] = newPos; d_ptr->m_posToStop.remove(oldPos); d_ptr->m_posToStop[newPos] = stop;}void QtGradientStopsModel::changeStop(QtGradientStop *stop, const QColor &newColor){ if (!d_ptr->m_stopToPos.contains(stop)) return; if (stop->color() == newColor) return; emit stopChanged(stop, newColor); stop->setColor(newColor);}void QtGradientStopsModel::selectStop(QtGradientStop *stop, bool select){ if (!d_ptr->m_stopToPos.contains(stop)) return; bool selected = d_ptr->m_selection.contains(stop); if (select == selected) return; emit stopSelected(stop, select); if (select) d_ptr->m_selection[stop] = true; else d_ptr->m_selection.remove(stop);}void QtGradientStopsModel::setCurrentStop(QtGradientStop *stop){ if (stop && !d_ptr->m_stopToPos.contains(stop)) return; if (stop == currentStop()) return; emit currentStopChanged(stop); d_ptr->m_current = stop;}QtGradientStop *QtGradientStopsModel::firstSelected() const{ QMap<qreal, QtGradientStop *> stopList = stops(); QMap<qreal, QtGradientStop *>::ConstIterator itStop = stopList.constBegin(); while (itStop != stopList.constEnd()) { QtGradientStop *stop = itStop.value(); if (isSelected(stop)) return stop; itStop++; }; return 0;}QtGradientStop *QtGradientStopsModel::lastSelected() const{ QMap<qreal, QtGradientStop *> stopList = stops(); QMap<qreal, QtGradientStop *>::ConstIterator itStop = stopList.constEnd(); while (itStop != stopList.constBegin()) { itStop--; QtGradientStop *stop = itStop.value(); if (isSelected(stop)) 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; QMap<qreal, QtGradientStop *> stopList; QList<QtGradientStop *> selected = selectedStops(); QListIterator<QtGradientStop *> it(selected); while (it.hasNext()) { QtGradientStop *stop = it.next(); stopList[stop->position()] = stop; } stopList[current->position()] = current; QMap<qreal, QtGradientStop *>::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++; }}void QtGradientStopsModel::clear(){ QList<QtGradientStop *> stopsList = stops().values(); QListIterator<QtGradientStop *> it(stopsList); while (it.hasNext()) removeStop(it.next());}void QtGradientStopsModel::clearSelection(){ QList<QtGradientStop *> stopsList = selectedStops(); QListIterator<QtGradientStop *> it(stopsList); while (it.hasNext()) selectStop(it.next(), false);}void QtGradientStopsModel::selectAll(){ QList<QtGradientStop *> stopsList = stops().values(); QListIterator<QtGradientStop *> it(stopsList); while (it.hasNext()) selectStop(it.next(), true);}void QtGradientStopsModel::deleteStops(){ QList<QtGradientStop *> selected = selectedStops(); QListIterator<QtGradientStop *> itSel(selected); while (itSel.hasNext()) { QtGradientStop *stop = itSel.next(); removeStop(stop); } QtGradientStop *current = currentStop(); if (current) removeStop(current);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?