diff -r 2dbc56c2323b -r e2fd132ab781 ui/ui/toolkit.h --- a/ui/ui/toolkit.h Sat Mar 29 19:12:07 2014 +0100 +++ b/ui/ui/toolkit.h Mon Mar 31 20:22:16 2014 +0200 @@ -55,12 +55,14 @@ #endif /* public types */ -typedef struct UiObject UiObject; -typedef struct UiEvent UiEvent; +typedef struct UiObject UiObject; +typedef struct UiEvent UiEvent; +typedef struct UiObserver UiObserver; typedef struct UiInteger UiInteger; typedef struct UiString UiString; typedef struct UiText UiText; +typedef struct UiList UiList; /* private types */ typedef struct UiContext UiContext; @@ -73,7 +75,7 @@ #define ui_insert(text, begin, str) (text).insert(&(text), begin, str) -typedef void(*ui_callback)(UiEvent*, void*); // event, user data +typedef void(*ui_callback)(UiEvent*, void*); /* event, user data */ struct UiObject { /* @@ -109,6 +111,12 @@ int intval; }; +struct UiObserver { + ui_callback callback; + void *data; + UiObserver *next; +}; + struct UiInteger { int (*get)(UiInteger*); void (*set)(UiInteger*, int); @@ -128,11 +136,32 @@ char* (*get)(UiText*); char* (*getsubstr)(UiText*, int, int); // text, begin, end void (*insert)(UiText*, int, char*); - char* value; + char *value; void *obj; void *undomgr; // TODO: selection, undo, replace, ... }; + +/* + * abstract list + */ +struct UiList { + /* get the first element */ + void*(*first)(UiList *list); + /* get the next element */ + void*(*next)(UiList *list); + /* get the nth element */ + void*(*get)(UiList *list, int i); + /* get the number of elements */ + int(*count)(UiList *list); + /* list of observers */ + UiObserver *observers; + /* iterator changes after first() next() and get() */ + void *iter; + /* private - implementation dependent */ + void *data; + +}; void ui_init(char *appname, int argc, char **argv); void ui_exitfunc(ui_callback f, void *udata); @@ -163,6 +192,27 @@ // new: int ui_getint(UiObject *obj, char *name); + + + + +// types +UiObserver* ui_observer_new(ui_callback f, void *data); +UiObserver* ui_obsvlist_add(UiObserver *list, UiObserver *observer); +UiObserver* ui_add_observer(UiObserver *list, ui_callback f, void *data); +void ui_notify(UiObserver *observer, void *data); +void ui_notify_except(UiObserver *observer, UiObserver *exc, void *data); + + +UiList* ui_list_new(); +void* ui_list_first(UiList *list); +void* ui_list_next(UiList *list); +void* ui_list_get(UiList *list, int i); +int ui_list_count(UiList *list); +void ui_list_append(UiList *list, void *data); +void ui_list_prepend(UiList *list, void *data); +void ui_list_addobsv(UiList *list, ui_callback f, void *data); +void ui_list_notify(UiList *list); #ifdef __cplusplus