quakeforge/ruamoko/qwaq/qwaq-button.r
Bill Currie 95d20d67c7 [qwaq] Implement mouse grabbing
Button will need it for dragging.
2020-03-19 19:00:03 +09:00

99 lines
1.7 KiB
R

#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];
onHover = [[ListenerGroup alloc] init];
return self;
}
-draw
{
[super 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;
action = onPress;
[self grabMouse];
[self redraw];
break;
case qe_mouseup:
pressed = 0;
action = onRelease;
[self releaseMouse];
[self redraw];
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;
}
-(ListenerGroup *) onHover
{
return onHover;
}
@end