diff --git a/haiku/progressbar.cpp b/haiku/progressbar.cpp index e212c810..b1639155 100644 --- a/haiku/progressbar.cpp +++ b/haiku/progressbar.cpp @@ -3,18 +3,19 @@ struct uiProgressBar { uiHaikuControl c; - BStringView *dummy; + BStatusBar *pbar; }; uiHaikuDefineControl( uiProgressBar, // type name uiProgressBarType, // type function - dummy // handle + pbar // handle ) void uiProgressBarSetValue(uiProgressBar *p, int n) { - // TODO + // not on api.haiku-os.org + p->pbar->SetTo(n); } uiProgressBar *uiNewProgressBar(void) @@ -23,7 +24,8 @@ uiProgressBar *uiNewProgressBar(void) p = (uiProgressBar *) uiNewControl(uiProgressBarType()); - p->dummy = new BStringView(NULL, "TODO uiProgressBar not implemented"); + // layout constructor; not on api.haiku-os.org + p->pbar = new BStatusBar(NULL, NULL, NULL); uiHaikuFinishNewControl(p, uiProgressBar); diff --git a/haiku/slider.cpp b/haiku/slider.cpp index e04304d7..fa040f07 100644 --- a/haiku/slider.cpp +++ b/haiku/slider.cpp @@ -1,40 +1,72 @@ // 18 november 2015 #include "uipriv_haiku.hpp" +// TODO any of this on api.haiku-os.org? +// TODO tracking events? + struct uiSlider { uiHaikuControl c; - BStringView *dummy; + BSlider *slider; + void (*onChanged)(uiSlider *, void *); + void *onChangedData; }; uiHaikuDefineControl( uiSlider, // type name uiSliderType, // type function - dummy // handle + slider // handle ) +#define mSliderChanged 0x6060FEFE + +static void onChanged(BMessage *msg) +{ + void *ss; + uiSlider *s; + + // TODO error check + msg->FindPointer(mControlField, &ss); + s = uiSlider(ss); + (*(s->onChanged))(s, s->onChangedData); +} + +static void defaultOnChanged(uiSlider *s, void *data) +{ + // do nothing +} + intmax_t uiSliderValue(uiSlider *s) { - // TODO - return 0; + return s->slider->Value(); } void uiSliderSetValue(uiSlider *s, intmax_t value) { - // TODO + // TODO does this trigger an event? + s->slider->SetValue(value); } void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *s, void *data), void *data) { - // TODO + s->onChanged = f; + s->onChangedData = data; } uiSlider *uiNewSlider(intmax_t min, intmax_t max) { uiSlider *s; + BMessage *msg; s = (uiSlider *) uiNewControl(uiSliderType()); - s->dummy = new BStringView(NULL, "TODO uiSlider not implemented"); + uiHaikuRegisterEventHandler(mSliderChanged, onChanged); + msg = new BMessage(mSliderChanged); + msg->AddPointer(mControlField, s); + + s->slider = new BSlider(NULL, NULL, msg, + min, max, B_HORIZONTAL); + + uiSliderOnChanged(s, defaultOnChanged, NULL); uiHaikuFinishNewControl(s, uiSlider);