// 18 november 2015 #include "uipriv_haiku.hpp" // TODO any of this on api.haiku-os.org? // TODO tracking events? struct uiSlider { uiHaikuControl c; BSlider *slider; void (*onChanged)(uiSlider *, void *); void *onChangedData; }; uiHaikuDefineControl( uiSlider, // type name uiSliderType, // type function 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) { return s->slider->Value(); } void uiSliderSetValue(uiSlider *s, intmax_t value) { // TODO does this trigger an event? s->slider->SetValue(value); } void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *s, void *data), void *data) { s->onChanged = f; s->onChangedData = data; } uiSlider *uiNewSlider(intmax_t min, intmax_t max) { uiSlider *s; BMessage *msg; s = (uiSlider *) uiNewControl(uiSliderType()); 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); return s; }