digitalmars.D.learn - SpinButton Signal Oddness...
- Ron Tarrant (2/243) Apr 24 2019
- Ron Tarrant (3/5) Apr 24 2019 This issue has been resolved over here:
I posted this over on the gtkD forum, but thought I'd post here,
too, to get a wider pool of expertise:
I hooked up some signals to a few SpinButtons and I'm getting
double-firings, but not all the time.
The buttons are as follows:
- double,
- float with no extra precision, and
- float with precision down to 1000ths.
The results when they're hooked up to the onValueChanged signal:
- the double never double-fires (how's that for irony?),
- the float with no extra precision always double-fires, and
- the 1000ths float only double-fires as it's crossing a
boundary of 3/1000ths in either direction.
With the onOutput signal:
- double always double-fires,
- float with no extra precision always double-fires except for
the first time it's clicked, and
- 1000ths float always double-fires.
When I say "double-fires" I mean that writeln() in a callback
reports the value before and after the value changes, so
something like:
click:
- 0.1
- 0.2
click:
- 0.2
- 0.3
click:
- 0.3
- 0.4
Here's the code:
```
// SpinButton madness
import std.stdio;
import gtk.MainWindow;
import gtk.Main;
import gtk.Box;
import gtk.Widget;
import gtk.SpinButton;
import gtk.Adjustment;
import gtk.c.types;
void main(string[] args)
{
Main.init(args);
TestRigWindow myTestRig = new TestRigWindow("Test Rig with
SpinButton");
Main.run();
} // main()
class TestRigWindow : MainWindow
{
AppBox appBox;
this(string title)
{
super(title);
addOnDestroy(&quitApp);
appBox = new AppBox();
add(appBox);
showAll();
} // this() CONSTRUCTOR
void quitApp(Widget widget)
{
writeln("Bye.");
Main.quit();
} // quitApp()
} // class myAppWindow
class AppBox : Box
{
DoubleSpinButton doubleSpinButton;
FloatSpinButton floatSpinButton;
PrecisionSpinButton precisionSpinButton;
this()
{
super(Orientation.VERTICAL, 10);
doubleSpinButton = new DoubleSpinButton();
packStart(doubleSpinButton, false, false, 0);
floatSpinButton = new FloatSpinButton();
packStart(floatSpinButton, false, false, 0);
precisionSpinButton = new PrecisionSpinButton();
packStart(precisionSpinButton, false, false, 0);
} // this()
} // class AppBox
class DoubleSpinButton : SpinButton
{
double minimum = -48;
double maximum = 48;
double step = 2;
Adjustment adjustment;
double initialValue = 0;
double pageIncrement = 8;
double pageSize = 0;
this()
{
super(minimum, maximum, step);
adjustment = new Adjustment(initialValue, minimum, maximum,
step, pageIncrement, pageSize);
setAdjustment(adjustment);
// addOnValueChanged(&valueChanged);
addOnOutput(&outputValue);
} // this()
void valueChanged(SpinButton sb)
{
writeln("Double", getValue());
} // valueChanged()
bool outputValue(SpinButton sb)
{
writeln("Double: ", getValue());
return(false);
} // outputValue()
} // class DoubleSpinButton
class FloatSpinButton : SpinButton
{
float minimum = -1.0;
float maximum = 1.0;
float step = .1;
Adjustment adjustment;
float initialValue = 0.0;
float pageIncrement = 0.5;
float pageSize = 0.0;
this()
{
super(minimum, maximum, step);
adjustment = new Adjustment(initialValue, minimum, maximum,
step, pageIncrement, pageSize);
setAdjustment(adjustment);
setWrap(true);
// WHY do these trigger twice?
addOnValueChanged(&valueChanged);
// addOnOutput(&outputValue);
} // this()
void valueChanged(SpinButton sb)
{
writeln("Float Standard", getValue());
} // valueChanged()
bool outputValue(SpinButton sb)
{
writeln("Float Standard: ", getValue());
return(false);
} // outputValue()
} // class FloatSpinButton
class PrecisionSpinButton : SpinButton
{
float minimum = -1.0;
float maximum = 1.0;
float step = .001;
uint precision = 3;
Adjustment adjustment;
float initialValue = 0.0;
float pageIncrement = 0.01;
float pageSize = 0.0;
this()
{
super(minimum, maximum, step);
adjustment = new Adjustment(initialValue, minimum, maximum,
step, pageIncrement, pageSize);
setAdjustment(adjustment);
setDigits(precision);
// addOnValueChanged(&valueChanged);
addOnOutput(&outputValue);
} // this()
void valueChanged(SpinButton sb)
{
writeln("Float Precision", getValue());
} // valueChanged()
bool outputValue(SpinButton sb)
{
writeln("Float Precision: ", getValue());
return(false);
} // outputValue()
} // class PrecisionSpinButton
```
Apr 24 2019
On Wednesday, 24 April 2019 at 14:18:00 UTC, Ron Tarrant wrote:I posted this over on the gtkD forum, but thought I'd post here, too, to get a wider pool of expertise:This issue has been resolved over here: https://forum.gtkd.org/groups/GtkD/thread/982/
Apr 24 2019








Ron Tarrant <rontarrant gmail.com>