diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index a6b1240b7..e27059353 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -37,6 +37,7 @@ #include "widget/filefield/filefield.h" #include "widget/slider/floatslider.h" #include "widget/slider/integerslider.h" +#include "widget/slider/rationalslider.h" #include "widget/videoparamedit/videoparamedit.h" namespace olive { @@ -76,7 +77,6 @@ void NodeParamViewWidgetBridge::CreateWidgets() case NodeValue::kNone: case NodeValue::kTexture: case NodeValue::kMatrix: - case NodeValue::kRational: case NodeValue::kSamples: case NodeValue::kFootageJob: case NodeValue::kShaderJob: @@ -93,6 +93,11 @@ void NodeParamViewWidgetBridge::CreateWidgets() CreateSliders(1); break; } + case NodeValue::kRational: + { + CreateSliders(1); + break; + } case NodeValue::kVec2: { CreateSliders(2); @@ -258,7 +263,6 @@ void NodeParamViewWidgetBridge::WidgetCallback() case NodeValue::kTexture: case NodeValue::kMatrix: case NodeValue::kSamples: - case NodeValue::kRational: case NodeValue::kFootageJob: case NodeValue::kShaderJob: case NodeValue::kSampleJob: @@ -280,6 +284,13 @@ void NodeParamViewWidgetBridge::WidgetCallback() ProcessSlider(slider, slider->GetValue()); break; } + case NodeValue::kRational: + { + // Widget is a RationalSlider + RationalSlider* slider = static_cast(sender()); + ProcessSlider(slider, QVariant::fromValue(slider->GetValue()));; + break; + } case NodeValue::kVec2: { // Widget is a FloatSlider @@ -404,7 +415,6 @@ void NodeParamViewWidgetBridge::UpdateWidgetValues() case NodeValue::kNone: case NodeValue::kTexture: case NodeValue::kMatrix: - case NodeValue::kRational: case NodeValue::kSamples: case NodeValue::kFootageJob: case NodeValue::kShaderJob: @@ -421,6 +431,11 @@ void NodeParamViewWidgetBridge::UpdateWidgetValues() static_cast(widgets_.first())->SetValue(input_.GetValueAtTime(node_time).toDouble()); break; } + case NodeValue::kRational: + { + static_cast(widgets_.first())->SetValue(input_.GetValueAtTime(node_time).value()); + break; + } case NodeValue::kVec2: { QVector2D vec2 = input_.GetValueAtTime(node_time).value(); @@ -560,7 +575,7 @@ void NodeParamViewWidgetBridge::PropertyChanged(const QString& input, const QStr static_cast(widgets_.first())->SetMinimum(value.toDouble()); break; case NodeValue::kRational: - // FIXME: Rational doesn't have a UI implementation yet + static_cast(widgets_.first())->SetMinimum(value.value()); break; case NodeValue::kVec2: { @@ -598,7 +613,7 @@ void NodeParamViewWidgetBridge::PropertyChanged(const QString& input, const QStr static_cast(widgets_.first())->SetMaximum(value.toDouble()); break; case NodeValue::kRational: - // FIXME: Rational doesn't have a UI implementation yet + static_cast(widgets_.first())->SetMaximum(value.value()); break; case NodeValue::kVec2: { @@ -636,7 +651,7 @@ void NodeParamViewWidgetBridge::PropertyChanged(const QString& input, const QStr static_cast(widgets_.first())->SetOffset(value); break; case NodeValue::kRational: - // FIXME: Rational doesn't have a UI implementation yet + static_cast(widgets_.first())->SetOffset(value); break; case NodeValue::kVec2: { diff --git a/app/widget/slider/rationalslider.cpp b/app/widget/slider/rationalslider.cpp index 62fd2548c..71dd834ab 100644 --- a/app/widget/slider/rationalslider.cpp +++ b/app/widget/slider/rationalslider.cpp @@ -20,12 +20,12 @@ namespace olive { -RationalSlider::RationalSlider(rational timebase, QWidget *parent) : +RationalSlider::RationalSlider(QWidget *parent) : SliderBase(SliderBase::kRational, parent), display_type_(kTimecode), decimal_places_(2), autotrim_decimal_places_(false), - timebase_(timebase), + timebase_(rational(1,24)), lock_display_type_(false) { connect(this, SIGNAL(ValueChanged(QVariant)), this, SLOT(ConvertValue(QVariant))); @@ -33,6 +33,8 @@ RationalSlider::RationalSlider(rational timebase, QWidget *parent) : connect(Core::instance(), &Core::TimecodeDisplayChanged, this, &RationalSlider::ChangeTimecodeDisplayType); SetDisplayType(display_type_); + + SetValue(rational(0, 0)); } rational RationalSlider::GetValue() @@ -50,6 +52,11 @@ void RationalSlider::SetDefaultValue(const rational &r) SliderBase::SetDefaultValue(QVariant::fromValue(r)); } +void RationalSlider::SetDefaultValue(const QVariant &v) { + rational r = v.value(); + SetDefaultValue(r); +} + void RationalSlider::SetMinimum(const rational &d) { SetMinimumInternal(QVariant::fromValue(d)); @@ -111,7 +118,7 @@ bool RationalSlider::LockDisplayType() QString RationalSlider::ValueToString(const QVariant &v) { - double time = v.value().toDouble(); + double time = v.value().toDouble() + GetOffset().value().toDouble(); switch (display_type_) { case kTimecode: @@ -165,7 +172,7 @@ QVariant RationalSlider::StringToValue(const QString &s, bool *ok) break; } - return QVariant::fromValue(r); + return QVariant::fromValue(r - GetOffset().value()); } double RationalSlider::AdjustDragDistanceInternal(const double &start, const double &drag) diff --git a/app/widget/slider/rationalslider.h b/app/widget/slider/rationalslider.h index bdff39d4b..3f171f5c2 100644 --- a/app/widget/slider/rationalslider.h +++ b/app/widget/slider/rationalslider.h @@ -46,7 +46,7 @@ public: kFloat }; - RationalSlider(rational timebase, QWidget* parent = nullptr); + RationalSlider(QWidget* parent = nullptr); /** * @brief Returns the sliders value as a rational @@ -63,6 +63,11 @@ public: */ void SetDefaultValue(const rational& r); + /** + * @brief Sets the sliders default value + */ + void SetDefaultValue(const QVariant& v); + /** * @brief Sets the sliders minimum value */ diff --git a/app/widget/slider/sliderbase.cpp b/app/widget/slider/sliderbase.cpp index 770fc57ed..61d240e10 100644 --- a/app/widget/slider/sliderbase.cpp +++ b/app/widget/slider/sliderbase.cpp @@ -331,9 +331,7 @@ void SliderBase::LadderDragged(int value, double multiplier) { double old_dragged_diff = dragged_diff_; dragged_diff_ += value * drag_multiplier_ * multiplier; - double drag_val = AdjustDragDistanceInternal(value_.value().toDouble(), dragged_diff_); - rational d_v; d_v = rational::fromDouble(drag_val); temp_dragged_value_.setValue(d_v); @@ -341,13 +339,16 @@ void SliderBase::LadderDragged(int value, double multiplier) QVariant clamped = ClampValue(temp_dragged_value_); if (clamped.value() != temp_dragged_value_.value()) { temp_dragged_value_ = clamped; - dragged_diff_ = old_dragged_diff; + dragged_diff_ = (temp_dragged_value_.value() - value_.value()).toDouble(); } UpdateLabel(temp_dragged_value_); drag_ladder_->SetValue(ValueToString(temp_dragged_value_)); - RepositionLadder(); + + if (!Config::Current()[QStringLiteral("UseSliderLadders")].toBool()) { + RepositionLadder(); + } emit ValueChanged(temp_dragged_value_); break;