X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdragvalue.cpp;h=64a8f2eec69f53b43f8ed4c0ffc14f31fc13aa5e;hb=c3302003093710ee247ad84c0fe2ef3c579d417f;hp=a7264803a35974e7b96c4dddf266e01e7e971761;hpb=5feac3c2f6edfa8639d8e9b9aa5a82c21f3d1776;p=kdenlive diff --git a/src/dragvalue.cpp b/src/dragvalue.cpp index a7264803..64a8f2ee 100644 --- a/src/dragvalue.cpp +++ b/src/dragvalue.cpp @@ -37,47 +37,78 @@ #include #include +#include #include #include #include -DragValue::DragValue(const QString &label, int defaultValue, int id, const QString suffix, bool showSlider, QWidget* parent) : - QWidget(parent), - m_maximum(100), - m_minimum(0), - m_precision(2), - m_default(defaultValue), - m_id(id) + +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, 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); - m_edit = new KIntSpinBox(this); - m_edit->setObjectName("dragBox"); - if (!suffix.isEmpty()) m_edit->setSuffix(suffix); - - m_edit->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_edit->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - m_edit->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - m_edit->setRange(m_minimum, m_maximum); - l->addWidget(m_edit); - connect(m_edit, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int))); - connect(m_label, SIGNAL(valueChanged(int,bool)), this, SLOT(setValue(int,bool))); + 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); + m_intEdit->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + m_intEdit->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + m_intEdit->setRange((int) m_minimum, (int)m_maximum); + l->addWidget(m_intEdit); + connect(m_intEdit, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int))); + connect(m_intEdit, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished())); + } 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->setButtonSymbols(QAbstractSpinBox::NoButtons); + 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(setValueFromProgress(double,bool))); connect(m_label, SIGNAL(resetValue()), this, SLOT(slotReset())); setLayout(l); - m_label->setMaximumHeight(m_edit->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")); @@ -101,29 +132,35 @@ DragValue::DragValue(const QString &label, int defaultValue, int id, const QStri 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))); - - connect(m_edit, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished())); } + DragValue::~DragValue() { - delete m_edit; + delete m_intEdit; + delete m_doubleEdit; delete m_menu; - delete m_scale; - delete m_directUpdate; + //delete m_scale; + //delete m_directUpdate; } int DragValue::spinSize() { - return m_edit->sizeHint().width(); + if (m_intEdit) + return m_intEdit->sizeHint().width(); + else + return m_doubleEdit->sizeHint().width(); } void DragValue::setSpinSize(int width) { - m_edit->setMinimumWidth(width); + if (m_intEdit) + m_intEdit->setMinimumWidth(width); + else + m_doubleEdit->setMinimumWidth(width); } void DragValue::slotSetInTimeline() @@ -133,7 +170,7 @@ void DragValue::slotSetInTimeline() int DragValue::precision() const { - return m_precision; + return m_decimals; } qreal DragValue::maximum() const @@ -148,29 +185,40 @@ qreal DragValue::minimum() const qreal DragValue::value() const { - return m_edit->value(); + if (m_intEdit) return m_intEdit->value(); + else return m_doubleEdit->value(); } void DragValue::setMaximum(qreal max) { - m_maximum = max; - m_label->setRange(m_minimum, m_maximum); - m_edit->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); - m_edit->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); - m_edit->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*/) @@ -183,40 +231,85 @@ 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_edit->blockSignals(true); - m_edit->setValue(m_default); - m_label->setValue(m_default); - m_edit->blockSignals(false); - emit valueChanged(m_default, true); + if (m_intEdit) { + m_intEdit->blockSignals(true); + m_intEdit->setValue(m_default); + m_intEdit->blockSignals(false); + emit valueChanged((int) m_default, true); + } + else { + m_doubleEdit->blockSignals(true); + m_doubleEdit->setValue(m_default); + m_doubleEdit->blockSignals(false); + emit valueChanged(m_default, true); + } + 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, true); } -void DragValue::setValue(int value, bool final) +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) { value = qBound(m_minimum, value, m_maximum); - m_edit->blockSignals(true); - m_edit->setValue(value); - m_edit->blockSignals(false); - m_label->setValue(value); - emit valueChanged(value, final); + if (m_intEdit) { + m_intEdit->blockSignals(true); + m_intEdit->setValue((int) value); + m_intEdit->blockSignals(false); + emit valueChanged((int) value, final); + } + else { + m_doubleEdit->blockSignals(true); + m_doubleEdit->setValue(value); + m_doubleEdit->blockSignals(false); + emit valueChanged(value, final); + } + + 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) { - //m_edit->setEnabled(true); - m_edit->setFocus(e->reason()); + if (m_intEdit) m_intEdit->setFocus(e->reason()); + else m_doubleEdit->setFocus(e->reason()); } else { QWidget::focusInEvent(e); } @@ -224,9 +317,20 @@ void DragValue::focusInEvent(QFocusEvent* e) void DragValue::slotEditingFinished() { - qreal value = m_edit->value(); - m_edit->clearFocus(); - emit valueChanged(value, true); + if (m_intEdit) { + int value = m_intEdit->value(); + m_intEdit->blockSignals(true); + m_intEdit->clearFocus(); + m_intEdit->blockSignals(false); + if (!KdenliveSettings::dragvalue_directupdate()) emit valueChanged((double) value, true); + } + else { + double value = m_doubleEdit->value(); + m_doubleEdit->blockSignals(true); + m_doubleEdit->clearFocus(); + m_doubleEdit->blockSignals(false); + if (!KdenliveSettings::dragvalue_directupdate()) emit valueChanged(value, true); + } } void DragValue::slotShowContextMenu(const QPoint& pos) @@ -251,29 +355,42 @@ void DragValue::setInTimelineProperty(bool intimeline) { if (m_label->property("inTimeline").toBool() == intimeline) return; m_label->setProperty("inTimeline", intimeline); - m_edit->setProperty("inTimeline", intimeline); style()->unpolish(m_label); style()->polish(m_label); m_label->update(); - style()->unpolish(m_edit); - style()->polish(m_edit); - m_edit->update(); + if (m_intEdit) { + m_intEdit->setProperty("inTimeline", intimeline); + style()->unpolish(m_intEdit); + style()->polish(m_intEdit); + m_intEdit->update(); + } + else { + m_doubleEdit->setProperty("inTimeline", intimeline); + style()->unpolish(m_doubleEdit); + style()->polish(m_doubleEdit); + m_doubleEdit->update(); + } + } -CustomLabel::CustomLabel(const QString &label, bool showSlider, QWidget* parent) : +CustomLabel::CustomLabel(const QString &label, bool showSlider, int range, QWidget* parent) : QProgressBar(parent), m_dragMode(false), - m_step(1), - m_showSlider(showSlider) + m_showSlider(showSlider), + 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"); } @@ -313,11 +430,11 @@ void CustomLabel::mouseMoveEvent(QMouseEvent* e) if (KdenliveSettings::dragvalue_mode() == 2) diff = (diff > 0 ? 1 : -1) * pow(diff, 2); - int nv = value() + diff / m_step; + double nv = value() + diff * m_step; if (nv != value()) setNewValue(nv, KdenliveSettings::dragvalue_directupdate()); } else { - int nv = minimum() + ((double) maximum() - minimum()) / width() * e->pos().x(); + double nv = minimum() + ((double) maximum() - minimum()) / width() * e->pos().x(); if (nv != value()) setNewValue(nv, KdenliveSettings::dragvalue_directupdate()); } m_dragLastPosition = e->pos(); @@ -344,7 +461,7 @@ void CustomLabel::mouseReleaseEvent(QMouseEvent* e) e->accept(); } else if (m_showSlider) { - setNewValue((int) (minimum() + ((double)maximum() - minimum()) / width() * e->pos().x()), true); + setNewValue((double) maximum() * e->pos().x() / width(), true); m_dragLastPosition = m_dragStartPosition; e->accept(); } @@ -355,30 +472,51 @@ void CustomLabel::wheelEvent(QWheelEvent* e) { if (e->delta() > 0) { if (e->modifiers() == Qt::ControlModifier) slotValueInc(10); + 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(0.1); else slotValueDec(); } e->accept(); } -void CustomLabel::slotValueInc(int factor) +void CustomLabel::slotValueInc(double factor) { - setNewValue((int) (value() + m_step * factor), true); + setNewValue(value() + m_step * factor, true); } -void CustomLabel::slotValueDec(int factor) +void CustomLabel::slotValueDec(double factor) { - setNewValue((int) (value() - m_step * factor), true); + setNewValue(value() - m_step * factor, true); } -void CustomLabel::setNewValue(int value, bool update) +void CustomLabel::setProgressValue(double value) { - setValue(value); - emit valueChanged(value, update); + setValue(qRound(value)); } -#include "dragvalue.moc" +void CustomLabel::setNewValue(double value, bool update) +{ + setValue(qRound(value)); + emit valueChanged(qRound(value), update); +} + +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"