all: $(APP_BIN) $(TEST_BIN)
$(APP_BIN): $(MAIN_OBJ) $(OBJ) $(BUILD_ROOT)/build/lib/libuitk.a
- $(LD) -o $(APP_BIN) $(MAIN_OBJ) $(OBJ) -L$(BUILD_ROOT)/build/lib -luitk -lucx -lidav -ldbutils -lmd4c $(LDFLAGS) $(TK_LDFLAGS) $(DAV_LDFLAGS) $(DBU_LDFLAGS)
+ $(LD) -o $(APP_BIN) $(MAIN_OBJ) $(OBJ) -L$(BUILD_ROOT)/build/lib $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(LIB_EXT) -lidav -ldbutils -lmd4c $(LDFLAGS) $(TK_LDFLAGS) $(DAV_LDFLAGS) $(DBU_LDFLAGS)
$(TEST_BIN): $(OBJ) $(TEST_OBJ) $(BUILD_ROOT)/build/lib/libuitk.a
- $(CC) -o $(TEST_BIN) $(TEST_OBJ) $(OBJ) -L$(BUILD_ROOT)/build/lib -luitk -lucx -lidav -ldbutils -lmd4c $(LDFLAGS) $(TK_LDFLAGS) $(DAV_LDFLAGS) $(DBU_LDFLAGS)
+ $(CC) -o $(TEST_BIN) $(TEST_OBJ) $(OBJ) -L$(BUILD_ROOT)/build/lib $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(LIB_EXT) -lidav -ldbutils -lmd4c $(LDFLAGS) $(TK_LDFLAGS) $(DAV_LDFLAGS) $(DBU_LDFLAGS)
../build/application/%$(OBJ_EXT): %.c
$(CC) $(CFLAGS) $(TK_CFLAGS) $(DAV_CFLAGS) -o $@ -c $<
}
if(model->window) {
- ui_detach_document2(model->window->obj->ctx, model);
+ ui_detach_document(model->window->obj->ctx, model);
model->window->current_notebook = NULL;
}
}
if(model->current_note == note) {
// workaround, see top comment
- ui_detach_document2(model->ctx, model->current_note->model);
+ ui_detach_document(model->ctx, model->current_note->model);
model->current_note = NULL;
} else{
notebookmodel_detach_current_note(model);
// of all vars, but it seems this doesn't work
// without note_save, the content is not saved (internally)
if(current_note->model) {
- ui_detach_document2(model->ctx, current_note->model);
+ ui_detach_document(model->ctx, current_note->model);
}
model->current_note = NULL;
}
window->notelist_isvisible = visible;
}
-void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item) {
+void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata) {
Resource *notebook = rowdata;
item->label = strdup(notebook->displayname ? notebook->displayname : notebook->nodename);
MainWindow* window_init_data(UiObject *obj);
-void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item);
+void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
void window_notelist_setvisible(MainWindow *window, UiBool visible);
cat >> "$TEMP_DIR/make.mk" << __EOF__
OBJ_EXT = .o
LIB_EXT = .a
+SHLIB_EXT = .dylib
LIB_PREFIX = lib
PACKAGE_SCRIPT = package_osx.sh
__EOF__
cat >> "$TEMP_DIR/make.mk" << __EOF__
OBJ_EXT = .o
LIB_EXT = .a
+SHLIB_EXT = .so
LIB_PREFIX = lib
PACKAGE_SCRIPT = package_unix.sh
__EOF__
break
done
while true
+do
+ while true
+ do
+
+ cat >> "$TEMP_DIR/make.mk" << __EOF__
+BUILD_BIN_DIR = bin
+BUILD_LIB_DIR = lib
+__EOF__
+ break
+ done
+ break
+done
+while true
do
if notisplatform "bsd"; then
break
<dependency platform="macos">
<make>OBJ_EXT = .o</make>
<make>LIB_EXT = .a</make>
+ <make>SHLIB_EXT = .dylib</make>
<make>LIB_PREFIX = lib</make>
<make>PACKAGE_SCRIPT = package_osx.sh</make>
</dependency>
<dependency platform="unix" not="macos">
<make>OBJ_EXT = .o</make>
<make>LIB_EXT = .a</make>
+ <make>SHLIB_EXT = .so</make>
<make>LIB_PREFIX = lib</make>
<make>PACKAGE_SCRIPT = package_unix.sh</make>
</dependency>
+ <dependency>
+ <make>BUILD_BIN_DIR = bin</make>
+ <make>BUILD_LIB_DIR = lib</make>
+ </dependency>
<dependency platform="bsd">
<cflags>-I/usr/local/include</cflags>
OBJ = $(SRC:%.c=../build/ucx/%$(OBJ_EXT))
-UCX_LIB = ../build/lib/libucx$(LIB_EXT)
+UCX_LIB = ../build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(LIB_EXT)
+UCX_SHLIB = ../build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(SHLIB_EXT)
-all: ../build/ucx $(UCX_LIB)
+all: $(UCX_LIB) $(UCX_SHLIB)
$(UCX_LIB): $(OBJ)
- $(AR) $(ARFLAGS) $(UCX_LIB) $(OBJ)
+ $(AR) $(ARFLAGS) $@ $(OBJ)
+
+$(UCX_SHLIB): $(OBJ)
+ $(CC) -o $@ $(LDFLAGS) $(SHLIB_LDFLAGS) $(OBJ)
../build/ucx:
mkdir -p ../build/ucx
../build/ucx/%$(OBJ_EXT): %.c
- $(CC) $(CFLAGS) -o $@ -c $<
+ $(CC) $(CFLAGS) $(SHLIB_CFLAGS) -o $@ -c $<
include common/objs.mk
-UI_LIB = ../build/lib/$(LIB_PREFIX)uitk$(LIB_EXT)
+UI_LIB = ../build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT)
+UI_SHLIB = ../build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(SHLIB_EXT)
include $(TOOLKIT)/objs.mk
OBJ = $(TOOLKITOBJS) $(COMMONOBJS)
-all: $(UI_LIB)
+all: $(UI_LIB) $(UI_SHLIB)
include $(TOOLKIT)/Makefile
$(COMMON_OBJPRE)uic_%$(OBJ_EXT): common/%.c
- $(CC) -o $@ -c -I../ucx/ $(CFLAGS) $(TK_CFLAGS) $<
+ $(CC) -o $@ -c -I../ucx/ $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $<
free(args);
}
+/* --------------------------- UiToolbarItemArgs --------------------------- */
+
+UiToolbarItemArgs* ui_toolbar_item_args_new(void) {
+ UiToolbarItemArgs *args = malloc(sizeof(UiToolbarItemArgs));
+ memset(args, 0, sizeof(UiToolbarItemArgs));
+ return args;
+}
+
+void ui_toolbar_item_args_set_label(UiToolbarItemArgs *args, const char *label) {
+ args->label = strdup(label);
+}
+
+void ui_toolbar_item_args_set_stockid(UiToolbarItemArgs *args, const char *stockid) {
+ args->stockid = strdup(stockid);
+}
+
+void ui_toolbar_item_args_set_icon(UiToolbarItemArgs *args, const char *icon) {
+ args->icon = strdup(icon);
+}
+
+void ui_toolbar_item_args_set_onclick(UiToolbarItemArgs *args, ui_callback callback) {
+ args->onclick = callback;
+}
+
+void ui_toolbar_item_args_set_onclickdata(UiToolbarItemArgs *args, void *onclickdata) {
+ args->onclickdata = onclickdata;
+}
+
+void ui_toolbar_item_args_set_groups(UiToolbarItemArgs *args, int *groups) {
+ // TODO
+}
+void ui_toolbar_item_args_free(UiToolbarItemArgs *args) {
+ free((void*)args->label);
+ free((void*)args->stockid);
+ free((void*)args->icon);
+ free(args);
+}
+
+/* ---------------------------- UiToolbarToggleItemArgs ---------------------------- */
+
+UiToolbarToggleItemArgs* ui_toolbar_toggleitem_args_new(void) {
+ UiToolbarToggleItemArgs *args = malloc(sizeof(UiToolbarToggleItemArgs));
+ memset(args, 0, sizeof(UiToolbarToggleItemArgs));
+ return args;
+}
+
+
+void ui_toolbar_toggleitem_args_set_label(UiToolbarToggleItemArgs *args, const char *label) {
+ args->label = strdup(label);
+}
+
+
+void ui_toolbar_toggleitem_args_set_stockid(UiToolbarToggleItemArgs *args, const char *stockid) {
+ args->stockid = strdup(stockid);
+}
+
+
+void ui_toolbar_toggleitem_args_set_icon(UiToolbarToggleItemArgs *args, const char *icon) {
+ args->icon = strdup(icon);
+}
+
+
+void ui_toolbar_toggleitem_args_set_varname(UiToolbarToggleItemArgs *args, const char *varname) {
+ args->varname = strdup(varname);
+}
+
+
+void ui_toolbar_toggleitem_args_set_onchange(UiToolbarToggleItemArgs *args, ui_callback callback) {
+ args->onchange = callback;
+}
+
+
+void ui_toolbar_toggleitem_args_set_onchangedata(UiToolbarToggleItemArgs *args, void *onchangedata) {
+ args->onchangedata = onchangedata;
+}
+
+
+void ui_toolbar_toggleitem_args_set_groups(UiToolbarToggleItemArgs *args, int *groups) {
+ // TODO
+}
+
+
+void ui_toolbar_toggleitem_args_free(UiToolbarToggleItemArgs *args) {
+ free((void*)args->label);
+ free((void*)args->stockid);
+ free((void*)args->icon);
+ free((void*)args->varname);
+ free(args);
+}
+
+/* ---------------------------- UiToolbarMenuArgs ---------------------------- */
+
+
+UiToolbarMenuArgs* ui_toolbar_menu_args_new(void) {
+ UiToolbarMenuArgs *args = malloc(sizeof(UiToolbarMenuArgs));
+ memset(args, 0, sizeof(UiToolbarMenuArgs));
+ return args;
+}
+
+
+void ui_toolbar_menu_args_set_label(UiToolbarMenuArgs *args, const char *label) {
+ args->label = strdup(label);
+}
+
+
+void ui_toolbar_menu_args_set_stockid(UiToolbarMenuArgs *args, const char *stockid) {
+ args->stockid = strdup(stockid);
+}
+
+
+void ui_toolbar_menu_args_set_icon(UiToolbarMenuArgs *args, const char *icon) {
+ args->icon = strdup(icon);
+}
+
+
+void ui_toolbar_menu_args_free(UiToolbarMenuArgs *args) {
+ free((void*)args->label);
+ free((void*)args->stockid);
+ free((void*)args->icon);
+ free(args);
+}
+
/* ---------------------------- UiContainerArgs ---------------------------- */
}
-void ui_container_args_set_rolspan(UiContainerArgs *args, int rowspan) {
+void ui_container_args_set_rowspan(UiContainerArgs *args, int rowspan) {
args->rowspan = rowspan;
}
}
-void ui_frame_args_set_rolspan(UiFrameArgs *args, int rowspan) {
+void ui_frame_args_set_rowspan(UiFrameArgs *args, int rowspan) {
args->rowspan = rowspan;
}
}
+/* ---------------------------- UiSidebarArgs -------------------------------*/
+
+UiSidebarArgs* ui_sidebar_args_new(void) {
+ UiSidebarArgs *args = malloc(sizeof(UiSidebarArgs));
+ memset(args, 0, sizeof(UiSidebarArgs));
+ return args;
+}
+
+
+void ui_sidebar_args_set_name(UiSidebarArgs *args, const char *name) {
+ args->name = strdup(name);
+}
+
+
+void ui_sidebar_args_set_style_class(UiSidebarArgs *args, const char *classname) {
+ args->style_class = strdup(classname);
+}
+
+
+void ui_sidebar_args_set_margin(UiSidebarArgs *args, int value) {
+ args->margin = value;
+}
+
+
+void ui_sidebar_args_set_spacing(UiSidebarArgs *args, int value) {
+ args->spacing = value;
+}
+
+
+void ui_sidebar_args_free(UiSidebarArgs *args) {
+ free((void*)args->name);
+ free((void*)args->style_class);
+ free(args);
+}
+
+
+/* --------------------------- UiSplitPaneArgs ------------------------------*/
+
+UiSplitPaneArgs* ui_splitpane_args_new(void) {
+ UiSplitPaneArgs *args = malloc(sizeof(UiSplitPaneArgs));
+ memset(args, 0, sizeof(UiSplitPaneArgs));
+ return args;
+}
+
+
+void ui_splitpane_args_set_fill(UiSplitPaneArgs *args, UiBool fill) {
+ args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_splitpane_args_set_hexpand(UiSplitPaneArgs *args, UiBool value) {
+ args->hexpand = value;
+}
+
+
+void ui_splitpane_args_set_vexpand(UiSplitPaneArgs *args, UiBool value) {
+ args->vexpand = value;
+}
+
+
+void ui_splitpane_args_set_hfill(UiSplitPaneArgs *args, UiBool value) {
+ args->hfill = value;
+}
+
+
+void ui_splitpane_args_set_vfill(UiSplitPaneArgs *args, UiBool value) {
+ args->vfill = value;
+}
+
+
+void ui_splitpane_args_set_override_defaults(UiSplitPaneArgs *args, UiBool value) {
+ args->override_defaults = value;
+}
+
+
+void ui_splitpane_args_set_colspan(UiSplitPaneArgs *args, int colspan) {
+ args->colspan = colspan;
+}
+
+
+void ui_splitpane_args_set_rowspan(UiSplitPaneArgs *args, int rowspan) {
+ args->rowspan = rowspan;
+}
+
+
+void ui_splitpane_args_set_name(UiSplitPaneArgs *args, const char *name) {
+ args->name = strdup(name);
+}
+
+
+void ui_splitpane_args_set_style_class(UiSplitPaneArgs *args, const char *classname) {
+ args->style_class = strdup(classname);
+}
+
+
+void ui_splitpane_args_set_margin(UiSplitPaneArgs *args, int value) {
+ args->margin = value;
+}
+
+
+void ui_splitpane_args_set_spacing(UiSplitPaneArgs *args, int value) {
+ args->spacing = value;
+}
+
+
+void ui_splitpane_args_set_columnspacing(UiSplitPaneArgs *args, int value) {
+ args->columnspacing = value;
+}
+
+
+void ui_splitpane_args_set_rowspacing(UiSplitPaneArgs *args, int value) {
+ args->rowspacing = value;
+}
+
+
+void ui_splitpane_args_set_initial_position(UiSplitPaneArgs *args, int pos) {
+ args->initial_position = pos;
+}
+
+
+void ui_splitpane_args_set_varname(UiSplitPaneArgs *args, const char *varname) {
+ args->varname = strdup(varname);
+}
+
+
+void ui_splitpane_args_set_value(UiSplitPaneArgs *args, UiInteger *value) {
+ args->value = value;
+}
+
+void ui_splitpane_args_set_max_panes(UiSplitPaneArgs *args, int max) {
+ args->max_panes = max;
+}
+
+
+void ui_splitpane_args_free(UiSplitPaneArgs *args) {
+ free((void*)args->name);
+ free((void*)args->style_class);
+ free((void*)args->varname);
+ free(args);
+}
+
+
/* ---------------------------- UiButtonArgs -------------------------------*/
UiButtonArgs* ui_button_args_new(void) {
UiButtonArgs *args = malloc(sizeof(UiButtonArgs));
- memset(args, 0, sizeof(UiContainerArgs));
+ memset(args, 0, sizeof(UiButtonArgs));
return args;
}
}
-void ui_button_args_set_rolspan(UiButtonArgs *args, int rowspan) {
+void ui_button_args_set_rowspan(UiButtonArgs *args, int rowspan) {
args->rowspan = rowspan;
}
UiToggleArgs* ui_toggle_args_new(void) {
UiToggleArgs *args = malloc(sizeof(UiToggleArgs));
- memset(args, 0, sizeof(UiContainerArgs));
+ memset(args, 0, sizeof(UiToggleArgs));
return args;
}
}
-void ui_toggle_args_set_rolspan(UiToggleArgs *args, int rowspan) {
+void ui_toggle_args_set_rowspan(UiToggleArgs *args, int rowspan) {
args->rowspan = rowspan;
}
free(args);
}
+
+/* ------------------------- UiListArgs ----------------------------*/
+
+UiListArgs* ui_list_args_new(void) {
+ UiListArgs *args = malloc(sizeof(UiListArgs));
+ memset(args, 0, sizeof(UiListArgs));
+ return args;
+}
+
+void ui_list_args_set_fill(UiListArgs *args, UiBool fill) {
+ args->fill = fill ? UI_ON : UI_OFF;
+}
+
+void ui_list_args_set_hexpand(UiListArgs *args, UiBool value) {
+ args->hexpand = value;
+}
+
+void ui_list_args_set_vexpand(UiListArgs *args, UiBool value) {
+ args->vexpand = value;
+}
+
+void ui_list_args_set_hfill(UiListArgs *args, UiBool value) {
+ args->hfill = value;
+}
+
+void ui_list_args_set_vfill(UiListArgs *args, UiBool value) {
+ args->vfill = value;
+}
+
+void ui_list_args_set_override_defaults(UiListArgs *args, UiBool value) {
+ args->override_defaults = value;
+}
+
+void ui_list_args_set_colspan(UiListArgs *args, int colspan) {
+ args->colspan = colspan;
+}
+
+void ui_list_args_set_rowspan(UiListArgs *args, int rowspan) {
+ args->rowspan = rowspan;
+}
+
+void ui_list_args_set_name(UiListArgs *args, const char *name) {
+ args->name = strdup(name);
+}
+
+void ui_list_args_set_style_class(UiListArgs *args, const char *classname) {
+ args->style_class = classname;
+}
+
+void ui_list_args_set_varname(UiListArgs *args, const char *varname) {
+ args->varname = strdup(varname);
+}
+
+void ui_list_args_set_value(UiListArgs *args, UiList *value) {
+ args->list = value;
+}
+
+void ui_list_args_set_model(UiListArgs *args, UiModel *model) {
+ args->model = model;
+}
+
+void ui_list_args_set_static_elements(UiListArgs *args, char **strarray, size_t nelm) {
+ char **array = calloc(nelm, sizeof(char*));
+ for(int i=0;i<nelm;i++) {
+ array[i] = strdup(strarray[i]);
+ }
+ args->static_elements = array;
+ args->static_nelm = nelm;
+}
+
+void ui_list_args_set_getvalue_func(UiListArgs *args, ui_getvaluefunc getvalue) {
+ args->getvalue = getvalue;
+}
+
+void ui_list_args_set_getvalue_func2(UiListArgs *args, ui_getvaluefunc2 getvalue) {
+ args->getvalue2 = getvalue;
+}
+
+void ui_list_args_set_getvalue_data(UiListArgs *args, void *userdata) {
+ args->getvalue2data = userdata;
+}
+
+void ui_list_args_set_onactivate(UiListArgs *args, ui_callback callback) {
+ args->onactivate = callback;
+}
+
+void ui_list_args_set_onactivatedata(UiListArgs *args, void *userdata) {
+ args->onactivatedata = userdata;
+}
+
+void ui_list_args_set_onselection(UiListArgs *args, ui_callback callback) {
+ args->onselection = callback;
+}
+
+void ui_list_args_set_onselectiondata(UiListArgs *args, void *userdata) {
+ args->onselectiondata = userdata;
+}
+
+void ui_list_args_set_ondragstart(UiListArgs *args, ui_callback callback) {
+ args->ondragstart = callback;
+}
+
+void ui_list_args_set_ondragstartdata(UiListArgs *args, void *userdata) {
+ args->ondragstartdata = userdata;
+}
+
+void ui_list_args_set_ondragcomplete(UiListArgs *args, ui_callback callback) {
+ args->ondragcomplete = callback;
+}
+
+void ui_list_args_set_ondragcompletedata(UiListArgs *args, void *userdata) {
+ args->ondragcompletedata = userdata;
+}
+
+void ui_list_args_set_ondrop(UiListArgs *args, ui_callback callback) {
+ args->ondrop = callback;
+}
+
+void ui_list_args_set_ondropdata(UiListArgs *args, void *userdata) {
+ args->ondropdata = userdata;
+}
+
+void ui_list_args_set_multiselection(UiListArgs *args, UiBool multiselection) {
+ args->multiselection = multiselection;
+}
+
+void ui_list_args_set_contextmenu(UiListArgs *args, UiMenuBuilder *menubuilder) {
+ args->contextmenu = menubuilder;
+}
+
+void ui_list_args_set_groups(UiListArgs *args, int *groups) {
+ // TODO
+}
+
+void ui_list_args_free(UiListArgs *args) {
+ free((void*)args->name);
+ free((void*)args->style_class);
+ free((void*)args->varname);
+ if(args->static_elements) {
+ for(int i=0;i<args->static_nelm;i++) {
+ free(args->static_elements[i]);
+ }
+ free(args->static_elements);
+ }
+ free(args);
+}
+
+
+
+/* ---------------------- SurceList ------------------------------------- */
+
+UiSourceListArgs* ui_sourcelist_args_new(void) {
+ UiSourceListArgs *args = malloc(sizeof(UiSourceListArgs));
+ memset(args, 0, sizeof(UiSourceListArgs));
+ return args;
+}
+
+
+void ui_sourcelist_args_set_fill(UiSourceListArgs *args, UiBool fill) {
+ args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_sourcelist_args_set_hexpand(UiSourceListArgs *args, UiBool value) {
+ args->hexpand = value;
+}
+
+
+void ui_sourcelist_args_set_vexpand(UiSourceListArgs *args, UiBool value) {
+ args->vexpand = value;
+}
+
+
+void ui_sourcelist_args_set_hfill(UiSourceListArgs *args, UiBool value) {
+ args->hfill = value;
+}
+
+
+void ui_sourcelist_args_set_vfill(UiSourceListArgs *args, UiBool value) {
+ args->vfill = value;
+}
+
+
+void ui_sourcelist_args_set_override_defaults(UiSourceListArgs *args, UiBool value) {
+ args->override_defaults = value;
+}
+
+
+void ui_sourcelist_args_set_colspan(UiSourceListArgs *args, int colspan) {
+ args->colspan = colspan;
+}
+
+
+void ui_sourcelist_args_set_rowspan(UiSourceListArgs *args, int rowspan) {
+ args->rowspan = rowspan;
+}
+
+
+void ui_sourcelist_args_set_name(UiSourceListArgs *args, const char *name) {
+ args->name = strdup(name);
+}
+
+
+void ui_sourcelist_args_set_style_class(UiSourceListArgs *args, const char *classname) {
+ args->style_class = strdup(classname);
+}
+
+UIEXPORT void ui_sourcelist_args_set_static_sublists(UiSourceListArgs *args, UiSubList *sublists, size_t numsublists) {
+ args->sublists = calloc(numsublists, sizeof(UiSubList));
+ memcpy(args->sublists, sublists, numsublists * sizeof(UiSubList));
+ args->numsublists = numsublists;
+}
+
+void ui_sourcelist_args_set_varname(UiSourceListArgs *args, const char *varname) {
+ args->varname = strdup(varname);
+}
+
+
+void ui_sourcelist_args_set_dynamic_sublists(UiSourceListArgs *args, UiList *value) {
+ args->dynamic_sublist = value;
+}
+
+
+void ui_sourcelist_args_set_getvalue_func(UiSourceListArgs *args, ui_sublist_getvalue_func getvalue) {
+ args->getvalue = getvalue;
+}
+
+void ui_sourcelist_args_set_getvalue_userdata(UiSourceListArgs *args, void *userdata) {
+ args->getvaluedata = userdata;
+}
+
+void ui_sourcelist_args_set_onactivate(UiSourceListArgs *args, ui_callback callback) {
+ args->onactivate = callback;
+}
+
+
+void ui_sourcelist_args_set_onactivatedata(UiSourceListArgs *args, void *userdata) {
+ args->onactivatedata = userdata;
+}
+
+
+void ui_sourcelist_args_set_onbuttonclick(UiSourceListArgs *args, ui_callback callback) {
+ args->onbuttonclick = callback;
+
+}
+
+
+void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata) {
+ args->onbuttonclickdata = userdata;
+}
+
+
+void ui_sourcelist_args_free(UiSourceListArgs *args) {
+ free((void*)args->name);
+ free((void*)args->style_class);
+ free((void*)args->varname);
+ free((void*)args->sublists);
+ free(args);
+}
+
+
#include "../ui/container.h"
#include "../ui/button.h"
#include "../ui/menu.h"
+#include "../ui/toolbar.h"
+#include "../ui/tree.h"
#ifdef __cplusplus
extern "C" {
UIEXPORT void ui_menutoggleitem_args_set_icon(UiMenuToggleItemArgs *args, const char *icon);
UIEXPORT void ui_menutoggleitem_args_set_varname(UiMenuToggleItemArgs *args, const char *varname);
UIEXPORT void ui_menutoggleitem_args_set_onchange(UiMenuToggleItemArgs *args, ui_callback callback);
-UIEXPORT void ui_menutoggleitem_args_set_onchangedata(UiMenuToggleItemArgs *args, void *onclickdata);
+UIEXPORT void ui_menutoggleitem_args_set_onchangedata(UiMenuToggleItemArgs *args, void *onchangedata);
UIEXPORT void ui_menutoggleitem_args_free(UiMenuToggleItemArgs *args);
UIEXPORT UiMenuItemListArgs* ui_menuitemlist_args_new(void);
UIEXPORT void ui_menuitemlist_args_set_onselectdata(UiMenuItemListArgs *args, void *data);
UIEXPORT void ui_menuitemlist_args_set_addseparator(UiMenuItemListArgs *args, UiBool value);
UIEXPORT void ui_menuitemlist_args_free(UiMenuItemListArgs *args);
+
+UIEXPORT UiToolbarItemArgs* ui_toolbar_item_args_new(void);
+UIEXPORT void ui_toolbar_item_args_set_label(UiToolbarItemArgs *args, const char *label);
+UIEXPORT void ui_toolbar_item_args_set_stockid(UiToolbarItemArgs *args, const char *stockid);
+UIEXPORT void ui_toolbar_item_args_set_icon(UiToolbarItemArgs *args, const char *icon);
+UIEXPORT void ui_toolbar_item_args_set_onclick(UiToolbarItemArgs *args, ui_callback callback);
+UIEXPORT void ui_toolbar_item_args_set_onclickdata(UiToolbarItemArgs *args, void *onclickdata);
+UIEXPORT void ui_toolbar_item_args_set_groups(UiToolbarItemArgs *args, int *groups);
+UIEXPORT void ui_toolbar_item_args_free(UiToolbarItemArgs *args);
+
+UIEXPORT UiToolbarToggleItemArgs* ui_toolbar_toggleitem_args_new(void);
+UIEXPORT void ui_toolbar_toggleitem_args_set_label(UiToolbarToggleItemArgs *args, const char *label);
+UIEXPORT void ui_toolbar_toggleitem_args_set_stockid(UiToolbarToggleItemArgs *args, const char *stockid);
+UIEXPORT void ui_toolbar_toggleitem_args_set_icon(UiToolbarToggleItemArgs *args, const char *icon);
+UIEXPORT void ui_toolbar_toggleitem_args_set_varname(UiToolbarToggleItemArgs *args, const char *varname);
+UIEXPORT void ui_toolbar_toggleitem_args_set_onchange(UiToolbarToggleItemArgs *args, ui_callback callback);
+UIEXPORT void ui_toolbar_toggleitem_args_set_onchangedata(UiToolbarToggleItemArgs *args, void *onchangedata);
+UIEXPORT void ui_toolbar_toggleitem_args_set_groups(UiToolbarToggleItemArgs *args, int *groups);
+UIEXPORT void ui_toolbar_toggleitem_args_free(UiToolbarToggleItemArgs *args);
+
+UIEXPORT UiToolbarMenuArgs* ui_toolbar_menu_args_new(void);
+UIEXPORT void ui_toolbar_menu_args_set_label(UiToolbarMenuArgs *args, const char *label);
+UIEXPORT void ui_toolbar_menu_args_set_stockid(UiToolbarMenuArgs *args, const char *stockid);
+UIEXPORT void ui_toolbar_menu_args_set_icon(UiToolbarMenuArgs *args, const char *icon);
+UIEXPORT void ui_toolbar_menu_args_free(UiToolbarMenuArgs *args);
UIEXPORT UiContainerArgs* ui_container_args_new(void);
UIEXPORT void ui_container_args_set_fill(UiContainerArgs *args, UiBool fill);
UIEXPORT void ui_container_args_set_vfill(UiContainerArgs *args, UiBool value);
UIEXPORT void ui_container_args_set_override_defaults(UiContainerArgs *args, UiBool value);
UIEXPORT void ui_container_args_set_colspan(UiContainerArgs *args, int colspan);
-UIEXPORT void ui_container_args_set_rolspan(UiContainerArgs *args, int rowspan);
+UIEXPORT void ui_container_args_set_rowspan(UiContainerArgs *args, int rowspan);
UIEXPORT void ui_container_args_set_def_hexpand(UiContainerArgs *args, UiBool value);
UIEXPORT void ui_container_args_set_def_vexpand(UiContainerArgs *args, UiBool value);
UIEXPORT void ui_container_args_set_def_hfill(UiContainerArgs *args, UiBool value);
UIEXPORT void ui_frame_args_set_vfill(UiFrameArgs *args, UiBool value);
UIEXPORT void ui_frame_args_set_override_defaults(UiFrameArgs *args, UiBool value);
UIEXPORT void ui_frame_args_set_colspan(UiFrameArgs *args, int colspan);
-UIEXPORT void ui_frame_args_set_rolspan(UiFrameArgs *args, int rowspan);
+UIEXPORT void ui_frame_args_set_rowspan(UiFrameArgs *args, int rowspan);
UIEXPORT void ui_frame_args_set_name(UiFrameArgs *args, const char *name);
UIEXPORT void ui_frame_args_set_style_class(UiFrameArgs *args, const char *classname);
UIEXPORT void ui_frame_args_set_margin(UiFrameArgs *args, int value);
UIEXPORT void ui_frame_args_set_label(UiFrameArgs *args, const char *label);
UIEXPORT void ui_frame_args_free(UiFrameArgs *args);
+UIEXPORT UiSidebarArgs* ui_sidebar_args_new(void);
+UIEXPORT void ui_sidebar_args_set_name(UiSidebarArgs *args, const char *name);
+UIEXPORT void ui_sidebar_args_set_style_class(UiSidebarArgs *args, const char *classname);
+UIEXPORT void ui_sidebar_args_set_margin(UiSidebarArgs *args, int value);
+UIEXPORT void ui_sidebar_args_set_spacing(UiSidebarArgs *args, int value);
+UIEXPORT void ui_sidebar_args_free(UiSidebarArgs *args);
+
+UIEXPORT UiSplitPaneArgs* ui_splitpane_args_new(void);
+UIEXPORT void ui_splitpane_args_set_fill(UiSplitPaneArgs *args, UiBool fill);
+UIEXPORT void ui_splitpane_args_set_hexpand(UiSplitPaneArgs *args, UiBool value);
+UIEXPORT void ui_splitpane_args_set_vexpand(UiSplitPaneArgs *args, UiBool value);
+UIEXPORT void ui_splitpane_args_set_hfill(UiSplitPaneArgs *args, UiBool value);
+UIEXPORT void ui_splitpane_args_set_vfill(UiSplitPaneArgs *args, UiBool value);
+UIEXPORT void ui_splitpane_args_set_override_defaults(UiSplitPaneArgs *args, UiBool value);
+UIEXPORT void ui_splitpane_args_set_colspan(UiSplitPaneArgs *args, int colspan);
+UIEXPORT void ui_splitpane_args_set_rowspan(UiSplitPaneArgs *args, int rowspan);
+UIEXPORT void ui_splitpane_args_set_name(UiSplitPaneArgs *args, const char *name);
+UIEXPORT void ui_splitpane_args_set_style_class(UiSplitPaneArgs *args, const char *classname);
+UIEXPORT void ui_splitpane_args_set_margin(UiSplitPaneArgs *args, int value);
+UIEXPORT void ui_splitpane_args_set_spacing(UiSplitPaneArgs *args, int value);
+UIEXPORT void ui_splitpane_args_set_columnspacing(UiSplitPaneArgs *args, int value);
+UIEXPORT void ui_splitpane_args_set_rowspacing(UiSplitPaneArgs *args, int value);
+UIEXPORT void ui_splitpane_args_set_initial_position(UiSplitPaneArgs *args, int pos);
+UIEXPORT void ui_splitpane_args_set_varname(UiSplitPaneArgs *args, const char *varname);
+UIEXPORT void ui_splitpane_args_set_value(UiSplitPaneArgs *args, UiInteger *value);
+UIEXPORT void ui_splitpane_args_set_max_panes(UiSplitPaneArgs *args, int max);
+UIEXPORT void ui_splitpane_args_free(UiSplitPaneArgs *args);
UIEXPORT UiButtonArgs* ui_button_args_new(void);
UIEXPORT void ui_button_args_set_fill(UiButtonArgs *args, UiBool fill);
UIEXPORT void ui_button_args_set_vfill(UiButtonArgs *args, UiBool value);
UIEXPORT void ui_button_args_set_override_defaults(UiButtonArgs *args, UiBool value);
UIEXPORT void ui_button_args_set_colspan(UiButtonArgs *args, int colspan);
-UIEXPORT void ui_button_args_set_rolspan(UiButtonArgs *args, int rowspan);
+UIEXPORT void ui_button_args_set_rowspan(UiButtonArgs *args, int rowspan);
UIEXPORT void ui_button_args_set_name(UiButtonArgs *args, const char *name);
UIEXPORT void ui_button_args_set_style_class(UiButtonArgs *args, const char *classname);
UIEXPORT void ui_button_args_set_label(UiButtonArgs *args, const char *label);
UIEXPORT void ui_button_args_set_onclick(UiButtonArgs *args, ui_callback callback);
UIEXPORT void ui_button_args_set_onclickdata(UiButtonArgs *args, void *onclickdata);
UIEXPORT void ui_button_args_set_groups(UiButtonArgs *args, int *groups);
-
+UIEXPORT void ui_button_args_free(UiButtonArgs *args);
UIEXPORT UiToggleArgs* ui_toggle_args_new(void);
UIEXPORT void ui_toggle_args_set_fill(UiToggleArgs *args, UiBool fill);
UIEXPORT void ui_toggle_args_set_vfill(UiToggleArgs *args, UiBool value);
UIEXPORT void ui_toggle_args_set_override_defaults(UiToggleArgs *args, UiBool value);
UIEXPORT void ui_toggle_args_set_colspan(UiToggleArgs *args, int colspan);
-UIEXPORT void ui_toggle_args_set_rolspan(UiToggleArgs *args, int rowspan);
+UIEXPORT void ui_toggle_args_set_rowspan(UiToggleArgs *args, int rowspan);
UIEXPORT void ui_toggle_args_set_name(UiToggleArgs *args, const char *name);
UIEXPORT void ui_toggle_args_set_style_class(UiToggleArgs *args, const char *classname);
UIEXPORT void ui_toggle_args_set_label(UiToggleArgs *args, const char *label);
UIEXPORT void ui_toggle_args_set_value(UiToggleArgs *args, UiInteger *value);
UIEXPORT void ui_toggle_args_set_enablegroup(UiToggleArgs *args, int group);
UIEXPORT void ui_toggle_args_set_groups(UiToggleArgs *args, int *groups);
+UIEXPORT void ui_toggle_args_free(UiToggleArgs *args);
+
+UIEXPORT UiListArgs* ui_list_args_new(void);
+UIEXPORT void ui_list_args_set_fill(UiListArgs *args, UiBool fill);
+UIEXPORT void ui_list_args_set_hexpand(UiListArgs *args, UiBool value);
+UIEXPORT void ui_list_args_set_vexpand(UiListArgs *args, UiBool value);
+UIEXPORT void ui_list_args_set_hfill(UiListArgs *args, UiBool value);
+UIEXPORT void ui_list_args_set_vfill(UiListArgs *args, UiBool value);
+UIEXPORT void ui_list_args_set_override_defaults(UiListArgs *args, UiBool value);
+UIEXPORT void ui_list_args_set_colspan(UiListArgs *args, int colspan);
+UIEXPORT void ui_list_args_set_rowspan(UiListArgs *args, int rowspan);
+UIEXPORT void ui_list_args_set_name(UiListArgs *args, const char *name);
+UIEXPORT void ui_list_args_set_style_class(UiListArgs *args, const char *classname);
+UIEXPORT void ui_list_args_set_varname(UiListArgs *args, const char *varname);
+UIEXPORT void ui_list_args_set_value(UiListArgs *args, UiList *value);
+UIEXPORT void ui_list_args_set_model(UiListArgs *args, UiModel *model);
+UIEXPORT void ui_list_args_set_static_elements(UiListArgs *args, char **strarray, size_t nelm);
+UIEXPORT void ui_list_args_set_getvalue_func(UiListArgs *args, ui_getvaluefunc getvalue);
+UIEXPORT void ui_list_args_set_getvalue_func2(UiListArgs *args, ui_getvaluefunc2 getvalue);
+UIEXPORT void ui_list_args_set_getvalue_data(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_onactivate(UiListArgs *args, ui_callback callback);
+UIEXPORT void ui_list_args_set_onactivatedata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_onselection(UiListArgs *args, ui_callback callback);
+UIEXPORT void ui_list_args_set_onselectiondata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondragstart(UiListArgs *args, ui_callback callback);
+UIEXPORT void ui_list_args_set_ondragstartdata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondragcomplete(UiListArgs *args, ui_callback callback);
+UIEXPORT void ui_list_args_set_ondragcompletedata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondrop(UiListArgs *args, ui_callback callback);
+UIEXPORT void ui_list_args_set_ondropdata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_multiselection(UiListArgs *args, UiBool multiselection);
+UIEXPORT void ui_list_args_set_contextmenu(UiListArgs *args, UiMenuBuilder *menubuilder);
+UIEXPORT void ui_list_args_set_groups(UiListArgs *args, int *groups);
+UIEXPORT void ui_list_args_free(UiListArgs *args);
+UIEXPORT UiSourceListArgs* ui_sourcelist_args_new(void);
+UIEXPORT void ui_sourcelist_args_set_fill(UiSourceListArgs *args, UiBool fill);
+UIEXPORT void ui_sourcelist_args_set_hexpand(UiSourceListArgs *args, UiBool value);
+UIEXPORT void ui_sourcelist_args_set_vexpand(UiSourceListArgs *args, UiBool value);
+UIEXPORT void ui_sourcelist_args_set_hfill(UiSourceListArgs *args, UiBool value);
+UIEXPORT void ui_sourcelist_args_set_vfill(UiSourceListArgs *args, UiBool value);
+UIEXPORT void ui_sourcelist_args_set_override_defaults(UiSourceListArgs *args, UiBool value);
+UIEXPORT void ui_sourcelist_args_set_colspan(UiSourceListArgs *args, int colspan);
+UIEXPORT void ui_sourcelist_args_set_rowspan(UiSourceListArgs *args, int rowspan);
+UIEXPORT void ui_sourcelist_args_set_name(UiSourceListArgs *args, const char *name);
+UIEXPORT void ui_sourcelist_args_set_style_class(UiSourceListArgs *args, const char *classname);
+UIEXPORT void ui_sourcelist_args_set_static_sublists(UiSourceListArgs *args, UiSubList *sublists, size_t numsublists);
+UIEXPORT void ui_sourcelist_args_set_varname(UiSourceListArgs *args, const char *varname);
+UIEXPORT void ui_sourcelist_args_set_dynamic_sublists(UiSourceListArgs *args, UiList *value);
+UIEXPORT void ui_sourcelist_args_set_getvalue_func(UiSourceListArgs *args, ui_sublist_getvalue_func getvalue);
+UIEXPORT void ui_sourcelist_args_set_getvalue_userdata(UiSourceListArgs *args, void *userdata);
+UIEXPORT void ui_sourcelist_args_set_onactivate(UiSourceListArgs *args, ui_callback callback);
+UIEXPORT void ui_sourcelist_args_set_onactivatedata(UiSourceListArgs *args, void *userdata);
+UIEXPORT void ui_sourcelist_args_set_onbuttonclick(UiSourceListArgs *args, ui_callback callback);
+UIEXPORT void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata);
+UIEXPORT void ui_sourcelist_args_free(UiSourceListArgs *args);
#ifdef __cplusplus
}
ctx->groups = cxArrayListCreate(mp->allocator, cx_cmp_int, sizeof(int), 32);
ctx->attach_document = uic_context_attach_document;
- ctx->detach_document2 = uic_context_detach_document2;
+ ctx->detach_document2 = uic_context_detach_document;
#if UI_GTK2 || UI_GTK3
if(toplevel && toplevel->widget) {
}
}
-void uic_context_detach_document2(UiContext *ctx, void *document) {
+void uic_context_detach_document(UiContext *ctx, void *document) {
// find the document in the documents list
size_t docIndex = cxListFind(ctx->documents, document);
if(!cxListIndexValid(ctx->documents, docIndex)) {
}
}
-void uic_reg_var(UiContext *ctx, char *name, UiVarType type, void *value) {
+void uic_reg_var(UiContext *ctx, const char *name, UiVarType type, void *value) {
// TODO: do we need/want this? Why adding vars to a context after
// widgets reference these? Workarounds:
// 1. add vars to ctx before creating ui
uic_context_attach_document(ctx, document);
}
-void ui_detach_document2(UiContext *ctx, void *document) {
- uic_context_detach_document2(ctx, document);
+void ui_detach_document(UiContext *ctx, void *document) {
+ uic_context_detach_document(ctx, document);
}
void ui_context_closefunc(UiContext *ctx, ui_callback fnc, void *udata) {
ctx->close_data = udata;
}
-UIEXPORT void ui_context_destroy(UiContext *ctx) {
+void ui_context_destroy(UiContext *ctx) {
CxIterator i = cxListIterator(ctx->destroy_handler);
cx_foreach(UiDestroyHandler *, h, i) {
h->destructor(h->data);
cxMempoolFree(ctx->mp);
}
+UiContext* ui_context_parent(UiContext *ctx) {
+ return ctx->parent;
+}
+
void ui_set_group(UiContext *ctx, int group) {
if(!cxListIndexValid(ctx->groups, cxListFind(ctx->groups, &group))) {
UiContext* uic_context(UiObject *toplevel, CxMempool *mp);
UiContext* uic_root_context(UiContext *ctx);
void uic_context_add_destructor(UiContext *ctx, cx_destructor_func func, void *data);
-void uic_context_set_document(UiContext *ctx, void *document); // deprecated
-void uic_context_detach_document(UiContext *ctx); // deprecated
void uic_context_prepare_close(UiContext *ctx);
void uic_context_attach_document(UiContext *ctx, void *document);
-void uic_context_detach_document2(UiContext *ctx, void *document);
-void uic_context_attach_context(UiContext *ctx, UiContext *doc_ctx);
-void uic_context_detach_context(UiContext *ctx, UiContext *doc_ctx);
+void uic_context_detach_document(UiContext *ctx, void *document);
+void uic_context_attach_context(UiContext *ctx, UiContext *doc_ctx); // TODO
+void uic_context_detach_context(UiContext *ctx, UiContext *doc_ctx); // TODO
void uic_context_detach_all(UiContext *ctx);
UiVar* uic_get_var(UiContext *ctx, const char *name);
void uic_save_var2(UiVar *var);
void uic_unbind_var(UiVar *var);
-void uic_reg_var(UiContext *ctx, char *name, UiVarType type, void *value);
+void uic_reg_var(UiContext *ctx, const char *name, UiVarType type, void *value);
void uic_remove_bound_var(UiContext *ctx, UiVar *var);
}
}
-void ui_set_document(UiObject *obj, void *document) {
- uic_context_detach_all(obj->ctx);
- obj->ctx->attach_document(obj->ctx, document);
-}
-
-void ui_detach_document(UiObject *obj) {
- uic_context_detach_all(obj->ctx);
-}
-
-void* ui_get_document(UiObject *obj) {
- return obj->ctx->document;
-}
-
-void ui_set_subdocument(void *document, void *sub) {
- UiContext *ctx = ui_document_context(document);
- if(!ctx) {
- fprintf(stderr, "UI Error: pointer is not a document\n");
- }
- // TODO
-}
-
-void ui_detach_subdocument(void *document, void *sub) {
- UiContext *ctx = ui_document_context(document);
- if(!ctx) {
- fprintf(stderr, "UI Error: pointer is not a document\n");
- }
- // TODO
-}
-
-void* ui_get_subdocument(void *document) {
- UiContext *ctx = ui_document_context(document);
- if(!ctx) {
- fprintf(stderr, "UI Error: pointer is not a document\n");
- }
- // TODO
- return NULL;
-}
-
void* ui_document_new(size_t size) {
CxMempool *mp = cxMempoolCreateSimple(256);
const CxAllocator *a = mp->allocator;
#include "object.h"
#include "context.h"
+#include <cx/linked_list.h>
+
#include "../ui/container.h"
+static CxList *creation_callbacks;
+static CxList *destruction_callbacks;
+
+typedef struct objcallback {
+ ui_object_callback func;
+ void *userdata;
+} objcallback;
+
+void ui_register_object_creation_callback(ui_object_callback func, void *userdata) {
+ if(!creation_callbacks) {
+ creation_callbacks = cxLinkedListCreateSimple(sizeof(objcallback));
+ }
+ objcallback cb = { func, userdata };
+ cxListAdd(creation_callbacks, &cb);
+}
+
+void ui_register_object_destruction_callback(ui_object_callback func, void *userdata) {
+ if(!destruction_callbacks) {
+ destruction_callbacks = cxLinkedListCreateSimple(sizeof(objcallback));
+ }
+ objcallback cb = { func, userdata };
+ cxListAdd(destruction_callbacks, &cb);
+}
+
+void uic_object_created(UiObject *obj) {
+ CxIterator i = cxListIterator(creation_callbacks);
+ cx_foreach(objcallback *, cb, i) {
+ cb->func(obj, cb->userdata);
+ }
+}
+
+void uic_object_destroyed(UiObject *obj) {
+ CxIterator i = cxListIterator(destruction_callbacks);
+ cx_foreach(objcallback *, cb, i) {
+ cb->func(obj, cb->userdata);
+ }
+}
+
void ui_end(UiObject *obj) {
if(!obj->next) {
return;
ev.intval = 0;
obj->ctx->close_callback(&ev, obj->ctx->close_data);
}
+ uic_object_destroyed(obj);
cxMempoolFree(obj->ctx->mp);
}
+UiObject* uic_object_new_toplevel(void) {
+ CxMempool *mp = cxMempoolCreateSimple(256);
+ UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
+ obj->ctx = uic_context(obj, mp);
+ uic_object_created(obj);
+ return obj;
+}
+
UiObject* uic_object_new(UiObject *toplevel, UIWIDGET widget) {
return uic_ctx_object_new(toplevel->ctx, widget);
}
UiObject *newobj = cxCalloc(ctx->allocator, 1, sizeof(UiObject));
newobj->ctx = ctx;
newobj->widget = widget;
-
+ uic_object_created(newobj);
return newobj;
}
extern "C" {
#endif
+typedef void (*ui_object_callback)(UiObject *obj, void *userdata);
+
+void ui_register_object_creation_callback(ui_object_callback func, void *userdata);
+void ui_register_object_destruction_callback(ui_object_callback func, void *userdata);
+
+void uic_object_created(UiObject *obj);
+void uic_object_destroyed(UiObject *obj);
+
void uic_object_destroy(UiObject *obj);
+UiObject* uic_object_new_toplevel(void);
UiObject* uic_object_new(UiObject *toplevel, UIWIDGET widget);
UiObject* uic_ctx_object_new(UiContext *ctx, UIWIDGET widget);
void uic_obj_add(UiObject *toplevel, UiObject *ctobj);
COMMON_OBJ += threadpool$(OBJ_EXT)
COMMON_OBJ += condvar$(OBJ_EXT)
COMMON_OBJ += args$(OBJ_EXT)
+COMMON_OBJ += wrapper$(OBJ_EXT)
TOOLKITOBJS += $(COMMON_OBJ:%=$(COMMON_OBJPRE)uic_%)
TOOLKITSOURCE += $(COMMON_OBJ:%$(OBJ_EXT)=common/%.c)
#include "context.h"
#include "../ui/image.h"
-
+static ui_list_init_func default_list_init;
+static void *default_list_init_userdata;
UiObserver* ui_observer_new(ui_callback f, void *data) {
UiObserver *observer = malloc(sizeof(UiObserver));
/* --------------------------- UiList --------------------------- */
-UiList* ui_list_new(UiContext *ctx, char *name) {
- UiList *list = malloc(sizeof(UiList));
+void uic_ucx_list_init(UiContext *ctx, UiList *list, void *unused) {
+ list->data = cxArrayListCreate(ctx->mp->allocator, NULL, CX_STORE_POINTERS, 32);
list->first = ui_list_first;
list->next = ui_list_next;
list->get = ui_list_get;
list->count = ui_list_count;
- list->observers = NULL;
-
- list->data = cxArrayListCreate(cxDefaultAllocator, NULL, CX_STORE_POINTERS, 32);
- list->iter = NULL;
-
- list->update = NULL;
- list->getselection = NULL;
- list->obj = NULL;
+}
+
+UiList* ui_list_new(UiContext *ctx, const char *name) {
+ return ui_list_new2(ctx, name, default_list_init ? default_list_init : uic_ucx_list_init, default_list_init_userdata);
+}
+
+UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit, void *userdata) {
+ UiList *list = cxMalloc(ctx->mp->allocator, sizeof(UiList));
+ memset(list, 0, sizeof(UiList));
+ listinit(ctx, list, userdata);
if(name) {
uic_reg_var(ctx, name, UI_VAR_LIST, list);
// types
// public functions
-UiInteger* ui_int_new(UiContext *ctx, char *name) {
+UiInteger* ui_int_new(UiContext *ctx, const char *name) {
UiInteger *i = ui_malloc(ctx, sizeof(UiInteger));
memset(i, 0, sizeof(UiInteger));
if(name) {
return i;
}
-UiDouble* ui_double_new(UiContext *ctx, char *name) {
+UiDouble* ui_double_new(UiContext *ctx, const char *name) {
UiDouble *d = ui_malloc(ctx, sizeof(UiDouble));
memset(d, 0, sizeof(UiDouble));
if(name) {
return d;
}
-UiString* ui_string_new(UiContext *ctx, char *name) {
+UiString* ui_string_new(UiContext *ctx, const char *name) {
UiString *s = ui_malloc(ctx, sizeof(UiString));
memset(s, 0, sizeof(UiString));
if(name) {
return s;
}
-UiText* ui_text_new(UiContext *ctx, char *name) {
+UiText* ui_text_new(UiContext *ctx, const char *name) {
UiText *t = ui_malloc(ctx, sizeof(UiText));
memset(t, 0, sizeof(UiText));
if(name) {
return t;
}
-UiRange* ui_range_new(UiContext *ctx, char *name) {
+UiRange* ui_range_new(UiContext *ctx, const char *name) {
UiRange *r = ui_malloc(ctx, sizeof(UiRange));
memset(r, 0, sizeof(UiRange));
if(name) {
return r;
}
-UIEXPORT UiGeneric* ui_generic_new(UiContext *ctx, char *name) {
+UIEXPORT UiGeneric* ui_generic_new(UiContext *ctx, const char *name) {
UiGeneric *g = ui_malloc(ctx, sizeof(UiGeneric));
memset(g, 0, sizeof(UiGeneric));
if(name) {
int ui_get_setop(void) {
return ui_set_op;
}
+
+/* ---------------- List initializers and wrapper functions ---------------- */
+
+void ui_global_list_initializer(ui_list_init_func func, void *userdata) {
+ default_list_init = func;
+ default_list_init_userdata = userdata;
+}
+
+void ui_list_class_set_first(UiList *list, void*(*first)(UiList *list)) {
+ list->first = first;
+}
+
+void ui_list_class_set_next(UiList *list, void*(*next)(UiList *list)) {
+ list->next = next;
+}
+
+void ui_list_class_set_get(UiList *list, void*(*get)(UiList *list, int i)) {
+ list->get = get;
+}
+
+void ui_list_class_set_count(UiList *list, int(*count)(UiList *list)) {
+ list->count = count;
+}
+
+void ui_list_class_set_data(UiList *list, void *data) {
+ list->data = data;
+}
+
+void ui_list_class_set_iter(UiList *list, void *iter) {
+ list->iter = iter;
+}
#ifdef __cplusplus
extern "C" {
#endif
-
-
+
+void uic_ucx_list_init(UiContext *ctx, UiList *list, void *unused);
+
void uic_int_copy(UiInteger *from, UiInteger *to);
void uic_double_copy(UiDouble *from, UiDouble *to);
void uic_string_copy(UiString *from, UiString *to);
--- /dev/null
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "wrapper.h"
+#include "types.h"
+#include <cx/list.h>
+
+/* ---------------------------- UiObject ---------------------------- */
+
+UiContext* ui_object_get_context(UiObject *obj) {
+ return obj->ctx;
+}
+
+void* ui_object_get_windowdata(UiObject *obj) {
+ return obj->window;
+}
+
+void ui_object_set_windowdata(UiObject *obj, void *windowdata) {
+ obj->window = windowdata;
+}
+
+
+/* ---------------------------- UiList ---------------------------- */
+
+void* ui_list_get_data(UiList *list) {
+ return list->data;
+}
+
+void ui_list_set_data(UiList *list, void *data) {
+ list->data = data;
+}
+
+void* ui_list_get_iter(UiList *list) {
+ return list->iter;
+}
+
+void ui_list_set_iter(UiList *list, void *iter) {
+ list->iter = iter;
+}
+
+
+/* ------------------------------ UiSublist ------------------------------ */
+
+UiSubList* ui_sublist_new(void) {
+ UiSubList *sublist = malloc(sizeof(UiSubList));
+ memset(sublist, 0, sizeof(UiSubList));
+ return sublist;
+}
+
+void ui_sublist_set_value(UiSubList *sublist, UiList *value) {
+ sublist->value = value;
+}
+
+void ui_sublist_set_varname(UiSubList *sublist, const char *varname) {
+ free((void*)sublist->varname);
+ sublist->varname = strdup(varname);
+}
+
+void ui_sublist_set_header(UiSubList *sublist, const char *header) {
+ free((void*)sublist->header);
+ sublist->header = strdup(header);
+}
+
+void ui_sublist_set_separator(UiSubList *sublist, UiBool separator) {
+ sublist->separator = separator;
+}
+
+void ui_sublist_set_userdata(UiSubList *sublist, void *userdata) {
+ sublist->userdata = userdata;
+}
+
+void ui_sublist_free(UiSubList *sublist) {
+ free((void*)sublist->varname);
+ free((void*)sublist->header);
+ free(sublist);
+}
+
+
+/* -------------------- Source list (UiList<UiSublist>) -------------------- */
+
+UiList* ui_srclist_new(UiContext *ctx, const char *name) {
+ UiList *list = ui_list_new2(ctx, name, uic_ucx_list_init, NULL);
+ CxList *cxlist = list->data;
+ cxlist->collection.simple_destructor = (cx_destructor_func)ui_sublist_free;
+ return list;
+}
+
+void ui_srclist_add(UiList *list, UiSubList *item) {
+ ui_list_append(list, item);
+}
+
+void ui_srclist_insert(UiList *list, int index, UiSubList *item) {
+ CxList *cxlist = list->data;
+ cxListInsert(cxlist, index, item);
+}
+
+void ui_srclist_remove(UiList *list, int index) {
+ CxList *cxlist = list->data;
+ cxListRemove(cxlist, index);
+}
+
+void ui_srclist_clear(UiList *list) {
+ CxList *cxlist = list->data;
+ cxListClear(cxlist);
+}
+
+int ui_srclist_size(UiList *list) {
+ return ui_list_count(list);
+}
+
+
+/* ---------------------------- UiEvent ---------------------------- */
+
+UiObject* ui_event_get_obj(UiEvent *event) {
+ return event->obj;
+}
+
+void* ui_event_get_document(UiEvent *event) {
+ return event->document;
+}
+
+void* ui_event_get_windowdata(UiEvent *event) {
+ return event->window;
+}
+
+void* ui_event_get_eventdata(UiEvent *event) {
+ return event->eventdata;
+}
+
+int ui_event_get_int(UiEvent *event) {
+ return event->intval;
+}
+
+int ui_event_get_set(UiEvent *event) {
+ return event->set;
+}
+
+
+/* ------------------------- SubListItem (public) ------------------------- */
+
+void ui_sublist_item_set_icon(UiSubListItem *item, const char *icon) {
+ item->icon = icon ? strdup(icon) : NULL;
+}
+
+void ui_sublist_item_set_label(UiSubListItem *item, const char *label) {
+ item->label = label ? strdup(label) : NULL;
+}
+
+void ui_sublist_item_set_button_icon(UiSubListItem *item, const char *button_icon) {
+ item->button_icon = button_icon ? strdup(button_icon) : NULL;
+}
+
+void ui_sublist_item_set_button_label(UiSubListItem *item, const char *button_label) {
+ item->button_label = button_label ? strdup(button_label) : NULL;
+}
+
+void ui_sublist_item_set_badge(UiSubListItem *item, const char *badge) {
+ item->badge = badge ? strdup(badge) : NULL;
+}
+
+void ui_sublist_item_set_eventdata(UiSubListItem *item, void *eventdata) {
+ item->eventdata = NULL;
+}
--- /dev/null
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef UIC_WRAPPER_H
+#define UIC_WRAPPER_H
+
+#include "../ui/toolkit.h"
+#include "../ui/tree.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+UIEXPORT UiContext* ui_object_get_context(UiObject *obj);
+UIEXPORT void* ui_object_get_windowdata(UiObject *obj);
+UIEXPORT void ui_object_set_windowdata(UiObject *obj, void *windowdata);
+
+UIEXPORT void* ui_list_get_data(UiList *list);
+UIEXPORT void* ui_list_get_iter(UiList *list);
+UIEXPORT void ui_list_set_iter(UiList *list, void *iter);
+
+UIEXPORT UiSubList* ui_sublist_new(void);
+UIEXPORT void ui_sublist_set_value(UiSubList *sublist, UiList *value);
+UIEXPORT void ui_sublist_set_varname(UiSubList *sublist, const char *varname);
+UIEXPORT void ui_sublist_set_header(UiSubList *sublist, const char *header);
+UIEXPORT void ui_sublist_set_separator(UiSubList *sublist, UiBool separator);
+UIEXPORT void ui_sublist_set_userdata(UiSubList *sublist, void *userdata);
+UIEXPORT void ui_sublist_free(UiSubList *sublist);
+
+UIEXPORT UiList* ui_srclist_new(UiContext *ctx, const char *name);
+UIEXPORT void ui_srclist_add(UiList *list, UiSubList *item);
+UIEXPORT void ui_srclist_insert(UiList *list, int index, UiSubList *item);
+UIEXPORT void ui_srclist_remove(UiList *list, int index);
+UIEXPORT void ui_srclist_clear(UiList *list);
+UIEXPORT int ui_srclist_size(UiList *list);
+
+UIEXPORT UiObject* ui_event_get_obj(UiEvent *event);
+UIEXPORT void* ui_event_get_document(UiEvent *event);
+UIEXPORT void* ui_event_get_windowdata(UiEvent *event);
+UIEXPORT void* ui_event_get_eventdata(UiEvent *event);
+UIEXPORT int ui_event_get_int(UiEvent *event);
+UIEXPORT int ui_event_get_set(UiEvent *event);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* UIC_WRAPPER_H */
+
return column == 0 ? elm : NULL;
}
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) {
+ if(model->getvalue2) {
+ return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult);
+ } else if(model->getvalue) {
+ return model->getvalue(elm, col);
+ }
+ return NULL;
+}
+
/*
static GtkTargetEntry targetentries[] =
{
typedef struct _ObjWrapper {
GObject parent_instance;
void *data;
+ int i;
} ObjWrapper;
typedef struct _ObjWrapperClass {
self->data = NULL;
}
-ObjWrapper* obj_wrapper_new(void* data) {
+ObjWrapper* obj_wrapper_new(void* data, int i) {
ObjWrapper *obj = g_object_new(obj_wrapper_get_type(), NULL);
obj->data = data;
+ obj->i = i;
return obj;
}
static void column_factory_bind( GtkListItemFactory *factory, GtkListItem *item, gpointer userdata) {
UiColData *col = userdata;
+ UiList *list = col->listview->var->value;
ObjWrapper *obj = gtk_list_item_get_item(item);
UiModel *model = col->listview->model;
UiModelType type = model->types[col->model_column];
- void *data = model->getvalue(obj->data, col->data_column);
+ UiBool freevalue = FALSE;
+ void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column, &freevalue);
GtkWidget *child = gtk_list_item_get_child(item);
- bool freevalue = TRUE;
switch(type) {
- case UI_STRING: {
- freevalue = FALSE;
- }
case UI_STRING_FREE: {
+ freevalue = TRUE;
+ }
+ case UI_STRING: {
gtk_label_set_label(GTK_LABEL(child), data);
if(freevalue) {
free(data);
break;
}
case UI_ICON_TEXT: {
- freevalue = FALSE;
+
}
case UI_ICON_TEXT_FREE: {
- void *data2 = model->getvalue(obj->data, col->data_column+1);
+ void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1, &freevalue);
+ if(type == UI_ICON_TEXT_FREE) {
+ freevalue = TRUE;
+ }
GtkWidget *image = g_object_get_data(G_OBJECT(child), "image");
GtkWidget *label = g_object_get_data(G_OBJECT(child), "label");
if(data && image) {
tableview->ondragcomplete = args->ondragcomplete;
tableview->ondragcompletedata = args->ondragcompletedata;
tableview->ondrop = args->ondrop;
- tableview->ondropdata = args->ondropsdata;
+ tableview->ondropdata = args->ondropdata;
tableview->selection.count = 0;
tableview->selection.rows = NULL;
return tableview;
// to simplify things and share code with ui_table_create, we also
// use a UiModel for the listview
UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
- model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ model->getvalue2 = args->getvalue2;
+ model->getvalue2data = args->getvalue2data;
+ } else if(args->getvalue) {
+ model->getvalue = args->getvalue;
+ } else {
+ model->getvalue = ui_strmodel_getvalue;
+ }
args->model = model;
GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
// to simplify things and share code with ui_tableview_create, we also
// use a UiModel for the listview
UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
- model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ model->getvalue2 = args->getvalue2;
+ model->getvalue2data = args->getvalue2data;
+ } else if(args->getvalue) {
+ model->getvalue = args->getvalue;
+ } else {
+ model->getvalue = ui_strmodel_getvalue;
+ }
args->model = model;
GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
void ui_update_liststore(GListStore *liststore, UiList *list) {
g_list_store_remove_all(liststore);
+ int i = 0;
void *elm = list->first(list);
while(elm) {
- ObjWrapper *obj = obj_wrapper_new(elm);
+ ObjWrapper *obj = obj_wrapper_new(elm, i++);
g_list_store_append(liststore, obj);
elm = list->next(list);
}
void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm) {
g_list_store_remove_all(liststore);
for(int i=0;i<nelm;i++) {
- ObjWrapper *obj = obj_wrapper_new(elm[i]);
+ ObjWrapper *obj = obj_wrapper_new(elm[i], i);
g_list_store_append(liststore, obj);
}
}
} else {
void *value = list->get(list, i);
if(value) {
- ObjWrapper *obj = obj_wrapper_new(value);
+ ObjWrapper *obj = obj_wrapper_new(value, i);
// TODO: if index i is selected, the selection is lost
// is it possible to update the item without removing it?
int count = g_list_model_get_n_items(G_LIST_MODEL(view->liststore));
#else
-static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, void *elm) {
+static void update_list_row(GtkListStore *store, GtkTreeIter *iter, UiModel *model, UiList *list, void *elm, int row) {
// set column values
int c = 0;
for(int i=0;i<model->columns;i++,c++) {
- void *data = model->getvalue(elm, c);
+ UiBool freevalue = FALSE;
+ void *data = model_getvalue(model, list, elm, row, c, &freevalue);
GValue value = G_VALUE_INIT;
switch(model->types[i]) {
- case UI_STRING:
case UI_STRING_FREE: {
+ freevalue = TRUE;
+ }
+ case UI_STRING: {
g_value_init(&value, G_TYPE_STRING);
g_value_set_string(&value, data);
- if(model->types[i] == UI_STRING_FREE) {
+ if(freevalue) {
free(data);
}
break;
}
#endif
c++;
-
- char *str = model->getvalue(elm, c);
+
+ freevalue = FALSE;
+ char *str = model_getvalue(model, list, elm, row, c, &freevalue);
g_value_init(&value, G_TYPE_STRING);
g_value_set_string(&value, str);
- if(model->types[i] == UI_ICON_TEXT_FREE) {
+ if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) {
free(str);
}
break;
if(list) {
void *elm = list->first(list);
+ int i = 0;
while(elm) {
// insert new row
GtkTreeIter iter;
gtk_list_store_insert (store, &iter, -1);
- update_list_row(store, &iter, model, elm);
+ update_list_row(store, &iter, model, list, elm, i++);
// next row
elm = list->next(list);
#endif
UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
- model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ model->getvalue2 = args->getvalue2;
+ model->getvalue2data = args->getvalue2data;
+ } else if(args->getvalue) {
+ model->getvalue = args->getvalue;
+ } else {
+ model->getvalue = ui_strmodel_getvalue;
+ }
UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
tableview->ondragcomplete = args->ondragcomplete;
tableview->ondragcompletedata = args->ondragcompletedata;
tableview->ondrop = args->ondrop;
- tableview->ondropdata = args->ondropsdata;
+ tableview->ondropdata = args->ondropdata;
tableview->selection.count = 0;
tableview->selection.rows = NULL;
g_signal_connect(
GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(view->widget));
GtkTreeIter iter;
if(gtk_tree_model_iter_nth_child(store, &iter, NULL, i)) {
- update_list_row(GTK_LIST_STORE(store), &iter, view->model, elm);
+ update_list_row(GTK_LIST_STORE(store), &iter, view->model, list, elm, i);
}
}
}
UiObject* current = uic_current_obj(obj);
UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
- model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ model->getvalue2 = args->getvalue2;
+ model->getvalue2data = args->getvalue2data;
+ } else if(args->getvalue) {
+ model->getvalue = args->getvalue;
+ } else {
+ model->getvalue = ui_strmodel_getvalue;
+ }
UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
uilistbox->obj = obj;
uilistbox->listbox = GTK_LIST_BOX(listbox);
uilistbox->getvalue = args->getvalue;
+ uilistbox->getvaluedata = args->getvaluedata;
uilistbox->onactivate = args->onactivate;
uilistbox->onactivatedata = args->onactivatedata;
uilistbox->onbuttonclick = args->onbuttonclick;
void *elm = list->first(list);
while(elm) {
UiSubListItem item = { NULL, NULL, NULL, NULL, NULL, NULL };
- listbox->getvalue(sublist->userdata, elm, index, &item);
+ listbox->getvalue(sublist->userdata, elm, index, &item, listbox->getvaluedata);
// create listbox item
GtkWidget *row = create_listbox_row(listbox, sublist, &item, (int)index);
GtkListBox *listbox;
CxList *sublists; // contains UiListBoxSubList elements
ui_sublist_getvalue_func getvalue;
+ void *getvaluedata;
ui_callback onactivate;
void *onactivatedata;
ui_callback onbuttonclick;
#endif
static UiObject* create_window(const char *title, void *window_data, UiBool sidebar, UiBool simple) {
- CxMempool *mp = cxMempoolCreateSimple(256);
- UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
- obj->ref = 0;
+ UiObject *obj = uic_object_new_toplevel();
#ifdef UI_LIBADWAITA
obj->widget = adw_application_window_new(ui_get_application());
obj->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
#endif
-
- obj->ctx = uic_context(obj, mp);
obj->window = window_data;
#if GTK_CHECK_VERSION(4, 0, 0)
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
}
- CxMempool *mp = cxMempoolCreateSimple(256);
- UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
- obj->ctx = uic_context(obj, mp);
+ UiObject *obj = uic_object_new_toplevel();
obj->widget = dialog;
obj->ref = 0;
obj->destroy = ui_window_widget_destroy;
#include "image.h"
+
+
+void ui_image_ref(UIIMAGE img) {
+ // TODO
+}
+
+void ui_image_unref(UIIMAGE img) {
+ // TODO
+}
#include "list.h"
#include "../common/object.h"
+static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
+ ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
+ return getvalue(elm, col);
+}
+
+/*
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) {
+ if(model->getvalue2) {
+ return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult);
+ } else if(model->getvalue) {
+ return model->getvalue(elm, col);
+ }
+ return NULL;
+}
+*/
+
UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
Arg xargs[16];
int n = 0;
memset(listview, 0, sizeof(UiListView));
listview->obj = obj;
listview->widget = widget;
- listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ listview->getvalue = args->getvalue2;
+ listview->getvaluedata = args->getvalue2data;
+ } else if(args->getvalue) {
+ listview->getvalue = getvalue_wrapper;
+ listview->getvaluedata = args->getvalue;
+ } else {
+ listview->getvalue = getvalue_wrapper;
+ listview->getvaluedata = ui_strmodel_getvalue;
+ }
listview->var = var;
listview->onactivate = args->onactivate;
listview->onactivatedata = args->onactivatedata;
}
}
-static XmStringTable create_stringlist(UiList *list, ui_getvaluefunc getvalue, int *count) {
+static XmStringTable create_stringlist(UiList *list, ui_getvaluefunc2 getvalue, void *getvaluedata, int *count) {
int num = list->count(list);
XmStringTable items = (XmStringTable)XtMalloc(num * sizeof(XmString));
void *data = list->first(list);
for(int i=0;i<num;i++) {
- char *s = getvalue(data, 0);
+ UiBool freevalue = FALSE;
+ char *s = getvalue(list, data, i, 0, getvaluedata, &freevalue);
items[i] = XmStringCreateLocalized(s ? s : "");
+ if(freevalue) {
+ free(s);
+ }
data = list->next(list);
}
XmStringTable items = create_stringlist(
list,
listview->getvalue,
+ listview->getvaluedata,
&count);
XtVaSetValues(
memset(listview, 0, sizeof(UiListView));
listview->obj = obj;
listview->widget = widget;
- listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+ if(args->getvalue2) {
+ listview->getvalue = args->getvalue2;
+ listview->getvaluedata = args->getvalue2data;
+ } else if(args->getvalue) {
+ listview->getvalue = getvalue_wrapper;
+ listview->getvaluedata = args->getvalue;
+ } else {
+ listview->getvalue = getvalue_wrapper;
+ listview->getvaluedata = ui_strmodel_getvalue;
+ }
listview->var = var;
listview->onactivate = args->onactivate;
listview->onactivatedata = args->onactivatedata;
Widget widget;
UiVar *var;
UiModel* model;
- ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
UiListSelection current_selection;
static UiObject* create_window(const char *title, void *window_data, Boolean simple) {
CxMempool *mp = cxMempoolCreateSimple(256);
const CxAllocator *a = mp->allocator;
- UiObject *obj = cxCalloc(a, 1, sizeof(UiObject));
- obj->ctx = uic_context(obj, mp);
+ UiObject *obj = uic_object_new_toplevel();
obj->window = window_data;
obj->destroy = ui_window_widget_destroy;
$(MAKE) -f $(QT_MAKEFILE)
$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)
+$(UI_SHLIB): $(OBJ)
+ $(MAKE) -f $(QT_MAKEFILE)
+ $(CXX) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx
+
FORCE:
--- /dev/null
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "image.h"
+
+
+
+void ui_image_ref(UIIMAGE img) {
+ // TODO
+}
+
+void ui_image_unref(UIIMAGE img) {
+ // TODO
+}
\ No newline at end of file
--- /dev/null
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef IMAGE_H
+#define IMAGE_H
+
+#include "toolkit.h"
+#include "../ui/image.h"
+
+#endif /* IMAGE_H */
+
return column == 0 ? elm : NULL;
}
+static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
+ ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
+ return getvalue(elm, col);
+}
UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
UiContainerPrivate *ctn = ui_obj_container(obj);
UI_APPLY_LAYOUT(ctn->layout, args);
QListView *view = new QListView();
+ ui_getvaluefunc2 getvalue = nullptr;
+ void *getvaluedata = nullptr;
+ if(args->getvalue2) {
+ getvalue = args->getvalue2;
+ getvaluedata = args->getvalue2data;
+ } else if(args->getvalue) {
+ getvalue = getvalue_wrapper;
+ getvaluedata = (void*)args->getvalue;
+ } else {
+ getvalue = getvalue_wrapper;
+ getvaluedata = (void*)ui_strmodel_getvalue;
+ }
- ui_getvaluefunc getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
- ListModel *model = new ListModel(obj, view, var, getvalue);
+ ListModel *model = new ListModel(obj, view, var, getvalue, getvaluedata);
view->setModel(model);
if(var) {
#include "model.h"
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) {
+ if(model->getvalue2) {
+ return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult);
+ } else if(model->getvalue) {
+ return model->getvalue(elm, col);
+ }
+ return NULL;
+}
-ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue){
+ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc2 getvalue, void *getvaluedata){
this->obj = obj;
this->view = view;
this->var = var;
this->getvalue = getvalue;
+ this->getvaluedata = getvaluedata;
this->onactivate = nullptr;
this->onactivatedata = nullptr;
this->onselection = nullptr;
UiList *ls = (UiList*)var->value;
void *rowData = ls->get(ls, index.row());
if(rowData && getvalue) {
- void *value = getvalue(rowData, 0);
+ UiBool freeResult = false;
+ void *value = getvalue(ls, rowData, index.row(), 0, getvaluedata, &freeResult);
if(value) {
- return QString::fromUtf8((char*)value);
+ auto qs = QString::fromUtf8((char*)value);
+ if(freeResult) {
+ free(value);
+ }
+ return qs;
}
}
}
if(role == Qt::DisplayRole) {
UiList *ls = (UiList*)var->value;
void *rowData = ls->get(ls, index.row());
- if(rowData && model->getvalue) {
+ if(rowData) {
int col = index.column();
- void *value = model->getvalue(rowData, col);
+ UiBool freeResult = false;
+ void *value = model_getvalue(model, ls, rowData, index.row(), col, &freeResult);
if(value) {
UiModelType type = model->types[col];
switch(type) {
case UI_STRING: {
- return QString::fromUtf8((char*)value);
+ auto qs = QString::fromUtf8((char*)value);
+ if(freeResult) {
+ free(value);
+ }
+ return qs;
}
case UI_STRING_FREE: {
QString s = QString::fromUtf8((char*)value);
return QString::number(i);
}
case UI_ICON: {
- break;
+ break; // TODO
}
case UI_ICON_TEXT: {
- break;
+ break; // TODO
}
case UI_ICON_TEXT_FREE: {
- break;
+ break; // TODO
}
}
}
class ListModel : public QAbstractListModel {
Q_OBJECT
- ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
ui_callback onactivate;
void *onactivatedata;
ui_callback onselection;
UiVar *var;
QListView *view;
- ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue);
+ ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc2 getvalue, void *getvaluedata);
void setActivationCallback(ui_callback f, void *userdata);
void setSelectionCallback(ui_callback f, void *userdata);
SOURCES += graphics.cpp
SOURCES += widget.cpp
SOURCES += entry.cpp
+SOURCES += image.cpp
HEADERS += toolkit.h
HEADERS += window.h
HEADERS += graphics.h
HEADERS += widget.h
HEADERS += entry.h
+HEADERS += image.h
#include <cx/mempool.h>
#include "../common/context.h"
+#include "../common/object.h"
#include "window.h"
#include "menu.h"
#include <QPushButton>
static UiObject* create_window(const char *title, void *window_data, bool simple) {
- CxMempool *mp = cxMempoolCreateSimple(256);
- UiObject *obj = (UiObject*)cxCalloc(mp->allocator, 1, sizeof(UiObject));
- obj->ctx = uic_context(obj, mp);
+ UiObject *obj = uic_object_new_toplevel();
obj->window = window_data;
obj->next = NULL;
typedef void(*ui_callback)(UiEvent*, void*); /* event, user data */
-typedef void*(*ui_getvaluefunc)(void*, int);
+typedef void*(*ui_getvaluefunc)(void *elm, int col);
+typedef void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult);
typedef int(*ui_threadfunc)(void*);
UiObserver *observers;
};
+typedef void (*ui_list_init_func)(UiContext *ctx, UiList *list, void *userdata);
+
/*
* abstract list
*/
UIEXPORT void ui_context_destroy(UiContext *ctx);
+UIEXPORT UiContext* ui_context_parent(UiContext *ctx);
+
UIEXPORT void ui_object_ref(UiObject *obj);
UIEXPORT int ui_object_unref(UiObject *obj);
UIEXPORT void* ui_document_new(size_t size);
UIEXPORT void ui_document_destroy(void *doc);
-UIEXPORT void ui_set_document(UiObject *obj, void *document); // deprecated
-UIEXPORT void ui_detach_document(UiObject *obj); // deprecated
-UIEXPORT void* ui_get_document(UiObject *obj); // deprecated
-UIEXPORT void ui_set_subdocument(void *document, void *sub); // deprecated
-UIEXPORT void ui_detach_subdocument(void *document, void *sub); // deprecated
UIEXPORT void* ui_get_subdocument(void *document); // deprecated
UIEXPORT UiContext* ui_document_context(void *doc);
UIEXPORT void ui_attach_document(UiContext *ctx, void *document);
-UIEXPORT void ui_detach_document2(UiContext *ctx, void *document);
+UIEXPORT void ui_detach_document(UiContext *ctx, void *document);
UIEXPORT void ui_widget_set_groups(UiContext *ctx, UIWIDGET widget, ui_enablefunc enable, ...);
// types
-UIEXPORT UiInteger* ui_int_new(UiContext *ctx, char *name);
-UIEXPORT UiDouble* ui_double_new(UiContext *ctx, char *name);
-UIEXPORT UiString* ui_string_new(UiContext *ctx, char *name);
-UIEXPORT UiText* ui_text_new(UiContext *ctx, char *name);
-UIEXPORT UiRange* ui_range_new(UiContext *ctx, char *name);
-UIEXPORT UiGeneric* ui_generic_new(UiContext *ctx, char *name);
+UIEXPORT UiInteger* ui_int_new(UiContext *ctx, const char *name);
+UIEXPORT UiDouble* ui_double_new(UiContext *ctx, const char *name);
+UIEXPORT UiString* ui_string_new(UiContext *ctx, const char *name);
+UIEXPORT UiText* ui_text_new(UiContext *ctx, const char *name);
+UIEXPORT UiRange* ui_range_new(UiContext *ctx, const char *name);
+UIEXPORT UiGeneric* ui_generic_new(UiContext *ctx, const char *name);
#define ui_get(v) _Generic(v, \
UiInteger*: ui_int_get, \
UIEXPORT void ui_notify_evt(UiObserver *observer, UiEvent *event);
-UIEXPORT UiList* ui_list_new(UiContext *ctx, char *name);
+UIEXPORT UiList* ui_list_new(UiContext *ctx, const char *name);
+UIEXPORT UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func init, void *userdata);
UIEXPORT void ui_list_free(UiList *list);
UIEXPORT void* ui_list_first(UiList *list);
UIEXPORT void* ui_list_next(UiList *list);
UIEXPORT void ui_setop_enable(int set);
UIEXPORT int ui_get_setop(void);
+
+UIEXPORT void ui_global_list_initializer(ui_list_init_func func, void *userdata);
+UIEXPORT void ui_list_class_set_first(UiList *list, void*(*first)(UiList *list));
+UIEXPORT void ui_list_class_set_next(UiList *list, void*(*next)(UiList *list));
+UIEXPORT void ui_list_class_set_get(UiList *list, void*(*get)(UiList *list, int i));
+UIEXPORT void ui_list_class_set_count(UiList *list, int(*count)(UiList *list));
+UIEXPORT void ui_list_class_set_data(UiList *list, void *data);
+UIEXPORT void ui_list_class_set_iter(UiList *list, void *iter);
+
#ifdef __cplusplus
}
#endif
int *columnsize;
/*
+ * void*(*ui_getvaluefunc)(void *elm, int col);
+ *
* function for translating model data to view data
- * first argument is the pointer returned by UiList->get or UiTree->get
+ * first argument is the pointer returned by UiList first|next|get
* second argument is the column index
* TODO: return
*/
- void*(*getvalue)(void*, int);
+ ui_getvaluefunc getvalue;
+
+ /*
+ * void*(*ui_getvaluefunc2)(UiList *list, void *elm, int row, int col, void *userdata)
+ *
+ * alternative for getvalue
+ */
+ ui_getvaluefunc2 getvalue2;
+
+ void *getvalue2data;
};
struct UiListCallbacks {
char **static_elements;
size_t static_nelm;
ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue2;
+ void *getvalue2data;
ui_callback onactivate;
void* onactivatedata;
ui_callback onselection;
ui_callback ondragcomplete;
void* ondragcompletedata;
ui_callback ondrop;
- void* ondropsdata;
+ void* ondropdata;
UiBool multiselection;
UiMenuBuilder *contextmenu;
const int *groups;
};
-typedef void (*ui_sublist_getvalue_func)(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item);
+typedef void (*ui_sublist_getvalue_func)(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
struct UiSubList {
UiList *value;
*/
ui_sublist_getvalue_func getvalue;
+ /*
+ * getvalue_func userdata
+ */
+ void *getvaluedata;
+
/*
* activated when a list item is selected
*/
UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args);
+UIEXPORT void ui_sublist_item_set_icon(UiSubListItem *item, const char *icon);
+UIEXPORT void ui_sublist_item_set_label(UiSubListItem *item, const char *label);
+UIEXPORT void ui_sublist_item_set_button_icon(UiSubListItem *item, const char *button_icon);
+UIEXPORT void ui_sublist_item_set_button_label(UiSubListItem *item, const char *button_label);
+UIEXPORT void ui_sublist_item_set_badge(UiSubListItem *item, const char *badge);
+UIEXPORT void ui_sublist_item_set_eventdata(UiSubListItem *item, void *eventdata);
+
#ifdef __cplusplus
}
$(UI_LIB): $(OBJ)
$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)
+
+$(UI_SHLIB): $(OBJ)
+ $(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx
--- /dev/null
+/*\r
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2024 Olaf Wintermann. All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions are met:\r
+ *\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ *\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "image.h"\r
+\r
+void ui_image_ref(UIIMAGE img) {\r
+ // TODO\r
+}\r
+\r
+void ui_image_unref(UIIMAGE img) {\r
+ // TODO\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2024 Olaf Wintermann. All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions are met:\r
+ *\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ *\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef IMAGE_H\r
+#define IMAGE_H\r
+\r
+#include "../ui/image.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif //IMAGE_H\r
WIN32OBJ = toolkit.obj
WIN32OBJ += window.obj
+WIN32OBJ += image.obj
TOOLKITOBJS += $(WIN32OBJ:%=$(WIN32_OBJPRE)%)
TOOLKITSOURCE += $(WIN32OBJ:%.obj=win32/%.c)
#include "window.h"
+#include "../common/menu.h"
+#include "../common/toolbar.h"
+#include "../common/document.h"
#include "../common/properties.h"
#include <stdio.h>
void *exit_data;
void ui_init(const char *appname, int argc, char **argv) {
- application_name = appname;
-
- ui_window_init();
+ application_name = appname;
+
+ uic_init_global_context();
+ uic_docmgr_init();
+ uic_menu_init();
+ uic_toolbar_init();
+ uic_load_app_properties();
+
+ ui_window_init();
}
const char* ui_appname() {
#include "window.h"
#include "Windows.h"
+#include "../common/object.h"
+
#include <stdbool.h>
#include <stdio.h>
}
static UiObject* create_window(const char *title, void *window_data, bool simple) {
- CxMempool *mp = cxMempoolCreateSimple(256);
- const CxAllocator *a = mp->allocator;
- UiObject *obj = cxCalloc(a, 1, sizeof(UiObject));
- obj->ctx = uic_context(obj, mp);
+ UiObject *obj = uic_object_new_toplevel();
obj->window = window_data;
HWND hwnd = CreateWindowEx(
#include "../common/object.h"\r
\r
#include "util.h"\r
+#include "../ui/widget.h"\r
\r
\r
void ui_container_begin_close(UiObject* obj) {\r
}\r
\r
\r
-UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) {\r
+UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) {\r
UiObject* current = uic_current_obj(obj);\r
\r
UIWIDGET widget = create_widget(obj, args, userdata);\r
FrameworkElement w = widget->uielement.as<FrameworkElement>();\r
\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
\r
current->container->Add(w, false);\r
\r
\r
// --------------------- UiBoxContainer ---------------------\r
\r
-static UIWIDGET ui_box(UiObject* obj, UiContainerArgs args, UiBoxContainerType type) {\r
+static UIWIDGET ui_box(UiObject* obj, UiContainerArgs *args, UiBoxContainerType type) {\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
\r
Grid grid = Grid();\r
current->container->Add(grid, true);\r
ui_context_add_widget_destructor(current->ctx, widget);\r
\r
UiObject* newobj = uic_object_new(obj, widget);\r
- newobj->container = new UiBoxContainer(grid, type, args.margin, args.spacing);\r
+ newobj->container = new UiBoxContainer(grid, type, args->margin, args->spacing);\r
ui_context_add_container_destructor(current->ctx, newobj->container);\r
uic_obj_add(obj, newobj);\r
\r
return widget;\r
}\r
\r
-UIWIDGET ui_vbox_create(UiObject* obj, UiContainerArgs args) {\r
+UIWIDGET ui_vbox_create(UiObject* obj, UiContainerArgs *args) {\r
return ui_box(obj, args, UI_BOX_CONTAINER_VBOX);\r
}\r
\r
-UIWIDGET ui_hbox_create(UiObject* obj, UiContainerArgs args) {\r
+UIWIDGET ui_hbox_create(UiObject* obj, UiContainerArgs *args) {\r
return ui_box(obj, args, UI_BOX_CONTAINER_HBOX);\r
}\r
\r
\r
// --------------------- UiGridContainer ---------------------\r
\r
-UIWIDGET ui_grid_create(UiObject* obj, UiContainerArgs args) {\r
+UIWIDGET ui_grid_create(UiObject* obj, UiContainerArgs *args) {\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
\r
Grid grid = Grid();\r
current->container->Add(grid, true);\r
ui_context_add_widget_destructor(current->ctx, widget);\r
\r
UiObject* newobj = uic_object_new(obj, widget);\r
- newobj->container = new UiGridContainer(grid, args.margin, args.columnspacing, args.rowspacing);\r
+ newobj->container = new UiGridContainer(grid, args->margin, args->columnspacing, args->rowspacing);\r
ui_context_add_container_destructor(current->ctx, newobj->container);\r
uic_obj_add(obj, newobj);\r
\r
\r
// --------------------- UI Frame ---------------------\r
\r
-UIWIDGET ui_frame_create(UiObject* obj, UiFrameArgs args) {\r
+UIWIDGET ui_frame_create(UiObject* obj, UiFrameArgs *args) {\r
// create a grid for the frame, that contains the label and a sub-frame\r
Grid frame = Grid();\r
\r
\r
// label\r
int row = 0;\r
- if (args.label) {\r
+ if (args->label) {\r
RowDefinition rowdefLabel = RowDefinition();\r
gl.GridUnitType = GridUnitType::Auto;\r
gl.Value = 0;\r
frame.RowDefinitions().Append(rowdefLabel);\r
\r
TextBlock label = TextBlock();\r
- wchar_t* wlabel = str2wstr(args.label, nullptr);\r
+ wchar_t* wlabel = str2wstr(args->label, nullptr);\r
winrt::hstring hstr(wlabel);\r
label.Text(hstr);\r
free(wlabel);\r
\r
// add frame to the parent container\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
current->container->Add(frame, true);\r
\r
UIElement elm = frame;\r
\r
// sub container\r
UiContainer* ctn = nullptr;\r
- switch (args.subcontainer) {\r
+ switch (args->subcontainer) {\r
default:\r
case UI_CONTAINER_VBOX: {\r
- ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_HBOX: {\r
- ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_GRID: {\r
- ctn = new UiGridContainer(workarea, args.margin, args.columnspacing, args.rowspacing);\r
+ ctn = new UiGridContainer(workarea, args->margin, args->columnspacing, args->rowspacing);\r
break;\r
}\r
}\r
\r
// --------------------- UI Expander ---------------------\r
\r
-UIWIDGET ui_expander_create(UiObject* obj, UiFrameArgs args) {\r
+UIWIDGET ui_expander_create(UiObject* obj, UiFrameArgs *args) {\r
Expander expander = Expander();\r
- if (args.label) {\r
- wchar_t* wlabel = str2wstr(args.label, nullptr);\r
+ if (args->label) {\r
+ wchar_t* wlabel = str2wstr(args->label, nullptr);\r
expander.Header(box_value(wlabel));\r
free(wlabel);\r
}\r
- expander.IsExpanded(args.isexpanded);\r
+ expander.IsExpanded(args->isexpanded);\r
\r
// add frame to the parent container\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
current->container->Add(expander, true);\r
\r
UIElement elm = expander;\r
expander.Content(content);\r
\r
UiContainer* ctn = nullptr;\r
- switch (args.subcontainer) {\r
+ switch (args->subcontainer) {\r
default: \r
case UI_CONTAINER_VBOX: {\r
- ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_HBOX: {\r
- ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_GRID: {\r
- ctn = new UiGridContainer(content, args.margin, args.columnspacing, args.rowspacing);\r
+ ctn = new UiGridContainer(content, args->margin, args->columnspacing, args->rowspacing);\r
break;\r
}\r
}\r
\r
// --------------------- UI ScrolledWindow ---------------------\r
\r
-UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) {\r
+UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {\r
ScrollViewer scrollW = ScrollViewer();\r
\r
// add frame to the parent container\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
current->container->Add(scrollW, true);\r
\r
UIElement elm = scrollW;\r
scrollW.Content(content);\r
\r
UiContainer* ctn = nullptr;\r
- switch (args.subcontainer) {\r
+ switch (args->subcontainer) {\r
default:\r
case UI_CONTAINER_VBOX: {\r
- ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_HBOX: {\r
- ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);\r
+ ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);\r
break;\r
}\r
case UI_CONTAINER_GRID: {\r
- ctn = new UiGridContainer(content, args.margin, args.columnspacing, args.rowspacing);\r
+ ctn = new UiGridContainer(content, args->margin, args->columnspacing, args->rowspacing);\r
break;\r
}\r
}\r
return newobj;\r
}\r
\r
-static UiTabView* tabview_pivot_create(UiObject* obj, UiTabViewArgs args) {\r
+static UiTabView* tabview_pivot_create(UiObject* obj, UiTabViewArgs *args) {\r
Pivot pivot = Pivot();\r
UiPivotTabView* tabview = new UiPivotTabView(obj, pivot, args);\r
\r
return tabview;\r
}\r
\r
-UiPivotTabView::UiPivotTabView(UiObject* obj, Pivot pivot, UiTabViewArgs args) {\r
+UiPivotTabView::UiPivotTabView(UiObject* obj, Pivot pivot, UiTabViewArgs *args) {\r
this->current = obj;\r
this->pivot = pivot;\r
- this->subcontainer = args.subcontainer;\r
- this->margin = args.margin;\r
- this->spacing = args.spacing;\r
- this->columnspacing = args.columnspacing;\r
- this->rowspacing = args.rowspacing;\r
+ this->subcontainer = args->subcontainer;\r
+ this->margin = args->margin;\r
+ this->spacing = args->spacing;\r
+ this->columnspacing = args->columnspacing;\r
+ this->rowspacing = args->rowspacing;\r
}\r
\r
UiObject* UiPivotTabView::AddTab(const char* label, int index) {\r
}\r
\r
\r
-static UiTabView* tabview_invisible_create(UiObject *obj, UiTabViewArgs args) {\r
+static UiTabView* tabview_invisible_create(UiObject *obj, UiTabViewArgs *args) {\r
Grid container = Grid();\r
container.HorizontalAlignment(HorizontalAlignment::Stretch);\r
container.VerticalAlignment(VerticalAlignment::Stretch);\r
return tabview;\r
}\r
\r
-UiInvisibleTabView::UiInvisibleTabView(UiObject* obj, Grid container, UiTabViewArgs args) {\r
+UiInvisibleTabView::UiInvisibleTabView(UiObject* obj, Grid container, UiTabViewArgs *args) {\r
this->current = obj;\r
this->container = container;\r
- this->subcontainer = args.subcontainer;\r
- this->margin = args.margin;\r
- this->spacing = args.spacing;\r
- this->columnspacing = args.columnspacing;\r
- this->rowspacing = args.rowspacing;\r
+ this->subcontainer = args->subcontainer;\r
+ this->margin = args->margin;\r
+ this->spacing = args->spacing;\r
+ this->columnspacing = args->columnspacing;\r
+ this->rowspacing = args->rowspacing;\r
this->currentIndex = -1;\r
\r
GridLength gl;\r
}\r
\r
\r
-static UiTabView* tabview_main_create(UiObject* obj, UiTabViewArgs args) {\r
+static UiTabView* tabview_main_create(UiObject* obj, UiTabViewArgs *args) {\r
TabView tabview = TabView();\r
tabview.IsAddTabButtonVisible(false);\r
//tabview.CanDragTabs(false);\r
return uitabview;\r
}\r
\r
-UiMainTabView::UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs args) {\r
+UiMainTabView::UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs *args) {\r
this->current = obj;\r
this->tabview = tabview;\r
- this->subcontainer = args.subcontainer;\r
- this->margin = args.margin;\r
- this->spacing = args.spacing;\r
- this->columnspacing = args.columnspacing;\r
- this->rowspacing = args.rowspacing;\r
+ this->subcontainer = args->subcontainer;\r
+ this->margin = args->margin;\r
+ this->spacing = args->spacing;\r
+ this->columnspacing = args->columnspacing;\r
+ this->rowspacing = args->rowspacing;\r
}\r
\r
UiObject* UiMainTabView::AddTab(const char* label, int index) {\r
}\r
\r
\r
-static UiTabView* tabview_navigationview_create(UiObject* obj, UiTabViewArgs args, UiTabViewType type) {\r
+static UiTabView* tabview_navigationview_create(UiObject* obj, UiTabViewArgs *args, UiTabViewType type) {\r
NavigationView navigationview = NavigationView();\r
UiNavigationTabView* tabview = new UiNavigationTabView(obj, navigationview, args, type);\r
navigationview.IsBackButtonVisible(NavigationViewBackButtonVisible::Collapsed);\r
return tabview;\r
}\r
\r
-UiNavigationTabView::UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs args, UiTabViewType type) {\r
+UiNavigationTabView::UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs *args, UiTabViewType type) {\r
this->current = obj;\r
this->navigationview = navigationview;\r
this->type = type;\r
- this->margin = args.margin;\r
- this->spacing = args.spacing;\r
- this->columnspacing = args.columnspacing;\r
- this->rowspacing = args.rowspacing;\r
+ this->margin = args->margin;\r
+ this->spacing = args->spacing;\r
+ this->columnspacing = args->columnspacing;\r
+ this->rowspacing = args->rowspacing;\r
\r
if (type == UI_TABVIEW_NAVIGATION_TOP) {\r
navigationview.PaneDisplayMode(NavigationViewPaneDisplayMode::Top);\r
tabview->Select(value);\r
}\r
\r
-UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) {\r
- UiTabViewType type = args.tabview == UI_TABVIEW_DEFAULT ? UI_TABVIEW_NAVIGATION_TOP2 : args.tabview;\r
+UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) {\r
+ UiTabViewType type = args->tabview == UI_TABVIEW_DEFAULT ? UI_TABVIEW_NAVIGATION_TOP2 : args->tabview;\r
UiTabView* tabview = nullptr;\r
switch (type) {\r
default: {\r
\r
// add frame to the parent container\r
UiObject* current = uic_current_obj(obj);\r
- UI_APPLY_LAYOUT1(current, args);\r
+ UI_APPLY_LAYOUT2(current, args);\r
current->container->Add(tabview->GetFrameworkElement(), true);\r
\r
UIElement elm = tabview->GetFrameworkElement();\r
// TODO: add tabview destructor\r
\r
// bind variable\r
- UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER);\r
+ UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);\r
if (var) {\r
UiInteger *i = (UiInteger*)var->value;\r
i->obj = tabview;\r
\r
// TODO: replace placeholder implementation\r
\r
-UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) {\r
+UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) {\r
UiContainerArgs boxargs = { };\r
boxargs.fill = UI_OFF;\r
- return ui_hbox_create(obj, boxargs);\r
+ return ui_hbox_create(obj, &boxargs);\r
}\r
\r
UIEXPORT void ui_headerbar_start_create(UiObject *obj) {\r
UiContainerArgs boxargs = { };\r
boxargs.fill = UI_OFF;\r
- ui_hbox_create(obj, boxargs);\r
+ ui_hbox_create(obj, &boxargs);\r
}\r
\r
UIEXPORT void ui_headerbar_center_create(UiObject *obj) {\r
UiContainerArgs boxargs = { };\r
boxargs.fill = UI_OFF;\r
- ui_hbox_create(obj, boxargs);\r
+ ui_hbox_create(obj, &boxargs);\r
}\r
\r
UIEXPORT void ui_headerbar_end_create(UiObject *obj) {\r
UiContainerArgs boxargs = { };\r
boxargs.fill = UI_OFF;\r
- ui_hbox_create(obj, boxargs);\r
+ ui_hbox_create(obj, &boxargs);\r
}\r
\r
\r
struct UiPivotTabView : UiTabView {\r
Pivot pivot;\r
\r
- UiPivotTabView(UiObject *obj, Pivot pivot, UiTabViewArgs args);\r
+ UiPivotTabView(UiObject *obj, Pivot pivot, UiTabViewArgs *args);\r
\r
UiObject* AddTab(const char* label, int index = -1);\r
void Remove(int index);\r
struct UiMainTabView : UiTabView {\r
TabView tabview;\r
\r
- UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs args);\r
+ UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs *args);\r
\r
UiObject* AddTab(const char* label, int index = -1);\r
void Remove(int index);\r
UiTabViewType type;\r
std::vector<std::tuple<NavigationViewItem, FrameworkElement> > pages;\r
\r
- UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs args, UiTabViewType type);\r
+ UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs *args, UiTabViewType type);\r
\r
UiObject* AddTab(const char* label, int index = -1);\r
void Remove(int index);\r
std::vector<FrameworkElement> pages;\r
int currentIndex;\r
\r
- UiInvisibleTabView(UiObject *obj, Grid container, UiTabViewArgs args);\r
+ UiInvisibleTabView(UiObject *obj, Grid container, UiTabViewArgs *args);\r
\r
UiObject* AddTab(const char* label, int index = -1);\r
void Remove(int index);\r
\r
UiImageSource::UiImageSource(winrt::Microsoft::UI::Xaml::Media::ImageSource& src) : imgsrc(src) {}\r
\r
+void UiImageSource::ref() {\r
+ refcount++;\r
+}\r
+\r
+void UiImageSource::unref() {\r
+ if (--refcount == 0) {\r
+ delete this;\r
+ }\r
+}\r
+\r
UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) {\r
UiObject* current = uic_current_obj(obj);\r
\r
UiImageSource *imgdata = (UiImageSource*)data;\r
if (g->value) {\r
UiImageSource *prevData = (UiImageSource*)g->value;\r
- delete prevData;\r
+ //prevData->unref();\r
}\r
g->value = imgdata;\r
+ //imgdata->ref();\r
\r
UiWidget* widget = (UiWidget*)g->obj;\r
Image image = widget->uielement.as<Image>();\r
\r
UiImageSource *imgdata = new UiImageSource(src);\r
obj->set(obj, imgdata, UI_IMAGE_OBJECT_TYPE);\r
+ imgdata->unref();\r
\r
free(wpath);\r
\r
return 0;\r
}\r
+\r
+void ui_image_ref(UIIMAGE img) {\r
+ UiImageSource* imgdata = (UiImageSource*)img;\r
+ imgdata->ref();\r
+}\r
+\r
+void ui_image_unref(UIIMAGE img) {\r
+ UiImageSource* imgdata = (UiImageSource*)img;\r
+ imgdata->unref();\r
+}\r
#include "../ui/image.h"\r
\r
class UiImageSource {\r
+ unsigned int refcount = 1;\r
+\r
public:\r
winrt::Microsoft::UI::Xaml::Media::ImageSource imgsrc { nullptr };\r
\r
UiImageSource(winrt::Microsoft::UI::Xaml::Media::ImageSource& src);\r
+\r
+ void ref();\r
+\r
+ void unref();\r
};\r
\r
\r
if (var) {\r
UiText* value = (UiText*)var->value;\r
value->obj = widget;\r
- value->undomgr = NULL;\r
value->set = ui_textarea_set;\r
value->get = ui_textarea_get;\r
value->getsubstr = ui_textarea_getsubstr;\r
}\r
\r
UIEXPORT UiObject* ui_simple_window(const char *title, void *window_data) {\r
- CxMempool* mp = cxMempoolCreateSimple(256);\r
- UiObject* obj = (UiObject*)cxCalloc(mp->allocator, 1, sizeof(UiObject));\r
+ UiObject* obj = uic_object_new_toplevel();\r
\r
obj->ctx = uic_context(obj, mp);\r
obj->window = window_data;\r