From 115e62f1403b03a326fe98e099ae56cce528a5e5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 18 Jun 2020 18:52:13 +1000 Subject: [PATCH] slider: further behavior improvements Ladders appears offset on sliders with multipliers. Ladder also appears on initial press (but still shows line edit if mouse wasn't moved) --- app/dialog/richtext/richtext.cpp | 1 - app/widget/colorwheel/colorvalueswidget.cpp | 1 - .../nodeparamviewwidgetbridge.cpp | 4 +- app/widget/slider/sliderbase.cpp | 96 ++++++++++++------- app/widget/slider/sliderbase.h | 17 ++-- app/widget/slider/sliderlabel.cpp | 19 +--- app/widget/slider/sliderlabel.h | 16 ---- app/widget/slider/sliderladder.cpp | 4 + 8 files changed, 73 insertions(+), 85 deletions(-) diff --git a/app/dialog/richtext/richtext.cpp b/app/dialog/richtext/richtext.cpp index 5b4303530..8807156b9 100644 --- a/app/dialog/richtext/richtext.cpp +++ b/app/dialog/richtext/richtext.cpp @@ -50,7 +50,6 @@ RichTextDialog::RichTextDialog(const QString &start, QWidget* parent) : toolbar_layout->addWidget(font_combo_); size_slider_ = new FloatSlider(); size_slider_->SetMinimum(0.1); - size_slider_->SetLadderEnabled(true); size_slider_->SetLadderElementCount(1); size_slider_->setToolTip(tr("Font Size")); toolbar_layout->addWidget(size_slider_); diff --git a/app/widget/colorwheel/colorvalueswidget.cpp b/app/widget/colorwheel/colorvalueswidget.cpp index 1b7fd76fc..43b328949 100644 --- a/app/widget/colorwheel/colorvalueswidget.cpp +++ b/app/widget/colorwheel/colorvalueswidget.cpp @@ -203,7 +203,6 @@ FloatSlider *ColorValuesTab::CreateColorSlider() FloatSlider* fs = new FloatSlider(); fs->SetDragMultiplier(0.01); fs->SetDecimalPlaces(5); - fs->SetLadderEnabled(true); fs->SetLadderElementCount(1); connect(fs, &FloatSlider::ValueChanged, this, &ColorValuesTab::SliderChanged); return fs; diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index dc2638ccd..4e4fabba3 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -96,7 +96,7 @@ void NodeParamViewWidgetBridge::CreateWidgets() { IntegerSlider* slider = new IntegerSlider(); slider->SetDefaultValue(input_->GetDefaultValue()); - slider->SetLadderEnabled(true); + slider->SetLadderElementCount(2); widgets_.append(slider); connect(slider, &IntegerSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback); break; @@ -373,7 +373,7 @@ void NodeParamViewWidgetBridge::CreateSliders(int count) for (int i=0;iSetDefaultValue(input_->GetDefaultValueForTrack(i)); - fs->SetLadderEnabled(true); + fs->SetLadderElementCount(2); widgets_.append(fs); connect(fs, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback); } diff --git a/app/widget/slider/sliderbase.cpp b/app/widget/slider/sliderbase.cpp index 67ff5b7de..727b2aa01 100644 --- a/app/widget/slider/sliderbase.cpp +++ b/app/widget/slider/sliderbase.cpp @@ -40,8 +40,8 @@ SliderBase::SliderBase(Mode mode, QWidget *parent) : require_valid_input_(true), tristate_(false), drag_ladder_(nullptr), - enable_ladder_(false), - ladder_element_count_(2) + ladder_element_count_(0), + dragged_(false) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); @@ -52,9 +52,8 @@ SliderBase::SliderBase(Mode mode, QWidget *parent) : editor_ = new FocusableLineEdit(this); addWidget(editor_); - connect(label_, &SliderLabel::LabelMoved, this, &SliderBase::LabelDragged); - connect(label_, &SliderLabel::LabelReleased, this, &SliderBase::LabelClicked); - connect(label_, &SliderLabel::focused, this, &SliderBase::LabelClicked); + connect(label_, &SliderLabel::LabelPressed, this, &SliderBase::LabelPressed); + connect(label_, &SliderLabel::focused, this, &SliderBase::ShowEditor); connect(label_, &SliderLabel::RequestReset, this, &SliderBase::ResetValue); connect(editor_, &FocusableLineEdit::Confirmed, this, &SliderBase::LineEditConfirmed); connect(editor_, &FocusableLineEdit::Cancelled, this, &SliderBase::LineEditCancelled); @@ -201,6 +200,22 @@ QString SliderBase::GetFormat() const } } +void SliderBase::RepositionLadder() +{ + QPoint label_global_pos = label_->mapToGlobal(label_->pos()); + int text_width = QFontMetricsWidth(label_->fontMetrics(), label_->text()); + QPoint ladder_pos(label_global_pos.x(), + label_global_pos.y() + label_->height() / 2 - drag_ladder_->height() / 2); + + if (ladder_element_count_ > 0) { + ladder_pos.setX(ladder_pos.x() + text_width + QFontMetricsWidth(label_->fontMetrics(), QStringLiteral("H"))); + } else { + ladder_pos.setX(ladder_pos.x() + text_width / 2 - drag_ladder_->width() / 2); + } + + drag_ladder_->move(ladder_pos); +} + void SliderBase::UpdateLabel(const QVariant &v) { if (tristate_) { @@ -226,23 +241,21 @@ QVariant SliderBase::StringToValue(const QString &s, bool *ok) return s; } -void SliderBase::LabelClicked() +void SliderBase::ShowEditor() { - if (!drag_ladder_) { - // This was a simple click - // Load label's text into editor - editor_->setText(ValueToString(value_)); + // This was a simple click + // Load label's text into editor + editor_->setText(ValueToString(value_)); - // Show editor - setCurrentWidget(editor_); + // Show editor + setCurrentWidget(editor_); - // Select all text in the editor - editor_->setFocus(); - editor_->selectAll(); - } + // Select all text in the editor + editor_->setFocus(); + editor_->selectAll(); } -void SliderBase::LabelDragged() +void SliderBase::LabelPressed() { switch (mode_) { case kString: @@ -250,24 +263,24 @@ void SliderBase::LabelDragged() break; case kInteger: case kFloat: - drag_ladder_ = new SliderLadder(drag_multiplier_, enable_ladder_ ? ladder_element_count_ : 0); + { + drag_ladder_ = new SliderLadder(drag_multiplier_, ladder_element_count_); drag_ladder_->SetValue(ValueToString(value_)); drag_ladder_->show(); - QPoint label_global_pos = label_->mapToGlobal(label_->pos()); - drag_ladder_->move(label_global_pos.x() + QFontMetricsWidth(label_->fontMetrics(), label_->text()) / 2 - drag_ladder_->width() / 2, - label_global_pos.y() + label_->height() / 2 - drag_ladder_->height() / 2); + RepositionLadder(); connect(drag_ladder_, &SliderLadder::DraggedByValue, this, &SliderBase::LadderDragged); connect(drag_ladder_, &SliderLadder::Released, this, &SliderBase::LadderReleased); - - label_->CancelDrag(); break; } + } } -void SliderBase::LadderDragged(double value, double multiplier) +void SliderBase::LadderDragged(int value, double multiplier) { + dragged_ = true; + switch (mode_) { case kString: // No dragging supported for strings @@ -294,7 +307,10 @@ void SliderBase::LadderDragged(double value, double multiplier) } UpdateLabel(temp_dragged_value_); + drag_ladder_->SetValue(ValueToString(temp_dragged_value_)); + RepositionLadder(); + emit ValueChanged(temp_dragged_value_); break; } @@ -307,20 +323,26 @@ void SliderBase::LadderReleased() drag_ladder_ = nullptr; dragged_diff_ = 0; - // This was a drag - switch (mode_) { - case kString: - // No-op - break; - case kInteger: - SetValue(temp_dragged_value_.toInt()); - break; - case kFloat: - SetValue(temp_dragged_value_.toDouble()); - break; - } + if (dragged_) { + // This was a drag + switch (mode_) { + case kString: + // No-op + break; + case kInteger: + SetValue(temp_dragged_value_.toInt()); + break; + case kFloat: + SetValue(temp_dragged_value_.toDouble()); + break; + } - emit ValueChanged(value_); + emit ValueChanged(value_); + + dragged_ = false; + } else { + ShowEditor(); + } } void SliderBase::LineEditConfirmed() diff --git a/app/widget/slider/sliderbase.h b/app/widget/slider/sliderbase.h index cbc9630a8..7e8062694 100644 --- a/app/widget/slider/sliderbase.h +++ b/app/widget/slider/sliderbase.h @@ -56,11 +56,6 @@ public: void SetFormat(const QString& s); void ClearFormat(); - void SetLadderEnabled(bool e) - { - enable_ladder_ = e; - } - void SetLadderElementCount(int b) { ladder_element_count_ = b; @@ -97,6 +92,8 @@ private: QString GetFormat() const; + void RepositionLadder(); + SliderLabel* label_; FocusableLineEdit* editor_; @@ -124,16 +121,16 @@ private: SliderLadder* drag_ladder_; - bool enable_ladder_; - int ladder_element_count_; + bool dragged_; + private slots: - void LabelClicked(); + void ShowEditor(); - void LabelDragged(); + void LabelPressed(); - void LadderDragged(double value, double multiplier); + void LadderDragged(int value, double multiplier); void LadderReleased(); diff --git a/app/widget/slider/sliderlabel.cpp b/app/widget/slider/sliderlabel.cpp index 8fcf30592..319398a91 100644 --- a/app/widget/slider/sliderlabel.cpp +++ b/app/widget/slider/sliderlabel.cpp @@ -27,8 +27,7 @@ OLIVE_NAMESPACE_ENTER SliderLabel::SliderLabel(QWidget *parent) : - QLabel(parent), - dragging_(false) + QLabel(parent) { QPalette p = palette(); @@ -55,26 +54,10 @@ void SliderLabel::mousePressEvent(QMouseEvent *e) if (e->modifiers() & Qt::AltModifier) { emit RequestReset(); } else { - dragging_ = true; emit LabelPressed(); } } -void SliderLabel::mouseMoveEvent(QMouseEvent *) -{ - if (dragging_) { - emit LabelMoved(); - } -} - -void SliderLabel::mouseReleaseEvent(QMouseEvent *) -{ - if (dragging_) { - emit LabelReleased(); - dragging_ = false; - } -} - void SliderLabel::focusInEvent(QFocusEvent *event) { QWidget::focusInEvent(event); diff --git a/app/widget/slider/sliderlabel.h b/app/widget/slider/sliderlabel.h index 6ac8f9e5a..68d0666e3 100644 --- a/app/widget/slider/sliderlabel.h +++ b/app/widget/slider/sliderlabel.h @@ -33,34 +33,18 @@ class SliderLabel : public QLabel public: SliderLabel(QWidget* parent); - void CancelDrag() - { - dragging_ = false; - } - protected: virtual void mousePressEvent(QMouseEvent *ev) override; - virtual void mouseMoveEvent(QMouseEvent *ev) override; - - virtual void mouseReleaseEvent(QMouseEvent *ev) override; - virtual void focusInEvent(QFocusEvent *event) override; signals: void LabelPressed(); - void LabelMoved(); - - void LabelReleased(); - void focused(); void RequestReset(); -private: - bool dragging_; - }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/slider/sliderladder.cpp b/app/widget/slider/sliderladder.cpp index bbfd50575..2c8e6128e 100644 --- a/app/widget/slider/sliderladder.cpp +++ b/app/widget/slider/sliderladder.cpp @@ -131,6 +131,10 @@ void SliderLadder::TimerUpdate() QCursor::setPos(drag_start_); #endif + if (!x_mvmt && !y_mvmt) { + return; + } + int y_threshold = fontMetrics().height() / 2; if (qAbs(y_mvmt) > qAbs(x_mvmt)