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)
This commit is contained in:
itsmattkc
2020-06-18 18:58:49 +10:00
parent 1f3e0db64b
commit 115e62f140
8 changed files with 73 additions and 85 deletions
-1
View File
@@ -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_);
@@ -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;
@@ -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;i<count;i++) {
FloatSlider* fs = new FloatSlider();
fs->SetDefaultValue(input_->GetDefaultValueForTrack(i));
fs->SetLadderEnabled(true);
fs->SetLadderElementCount(2);
widgets_.append(fs);
connect(fs, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
}
+59 -37
View File
@@ -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()
+7 -10
View File
@@ -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();
+1 -18
View File
@@ -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);
-16
View File
@@ -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
+4
View File
@@ -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)