diff --git a/ruamoko/qwaq/Makefile.am b/ruamoko/qwaq/Makefile.am index f0dbe4167..683a0923c 100644 --- a/ruamoko/qwaq/Makefile.am +++ b/ruamoko/qwaq/Makefile.am @@ -25,6 +25,7 @@ SUFFIXES=.o .r qwaq_app_dat_src= \ qwaq-app.r \ + qwaq-button.r \ qwaq-draw.r \ qwaq-garray.r \ qwaq-group.r \ diff --git a/ruamoko/qwaq/qwaq-button.h b/ruamoko/qwaq/qwaq-button.h new file mode 100644 index 000000000..2c19236d3 --- /dev/null +++ b/ruamoko/qwaq/qwaq-button.h @@ -0,0 +1,28 @@ +#ifndef __qwaq_button_h +#define __qwaq_button_h + +#include "qwaq-draw.h" +#include "qwaq-view.h" + +@class ListenerGroup; + +@interface Button : View +{ + DrawBuffer *icon[2]; + int pressed; + ListenerGroup *onPress; + ListenerGroup *onRelease; + ListenerGroup *onClick; + ListenerGroup *onDrag; + ListenerGroup *onAuto; +} +-initWithPos: (Point) pos releasedIcon: (DrawBuffer *) released + pressedIcon: (DrawBuffer *) pressed; +-(ListenerGroup *) onPress; +-(ListenerGroup *) onRelease; +-(ListenerGroup *) onClick; +-(ListenerGroup *) onDrag; +-(ListenerGroup *) onAuto; +@end + +#endif//__qwaq_button_h diff --git a/ruamoko/qwaq/qwaq-button.r b/ruamoko/qwaq/qwaq-button.r new file mode 100644 index 000000000..d79092b0c --- /dev/null +++ b/ruamoko/qwaq/qwaq-button.r @@ -0,0 +1,91 @@ +#include "qwaq-button.h" +#include "qwaq-listener.h" + +@implementation Button +-initWithPos: (Point) pos releasedIcon: (DrawBuffer *) released + pressedIcon: (DrawBuffer *) pressed +{ + Extent size = mergeExtents ([released size], [pressed size]); + + if (!(self = [super initWithRect: {pos, size}])) { + return nil; + } + icon[0] = released; + icon[1] = pressed; + onPress = [[ListenerGroup alloc] init]; + onRelease = [[ListenerGroup alloc] init]; + onClick = [[ListenerGroup alloc] init]; + onDrag = [[ListenerGroup alloc] init]; + onAuto = [[ListenerGroup alloc] init]; + return self; +} + +-draw +{ + [textContext blitFromBuffer: icon[pressed] + to: pos + from: [icon[pressed] rect]]; + return self; +} + +-handleEvent: (qwaq_event_t *) event +{ + ListenerGroup *action = nil; + + if (event.what & qe_mouse) { + switch ((qwaq_mouse_event) (event.what & qe_mouse)) { + case qe_mousedown: + pressed = 1; + [self redraw]; + action = onPress; + break; + case qe_mouseup: + pressed = 0; + [self redraw]; + action = onRelease; + break; + case qe_mouseclick: + action = onClick; + break; + case qe_mousemove: + if (pressed) { + action = onDrag; + } + break; + case qe_mouseauto: + action = onAuto; + break; + } + if (action) { + [action respond: self]; + } + } + return self; +} + +-(ListenerGroup *) onPress +{ + return onPress; +} + +-(ListenerGroup *) onRelease +{ + return onRelease; +} + +-(ListenerGroup *) onClick +{ + return onClick; +} + +-(ListenerGroup *) onDrag +{ + return onDrag; +} + +-(ListenerGroup *) onAuto +{ + return onAuto; +} + +@end