Finish implementation

This commit is contained in:
Thomas Wilshaw
2021-04-08 11:26:31 +01:00
parent b12518af9e
commit 3bc26f6ce0
7 changed files with 174 additions and 25 deletions
+67 -10
View File
@@ -55,6 +55,7 @@ SliderBase::SliderBase(Mode mode, QWidget *parent) :
connect(label_, &SliderLabel::LabelPressed, this, &SliderBase::LabelPressed);
connect(label_, &SliderLabel::focused, this, &SliderBase::ShowEditor);
connect(label_, &SliderLabel::RequestReset, this, &SliderBase::ResetValue);
connect(label_, &SliderLabel::ChangeSliderType, this, &SliderBase::ChangeSliderType);
connect(editor_, &FocusableLineEdit::Confirmed, this, &SliderBase::LineEditConfirmed);
connect(editor_, &FocusableLineEdit::Cancelled, this, &SliderBase::LineEditCancelled);
@@ -160,8 +161,14 @@ void SliderBase::SetMinimumInternal(const QVariant &v)
has_min_ = true;
// Limit value by this new minimum value
if (value_.toDouble() < min_value_.toDouble()) {
SetValue(min_value_);
if (mode_ == kRational) {
if (value_.value<rational>().toDouble() < min_value_.value<rational>().toDouble()) {
SetValue(min_value_);
}
} else {
if (value_.toDouble() < min_value_.toDouble()) {
SetValue(min_value_);
}
}
}
@@ -171,8 +178,14 @@ void SliderBase::SetMaximumInternal(const QVariant &v)
has_max_ = true;
// Limit value by this new maximum value
if (value_.toDouble() > max_value_.toDouble()) {
SetValue(max_value_);
if (mode_ == kRational) {
if (value_.value<rational>().toDouble() > max_value_.value<rational>().toDouble()) {
SetValue(max_value_);
}
} else {
if (value_.toDouble() > max_value_.toDouble()) {
SetValue(max_value_);
}
}
}
@@ -186,11 +199,22 @@ void SliderBase::changeEvent(QEvent *e)
const QVariant &SliderBase::ClampValue(const QVariant &v)
{
if (has_min_ && v.toDouble() < min_value_.toDouble()) {
return min_value_;
double value, min, max;
if (mode_ == kRational) {
value = v.value<rational>().toDouble();
min = min_value_.value<rational>().toDouble();
max = max_value_.value<rational>().toDouble();
} else {
value = v.toDouble();
min = min_value_.toDouble();
max = max_value_.toDouble();
}
if (has_max_ && v.toDouble() > max_value_.toDouble()) {
if (has_min_ && value < min) {
return min_value_;
}else if (has_max_ && value > max) {
printf("MAX: %f\n", max_value_.value<rational>().toDouble());
return max_value_;
}
@@ -253,6 +277,7 @@ void SliderBase::LabelPressed()
break;
case kInteger:
case kFloat:
case kRational:
{
drag_ladder_ = new SliderLadder(drag_multiplier_, ladder_element_count_);
drag_ladder_->SetValue(ValueToString(value_));
@@ -277,7 +302,6 @@ void SliderBase::LadderDragged(int value, double multiplier)
break;
case kInteger:
case kFloat:
case kRational:
{
dragged_diff_ += value * drag_multiplier_ * multiplier;
@@ -303,6 +327,32 @@ void SliderBase::LadderDragged(int value, double multiplier)
emit ValueChanged(clamped_temp_dragged_value_);
break;
}
case kRational:
{
double old_dragged_diff = dragged_diff_;
dragged_diff_ += value * drag_multiplier_ * multiplier;
double drag_val = AdjustDragDistanceInternal(value_.value<rational>().toDouble(), dragged_diff_);
rational d_v;
d_v = rational::fromDouble(drag_val);
temp_dragged_value_.setValue(d_v);
QVariant clamped = ClampValue(temp_dragged_value_);
if (clamped.value<rational>() != temp_dragged_value_.value<rational>()) {
temp_dragged_value_ = clamped;
dragged_diff_ = old_dragged_diff;
}
UpdateLabel(temp_dragged_value_);
drag_ladder_->SetValue(ValueToString(temp_dragged_value_));
RepositionLadder();
emit ValueChanged(temp_dragged_value_);
break;
}
}
}
@@ -326,7 +376,7 @@ void SliderBase::LadderReleased()
break;
case kRational:
QVariant r;
r.setValue(rational(temp_dragged_value_.toDouble()));
r.setValue(rational::fromDouble(temp_dragged_value_.value<rational>().toDouble()));
SetValue(r);
}
@@ -407,4 +457,11 @@ void SliderBase::RepositionLadder()
}
}
void SliderBase::ChangeSliderType()
{
if (mode_ == kRational) {
emit changeRationalDisplayType();
}
}
}