Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #169: stepSize not updated when holding button #170

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions applications/launcher/widgets/BetterSpinBox.qml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ SpinBox {
id: control
property bool upPressed: up.pressed
property bool downPressed: down.pressed
property bool lastDirectionUp
property bool ignoreNextValueChange: false
onDownPressedChanged: {
this.lastDirectionUp = false;
}
onUpPressedChanged: {
this.lastDirectionUp = true;
}
up.indicator: Rectangle {
x: control.mirrored ? 0 : parent.width - width
height: parent.height
Expand Down
32 changes: 13 additions & 19 deletions applications/launcher/widgets/SettingsPopup.qml
Original file line number Diff line number Diff line change
Expand Up @@ -51,29 +51,23 @@ Item {
to: 360
stepSize: 1
value: controller.sleepAfter
onDownPressedChanged: {
if(this.value <= 10){
this.stepSize = 1;
return;
}
if(this.value <= 60){
this.stepSize = 5;
onValueChanged: {
if(this.ignoreNextValueChange){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this logic should be moved into BetterSpinBox, and it should only call the valueChanged signal if ignoreNextValueChange is false.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll have to fiddle with this one.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For sure. Just for some more context for you, I intend to pull out a bunch of the widgets into their own widget library at some point, so I'd like to make as many of them fully self contained as I can before I do so.

Copy link
Contributor Author

@danshick danshick Mar 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be best to create a second signal. I'm thinking "valueStable"? It doesn't look like Javascript's super keyword will be any use here at all.

Unfortunately, all of this can be overwritten if someone intuitively attempts to use the original onValueChanged signal.

I'd be curious to hear your thoughts.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or, we could just try to make ignoreNextValueChange an instance variable and not declare it in BetterSpinBox at all.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What you can do is make Item be the root of BetterSpinBox and then declare the signals/properties there and map them into the SpinBox. That way you'll have more control over when things are called.

this.ignoreNextValueChange = false;
return;
}
this.stepSize = 15;
}
onUpPressedChanged: {
if(this.value < 10){
this.stepSize = 1;
return;
var offset = 0;
if(this.value > 10){
offset = 4;
}
if(this.value < 60){
this.stepSize = 5;
return;
if(this.value > 60){
offset = 14;
}
this.stepSize = 15;
}
onValueChanged: {
// this event handler will fire a second time
// if offset is non-zero
this.ignoreNextValueChange = offset !== 0;
this.lastDirectionUp ?
this.value += offset : this.value -= offset;
controller.sleepAfter = this.value;
}
Layout.preferredWidth: 300
Expand Down