|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/spectrumfield.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/styleeditor.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/dvdialog.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/gutil.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tcolorstyles.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qhboxlayout></qhboxlayout>
|
|
Toshihiro Shimizu |
890ddd |
#include <qlabel></qlabel>
|
|
Toshihiro Shimizu |
890ddd |
#include <qslider></qslider>
|
|
Toshihiro Shimizu |
890ddd |
#include <qpainter></qpainter>
|
|
Toshihiro Shimizu |
890ddd |
#include <qlineargradient></qlineargradient>
|
|
Toshihiro Shimizu |
890ddd |
#include <qmouseevent></qmouseevent>
|
|
Toshihiro Shimizu |
890ddd |
#include <qimage></qimage>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
using namespace DVGui;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
/*! \class DVGui::SpectrumBar
|
|
Shinya Kitaoka |
120a6e |
\brief The SpectrumBar class provides a bar to display a
|
|
Shinya Kitaoka |
120a6e |
spectrum
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
Inherits \b QWidget.
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
The object allows to manage a spectrum, permit you to insert,
|
|
Shinya Kitaoka |
120a6e |
move and
|
|
Shinya Kitaoka |
120a6e |
remove key.
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
You can set spectrum default color in constructor, or set color
|
|
Shinya Kitaoka |
120a6e |
of current
|
|
Shinya Kitaoka |
120a6e |
key, \b getCurrentColor(), using \b setCurrentColor(). It's
|
|
Shinya Kitaoka |
120a6e |
possible to change
|
|
Shinya Kitaoka |
120a6e |
current key, \b getCurrentKeyIndex(), through its index, \b
|
|
Shinya Kitaoka |
120a6e |
setCurrentKeyIndex().
|
|
Shinya Kitaoka |
120a6e |
You can also set current key position, \b getCurrentPos(), using
|
|
Shinya Kitaoka |
120a6e |
\b setCurrentPos()
|
|
Shinya Kitaoka |
120a6e |
or add a new key in a specific position, addKeyAt().
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
/*! \fn void DVGui::SpectrumBar::currentPosChanged()
|
|
Shinya Kitaoka |
120a6e |
The signal is emitted when current key position change.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
/*! \fn void DVGui::SpectrumBar::currentKeyChanged()
|
|
Shinya Kitaoka |
120a6e |
The signal is emitted when current key index change.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
SpectrumBar::SpectrumBar(QWidget *parent, TPixel32 color)
|
|
Shinya Kitaoka |
120a6e |
: QWidget(parent)
|
|
Shinya Kitaoka |
120a6e |
, m_x0(10)
|
|
Shinya Kitaoka |
120a6e |
, m_currentKeyIndex(0)
|
|
Shinya Kitaoka |
120a6e |
, m_spectrum(color, color)
|
|
Shinya Kitaoka |
120a6e |
, m_chessBg(":Resources/backg.png") {
|
|
Shinya Kitaoka |
120a6e |
setMinimumWidth(200);
|
|
Shinya Kitaoka |
120a6e |
setFixedHeight(WidgetHeight);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SpectrumBar::~SpectrumBar() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return current key position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
int SpectrumBar::getCurrentPos() {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1) return -1;
|
|
Shinya Kitaoka |
120a6e |
return spectrumValueToPos(m_spectrum.getKey(m_currentKeyIndex).first);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return current key color.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
TPixel32 SpectrumBar::getCurrentColor() {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1) // C'e' sicuramente una key perche' lo spectrum
|
|
Shinya Kitaoka |
120a6e |
// e' strutturato in modo da non avere mai size
|
|
Shinya Kitaoka |
120a6e |
// nulla.
|
|
Shinya Kitaoka |
120a6e |
return m_spectrum.getKey(getMaxPosKeyIndex()).second;
|
|
Shinya Kitaoka |
120a6e |
return m_spectrum.getKey(m_currentKeyIndex).second;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Set current key index to \b index. Update spectrum bar and emit a signal to
|
|
Shinya Kitaoka |
120a6e |
notify current key changed \b currentKeyChanged().
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::setCurrentKeyIndex(int index) {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == index) return;
|
|
Shinya Kitaoka |
120a6e |
m_currentKeyIndex = index;
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Shinya Kitaoka |
120a6e |
emit currentKeyChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Add a new key to spectrum. Key position is computed \b x using
|
|
Shinya Kitaoka |
120a6e |
\b posToSpectrumValue() and color come from position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::addKeyAt(int x) {
|
|
Shinya Kitaoka |
120a6e |
TPixel32 color = m_spectrum.getValue(posToSpectrumValue(x));
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey key(posToSpectrumValue(x), color);
|
|
Shinya Kitaoka |
120a6e |
m_spectrum.addKey(key);
|
|
Shinya Kitaoka |
120a6e |
int newIndex = m_spectrum.getKeyCount() - 1;
|
|
Shinya Kitaoka |
120a6e |
setCurrentKeyIndex(newIndex);
|
|
Shinya Kitaoka |
120a6e |
emit currentKeyAdded(newIndex);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Set current key position to \b pos. Update spectrum bar and emit a signal to
|
|
Shinya Kitaoka |
120a6e |
notify current key changed \b currentKeyChanged().
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::setCurrentPos(int pos, bool isDragging) {
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey key = m_spectrum.getKey(m_currentKeyIndex);
|
|
Shinya Kitaoka |
120a6e |
key.first = posToSpectrumValue(pos);
|
|
Shinya Kitaoka |
120a6e |
m_spectrum.setKey(m_currentKeyIndex, key);
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Shinya Kitaoka |
120a6e |
emit currentPosChanged(isDragging);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Set current key color to \b color. Update spectrum bar.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::setCurrentColor(const TPixel32 &color) {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1) return;
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey key = m_spectrum.getKey(m_currentKeyIndex);
|
|
Shinya Kitaoka |
120a6e |
TPixel32 oldColor = key.second;
|
|
Shinya Kitaoka |
120a6e |
if (oldColor == color) return;
|
|
Shinya Kitaoka |
120a6e |
key.second = color;
|
|
Shinya Kitaoka |
120a6e |
m_spectrum.setKey(m_currentKeyIndex, key);
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return spectrum value from widget position \b pos.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
double SpectrumBar::posToSpectrumValue(int pos) {
|
|
Shinya Kitaoka |
120a6e |
return (double)(pos - m_x0) / (double)(width() - 2 * m_x0 - 1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return widget position from spectrum value \b spectrumValue.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
int SpectrumBar::spectrumValueToPos(double spectrumValue) {
|
|
Shinya Kitaoka |
120a6e |
return m_x0 + int(0.5 + spectrumValue * (width() - 2 * m_x0));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Paint widget object:
|
|
Shinya Kitaoka |
120a6e |
\li a linear gradient computed with spectrum value;
|
|
Shinya Kitaoka |
120a6e |
\li arrows for each spectrum key.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::paintEvent(QPaintEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
QPainter p(this);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int h = height() - 1;
|
|
Shinya Kitaoka |
120a6e |
int y1 = height() / 2;
|
|
Shinya Kitaoka |
120a6e |
int x1 = width() - m_x0;
|
|
Shinya Kitaoka |
120a6e |
QRectF rectBar = QRectF(m_x0, 0, x1 - m_x0 + 1, y1);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Build the linear gradient
|
|
Shinya Kitaoka |
120a6e |
QLinearGradient linearGrad(QPointF(m_x0, h), QPointF(x1, h));
|
|
Shinya Kitaoka |
120a6e |
int spectrumSize = m_spectrum.getKeyCount();
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < spectrumSize; i++) {
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey key = m_spectrum.getKey(i);
|
|
Shinya Kitaoka |
120a6e |
// Linear Gradient
|
|
Shinya Kitaoka |
120a6e |
TPixel32 pix = key.second;
|
|
Shinya Kitaoka |
120a6e |
double spectrumValue = key.first;
|
|
Shinya Kitaoka |
120a6e |
linearGrad.setColorAt(spectrumValue, QColor(pix.r, pix.g, pix.b, pix.m));
|
|
Shinya Kitaoka |
120a6e |
// Frecce delle key
|
|
Shinya Kitaoka |
120a6e |
int pos = spectrumValueToPos(spectrumValue);
|
|
Shinya Kitaoka |
120a6e |
int f = 4;
|
|
Shinya Kitaoka |
120a6e |
drawArrow(p, QPointF(pos - f, y1 + f), QPointF(pos, y1),
|
|
Shinya Kitaoka |
120a6e |
QPointF(pos + f, y1 + f), true,
|
|
Shinya Kitaoka |
120a6e |
(m_currentKeyIndex == i) ? Qt::black : Qt::white);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
p.setPen(Qt::NoPen);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Draw chess bg
|
|
Shinya Kitaoka |
120a6e |
QBrush bg;
|
|
Shinya Kitaoka |
120a6e |
bg.setTexture(m_chessBg);
|
|
Shinya Kitaoka |
120a6e |
p.setBrush(bg);
|
|
Shinya Kitaoka |
120a6e |
p.drawRect(rectBar);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Draw the gradient
|
|
Shinya Kitaoka |
120a6e |
p.setBrush(linearGrad);
|
|
Shinya Kitaoka |
120a6e |
p.drawRect(rectBar);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Manage mouse press event. Search exsisting key near click position, if
|
|
Shinya Kitaoka |
120a6e |
there is set it as current key; otherwise add a new key in click
|
|
Shinya Kitaoka |
120a6e |
position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::mousePressEvent(QMouseEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
QPoint pos = e->pos();
|
|
Shinya Kitaoka |
120a6e |
int x = pos.x();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Verifico se esiste una key vicino alla posizione in cui ho cliccato
|
|
Shinya Kitaoka |
120a6e |
int index = -1;
|
|
Shinya Kitaoka |
120a6e |
int spectrumSize = m_spectrum.getKeyCount();
|
|
Shinya Kitaoka |
120a6e |
if (x < m_x0)
|
|
Shinya Kitaoka |
120a6e |
index = getMinPosKeyIndex();
|
|
Shinya Kitaoka |
120a6e |
else if (x > width() - m_x0)
|
|
Shinya Kitaoka |
120a6e |
index = getMaxPosKeyIndex();
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
index = getNearPosKeyIndex(x);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Se x e' vicino a una key esistente setto questa come corrente
|
|
Shinya Kitaoka |
120a6e |
if (index != -1)
|
|
Shinya Kitaoka |
120a6e |
setCurrentKeyIndex(index);
|
|
Shinya Kitaoka |
120a6e |
else // Altrimenti aggiungo una nuova key
|
|
Shinya Kitaoka |
120a6e |
addKeyAt(x);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Manage mouse move event. If y position value greater than widget height
|
|
Shinya Kitaoka |
120a6e |
erase current key; otherwise move current key position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::mouseMoveEvent(QMouseEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
QPoint pos = e->pos();
|
|
Shinya Kitaoka |
120a6e |
int x = pos.x();
|
|
Shinya Kitaoka |
120a6e |
int y = pos.y();
|
|
Shinya Kitaoka |
120a6e |
if (x < m_x0 || x > width() - m_x0 - 1) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Se il valore della y e' maggiore dell'altezza widget, cioe' va fuori dal
|
|
Shinya Kitaoka |
120a6e |
// widget
|
|
Shinya Kitaoka |
120a6e |
// elimino la key corrente
|
|
Shinya Kitaoka |
120a6e |
if (y > height()) {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1 || m_spectrum.getKeyCount() == 1) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_spectrum.removeKey(m_currentKeyIndex);
|
|
Shinya Kitaoka |
120a6e |
int keyIndex = m_currentKeyIndex;
|
|
Shinya Kitaoka |
120a6e |
setCurrentKeyIndex(-1);
|
|
Shinya Kitaoka |
120a6e |
emit currentKeyRemoved(keyIndex);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Se il valore della y e' interno al widget
|
|
Shinya Kitaoka |
120a6e |
// Se l'indice della key corrente e' -1 avevo eliminato un key; ora devo
|
|
Shinya Kitaoka |
120a6e |
// riaggiungerla.
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1) addKeyAt(x);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Setto la nuova posizione x alla chiave corrente
|
|
Shinya Kitaoka |
120a6e |
setCurrentPos(x, true);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void SpectrumBar::mouseReleaseEvent(QMouseEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentKeyIndex == -1) return;
|
|
Shinya Kitaoka |
120a6e |
QPoint pos = e->pos();
|
|
Shinya Kitaoka |
120a6e |
int x = pos.x();
|
|
Shinya Kitaoka |
120a6e |
int y = pos.y();
|
|
Shinya Kitaoka |
120a6e |
if (x < m_x0 || x > width() - m_x0 - 1) return;
|
|
Shinya Kitaoka |
120a6e |
if (y > height()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
setCurrentPos(x, false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return index of key with maximum position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
int SpectrumBar::getMaxPosKeyIndex() {
|
|
Shinya Kitaoka |
120a6e |
int spectrumSize = m_spectrum.getKeyCount();
|
|
Shinya Kitaoka |
120a6e |
if (!spectrumSize) return -1;
|
|
Shinya Kitaoka |
120a6e |
int maxPosIndex = 0;
|
|
Shinya Kitaoka |
120a6e |
int maxPos = spectrumValueToPos(m_spectrum.getKey(0).first);
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < spectrumSize; i++) {
|
|
Shinya Kitaoka |
120a6e |
int newPos = spectrumValueToPos(m_spectrum.getKey(i).first);
|
|
Shinya Kitaoka |
120a6e |
if (maxPos < newPos) {
|
|
Shinya Kitaoka |
120a6e |
maxPos = newPos;
|
|
Shinya Kitaoka |
120a6e |
maxPosIndex = i;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return maxPosIndex;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return index of key with minimum position.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
int SpectrumBar::getMinPosKeyIndex() {
|
|
Shinya Kitaoka |
120a6e |
int spectrumSize = m_spectrum.getKeyCount();
|
|
Shinya Kitaoka |
120a6e |
if (!spectrumSize) return -1;
|
|
Shinya Kitaoka |
120a6e |
int minPosIndex = 0;
|
|
Shinya Kitaoka |
120a6e |
int minPos = spectrumValueToPos(m_spectrum.getKey(0).first);
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < spectrumSize; i++) {
|
|
Shinya Kitaoka |
120a6e |
int newPos = spectrumValueToPos(m_spectrum.getKey(i).first);
|
|
Shinya Kitaoka |
120a6e |
if (minPos > newPos) {
|
|
Shinya Kitaoka |
120a6e |
minPos = newPos;
|
|
Shinya Kitaoka |
120a6e |
minPosIndex = i;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return minPosIndex;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Return index of key "near" \b pos. "near" mean with a dinstace less than
|
|
Shinya Kitaoka |
120a6e |
a constant size. If there aren't key near pos return \b -1.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
int SpectrumBar::getNearPosKeyIndex(int pos) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
int gap = 20;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_spectrum.getKeyCount(); i++)
|
|
Shinya Kitaoka |
120a6e |
if (areAlmostEqual(double(pos),
|
|
Shinya Kitaoka |
120a6e |
double(spectrumValueToPos(m_spectrum.getKey(i).first)),
|
|
Shinya Kitaoka |
120a6e |
gap))
|
|
Shinya Kitaoka |
120a6e |
return i;
|
|
Shinya Kitaoka |
120a6e |
return -1;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
/*! \class DVGui::SpectrumField
|
|
Shinya Kitaoka |
120a6e |
\brief The SpectrumField class provides an object to display and
|
|
Shinya Kitaoka |
120a6e |
manage a spectrum.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Inherits \b QWidget.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
The object is composed of a vertical layout \b QVBoxLayout which
|
|
Shinya Kitaoka |
120a6e |
contains a
|
|
Shinya Kitaoka |
120a6e |
spectrum bar \b SpectrumBar and a color field \b ColorField.
|
|
Shinya Kitaoka |
120a6e |
Using color field
|
|
Shinya Kitaoka |
120a6e |
it's possible to set spectrum current key color.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
\b Example: Spectrum Field.
|
|
Shinya Kitaoka |
120a6e |
\image html SpectrumField.jpg
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
SpectrumField::SpectrumField(QWidget *parent, TPixel32 color)
|
|
Shinya Kitaoka |
120a6e |
: QWidget(parent), m_margin(0), m_spacing(4) {
|
|
Shinya Kitaoka |
120a6e |
setFixedHeight(60);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QVBoxLayout *layout = new QVBoxLayout();
|
|
Shinya Kitaoka |
120a6e |
layout->setMargin(m_margin);
|
|
Shinya Kitaoka |
120a6e |
layout->setSpacing(m_spacing);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_spectrumbar = new SpectrumBar(this, color);
|
|
Shinya Kitaoka |
120a6e |
connect(m_spectrumbar, SIGNAL(currentPosChanged(bool)),
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCurrentPosChanged(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_spectrumbar, SIGNAL(currentKeyChanged()),
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCurrentKeyChanged()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_spectrumbar, SIGNAL(currentKeyAdded(int)), SIGNAL(keyAdded(int)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_spectrumbar, SIGNAL(currentKeyRemoved(int)),
|
|
Shinya Kitaoka |
120a6e |
SIGNAL(keyRemoved(int)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
layout->addWidget(m_spectrumbar);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_colorField = new ColorField(this, true, color, 36);
|
|
Shinya Kitaoka |
120a6e |
connect(m_colorField, SIGNAL(colorChanged(const TPixel32 &, bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onColorChanged(const TPixel32 &, bool)));
|
|
Shinya Kitaoka |
120a6e |
layout->addWidget(m_colorField, 0, Qt::AlignLeft);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
setLayout(layout);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Update all widget and emit keyPositionChanged() signal.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumField::onCurrentPosChanged(bool isDragging) {
|
|
Shinya Kitaoka |
120a6e |
if (m_spectrumbar->getCurrentKeyIndex() == -1) return;
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Shinya Kitaoka |
120a6e |
emit keyPositionChanged(isDragging);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Set color field to spectrum current key color and update.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumField::onCurrentKeyChanged() {
|
|
Shinya Kitaoka |
120a6e |
if (m_spectrumbar->getCurrentKeyIndex() != -1)
|
|
Shinya Kitaoka |
120a6e |
m_colorField->setColor(m_spectrumbar->getCurrentColor());
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Set spectrum current key color to \b color and emit keyColorChanged().
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumField::onColorChanged(const TPixel32 &color, bool isDragging) {
|
|
Shinya Kitaoka |
120a6e |
m_spectrumbar->setCurrentColor(color);
|
|
Shinya Kitaoka |
120a6e |
emit keyColorChanged(isDragging);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! Paint an arrow to connect current spectrum key and square color field.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
void SpectrumField::paintEvent(QPaintEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
int curPos = m_spectrumbar->getCurrentPos();
|
|
Shinya Kitaoka |
120a6e |
if (curPos == -1) return;
|
|
Shinya Kitaoka |
120a6e |
QPainter p(this);
|
|
Shinya Kitaoka |
120a6e |
int x0 = 18 + m_margin;
|
|
Shinya Kitaoka |
120a6e |
int y0 = 2 * m_margin + WidgetHeight + m_spacing;
|
|
Shinya Kitaoka |
120a6e |
int y = m_margin + m_spacing +
|
|
Shinya Kitaoka |
120a6e |
(WidgetHeight * 0.5 -
|
|
Shinya Kitaoka |
120a6e |
4); // 4 e' l'altezza della freccia nella spectrum bar
|
|
Shinya Kitaoka |
120a6e |
int y1 = y0 - y * 0.5 + 1;
|
|
Shinya Kitaoka |
120a6e |
int y2 = y0 - y;
|
|
Shinya Kitaoka |
120a6e |
curPos += m_margin;
|
|
Shinya Kitaoka |
120a6e |
p.setPen(Qt::black);
|
|
Shinya Kitaoka |
120a6e |
p.drawLine(x0, y0, x0, y1);
|
|
Shinya Kitaoka |
120a6e |
p.drawLine(x0, y1, curPos, y1);
|
|
Shinya Kitaoka |
120a6e |
p.drawLine(curPos, y1, curPos, y2);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SpectrumField::~SpectrumField() {}
|