#include <QPainter>
#include <QStyle>
+#include <KDebug>
#include <KIcon>
#include <KLocalizedString>
#include <KGlobalSettings>
-DragValue::DragValue(const QString &label, double defaultValue, int decimals, int id, const QString suffix, bool showSlider, QWidget* parent) :
- QWidget(parent),
- m_maximum(100),
- m_minimum(0),
- m_decimals(decimals),
- m_default(defaultValue),
- m_id(id),
- m_intEdit(NULL),
- m_doubleEdit(NULL)
+
+DragValue::DragValue(const QString &label, double defaultValue, int decimals, double min, double max, int id, const QString &suffix, bool showSlider, QWidget* parent) :
+ QWidget(parent),
+ m_maximum(max),
+ m_minimum(min),
+ m_decimals(decimals),
+ m_default(defaultValue),
+ m_id(id),
+ m_intEdit(NULL),
+ m_doubleEdit(NULL)
{
if (showSlider) setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
else setSizePolicy(QSizePolicy::Maximum, QSizePolicy::MinimumExpanding);
setFocusPolicy(Qt::StrongFocus);
setContextMenuPolicy(Qt::CustomContextMenu);
+ setFocusPolicy(Qt::StrongFocus);
QHBoxLayout *l = new QHBoxLayout;
l->setSpacing(0);
l->setContentsMargins(0, 0, 0, 0);
- m_label = new CustomLabel(label, showSlider, decimals, this);
- m_label->setCursor(Qt::PointingHandCursor);
- m_label->setRange(m_minimum, m_maximum);
+ m_label = new CustomLabel(label, showSlider, m_maximum - m_minimum, this);
l->addWidget(m_label);
if (decimals == 0) {
+ m_label->setMaximum(max - min);
+ m_label->setStep(1);
m_intEdit = new QSpinBox(this);
m_intEdit->setObjectName("dragBox");
+ m_intEdit->setFocusPolicy(Qt::StrongFocus);
if (!suffix.isEmpty()) m_intEdit->setSuffix(suffix);
m_intEdit->setKeyboardTracking(false);
m_intEdit->setButtonSymbols(QAbstractSpinBox::NoButtons);
l->addWidget(m_intEdit);
connect(m_intEdit, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int)));
connect(m_intEdit, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
- }
- else {
+ } else {
m_doubleEdit = new QDoubleSpinBox(this);
m_doubleEdit->setDecimals(decimals);
+ m_doubleEdit->setFocusPolicy(Qt::StrongFocus);
m_doubleEdit->setObjectName("dragBox");
if (!suffix.isEmpty()) m_doubleEdit->setSuffix(suffix);
m_doubleEdit->setKeyboardTracking(false);
m_doubleEdit->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
m_doubleEdit->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
m_doubleEdit->setRange(m_minimum, m_maximum);
+ double factor = 100;
+ if (m_maximum - m_minimum > 10000) factor = 1000;
+ m_label->setStep(1);
+ m_doubleEdit->setSingleStep((m_maximum - m_minimum) / factor);
l->addWidget(m_doubleEdit);
connect(m_doubleEdit, SIGNAL(valueChanged(double)), this, SLOT(slotSetValue(double)));
connect(m_doubleEdit, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
}
- connect(m_label, SIGNAL(valueChanged(double,bool)), this, SLOT(setValue(double,bool)));
+ connect(m_label, SIGNAL(valueChanged(double,bool)), this, SLOT(setValueFromProgress(double,bool)));
connect(m_label, SIGNAL(resetValue()), this, SLOT(slotReset()));
setLayout(l);
- if (m_intEdit) m_label->setMaximumHeight(m_intEdit->sizeHint().height());
- else m_label->setMaximumHeight(m_doubleEdit->sizeHint().height());
+ if (m_intEdit)
+ m_label->setMaximumHeight(m_intEdit->sizeHint().height());
+ else
+ m_label->setMaximumHeight(m_doubleEdit->sizeHint().height());
m_menu = new QMenu(this);
-
+
m_scale = new KSelectAction(i18n("Scaling"), this);
m_scale->addAction(i18n("Normal scale"));
m_scale->addAction(i18n("Pixel scale"));
m_menu->addAction(timeline);
}
- connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotShowContextMenu(const QPoint&)));
+ connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotShowContextMenu(QPoint)));
connect(m_scale, SIGNAL(triggered(int)), this, SLOT(slotSetScaleMode(int)));
connect(m_directUpdate, SIGNAL(triggered(bool)), this, SLOT(slotSetDirectUpdate(bool)));
}
DragValue::~DragValue()
{
- if (m_intEdit) delete m_intEdit;
- if (m_doubleEdit) delete m_doubleEdit;
+ delete m_intEdit;
+ delete m_doubleEdit;
delete m_menu;
- delete m_scale;
- delete m_directUpdate;
+ //delete m_scale;
+ //delete m_directUpdate;
}
int DragValue::spinSize()
{
- if (m_intEdit) return m_intEdit->sizeHint().width();
- else return m_doubleEdit->sizeHint().width();
+ if (m_intEdit)
+ return m_intEdit->sizeHint().width();
+ else
+ return m_doubleEdit->sizeHint().width();
}
void DragValue::setSpinSize(int width)
{
- if (m_intEdit) m_intEdit->setMinimumWidth(width);
- else m_doubleEdit->setMinimumWidth(width);
+ if (m_intEdit)
+ m_intEdit->setMinimumWidth(width);
+ else
+ m_doubleEdit->setMinimumWidth(width);
}
void DragValue::slotSetInTimeline()
void DragValue::setMaximum(qreal max)
{
- m_maximum = max;
- m_label->setRange(m_minimum, m_maximum);
- if (m_intEdit) m_intEdit->setRange(m_minimum, m_maximum);
- else m_doubleEdit->setRange(m_minimum, m_maximum);
+ if (m_maximum != max) {
+ m_maximum = max;
+ if (m_intEdit)
+ m_intEdit->setRange(m_minimum, m_maximum);
+ else
+ m_doubleEdit->setRange(m_minimum, m_maximum);
+ }
}
void DragValue::setMinimum(qreal min)
{
- m_minimum = min;
- m_label->setRange(m_minimum, m_maximum);
- if (m_intEdit) m_intEdit->setRange(m_minimum, m_maximum);
- else m_doubleEdit->setRange(m_minimum, m_maximum);
+ if (m_minimum != min) {
+ m_minimum = min;
+ if (m_intEdit)
+ m_intEdit->setRange(m_minimum, m_maximum);
+ else
+ m_doubleEdit->setRange(m_minimum, m_maximum);
+ }
}
void DragValue::setRange(qreal min, qreal max)
{
m_maximum = max;
m_minimum = min;
- m_label->setRange(m_minimum, m_maximum);
- if (m_intEdit) m_intEdit->setRange(m_minimum, m_maximum);
- else m_doubleEdit->setRange(m_minimum, m_maximum);
+ if (m_intEdit)
+ m_intEdit->setRange(m_minimum, m_maximum);
+ else
+ m_doubleEdit->setRange(m_minimum, m_maximum);
}
void DragValue::setPrecision(int /*precision*/)
m_edit->setValidator(new QDoubleValidator(m_minimum, m_maximum, precision, this));*/
}
-void DragValue::setStep(qreal /*step*/)
+void DragValue::setStep(qreal step)
{
- //m_step = step;
+ if (m_intEdit)
+ m_intEdit->setSingleStep(step);
+ else
+ m_doubleEdit->setSingleStep(step);
}
void DragValue::slotReset()
m_doubleEdit->blockSignals(false);
emit valueChanged(m_default, true);
}
- m_label->setProgressValue(m_default);
+ m_label->setProgressValue((m_default - m_minimum) / (m_maximum - m_minimum) * m_label->maximum());
}
void DragValue::slotSetValue(int value)
{
- setValue(value, KdenliveSettings::dragvalue_directupdate());
+ setValue(value, true);
}
void DragValue::slotSetValue(double value)
{
- setValue(value, KdenliveSettings::dragvalue_directupdate());
+ setValue(value, true);
+}
+
+void DragValue::setValueFromProgress(double value, bool final)
+{
+ value = m_minimum + value * (m_maximum - m_minimum) / m_label->maximum();
+ if (m_decimals == 0)
+ setValue(qRound(value), final);
+ else
+ setValue(value, final);
}
void DragValue::setValue(double value, bool final)
m_doubleEdit->blockSignals(false);
emit valueChanged(value, final);
}
- m_label->setProgressValue(value);
+
+ m_label->setProgressValue((value - m_minimum) / (m_maximum - m_minimum) * m_label->maximum());
+}
+
+void DragValue::focusOutEvent(QFocusEvent*)
+{
+ if (m_intEdit) m_intEdit->setFocusPolicy(Qt::StrongFocus);
+ else m_doubleEdit->setFocusPolicy(Qt::StrongFocus);
}
void DragValue::focusInEvent(QFocusEvent* e)
{
+ if (m_intEdit)
+ m_intEdit->setFocusPolicy(Qt::WheelFocus);
+ else
+ m_doubleEdit->setFocusPolicy(Qt::WheelFocus);
+
if (e->reason() == Qt::TabFocusReason || e->reason() == Qt::BacktabFocusReason) {
if (m_intEdit) m_intEdit->setFocus(e->reason());
else m_doubleEdit->setFocus(e->reason());
m_intEdit->blockSignals(true);
m_intEdit->clearFocus();
m_intEdit->blockSignals(false);
- if (!KdenliveSettings::dragvalue_directupdate()) emit valueChanged(value, true);
+ if (!KdenliveSettings::dragvalue_directupdate()) emit valueChanged((double) value, true);
}
else {
double value = m_doubleEdit->value();
}
-CustomLabel::CustomLabel(const QString &label, bool showSlider, int precision, QWidget* parent) :
+CustomLabel::CustomLabel(const QString &label, bool showSlider, int range, QWidget* parent) :
QProgressBar(parent),
m_dragMode(false),
- m_step(1.0),
m_showSlider(showSlider),
- m_precision(pow(10, precision)),
- m_value(0)
+ m_step(10.0)
+ //m_precision(pow(10, precision)),
{
setFont(KGlobalSettings::toolBarFont());
- setFormat(" " + label);
- setFocusPolicy(Qt::ClickFocus);
+ setFormat(' ' + label);
+ setFocusPolicy(Qt::StrongFocus);
+ setCursor(Qt::PointingHandCursor);
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
- if (!showSlider) {
+ if (showSlider) setRange(0, 1000);
+ else {
+ setRange(0, range);
QSize sh;
const QFontMetrics &fm = fontMetrics();
- sh.setWidth(fm.width(" " + label + " "));
+ sh.setWidth(fm.width(' ' + label + ' '));
setMaximumWidth(sh.width());
setObjectName("dragOnly");
}
if (KdenliveSettings::dragvalue_mode() == 2)
diff = (diff > 0 ? 1 : -1) * pow(diff, 2);
- int nv = m_value + diff / m_step;
- if (nv != m_value) setNewValue(nv, KdenliveSettings::dragvalue_directupdate());
+ double nv = value() + diff * m_step;
+ if (nv != value()) setNewValue(nv, KdenliveSettings::dragvalue_directupdate());
}
else {
double nv = minimum() + ((double) maximum() - minimum()) / width() * e->pos().x();
- if (nv != m_value) setNewValue(nv, KdenliveSettings::dragvalue_directupdate());
+ if (nv != value()) setNewValue(nv, KdenliveSettings::dragvalue_directupdate());
}
m_dragLastPosition = e->pos();
e->accept();
return;
}
if (m_dragMode) {
- setNewValue(m_value, true);
+ setNewValue(value(), true);
m_dragLastPosition = m_dragStartPosition;
e->accept();
}
else if (m_showSlider) {
- setNewValue((minimum() + ((double)maximum() - minimum()) / width() * e->pos().x()), true);
+ setNewValue((double) maximum() * e->pos().x() / width(), true);
m_dragLastPosition = m_dragStartPosition;
e->accept();
}
{
if (e->delta() > 0) {
if (e->modifiers() == Qt::ControlModifier) slotValueInc(10);
- else if (e->modifiers() == Qt::AltModifier) slotValueInc(1.0 / m_precision);
+ else if (e->modifiers() == Qt::AltModifier) slotValueInc(0.1);
else slotValueInc();
}
else {
if (e->modifiers() == Qt::ControlModifier) slotValueDec(10);
- else if (e->modifiers() == Qt::AltModifier) slotValueDec(1.0 / m_precision);
+ else if (e->modifiers() == Qt::AltModifier) slotValueDec(0.1);
else slotValueDec();
}
e->accept();
void CustomLabel::slotValueInc(double factor)
{
- setNewValue(m_value + m_step * factor, true);
+ setNewValue(value() + m_step * factor, true);
}
void CustomLabel::slotValueDec(double factor)
{
- setNewValue(m_value - m_step * factor, true);
+ setNewValue(value() - m_step * factor, true);
}
void CustomLabel::setProgressValue(double value)
{
- m_value = value;
- setValue((int) value);
+ setValue(qRound(value));
}
void CustomLabel::setNewValue(double value, bool update)
{
- m_value = value;
- setValue(value);
- emit valueChanged(value, update);
+ setValue(qRound(value));
+ emit valueChanged(qRound(value), update);
}
-#include "dragvalue.moc"
+void CustomLabel::setStep(double step)
+{
+ m_step = step;
+}
+
+void CustomLabel::focusInEvent(QFocusEvent*)
+{
+ setFocusPolicy(Qt::WheelFocus);
+}
+void CustomLabel::focusOutEvent(QFocusEvent*)
+{
+ setFocusPolicy(Qt::StrongFocus);
+}
+
+#include "dragvalue.moc"