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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user