More spinbox and slider work.

This commit is contained in:
Pietro Gagliardi 2015-05-20 13:25:45 -04:00
parent 7a86dc92cb
commit ea4017f29d
4 changed files with 54 additions and 12 deletions

View File

@ -18,22 +18,60 @@ static uiProgressBar *pbar;
CHANGED(Spinbox)
CHANGED(Slider)
#define SETTOO(what, name, n) \
static void set ## what ## Too ## name(uiButton *this, void *data) \
{ \
ui ## what ## SetValue(ui ## what(data), n); \
}
SETTOO(Spinbox, Low, -80)
SETTOO(Spinbox, High, 80)
SETTOO(Slider, Low, -80)
SETTOO(Slider, High, 80)
uiBox *makePage4(void)
{
uiBox *page4;
uiBox *hbox;
uiSpinbox *xsb;
uiButton *b;
uiSlider *xsl;
page4 = newVerticalBox();
spinbox = uiNewSpinbox();
spinbox = uiNewSpinbox(0, 100);
uiSpinboxOnChanged(spinbox, onSpinboxChanged, NULL);
uiBoxAppend(page4, uiControl(spinbox), 0);
slider = uiNewSlider();
slider = uiNewSlider(0, 100);
uiSliderOnChanged(slider, onSliderChanged, NULL);
uiBoxAppend(page4, uiControl(slider), 0);
pbar = uiNewProgressBar();
uiBoxAppend(page4, uiControl(pbar), 0);
// TODO separator
hbox = newHorizontalBox();
xsb = uiNewSpinbox(-40, 40);
uiBoxAppend(hbox, uiControl(xsb), 0);
b = uiNewButton("Bad Low");
uiButtonOnClicked(b, setSpinboxTooLow, xsb);
uiBoxAppend(hbox, uiControl(b), 0);
b = uiNewButton("Bad High");
uiButtonOnClicked(b, setSpinboxTooHigh, xsb);
uiBoxAppend(hbox, uiControl(b), 0);
uiBoxAppend(page4, uiControl(hbox), 0);
hbox = newHorizontalBox();
xsl = uiNewSlider(-40, 40);
uiBoxAppend(hbox, uiControl(xsl), 0);
b = uiNewButton("Bad Low");
uiButtonOnClicked(b, setSliderTooLow, xsl);
uiBoxAppend(hbox, uiControl(b), 0);
b = uiNewButton("Bad High");
uiButtonOnClicked(b, setSliderTooHigh, xsl);
uiBoxAppend(hbox, uiControl(b), 0);
uiBoxAppend(page4, uiControl(hbox), 0);
return page4;
}

View File

@ -143,13 +143,15 @@ func NewGroup(text *const char) *Group;
// spinbox/slider rules:
// setting value outside of range will automatically clamp
// initial value is minimum
// TODO what happens if max > min? max == min?
interface Spinbox from Control {
func Value(void) intmax_t;
func SetValue(value intmax_t);
func OnChanged(f *func(s *Spinbox, data *void), data *void);
};
func NewSpinbox(void) *Spinbox;
func NewSpinbox(min intmax_t, max intmax_t) *Spinbox;
interface ProgressBar from Control {
// TODO Value()
@ -162,7 +164,7 @@ interface Slider from Control {
func SetValue(value intmax_t);
func OnChanged(f *func(s *Slider, data *void), data *void);
};
func NewSlider(void) *Slider;
func NewSlider(min intmax_t, max intmax_t) *Slider;
interface Menu {
func AppendItem(name *const char) *MenuItem;

View File

@ -3,6 +3,7 @@
// TODOs
// - investigate overriding WM_ERASEBKGND to simulate TBS_TRANSPARENTBKGND
// - wine does not clamp TBM_SETPOS
struct slider {
uiSlider s;
@ -78,7 +79,7 @@ static void sliderOnChanged(uiSlider *ss, void (*f)(uiSlider *, void *), void *d
s->onChangedData = data;
}
uiSlider *uiNewSlider(void)
uiSlider *uiNewSlider(intmax_t min, intmax_t max)
{
struct slider *s;
uiWindowsMakeControlParams p;
@ -103,8 +104,9 @@ uiSlider *uiNewSlider(void)
s->hwnd = (HWND) uiControlHandle(uiControl(s));
SendMessageW(s->hwnd, TBM_SETRANGEMIN, (WPARAM) TRUE, (LPARAM) 0);
SendMessageW(s->hwnd, TBM_SETRANGEMAX, (WPARAM) TRUE, (LPARAM) 100);
SendMessageW(s->hwnd, TBM_SETRANGEMIN, (WPARAM) TRUE, (LPARAM) min);
SendMessageW(s->hwnd, TBM_SETRANGEMAX, (WPARAM) TRUE, (LPARAM) max);
SendMessageW(s->hwnd, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) min);
s->onChanged = defaultOnChanged;

View File

@ -110,10 +110,6 @@ static void recreateUpDown(struct spinbox *s)
if (preserve) {
SendMessageW(s->updown, UDM_SETRANGE32, (WPARAM) min, (LPARAM) max);
SendMessageW(s->updown, UDM_SETPOS32, 0, (LPARAM) current);
} else {
// TODO
SendMessageW(s->updown, UDM_SETRANGE32, 0, 100);
SendMessageW(s->updown, UDM_SETPOS32, 0, 0);
}
if (uiControlContainerVisible(uiControl(s)))
ShowWindow(s->updown, SW_SHOW);
@ -158,7 +154,7 @@ static void spinboxOnChanged(uiSpinbox *ss, void (*f)(uiSpinbox *, void *), void
s->onChangedData = data;
}
uiSpinbox *uiNewSpinbox(void)
uiSpinbox *uiNewSpinbox(intmax_t min, intmax_t max)
{
struct spinbox *s;
uiWindowsMakeControlParams p;
@ -183,6 +179,10 @@ uiSpinbox *uiNewSpinbox(void)
s->hwnd = (HWND) uiControlHandle(uiControl(s));
recreateUpDown(s);
s->inhibitChanged = TRUE;
SendMessageW(s->updown, UDM_SETRANGE32, (WPARAM) min, (LPARAM) max);
SendMessageW(s->updown, UDM_SETPOS32, 0, (LPARAM) min);
s->inhibitChanged = FALSE;
s->onChanged = defaultOnChanged;