andlabs-ui/areahandler.go

75 lines
1.8 KiB
Go

// 13 december 2015
package ui
// #include "ui.h"
// extern void doAreaHandlerDraw(uiAreaHandler *, uiArea *, uiAreaDrawParams *);
// static inline void uiAreaHandler *allocAreaHandler(void)
// {
// uiAreaHandler *ah;
//
// ah = (uiAreaHandler *) malloc(sizeof (uiAreaHandler));
// if (ah == NULL)
// return NULL;
// ah->Draw = doAreaHandlerDraw;
// return ah;
// }
// static inline void freeAreaHandler(uiAreaHandler *ah)
// {
// free(ah);
// }
import "C"
// no need to lock this; only the GUI thread can access it
var areahandlers = make(map[*C.uiAreaHandler]AreaHandler)
// AreaHandler defines the functionality needed for handling events
// from an Area.
type AreaHandler interface {
// TODO document all these
Draw(a *Area, dp *AreaDrawParams)
}
func registerHandler(ah AreaHandler) *C.uiAreaHandler {
uah := C.allocAreaHandler()
areahandlers[uah] = ah
return uah
}
func unregisterAreaHandler(uah *C.uiAreaHandler) {
delete(areahandlers, uah)
C.freeAreaHandler(uah)
}
// AreaDrawParams defines the TODO.
type AreaDrawParams struct {
// TODO document all these
Context *DrawContext
ClientWidth float64
ClientHeight float64
ClipX float64
ClipY float64
ClipWidth float64
ClipHeight float64
HScrollPos int
VScrollPos int
}
// export doAreaHandlerDraw
func doAreaHandlerDraw(uah *C.uiAreaHandler, ua *C.uiArea, udp *C.uiAreaDrawParams) {
ah := areahandlers[uah]
a := areas[ua]
dp := &AreaDrawParams{
Context: &DrawContext{udp.Context},
ClientWidth: float64(udp.ClientWidth),
ClientHeight: float64(udp.ClientHeight),
ClipX: float64(udp.ClipX),
ClipY: float64(udp.ClipY),
ClipWidth: float64(udp.ClipWidth),
ClipHeight: float64(udp.ClipHeight),
HScrollPos: int(udp.HScrollPos),
VScrollPos: int(udp.VScrollPos),
}
ah.Draw(a, dp)
}