]> uap-core.de Git - note.git/commitdiff
update UI: change fill parameter
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 19 Jul 2025 18:34:55 +0000 (20:34 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 19 Jul 2025 18:34:55 +0000 (20:34 +0200)
65 files changed:
application/nbconfig.c
application/window.c
application/window.h
ucx/mempool.c
ui/cocoa/container.h
ui/common/args.c
ui/common/args.h
ui/common/document.c
ui/common/object.c
ui/common/threadpool.c
ui/common/types.c
ui/common/wrapper.c
ui/common/wrapper.h
ui/gtk/button.c
ui/gtk/container.c
ui/gtk/container.h
ui/gtk/display.c
ui/gtk/entry.c
ui/gtk/graphics.c
ui/gtk/image.c
ui/gtk/list.c
ui/gtk/menu.c
ui/gtk/range.c
ui/gtk/text.c
ui/gtk/toolbar.c
ui/gtk/toolkit.c
ui/gtk/toolkit.h
ui/gtk/webview.c
ui/gtk/widget.c
ui/gtk/window.c
ui/motif/button.c
ui/motif/container.h
ui/motif/list.c
ui/motif/text.c
ui/motif/toolkit.c
ui/qt/button.cpp
ui/qt/container.cpp
ui/qt/container.h
ui/qt/entry.cpp
ui/qt/label.cpp
ui/qt/list.cpp
ui/qt/menu.cpp
ui/qt/model.cpp
ui/qt/text.cpp
ui/qt/toolbar.cpp
ui/qt/toolkit.cpp
ui/qt/widget.cpp
ui/ui/button.h
ui/ui/container.h
ui/ui/display.h
ui/ui/entry.h
ui/ui/image.h
ui/ui/text.h
ui/ui/toolkit.h
ui/ui/tree.h
ui/ui/widget.h
ui/win32/Makefile
ui/win32/button.c [new file with mode: 0644]
ui/win32/button.h [new file with mode: 0644]
ui/win32/container.c [new file with mode: 0644]
ui/win32/container.h [new file with mode: 0644]
ui/win32/grid.c [new file with mode: 0644]
ui/win32/grid.h [new file with mode: 0644]
ui/win32/objs.mk
ui/win32/window.c

index 9cca033de551513ad2f5591c2a5c2788a2f0ba39..275d639ba20f2b038a629fc02bc168c02e28f463 100644 (file)
@@ -250,13 +250,13 @@ void notebook_config_dialog(void) {
     
     
     // UI
-    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .fill = UI_ON) {
+    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .fill = TRUE) {
         ui_tabview(obj, .hfill = TRUE, .hexpand = TRUE, .vfill = TRUE, .vexpand = TRUE) {
             ui_tab(obj, "Groups") {
-                ui_hbox(obj, .margin = 10, .spacing = 10, .fill = UI_ON) {
-                    ui_vbox(obj, .fill = UI_OFF) {
-                        ui_listview(obj, .list = wdata->tab1_groups, .getvalue = reslist_getvalue, .fill = UI_ON, .onactivate = nbconfig_grouplist_activate);
-                        ui_hbox(obj, .fill = UI_OFF) {
+                ui_hbox(obj, .margin = 10, .spacing = 10, .fill = TRUE) {
+                    ui_vbox(obj, .fill = FALSE) {
+                        ui_listview(obj, .list = wdata->tab1_groups, .getvalue = reslist_getvalue, .fill = TRUE, .onactivate = nbconfig_grouplist_activate);
+                        ui_hbox(obj, .fill = FALSE) {
                             ui_button(obj, .icon = UI_ICON_NEW_FOLDER, .onclick = nbconfig_grouplist_add);
                             ui_button(obj, .icon = UI_ICON_DELETE, .onclick = nbconfig_grouplist_delete);
                             ui_button(obj, .icon = UI_ICON_GO_UP, .onclick = nbconfig_grouplist_move_up);
@@ -264,7 +264,7 @@ void notebook_config_dialog(void) {
                         }
                     }
 
-                    ui_grid(obj, .columnspacing = 10, .rowspacing = 10, .fill = UI_ON, .def_vfill = TRUE) {
+                    ui_grid(obj, .columnspacing = 10, .rowspacing = 10, .fill = TRUE, .def_vfill = TRUE) {
                         ui_rlabel(obj, .label = "Name");
                         ui_textfield(obj, .value = wdata->tab1_group_name, .onchange = nbconfig_grouplist_name_changed);
                         ui_newline(obj);
@@ -280,10 +280,10 @@ void notebook_config_dialog(void) {
                 }
             }
             ui_tab(obj, "Notebooks") {
-                ui_hbox(obj, .margin = 10, .spacing = 10, .fill = UI_ON) {
-                    ui_vbox(obj, .fill = UI_OFF) {
-                        ui_listview(obj, .list = wdata->tab2_notebooks, .getvalue = reslist_getvalue, .fill = UI_ON, .onactivate = nbconfig_notebooklist_activate);
-                        ui_hbox(obj, .fill = UI_OFF) {
+                ui_hbox(obj, .margin = 10, .spacing = 10, .fill = TRUE) {
+                    ui_vbox(obj) {
+                        ui_listview(obj, .list = wdata->tab2_notebooks, .getvalue = reslist_getvalue, .fill = TRUE, .onactivate = nbconfig_notebooklist_activate);
+                        ui_hbox(obj) {
                             ui_button(obj, .icon = UI_ICON_NEW_FOLDER, .onclick = nbconfig_notebooklist_add);
                             ui_button(obj, .icon = UI_ICON_DELETE, .onclick = nbconfig_notebooklist_delete);
                             ui_button(obj, .icon = UI_ICON_GO_UP, .onclick = nbconfig_notebooklist_move_up);
@@ -291,7 +291,7 @@ void notebook_config_dialog(void) {
                         }
                     }
 
-                    ui_grid(obj, .columnspacing = 10, .rowspacing = 10, .fill = UI_ON, .def_vfill = TRUE) {
+                    ui_grid(obj, .columnspacing = 10, .rowspacing = 10, .fill = TRUE, .def_vfill = TRUE) {
                         ui_rlabel(obj, .label = "Group");
                         ui_combobox(obj, .list = wdata->tab2_groups, .getvalue = reslist_getvalue);
                         ui_newline(obj);
index 576c7ffab454a91252d18dc09e34138289e9f2ae..63889933d34741374ace05ab14e47098566f3266 100644 (file)
@@ -52,21 +52,28 @@ void window_create() {
     };
     */
     ui_sidebar(obj) {
-        ui_sourcelist(obj, .dynamic_sublist = wdata->notebooks, .getvalue = window_sidebar_getvalue, .onactivate = action_notebook_selected, .fill = UI_ON);
-        ui_hbox(obj, .spacing = 2, .fill = UI_OFF) {
+        ui_sourcelist(obj, .dynamic_sublist = wdata->notebooks, .getvalue = window_sidebar_getvalue, .onactivate = action_notebook_selected, .fill = TRUE);
+        ui_hbox(obj, .spacing = 2) {
             ui_button(obj, .icon = "folder-new-symbolic", .style_class = "flat", .onclick = action_notebook_add);
-            ui_label(obj, .fill = UI_ON);
+            ui_label(obj, .fill = TRUE);
             ui_button(obj, .icon = "emblem-system-symbolic", .style_class = "flat", .onclick = action_notebook_config);
         }
     }
     
-    ui_hsplitpane_w(obj, wdata->splitpane, .initial_position = 500) {
+    ui_hsplitpane_w(obj, wdata->splitpane, .initial_position = 500, .fill = TRUE) {
         // splitpane left: table
         UiModel* model = ui_model(obj->ctx, UI_STRING, "Name", UI_STRING_FREE, "Last Modified", -1);
         model->columnsize[0] = -1;
         model->getvalue = window_notelist_getvalue;
         
-        ui_table(obj, .model = model, .varname = "notes", .contextmenu = get_notelist_context_menu(), .multiselection = TRUE, .onselection = action_note_selected, .onactivate = action_note_activated);
+        ui_table(obj,
+                .model = model,
+                .varname = "notes",
+                .contextmenu = get_notelist_context_menu(),
+                .multiselection = TRUE,
+                .onselection = action_note_selected,
+                .onactivate = action_note_activated,
+                .fill = TRUE);
         
         // splitpane right: content
         ui_tabview_w(obj, wdata->document_tabview, .tabview = UI_TABVIEW_INVISIBLE, .varname = "note_type") {
@@ -74,13 +81,13 @@ void window_create() {
                 
             }
             ui_tab(obj, "textnote") {
-                ui_vbox0(obj) {
-                    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .def_vfill = TRUE, .fill = UI_OFF) {
+                ui_vbox(obj, .fill = TRUE) {
+                    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .def_vfill = TRUE) {
                         //ui_label(obj, .label = "Title", .vfill = TRUE);
                         ui_textfield(obj, .varname = "note_title", .onchange = action_note_title_changed, .hexpand = TRUE, .groups = UI_GROUPS(APP_STATE_NOTE_SELECTED));
                         ui_newline(obj);
                     }
-                    ui_hbox(obj, .style_class = "note_toolbar", .margin = 10, .spacing = 4, .fill = UI_OFF) {
+                    ui_hbox(obj, .style_class = "note_toolbar", .margin = 10, .spacing = 4) {
                         ui_combobox(obj, .varname = "note_textnote_para", .onactivate = action_textnote_paragraph);
                         ui_togglebutton(obj, .icon = "format-text-bold", .varname = "note_textnote_strong", .onchange = action_textnote_style_strong);
                         ui_togglebutton(obj, .icon = "format-text-italic", .varname = "note_textnote_emphasis", .onchange = action_textnote_style_emphasis);
@@ -91,7 +98,7 @@ void window_create() {
                         ui_button(obj, .icon = "insert-image");
                         ui_button(obj, .icon = "insert-link");
                     }
-                    ui_hbox_w(obj, wdata->attachments, .margin = 10, .fill = UI_OFF) {
+                    ui_hbox_w(obj, wdata->attachments, .margin = 10) {
                         UIWIDGET sw;
                         ui_scrolledwindow_w(obj, sw, .name = "note_attachments_sw") {
                             ui_itemlist(obj, .varname = "note_attachments", .container = UI_CONTAINER_HBOX, .create_ui = attachment_item, .userdata = wdata);
@@ -136,7 +143,7 @@ void window_notelist_setvisible(MainWindow *window, UiBool visible) {
     window->notelist_isvisible = visible;
 }
 
-void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata) {
+void window_sidebar_getvalue(UiList *list, void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata) {
     Resource *notebook = rowdata;
     item->label = strdup(notebook->displayname ? notebook->displayname : notebook->nodename);
     
@@ -336,7 +343,7 @@ void action_notebook_add(UiEvent *event, void *userdata) {
     obj->window = wdata;
     
     // Dialog UI
-    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .def_vfill = TRUE, .fill = UI_ON) {
+    ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .def_vfill = TRUE, .fill = TRUE) {
         ui_rlabel(obj, .label = "Group");
         ui_combobox(obj, .list = wdata->groups, .getvalue = nnd_group_value, .hfill = TRUE, .hexpand = TRUE);
         ui_newline(obj);
index 4a134fb01e472d4c0d07fc47415c6e415869d245..63fc9bb55a9d2016ce2ff00a66fec5ba970b774f 100644 (file)
@@ -53,7 +53,7 @@ void window_create();
 
 MainWindow* window_init_data(UiObject *obj);
 
-void window_sidebar_getvalue(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
+void window_sidebar_getvalue(UiList *list, void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
 
 void window_notelist_setvisible(MainWindow *window, UiBool visible);
 
index 8711439f50d784defc3c4823f69823ee4e7465ee..b7b2e81ddf1d26cf637ceceffb15e7fc457806d9 100644 (file)
@@ -638,7 +638,7 @@ int cxMempoolTransfer(
 
     // transfer all registered memory
     memcpy(&dest->registered[dest->registered_size], source->registered,
-           sizeof(struct cx_mempool_foreign_memory_s) * source->size);
+           sizeof(struct cx_mempool_foreign_memory_s) * source->registered_size);
     dest->registered_size += source->registered_size;
 
     // register the old allocator with the new pool
index b1796b5a31f7f0c3d98751d36ab839e9a87e797f..d969fa8cf6186d9feb1fca0afcf2cbb0a2521e43 100644 (file)
@@ -43,7 +43,7 @@ enum UiLayoutBool {
 };
 
 struct UiLayout {
-    UiTri        fill;
+    UiBool       fill;
     //UiBool       newline;
     //char         *label;
     UiBool       hexpand;
index c99ce0cddce02f689727371bae80713384134688..e799889fa8fbddc5086976badfcbe5c0cbc8f424 100644 (file)
@@ -608,6 +608,242 @@ void ui_splitpane_args_free(UiSplitPaneArgs *args) {
 }
 
 
+/* ------------------------- UiLabelArgs ----------------------------*/
+
+
+UiLabelArgs* ui_label_args_new(void) {
+    UiLabelArgs *args = malloc(sizeof(UiLabelArgs));
+    memset(args, 0, sizeof(UiLabelArgs));
+    return args;
+}
+
+
+void ui_label_args_set_fill(UiLabelArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_label_args_set_hexpand(UiLabelArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+
+void ui_label_args_set_vexpand(UiLabelArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+
+void ui_label_args_set_hfill(UiLabelArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+
+void ui_label_args_set_vfill(UiLabelArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+
+void ui_label_args_set_override_defaults(UiLabelArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+
+void ui_label_args_set_colspan(UiLabelArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+
+void ui_label_args_set_rowspan(UiLabelArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+
+void ui_label_args_set_name(UiLabelArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+
+void ui_label_args_set_style_class(UiLabelArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_label_args_set_label(UiLabelArgs *args, const char *label){
+    args->label = strdup(label);
+}
+
+
+void ui_label_args_set_align(UiLabelArgs *args, UiAlignment align) {
+    args->align = align;
+}
+
+void ui_label_args_set_style(UiLabelArgs *args, UiLabelStyle style) {
+    args->style = style;
+}
+
+void ui_label_args_set_varname(UiLabelArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_label_args_set_value(UiLabelArgs *args, UiString *value) {
+    args->value = value;
+}
+
+void ui_label_args_free(UiLabelArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->label);
+    free((void*)args->varname);
+    free(args);
+}
+
+
+/* ------------------------- UiProgressbarArgs ----------------------------*/
+
+
+UiProgressbarArgs* ui_progressbar_args_new(void) {
+    UiProgressbarArgs *args = malloc(sizeof(UiProgressbarArgs));
+    memset(args, 0, sizeof(UiProgressbarArgs));
+    return args;
+}
+
+
+void ui_progressbar_args_set_fill(UiProgressbarArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_progressbar_args_set_hexpand(UiProgressbarArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+
+void ui_progressbar_args_set_vexpand(UiProgressbarArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+
+void ui_progressbar_args_set_hfill(UiProgressbarArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+
+void ui_progressbar_args_set_vfill(UiProgressbarArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+
+void ui_progressbar_args_set_override_defaults(UiProgressbarArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+
+void ui_progressbar_args_set_colspan(UiProgressbarArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+
+void ui_progressbar_args_set_rowspan(UiProgressbarArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+
+void ui_progressbar_args_set_name(UiProgressbarArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+
+void ui_progressbar_args_set_style_class(UiProgressbarArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_progressbar_args_set_min(UiProgressbarArgs *args, double min) {
+    args->min = min;
+}
+
+void ui_progressbar_args_set_max(UiProgressbarArgs *args, double max) {
+    args->max = max;
+}
+
+void ui_progressbar_args_set_varname(UiProgressbarArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_progressbar_args_set_value(UiProgressbarArgs *args, UiDouble *value) {
+    args->value = value;
+}
+
+void ui_progressbar_args_free(UiProgressbarArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->varname);
+    free(args);
+}
+
+
+/* ------------------------- UiProgressbarSpinnerArgs ----------------------------*/
+
+UiProgressbarSpinnerArgs* ui_progress_spinner_args_new(void) {
+    UiProgressbarSpinnerArgs *args = malloc(sizeof(UiProgressbarSpinnerArgs));
+    memset(args, 0, sizeof(UiProgressbarSpinnerArgs));
+    return args;
+}
+
+void ui_progress_spinner_args_set_fill(UiProgressbarSpinnerArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+void ui_progress_spinner_args_set_hexpand(UiProgressbarSpinnerArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+void ui_progress_spinner_args_set_vexpand(UiProgressbarSpinnerArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+void ui_progress_spinner_args_set_hfill(UiProgressbarSpinnerArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+void ui_progress_spinner_args_set_vfill(UiProgressbarSpinnerArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+void ui_progress_spinner_args_set_override_defaults(UiProgressbarSpinnerArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+void ui_progress_spinner_args_set_colspan(UiProgressbarSpinnerArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+void ui_progress_spinner_args_set_rowspan(UiProgressbarSpinnerArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+void ui_progress_spinner_args_set_name(UiProgressbarSpinnerArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+void ui_progress_spinner_args_set_style_class(UiProgressbarSpinnerArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_progress_spinner_args_set_varname(UiProgressbarSpinnerArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_progress_spinner_args_set_value(UiProgressbarSpinnerArgs *args, UiInteger *value) {
+    args->value = value;
+}
+
+void ui_progress_spinner_args_free(UiProgressbarSpinnerArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->varname);
+    free(args);
+}
+
+
 /* ---------------------------- UiButtonArgs -------------------------------*/
 
 UiButtonArgs* ui_button_args_new(void) {
@@ -1084,3 +1320,267 @@ void ui_sourcelist_args_free(UiSourceListArgs *args) {
 }
 
 
+/* ------------------------- UiTextAreaArgs ----------------------------*/
+
+UiTextAreaArgs* ui_textarea_args_new(void) {
+    UiTextAreaArgs *args = malloc(sizeof(UiTextAreaArgs));
+    memset(args, 0, sizeof(UiTextAreaArgs));
+    return args;
+}
+
+
+void ui_textarea_args_set_fill(UiTextAreaArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_textarea_args_set_hexpand(UiTextAreaArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+
+void ui_textarea_args_set_vexpand(UiTextAreaArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+
+void ui_textarea_args_set_hfill(UiTextAreaArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+
+void ui_textarea_args_set_vfill(UiTextAreaArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+
+void ui_textarea_args_set_override_defaults(UiTextAreaArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+
+void ui_textarea_args_set_colspan(UiTextAreaArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+
+void ui_textarea_args_set_rowspan(UiTextAreaArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+
+void ui_textarea_args_set_name(UiTextAreaArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+
+void ui_textarea_args_set_style_class(UiTextAreaArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_textarea_args_set_onchange(UiTextAreaArgs *args, ui_callback callback){
+    args->onchange = callback;
+}
+
+
+void ui_textarea_args_set_onchangedata(UiTextAreaArgs *args, void *onchangedata){
+    args->onchangedata = onchangedata;
+}
+
+void ui_textarea_args_set_varname(UiTextAreaArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_textarea_args_set_value(UiTextAreaArgs *args, UiText *value) {
+    args->value = value;
+}
+
+void ui_textarea_args_set_groups(UiTextAreaArgs *args, int *groups){
+    // TODO
+}
+
+void ui_textarea_args_free(UiTextAreaArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->varname);
+    free((void*)args->groups);
+    free(args);
+}
+
+
+
+/* ------------------------- UiTextFieldArgs ----------------------------*/
+
+UiTextFieldArgs* ui_textfield_args_new(void) {
+    UiTextFieldArgs *args = malloc(sizeof(UiTextFieldArgs));
+    memset(args, 0, sizeof(UiTextFieldArgs));
+    return args;
+}
+
+
+void ui_textfield_args_set_fill(UiTextFieldArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_textfield_args_set_hexpand(UiTextFieldArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+
+void ui_textfield_args_set_vexpand(UiTextFieldArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+
+void ui_textfield_args_set_hfill(UiTextFieldArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+
+void ui_textfield_args_set_vfill(UiTextFieldArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+
+void ui_textfield_args_set_override_defaults(UiTextFieldArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+
+void ui_textfield_args_set_colspan(UiTextFieldArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+
+void ui_textfield_args_set_rowspan(UiTextFieldArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+
+void ui_textfield_args_set_name(UiTextFieldArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+
+void ui_textfield_args_set_style_class(UiTextFieldArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_textfield_args_set_onchange(UiTextFieldArgs *args, ui_callback callback){
+    args->onchange = callback;
+}
+
+
+void ui_textfield_args_set_onchangedata(UiTextFieldArgs *args, void *onchangedata){
+    args->onchangedata = onchangedata;
+}
+
+void ui_textfield_args_set_onactivate(UiTextFieldArgs *args, ui_callback callback){
+    args->onactivate = callback;
+}
+
+
+void ui_textfield_args_set_onactivatedata(UiTextFieldArgs *args, void *onactivatedata){
+    args->onactivatedata = onactivatedata;
+}
+
+void ui_textfield_args_set_varname(UiTextFieldArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_textfield_args_set_value(UiTextFieldArgs *args, UiString *value) {
+    args->value = value;
+}
+
+void ui_textfield_args_set_groups(UiTextFieldArgs *args, int *groups){
+    // TODO
+}
+
+void ui_textfield_args_free(UiTextFieldArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->varname);
+    free((void*)args->groups);
+    free(args);
+}
+
+
+/* ------------------------- UiWebviewArgs ----------------------------*/
+
+UiWebviewArgs* ui_webview_args_new(void) {
+    UiWebviewArgs *args = malloc(sizeof(UiWebviewArgs));
+    memset(args, 0, sizeof(UiWebviewArgs));
+    return args;
+}
+
+
+void ui_webview_args_set_fill(UiWebviewArgs *args, UiBool fill) {
+    args->fill = fill ? UI_ON : UI_OFF;
+}
+
+
+void ui_webview_args_set_hexpand(UiWebviewArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+
+void ui_webview_args_set_vexpand(UiWebviewArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+
+void ui_webview_args_set_hfill(UiWebviewArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+
+void ui_webview_args_set_vfill(UiWebviewArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+
+void ui_webview_args_set_override_defaults(UiWebviewArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+
+void ui_webview_args_set_colspan(UiWebviewArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+
+void ui_webview_args_set_rowspan(UiWebviewArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+
+void ui_webview_args_set_name(UiWebviewArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+
+void ui_webview_args_set_style_class(UiWebviewArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_webview_args_set_varname(UiWebviewArgs *args, const char *varname) {
+    args->varname = strdup(varname);
+}
+
+void ui_webview_args_set_value(UiWebviewArgs *args, UiGeneric *value) {
+    args->value = value;
+}
+
+void ui_webview_args_set_groups(UiWebviewArgs *args, int *groups){
+    // TODO
+}
+
+void ui_webview_args_free(UiWebviewArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free((void*)args->varname);
+    free((void*)args->groups);
+    free(args);
+}
+
index 6499594fd9a14b2bfd8233637d2a60b3d18ddc70..04e7063b7246005f8bac1bada2ad8c3a258c236c 100644 (file)
 #define UIC_ARGS_H
 
 #include "../ui/container.h"
+#include "../ui/display.h"
 #include "../ui/button.h"
 #include "../ui/menu.h"
 #include "../ui/toolbar.h"
 #include "../ui/tree.h"
+#include "../ui/text.h"
+#include "../ui/webview.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -159,6 +162,56 @@ UIEXPORT void ui_splitpane_args_set_value(UiSplitPaneArgs *args, UiInteger *valu
 UIEXPORT void ui_splitpane_args_set_max_panes(UiSplitPaneArgs *args, int max);
 UIEXPORT void ui_splitpane_args_free(UiSplitPaneArgs *args);
 
+UIEXPORT UiLabelArgs* ui_label_args_new(void);
+UIEXPORT void ui_label_args_set_fill(UiLabelArgs *args, UiBool fill);
+UIEXPORT void ui_label_args_set_hexpand(UiLabelArgs *args, UiBool value);
+UIEXPORT void ui_label_args_set_vexpand(UiLabelArgs *args, UiBool value);
+UIEXPORT void ui_label_args_set_hfill(UiLabelArgs *args, UiBool value);
+UIEXPORT void ui_label_args_set_vfill(UiLabelArgs *args, UiBool value);
+UIEXPORT void ui_label_args_set_override_defaults(UiLabelArgs *args, UiBool value);
+UIEXPORT void ui_label_args_set_colspan(UiLabelArgs *args, int colspan);
+UIEXPORT void ui_label_args_set_rowspan(UiLabelArgs *args, int rowspan);
+UIEXPORT void ui_label_args_set_name(UiLabelArgs *args, const char *name);
+UIEXPORT void ui_label_args_set_style_class(UiLabelArgs *args, const char *classname);
+UIEXPORT void ui_label_args_set_label(UiLabelArgs *args, const char *label);
+UIEXPORT void ui_label_args_set_align(UiLabelArgs *args, UiAlignment align);
+UIEXPORT void ui_label_args_set_style(UiLabelArgs *args, UiLabelStyle style);
+UIEXPORT void ui_label_args_set_value(UiLabelArgs *args, UiString *value);
+UIEXPORT void ui_label_args_set_varname(UiLabelArgs *args, const char *varname);
+UIEXPORT void ui_label_args_free(UiLabelArgs *args);
+
+UIEXPORT UiProgressbarArgs* ui_progressbar_args_new(void);
+UIEXPORT void ui_progressbar_args_set_fill(UiProgressbarArgs *args, UiBool fill);
+UIEXPORT void ui_progressbar_args_set_hexpand(UiProgressbarArgs *args, UiBool value);
+UIEXPORT void ui_progressbar_args_set_vexpand(UiProgressbarArgs *args, UiBool value);
+UIEXPORT void ui_progressbar_args_set_hfill(UiProgressbarArgs *args, UiBool value);
+UIEXPORT void ui_progressbar_args_set_vfill(UiProgressbarArgs *args, UiBool value);
+UIEXPORT void ui_progressbar_args_set_override_defaults(UiProgressbarArgs *args, UiBool value);
+UIEXPORT void ui_progressbar_args_set_colspan(UiProgressbarArgs *args, int colspan);
+UIEXPORT void ui_progressbar_args_set_rowspan(UiProgressbarArgs *args, int rowspan);
+UIEXPORT void ui_progressbar_args_set_name(UiProgressbarArgs *args, const char *name);
+UIEXPORT void ui_progressbar_args_set_style_class(UiProgressbarArgs *args, const char *classname);
+UIEXPORT void ui_progressbar_args_set_min(UiProgressbarArgs *args, double min);
+UIEXPORT void ui_progressbar_args_set_max(UiProgressbarArgs *args, double max);
+UIEXPORT void ui_progressbar_args_set_value(UiProgressbarArgs *args, UiDouble *value);
+UIEXPORT void ui_progressbar_args_set_varname(UiProgressbarArgs *args, const char *varname);
+UIEXPORT void ui_progressbar_args_free(UiProgressbarArgs *args);
+
+UIEXPORT UiProgressbarSpinnerArgs* ui_progress_spinner_args_new(void);
+UIEXPORT void ui_progress_spinner_args_set_fill(UiProgressbarSpinnerArgs *args, UiBool fill);
+UIEXPORT void ui_progress_spinner_args_set_hexpand(UiProgressbarSpinnerArgs *args, UiBool value);
+UIEXPORT void ui_progress_spinner_args_set_vexpand(UiProgressbarSpinnerArgs *args, UiBool value);
+UIEXPORT void ui_progress_spinner_args_set_hfill(UiProgressbarSpinnerArgs *args, UiBool value);
+UIEXPORT void ui_progress_spinner_args_set_vfill(UiProgressbarSpinnerArgs *args, UiBool value);
+UIEXPORT void ui_progress_spinner_args_set_override_defaults(UiProgressbarSpinnerArgs *args, UiBool value);
+UIEXPORT void ui_progress_spinner_args_set_colspan(UiProgressbarSpinnerArgs *args, int colspan);
+UIEXPORT void ui_progress_spinner_args_set_rowspan(UiProgressbarSpinnerArgs *args, int rowspan);
+UIEXPORT void ui_progress_spinner_args_set_name(UiProgressbarSpinnerArgs *args, const char *name);
+UIEXPORT void ui_progress_spinner_args_set_style_class(UiProgressbarSpinnerArgs *args, const char *classname);
+UIEXPORT void ui_progress_spinner_args_set_value(UiProgressbarSpinnerArgs *args, UiInteger *value);
+UIEXPORT void ui_progress_spinner_args_set_varname(UiProgressbarSpinnerArgs *args, const char *varname);
+UIEXPORT void ui_progress_spinner_args_free(UiProgressbarSpinnerArgs *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_hexpand(UiButtonArgs *args, UiBool value);
@@ -257,6 +310,60 @@ UIEXPORT void ui_sourcelist_args_set_onbuttonclick(UiSourceListArgs *args, ui_ca
 UIEXPORT void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata);
 UIEXPORT void ui_sourcelist_args_free(UiSourceListArgs *args);
 
+UIEXPORT UiTextAreaArgs* ui_textarea_args_new(void);
+UIEXPORT void ui_textarea_args_set_fill(UiTextAreaArgs *args, UiBool fill);
+UIEXPORT void ui_textarea_args_set_hexpand(UiTextAreaArgs *args, UiBool value);
+UIEXPORT void ui_textarea_args_set_vexpand(UiTextAreaArgs *args, UiBool value);
+UIEXPORT void ui_textarea_args_set_hfill(UiTextAreaArgs *args, UiBool value);
+UIEXPORT void ui_textarea_args_set_vfill(UiTextAreaArgs *args, UiBool value);
+UIEXPORT void ui_textarea_args_set_override_defaults(UiTextAreaArgs *args, UiBool value);
+UIEXPORT void ui_textarea_args_set_colspan(UiTextAreaArgs *args, int colspan);
+UIEXPORT void ui_textarea_args_set_rowspan(UiTextAreaArgs *args, int rowspan);
+UIEXPORT void ui_textarea_args_set_name(UiTextAreaArgs *args, const char *name);
+UIEXPORT void ui_textarea_args_set_style_class(UiTextAreaArgs *args, const char *classname);
+UIEXPORT void ui_textarea_args_set_onchange(UiTextAreaArgs *args, ui_callback callback);
+UIEXPORT void ui_textarea_args_set_onchangedata(UiTextAreaArgs *args, void *onchangedata);
+UIEXPORT void ui_textarea_args_set_varname(UiTextAreaArgs *args, const char *varname);
+UIEXPORT void ui_textarea_args_set_value(UiTextAreaArgs *args, UiText *value);
+UIEXPORT void ui_textarea_args_set_groups(UiTextAreaArgs *args, int *groups);
+UIEXPORT void ui_textarea_args_free(UiTextAreaArgs *args);
+
+UIEXPORT UiTextFieldArgs* ui_textfield_args_new(void);
+UIEXPORT void ui_textfield_args_set_fill(UiTextFieldArgs *args, UiBool fill);
+UIEXPORT void ui_textfield_args_set_hexpand(UiTextFieldArgs *args, UiBool value);
+UIEXPORT void ui_textfield_args_set_vexpand(UiTextFieldArgs *args, UiBool value);
+UIEXPORT void ui_textfield_args_set_hfill(UiTextFieldArgs *args, UiBool value);
+UIEXPORT void ui_textfield_args_set_vfill(UiTextFieldArgs *args, UiBool value);
+UIEXPORT void ui_textfield_args_set_override_defaults(UiTextFieldArgs *args, UiBool value);
+UIEXPORT void ui_textfield_args_set_colspan(UiTextFieldArgs *args, int colspan);
+UIEXPORT void ui_textfield_args_set_rowspan(UiTextFieldArgs *args, int rowspan);
+UIEXPORT void ui_textfield_args_set_name(UiTextFieldArgs *args, const char *name);
+UIEXPORT void ui_textfield_args_set_style_class(UiTextFieldArgs *args, const char *classname);
+UIEXPORT void ui_textfield_args_set_onchange(UiTextFieldArgs *args, ui_callback callback);
+UIEXPORT void ui_textfield_args_set_onchangedata(UiTextFieldArgs *args, void *onchangedata);
+UIEXPORT void ui_textfield_args_set_onactivate(UiTextFieldArgs *args, ui_callback callback);
+UIEXPORT void ui_textfield_args_set_onactivatedata(UiTextFieldArgs *args, void *onactivatedata);
+UIEXPORT void ui_textfield_args_set_varname(UiTextFieldArgs *args, const char *varname);
+UIEXPORT void ui_textfield_args_set_value(UiTextFieldArgs *args, UiString *value);
+UIEXPORT void ui_textfield_args_set_groups(UiTextFieldArgs *args, int *groups);
+UIEXPORT void ui_textfield_args_free(UiTextFieldArgs *args);
+
+UIEXPORT UiWebviewArgs* ui_webview_args_new(void);
+UIEXPORT void ui_webview_args_set_fill(UiWebviewArgs *args, UiBool fill);
+UIEXPORT void ui_webview_args_set_hexpand(UiWebviewArgs *args, UiBool value);
+UIEXPORT void ui_webview_args_set_vexpand(UiWebviewArgs *args, UiBool value);
+UIEXPORT void ui_webview_args_set_hfill(UiWebviewArgs *args, UiBool value);
+UIEXPORT void ui_webview_args_set_vfill(UiWebviewArgs *args, UiBool value);
+UIEXPORT void ui_webview_args_set_override_defaults(UiWebviewArgs *args, UiBool value);
+UIEXPORT void ui_webview_args_set_colspan(UiWebviewArgs *args, int colspan);
+UIEXPORT void ui_webview_args_set_rowspan(UiWebviewArgs *args, int rowspan);
+UIEXPORT void ui_webview_args_set_name(UiWebviewArgs *args, const char *name);
+UIEXPORT void ui_webview_args_set_style_class(UiWebviewArgs *args, const char *classname);
+UIEXPORT void ui_webview_args_set_varname(UiWebviewArgs *args, const char *varname);
+UIEXPORT void ui_webview_args_set_value(UiWebviewArgs *args, UiGeneric *value);
+UIEXPORT void ui_webview_args_set_groups(UiWebviewArgs *args, int *groups);
+UIEXPORT void ui_webview_args_free(UiWebviewArgs *args);
+
 #ifdef __cplusplus
 }
 #endif
index b2b2fba46e34f715f8da2b37f7267fedc4c5d10c..bd69073f5a9c5112cd4495b160c0bd65e5dff72b 100644 (file)
@@ -62,6 +62,7 @@ void ui_document_destroy(void *doc) {
         ev.document = doc;
         ev.obj = NULL;
         ev.eventdata = NULL;
+        ev.eventdatatype = 0;
         ev.intval = 0;
 
         if(ctx->close_callback) {
index 9a42ce4a9287bf4e9ffd8afdd61f51fe6390edf7..e7981c4687f2c3d82823a2df8701847c4e21309d 100644 (file)
@@ -124,6 +124,7 @@ void uic_object_destroy(UiObject *obj) {
         ev.document = obj->ctx->document;
         ev.obj = obj;
         ev.eventdata = NULL;
+        ev.eventdatatype = 0;
         ev.intval = 0;
         obj->ctx->close_callback(&ev, obj->ctx->close_data);
     }
index 7a37407621b98d8556fd53120accb700c1df605d..7988eab577a9daa66999cc6d34e08891a7ab5b7d 100644 (file)
@@ -165,6 +165,7 @@ static int ui_threadpool_job_finish(void *data) {
     event.document = job->obj->ctx->document;
     event.intval = 0;
     event.eventdata = NULL;
+    event.eventdatatype = 0;
     job->finish_callback(&event, job->finish_data);
     free(job);
     return 0;
index 024ec0bcd624fd8b27a108f2e0cc265a39df51f8..b3f55d19215332f39759f5db34d69081fe26d3d7 100644 (file)
@@ -77,6 +77,7 @@ void ui_notify_except(UiObserver *observer, UiObserver *exc, void *data) {
     evt.window = NULL;
     evt.document = NULL;
     evt.eventdata = data;
+    evt.eventdatatype = UI_EVENT_DATA_POINTER;
     evt.intval = 0;
     
     while(observer) {
index 04b74308f7de3469e13ff1d6eee70e87a4024fe1..ea8855336f921e77ff16a074d5511dc7fe582be2 100644 (file)
@@ -29,6 +29,7 @@
 #include "wrapper.h"
 #include "types.h"
 #include <cx/list.h>
+#include <string.h>
 
 /* ---------------------------- UiObject ---------------------------- */
 
@@ -134,6 +135,33 @@ int ui_srclist_size(UiList *list) {
 }
 
 
+/* ---------------------------- UiSubListEventData ---------------------------- */
+
+UiList* ui_sublist_event_get_list(UiSubListEventData *event) {
+    return event->list;
+}
+
+int ui_sublist_event_get_sublist_index(UiSubListEventData *event) {
+    return event->sublist_index;
+}
+
+int ui_sublist_event_get_row_index(UiSubListEventData *event) {
+    return event->row_index;
+}
+
+void* ui_sublist_event_get_row_data(UiSubListEventData *event) {
+    return event->row_data;
+}
+
+void* ui_sublist_event_get_sublist_userdata(UiSubListEventData *event) {
+    return event->sublist_userdata;
+}
+
+void* ui_sublist_event_get_event_data(UiSubListEventData *event) {
+    return event->event_data;
+}
+
+
 /* ---------------------------- UiEvent ---------------------------- */
 
 UiObject* ui_event_get_obj(UiEvent *event) {
@@ -152,6 +180,10 @@ void* ui_event_get_eventdata(UiEvent *event) {
     return event->eventdata;
 }
 
+int ui_event_get_eventdatatype(UiEvent *event) {
+    return event->eventdatatype;
+}
+
 int ui_event_get_int(UiEvent *event) {
     return event->intval;
 }
index 02794b1a8785d815dc45ca90798c7c05d4896730..d190fc8609b4c74b42e92e5fe4f8bf21562bb0ac 100644 (file)
@@ -58,11 +58,19 @@ 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 UiList* ui_sublist_event_get_list(UiSubListEventData *event);
+UIEXPORT int ui_sublist_event_get_sublist_index(UiSubListEventData *event);
+UIEXPORT int ui_sublist_event_get_row_index(UiSubListEventData *event);
+UIEXPORT void* ui_sublist_event_get_row_data(UiSubListEventData *event);
+UIEXPORT void* ui_sublist_event_get_sublist_userdata(UiSubListEventData *event);
+UIEXPORT void* ui_sublist_event_get_event_data(UiSubListEventData *event);
     
 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_eventdatatype(UiEvent *event);
 UIEXPORT int ui_event_get_int(UiEvent *event);
 UIEXPORT int ui_event_get_set(UiEvent *event);
 
index 6a95150e84c003516054bcff7ccde4d1bb41d43c..6f6ad0ba2daf126cccc937f4a9bb6b9518836df5 100644 (file)
@@ -73,6 +73,7 @@ GtkWidget* ui_create_button(
         event->callback = onclick;
         event->value = event_value;
         event->customdata = NULL;
+        event->customint = 0;
 
         g_signal_connect(
                 button,
@@ -102,7 +103,7 @@ UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
     ui_set_name_and_style(button, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, button, args->groups);
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, button, FALSE);
+    current->container->add(current->container, button);
     return button;
 }
 
@@ -113,6 +114,7 @@ void ui_button_clicked(GtkWidget *widget, UiEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = event->value;
     e.set = ui_get_setop();
     event->callback(&e, event->userdata);
@@ -137,6 +139,7 @@ void ui_toggled_obs(void *widget, UiVarEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = event->var->value;
+    e.eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     e.intval = i->get(i);
     e.set = ui_get_setop();
     
@@ -149,6 +152,7 @@ static void ui_toggled_callback(GtkToggleButton *widget, UiEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = gtk_toggle_button_get_active(widget);
     e.set = ui_get_setop();
     event->callback(&e, event->userdata);    
@@ -240,6 +244,7 @@ void ui_bind_togglebutton(
         event->callback = onchange;
         event->value = 0;
         event->customdata = NULL;
+        event->customint = 0;
         
         g_signal_connect(
                 widget,
@@ -260,6 +265,7 @@ void ui_bind_togglebutton(
         event->callback = NULL;
         event->value = enable_state;
         event->customdata = NULL;
+        event->customint = 0;
         
         g_signal_connect(
                 widget,
@@ -291,7 +297,7 @@ static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleAr
     ui_set_widget_groups(obj->ctx, widget, args->groups);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget, FALSE);
+    current->container->add(current->container, widget);
     
     return widget;
 }
@@ -320,6 +326,7 @@ static void ui_checkbox_callback(GtkCheckButton *widget, UiEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = gtk_check_button_get_active(widget);
     e.set = ui_get_setop();
     event->callback(&e, event->userdata);    
@@ -354,7 +361,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     ui_set_widget_groups(obj->ctx, widget, args->groups);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget, FALSE);
+    current->container->add(current->container, widget);
     
     return widget;
 }
@@ -391,6 +398,7 @@ static void radiobutton_toggled(void *widget, UiEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = RADIOBUTTON_GET_ACTIVE(widget);
     e.set = ui_get_setop();
     event->callback(&e, event->userdata);    
@@ -483,6 +491,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
         event->callback = args->onchange;
         event->value = 0;
         event->customdata = NULL;
+        event->customint = 0;
         
         g_signal_connect(
                 rbutton,
@@ -497,7 +506,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
     }
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, rbutton, FALSE);
+    current->container->add(current->container, rbutton);
     
     return rbutton;
 }
@@ -510,6 +519,7 @@ void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = i->get(i);
     
     ui_notify_evt(i->observers, &e);
index 8ee7ee5480d740e43338e24737fefd9528571fb8..7a98bf475561f6ac720ac58e38b2b0cb4a6b32d1 100644 (file)
@@ -120,12 +120,9 @@ UiContainer* ui_box_container(UiObject *obj, GtkWidget *box, UiSubContainerType
     return (UiContainer*)ct;
 }
 
-void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_box_container_add(UiContainer *ct, GtkWidget *widget) {
     UiBoxContainer *bc = (UiBoxContainer*)ct;
-    if(ct->layout.fill != UI_LAYOUT_UNDEFINED) {
-        fill = ui_lb2bool(ct->layout.fill);
-    }
-    
+    UiBool fill = ct->layout.fill;
     if(bc->has_fill && fill) {
         fprintf(stderr, "UiError: container has 2 filled widgets");
         fill = FALSE;
@@ -180,7 +177,7 @@ UiContainer* ui_grid_container(
 }
 
 #if GTK_MAJOR_VERSION >= 3
-void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_grid_container_add(UiContainer *ct, GtkWidget *widget) {
     UiGridContainer *grid = (UiGridContainer*)ct;
     
     if(ct->layout.newline) {
@@ -208,9 +205,7 @@ void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
         }
     }
     
-    if(ct->layout.fill != UI_LAYOUT_UNDEFINED) {
-        fill = ui_lb2bool(ct->layout.fill);
-    }
+    UiBool fill = ct->layout.fill;
     if(ct->layout.hexpand) {
         hexpand = TRUE;
         hfill = TRUE;
@@ -249,7 +244,7 @@ void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
 }
 #endif
 #ifdef UI_GTK2
-void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_grid_container_add(UiContainer *ct, GtkWidget *widget) {
     UiGridContainer *grid = (UiGridContainer*)ct;
     
     if(ct->layout.newline) {
@@ -277,9 +272,7 @@ void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
         }
     }
     
-    if(ct->layout.fill != UI_LAYOUT_UNDEFINED) {
-        fill = ui_lb2bool(ct->layout.fill);
-    }
+    UiBool fill = ct->layout.fill;
     if(ct->layout.hexpand) {
         hexpand = TRUE;
         hfill = TRUE;
@@ -340,7 +333,7 @@ UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame) {
     return ct;
 }
 
-void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_frame_container_add(UiContainer *ct, GtkWidget *widget) {
     FRAME_SET_CHILD(ct->widget, widget);
 }
 
@@ -354,11 +347,11 @@ UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander) {
     return ct;
 }
 
-void ui_expander_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_expander_container_add(UiContainer *ct, GtkWidget *widget) {
     EXPANDER_SET_CHILD(ct->widget, widget);
 }
 
-void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget) {
     // TODO: check if the widget implements GtkScrollable
     SCROLLEDWINDOW_SET_CHILD(ct->widget, widget);
     ui_reset_layout(ct->layout);
@@ -385,7 +378,7 @@ UiContainer* ui_tabview_container(UiObject *obj, GtkWidget *tabview) {
     return (UiContainer*)ct;
 }
 
-void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget) {
     UiGtkTabView *data = ui_widget_get_tabview_data(ct->widget);
     if(!data) {
         fprintf(stderr, "UI Error: widget is not a tabview");
@@ -428,7 +421,7 @@ UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType
     GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
     GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box;
-    ct->add(ct, widget, TRUE);
+    ct->add(ct, widget);
     
     UiObject *newobj = uic_object_new(obj, box);
     newobj->container = ui_box_container(obj, box, type);
@@ -466,7 +459,7 @@ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) {
     GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing);
     ui_set_name_and_style(grid, args->name, args->style_class);
     widget = ui_box_set_margin(grid, args->margin);
-    current->container->add(current->container, widget, TRUE);
+    current->container->add(current->container, widget);
     
     UiObject *newobj = uic_object_new(obj, grid);
     newobj->container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill);
@@ -488,7 +481,7 @@ UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
         newobj->widget = frame;
         newobj->container = ui_frame_container(obj, frame);
     }
-    current->container->add(current->container, frame, FALSE);
+    current->container->add(current->container, frame);
     uic_obj_add(obj, newobj);
     
     return frame;
@@ -508,7 +501,7 @@ UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args) {
         newobj->widget = expander;
         newobj->container = ui_expander_container(obj, expander);
     }
-    current->container->add(current->container, expander, FALSE);
+    current->container->add(current->container, expander);
     uic_obj_add(obj, newobj);
     
     return expander;
@@ -522,7 +515,7 @@ UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {
     GtkWidget *sw = SCROLLEDWINDOW_NEW();
     ui_set_name_and_style(sw, args->name, args->style_class);
     GtkWidget *widget = ui_box_set_margin(sw, args->margin);
-    current->container->add(current->container, widget, TRUE);
+    current->container->add(current->container, widget);
     
     UiObject *newobj = uic_object_new(obj, sw);
     GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin);
@@ -706,6 +699,7 @@ static void tabview_switch_page(
     event.document = event.obj->ctx->document;
     event.set = ui_get_setop();
     event.eventdata = NULL;
+    event.eventdatatype = 0;
     event.intval = page_num;
     
     tabview->onchange(&event, tabview->onchange);
@@ -728,6 +722,7 @@ static void tabview_stack_changed(
     event.document = event.obj->ctx->document;
     event.set = ui_get_setop();
     event.eventdata = NULL;
+    event.eventdatatype = 0;
     event.intval = 0;
     
     tabview->onchange(&event, tabview->onchange);
@@ -815,7 +810,7 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) {
     data->subcontainer = args->subcontainer;
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget, TRUE);
+    current->container->add(current->container, widget);
     
     UiObject *newobj = uic_object_new(obj, widget);
     newobj->container = ui_tabview_container(obj, widget);
@@ -932,7 +927,7 @@ UIWIDGET ui_headerbar_fallback_create(UiObject *obj, UiHeaderbarArgs *args) {
     
     GtkWidget *box = ui_gtk_hbox_new(args->alt_spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
-    ct->add(ct, box, FALSE);
+    ct->add(ct, box);
     
     UiObject *newobj = uic_object_new(obj, box);
     newobj->container = ui_headerbar_fallback_container(obj, box);
@@ -963,7 +958,7 @@ UiContainer* ui_headerbar_fallback_container(UiObject *obj, GtkWidget *headerbar
     return (UiContainer*)ct;
 }
 
-void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget) {
     UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct;
     BOX_ADD(ct->widget, widget);
 }
@@ -993,7 +988,7 @@ UiContainer* ui_headerbar_container(UiObject *obj, GtkWidget *headerbar) {
     return (UiContainer*)ct;
 }
 
-void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget) {
     UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct;
     if(hb->part == 0) {
         UI_HEADERBAR_PACK_START(ct->widget, widget);
@@ -1078,7 +1073,7 @@ static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSpl
     GtkWidget *pane0 = create_paned(orientation);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, pane0, TRUE);
+    current->container->add(current->container, pane0);
     
     int max = args->max_panes == 0 ? 2 : args->max_panes;
     
@@ -1111,7 +1106,7 @@ UiContainer* ui_splitpane_container(UiObject *obj, GtkWidget *pane, UiOrientatio
     return (UiContainer*)ct;
 }
 
-void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget) {
     UiSplitPaneContainer *s = (UiSplitPaneContainer*)ct;
     
     if(s->nchildren >= s->max) {
@@ -1204,7 +1199,7 @@ static void update_itemlist(UiList *list, int c) {
         UiObject *item_obj = cxMapGet(ct->current_items, key);
         if(item_obj) {
             // re-add previously created widget
-            ui_box_container_add(ct->container, item_obj->widget, FALSE);
+            ui_box_container_add(ct->container, item_obj->widget);
         } else {
             // create new widget and object for this list element
             CxMempool *mp = cxMempoolCreateSimple(256);
@@ -1219,7 +1214,7 @@ static void update_itemlist(UiList *list, int c) {
                     ct->columnspacing,
                     ct->rowspacing,
                     ct->margin);
-            ui_box_container_add(ct->container, obj->widget, FALSE);
+            ui_box_container_add(ct->container, obj->widget);
             if(ct->create_ui) {
                 ct->create_ui(obj, index, elm, ct->userdata);
             }
@@ -1248,7 +1243,7 @@ UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args) {
     GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
     GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box;
-    ct->add(ct, widget, TRUE);
+    ct->add(ct, widget);
     
     UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer));
     container->parent = obj;
@@ -1293,7 +1288,7 @@ UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args) {
 
 void ui_layout_fill(UiObject *obj, UiBool fill) {
     UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.fill = ui_bool2lb(fill);
+    ct->layout.fill = fill;
 }
 
 void ui_layout_hexpand(UiObject *obj, UiBool expand) {
index 6c254a4b18a6eff45fee4ef9a1a5e579ef13156e..5f447662477881ec25a9b4c8ca8bfabd8bd37d9d 100644 (file)
@@ -44,23 +44,15 @@ extern "C" {
 #endif
   
 #define ui_reset_layout(layout) memset(&(layout), 0, sizeof(UiLayout))
-#define ui_lb2bool(b) ((b) == UI_LAYOUT_TRUE ? TRUE : FALSE)
-#define ui_bool2lb(b) ((b) ? UI_LAYOUT_TRUE : UI_LAYOUT_FALSE)
     
-typedef void (*ui_container_add_f)(UiContainer*, GtkWidget*, UiBool);
+typedef void (*ui_container_add_f)(UiContainer*, GtkWidget*);
 
 typedef struct UiDocumentView UiDocumentView;
 
 
-typedef enum UiLayoutBool {
-    UI_LAYOUT_UNDEFINED = 0,
-    UI_LAYOUT_TRUE,
-    UI_LAYOUT_FALSE,
-} UiLayoutBool;
-
 typedef struct UiLayout UiLayout;
 struct UiLayout {
-    UiLayoutBool fill;
+    UiBool       fill;
     UiBool       newline;
     char         *label;
     UiBool       hexpand;
@@ -78,7 +70,7 @@ struct UiContainer {
     UIMENU menu;
     GtkWidget *current;
     
-    void (*add)(UiContainer*, GtkWidget*, UiBool);
+    void (*add)(UiContainer*, GtkWidget*);
     UiLayout layout;
     
     int close;
@@ -172,13 +164,13 @@ GtkWidget* ui_subcontainer_create(
         int margin);
 
 UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame);
-void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_frame_container_add(UiContainer *ct, GtkWidget *widget);
 
 GtkWidget* ui_box_set_margin(GtkWidget *box, int margin);
 UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType type);
 
 UiContainer* ui_box_container(UiObject *obj, GtkWidget *box, UiSubContainerType type);
-void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_box_container_add(UiContainer *ct, GtkWidget *widget);
 
 GtkWidget* ui_create_grid_widget(int colspacing, int rowspacing);
 UiContainer* ui_grid_container(
@@ -188,22 +180,22 @@ UiContainer* ui_grid_container(
         UiBool def_vexpand,
         UiBool def_hfill,
         UiBool def_vfill);
-void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_grid_container_add(UiContainer *ct, GtkWidget *widget);
 
 UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame);
-void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_frame_container_add(UiContainer *ct, GtkWidget *widget);
 
 UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander);
-void ui_expander_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_expander_container_add(UiContainer *ct, GtkWidget *widget);
 
 UiContainer* ui_scrolledwindow_container(UiObject *obj, GtkWidget *scrolledwindow);
-void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget);
 
 UiContainer* ui_tabview_container(UiObject *obj, GtkWidget *tabview);
-void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget);
 
 UiContainer* ui_splitpane_container(UiObject *obj, GtkWidget *pane, UiOrientation orientation, int max, int init);
-void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget);
 
 
 UiGtkTabView* ui_widget_get_tabview_data(UIWIDGET tabview);
@@ -212,11 +204,11 @@ void ui_gtk_notebook_select_tab(GtkWidget *widget, int tab);
 
 #if GTK_CHECK_VERSION(3, 10, 0)
 UiContainer* ui_headerbar_container(UiObject *obj, GtkWidget *headerbar);
-void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget);
 #endif
 
 UiContainer* ui_headerbar_fallback_container(UiObject *obj, GtkWidget *headerbar);
-void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget);
 
 #ifdef __cplusplus
 }
index 617273aaf3daceb9c673398d884442c0dbd7dd95..40fcde1e376fcbb2774cc2d79d9d0e990a3c26f6 100644 (file)
@@ -114,7 +114,7 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs *args) {
     }
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget, FALSE);
+    current->container->add(current->container, widget);
     
     return widget;
 }
@@ -150,7 +150,7 @@ void ui_label_set(UiString *s, const char *value) {
 UIWIDGET ui_space_deprecated(UiObject *obj) {
     GtkWidget *widget = gtk_label_new("");
     UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, widget, TRUE);
+    ct->add(ct, widget);
     
     return widget;
 }
@@ -162,7 +162,7 @@ UIWIDGET ui_separator_deprecated(UiObject *obj) {
     GtkWidget *widget = gtk_hseparator_new();
 #endif
     UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, widget, FALSE);
+    ct->add(ct, widget);
     
     return widget;
 }
@@ -201,7 +201,7 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) {
     }
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, progressbar, FALSE);
+    current->container->add(current->container, progressbar);
     
     return progressbar;
 }
@@ -243,7 +243,7 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args
     }
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, spinner, FALSE);
+    current->container->add(current->container, spinner);
     
     return spinner;
 }
index ea02755bf320f8c83aba455d92ad1476087688fe..3c83f111d8f944b362bc05f45cb55d347ee1e6ea 100644 (file)
@@ -130,7 +130,7 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) {
             event);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, spin, FALSE);
+    current->container->add(current->container, spin);
     
     return spin;
 }
@@ -150,7 +150,8 @@ void ui_spinner_changed(GtkSpinButton *spinner, UiVarEventData *event) {
     e.obj = event->obj;
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
-    e.eventdata = &value;
+    e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = (int64_t)value;
     
     if(event->callback) {
index dcaff88a05fb3abced071f17a48a590cc85da71c..6883575f3b3b1194633de428adafe4c1f1848baf 100644 (file)
@@ -45,7 +45,7 @@ UIWIDGET ui_drawingarea(UiObject *obj, ui_drawfunc f, void *userdata) {
     }
     
     UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, widget, TRUE);
+    ct->add(ct, widget);
     
     return widget;
 }
index 3a2550d020909bfc35e488666611d852e1ce14c0..425af82ef311bb96c428b9c51ae1b04cf64899bc 100644 (file)
@@ -188,7 +188,7 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) {
     }
        
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, toplevel, TRUE);
+    current->container->add(current->container, toplevel);
     
     return toplevel;
 }
@@ -438,6 +438,7 @@ static void imgviewer_button_event(
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
     event.eventdata = NULL;
+    event.eventdatatype = 0;
     event.intval = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture));
     event.set = 0;
     callback(&event, userdata);
index ea96fb0a300665d6b0072197f5952e0012de9d5c..be9c00ae911ee2d606c27983fe459f7d0e877955 100644 (file)
@@ -133,7 +133,7 @@ static void column_factory_setup(GtkListItemFactory *factory, GtkListItem *item,
 
 static void column_factory_bind( GtkListItemFactory *factory, GtkListItem *item, gpointer userdata) {
     UiColData *col = userdata;
-    UiList *list = col->listview->var->value;
+    UiList *list = col->listview->var ? col->listview->var->value : NULL;
     
     ObjWrapper *obj = gtk_list_item_get_item(item);
     UiModel *model = col->listview->model;
@@ -305,7 +305,7 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, scroll_area, FALSE);
+    current->container->add(current->container, scroll_area);
     
     // ct->current should point to view, not scroll_area, to make it possible
     // to add a context menu
@@ -381,7 +381,7 @@ UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) {
     
     // add widget to parent 
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, view, FALSE);
+    current->container->add(current->container, view);
     return view;
 }
 
@@ -485,7 +485,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, scroll_area, FALSE);
+    current->container->add(current->container, scroll_area);
     
     // ct->current should point to view, not scroll_area, to make it possible
     // to add a context menu
@@ -511,6 +511,7 @@ static void listview_event(ui_callback cb, void *cbdata, UiListView *view) {
     event.window = event.obj->window;
     event.intval = view->selection.count;
     event.eventdata = &view->selection;
+    event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
     event.set = ui_get_setop();
     if(cb) {
         cb(&event, cbdata);
@@ -554,6 +555,7 @@ void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata)
         event.window = event.obj->window;
         event.intval = index;
         event.eventdata = eventdata->data;
+        event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
         event.set = ui_get_setop();
         view->onactivate(&event, view->onactivatedata);
     }
@@ -591,6 +593,7 @@ void ui_dropdown_activate(GtkDropDown* self, gpointer userdata) {
         event.window = event.obj->window;
         event.intval = view->selection.count;
         event.eventdata = &view->selection;
+        event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
         event.set = ui_get_setop();
         view->onactivate(&event, view->onactivatedata);
     }
@@ -1385,6 +1388,7 @@ static GdkContentProvider *ui_listview_dnd_prepare(GtkDragSource *source, double
         event.window = event.obj->window;
         event.document = event.obj->ctx->document;
         event.eventdata = dnd;
+        event.eventdatatype = UI_EVENT_DATA_DND;
         event.intval = 0;
         event.set = ui_get_setop();
         listview->ondragstart(&event, listview->ondragstartdata);
@@ -1421,6 +1425,7 @@ static void ui_listview_drag_end(GtkDragSource *self, GdkDrag *drag, gboolean de
         event.window = event.obj->window;
         event.document = event.obj->ctx->document;
         event.eventdata = &dnd;
+        event.eventdatatype = UI_EVENT_DATA_DND;
         event.intval = 0;
         event.set = ui_get_setop();
         listview->ondragcomplete(&event, listview->ondragcompletedata);
@@ -1450,6 +1455,7 @@ static gboolean ui_listview_drop(
         event.window = event.obj->window;
         event.document = event.obj->ctx->document;
         event.eventdata = &dnd;
+        event.eventdatatype = UI_EVENT_DATA_DND;
         event.intval = 0;
         event.set = ui_get_setop();
         listview->ondrop(&event, listview->ondropdata);
@@ -1829,7 +1835,7 @@ UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) {
     ui_set_name_and_style(listbox, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, listbox, args->groups);
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, scroll_area, TRUE);
+    current->container->add(current->container, scroll_area);
     
     UiListBox *uilistbox = malloc(sizeof(UiListBox));
     uilistbox->obj = obj;
@@ -2008,7 +2014,11 @@ void ui_listbox_update_sublist(UiListBox *listbox, UiListBoxSubList *sublist, si
     void *elm = list->first(list);
     while(elm) {
         UiSubListItem item = { NULL, NULL, NULL, NULL, NULL, NULL };
-        listbox->getvalue(sublist->userdata, elm, index, &item, listbox->getvaluedata);
+        if(listbox->getvalue) {
+            listbox->getvalue(list, sublist->userdata, elm, index, &item, listbox->getvaluedata);
+        } else {
+            item.label = strdup(elm);
+        }
         
         // create listbox item
         GtkWidget *row = create_listbox_row(listbox, sublist, &item, (int)index);
@@ -2059,7 +2069,7 @@ void ui_listbox_row_activate(GtkListBox *self, GtkListBoxRow *row, gpointer user
     eventdata.sublist_index = sublist->index;
     eventdata.row_index = data->value0;
     eventdata.sublist_userdata = sublist->userdata;
-    eventdata.row_data = ui_list_get(eventdata.list, eventdata.row_index);
+    eventdata.row_data = eventdata.list->get(eventdata.list, eventdata.row_index);
     eventdata.event_data = data->customdata2;
     
     UiEvent event;
@@ -2067,6 +2077,7 @@ void ui_listbox_row_activate(GtkListBox *self, GtkListBoxRow *row, gpointer user
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
     event.eventdata = &eventdata;
+    event.eventdatatype = UI_EVENT_DATA_SUBLIST;
     event.intval = data->value0;
     event.set = ui_get_setop();
     
index a54a34b86b20b4e74accbe5e724eb0c1acfb4f59..521bf91d9f8f05e24ea77a5407d6133599b409d4 100644 (file)
@@ -514,6 +514,7 @@ void ui_gmenu_add_menuitem(GMenu *parent, int index, UiMenuItemI *item, UiObject
         event->callback = i->callback;
         event->value = 0;
         event->customdata = NULL;
+        event->customint = 0;
 
         g_signal_connect(
                 action,
@@ -613,6 +614,7 @@ void ui_gmenu_add_menuitem_list(GMenu *p, int index, UiMenuItemI *item, UiObject
     event->userdata = il->userdata;
     event->callback = il->callback;
     event->customdata = var;
+    event->customint = 0;
     event->value = 0;
     
     g_signal_connect(
@@ -638,6 +640,7 @@ void ui_activate_event_wrapper(GSimpleAction* self, GVariant* parameter, UiEvent
     evt.window = event->obj->window;
     evt.document = event->obj->ctx->document;
     evt.eventdata = event->customdata;
+    evt.eventdatatype = event->customint;
     evt.intval = intval;
     event->callback(&evt, event->userdata);    
 }
@@ -652,6 +655,7 @@ void ui_menu_list_item_activate_event_wrapper(GSimpleAction* self, GVariant* par
     evt.window = event->obj->window;
     evt.document = event->obj->ctx->document;
     evt.eventdata = ui_list_get(list, index);
+    evt.eventdatatype = UI_EVENT_DATA_LIST_ELM;
     evt.intval = index;
     event->callback(&evt, event->userdata);    
     
index c9921592cbdf934a4b2d2b87d1b7f3928857b3a0..45c5bfc19e60bafca0cbda4164328b3bdb4c6598 100644 (file)
@@ -62,6 +62,7 @@ static UIWIDGET ui_scrollbar(UiObject *obj, UiOrientation orientation, UiRange *
         event->callback = f;
         event->value = 0;
         event->customdata = NULL;
+        event->customint = 0;
         
         g_signal_connect(
                 G_OBJECT(scrollbar),
@@ -76,7 +77,7 @@ static UIWIDGET ui_scrollbar(UiObject *obj, UiOrientation orientation, UiRange *
     }
     
     UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, scrollbar, FALSE);
+    ct->add(ct, scrollbar);
     
     return scrollbar;
 }
@@ -95,6 +96,7 @@ gboolean ui_scrollbar_value_changed(GtkRange *range, UiEventData *event) {
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = event->value;
     event->callback(&e, event->userdata); 
     return TRUE;
index 3e81342ae638d13d525fd65103e728f9cf94fec9..9ea0c4ca2c55bd58b44dc0ff6463b060e379c91b 100644 (file)
@@ -156,7 +156,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
     
     // add
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, scroll_area, TRUE);
+    current->container->add(current->container, scroll_area);
     
     // bind value
     if(var) {
@@ -330,6 +330,7 @@ void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) {
     e.window = e.obj->window;
     e.document = textarea->ctx->document;
     e.eventdata = value;
+    e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE;
     e.intval = 0;
     e.set = ui_get_setop();
     
@@ -629,7 +630,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor
     }
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, textfield, FALSE);
+    current->container->add(current->container, textfield);
     
     if(var) {
         UiString *value = var->value;
@@ -691,6 +692,7 @@ void ui_textfield_changed(GtkEditable *editable, UiTextField *textfield) {
     e.window = e.obj->window;
     e.document = textfield->obj->ctx->document;
     e.eventdata = value;
+    e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE;
     e.intval = 0;
     e.set = ui_get_setop();
     
@@ -710,6 +712,7 @@ void ui_textfield_activate(GtkEntry* self, UiTextField *textfield) {
         e.window = e.obj->window;
         e.document = textfield->obj->ctx->document;
         e.eventdata = NULL;
+        e.eventdatatype = 0;
         e.intval = 0;
         e.set = ui_get_setop();
         textfield->onactivate(&e, textfield->onactivatedata);
@@ -807,6 +810,7 @@ void ui_path_button_clicked(GtkWidget *widget, UiEventDataExt *event) {
     evt.window = evt.obj->window;
     evt.document = evt.obj->ctx->document;
     evt.eventdata = elm->path;
+    evt.eventdatatype = UI_EVENT_DATA_STRING;
     evt.intval = event->value0;
     evt.set = ui_get_setop();
     event->callback(&evt, event->userdata);
@@ -888,6 +892,7 @@ static void ui_path_textfield_activate(GtkWidget *entry, UiPathTextField *pathtf
         evt.window = obj->window;
         evt.document = obj->ctx->document;
         evt.eventdata = (char*)text;
+        evt.eventdatatype = UI_EVENT_DATA_STRING;
         evt.intval = -1;
         pathtf->onactivate(&evt, pathtf->onactivatedata);
     }
@@ -941,7 +946,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) {
     gtk_widget_set_name(pathtf->stack, "path-textfield-box");
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, pathtf->stack, FALSE);
+    current->container->add(current->container, pathtf->stack);
     
     pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
     pathtf->entry = gtk_entry_new();
index 60c4bac5f23853ac817e3fbd30dd6667b545ef3f..0409be93bf18715a30576aa342902671f3751b3a 100644 (file)
@@ -155,6 +155,7 @@ void add_toolitem_widget(GtkToolbar *tb, UiToolbarItem *item, UiObject *obj) {
         event->callback = item->args.onclick;
         event->userdata = item->args.onclickdata;
         event->customdata = NULL;
+        event->customint = 0;
         event->value = 0;
         
         g_signal_connect(
@@ -237,6 +238,7 @@ void ui_tool_button_toggled(GtkToggleToolButton *widget, UiVarEventData *event)
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = gtk_toggle_tool_button_get_active(widget);
     
     if(event->callback) {
index 7e8e3a5864999417dd8bfa3975fca814be62557d..7a26a708dc98cb6fa1eb20bf83b7d4559b2d6f43 100644 (file)
@@ -191,6 +191,7 @@ static gboolean ui_job_finished(void *data) {
     event.document = job->obj->ctx->document;
     event.intval = 0;
     event.eventdata = NULL;
+    event.eventdatatype = 0;
 
     job->finish_callback(&event, job->finish_data);
     free(job);
index b98bb25fd6b3187b87e55af753e9ed57275290db..b66c695cd4abd84594ba4b4b1f73a4f9a4603943 100644 (file)
@@ -131,6 +131,7 @@ typedef struct UiEventData {
     ui_callback callback;
     void        *userdata;
     int         value;
+    int         customint;
     void        *customdata;
 } UiEventData;
 
index 1cd09aad1c139638331e4e922cc3e3f3b4f69114..3b9a94661a2356a1a6e27212fcfb26afea5eb2e5 100644 (file)
@@ -61,7 +61,7 @@ UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args) {
     
     ui_set_widget_groups(obj->ctx, webview, args->groups);
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, webview, FALSE);
+    current->container->add(current->container, webview);
     
     return webview;
 }
index 633b0f9a0e430c17b94092694e90aecc3b1898f0..36f446505d93daba204ba3f5e14d8932dcdfd4c4 100644 (file)
@@ -37,7 +37,7 @@ UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func cre
     UIWIDGET widget = create_widget(obj, args, userdata);
     
     UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget, FALSE);
+    current->container->add(current->container, widget);
     
     return widget;
 }
@@ -47,7 +47,7 @@ UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) {
     GtkWidget *widget = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
     ui_set_name_and_style(widget, args->name, args->style_class);
     UI_APPLY_LAYOUT1(current, (*args));
-    current->container->add(current->container, widget, FALSE);
+    current->container->add(current->container, widget);
     return widget;
 }
 
index 1d039483390fb5439574f85883600abd03fc3a1c..cdafae3d4678470360648ad225bd672240b4ba7b 100644 (file)
@@ -312,6 +312,8 @@ static void dialog_response(AdwAlertDialog *self, gchar *response, UiEventData *
     evt.document = evt.obj->ctx->document;
     evt.window = evt.obj->window;
     evt.eventdata = NULL;
+    evt.eventdatatype = 0;
+    evt.eventdatatype = 0;
     evt.intval = 0;
     
     if(!strcmp(response, "btn1")) {
@@ -323,6 +325,7 @@ static void dialog_response(AdwAlertDialog *self, gchar *response, UiEventData *
     if(data->customdata) {
         GtkWidget *entry = data->customdata;
         evt.eventdata = (void*)ENTRY_GET_TEXT(GTK_ENTRY(entry));
+        evt.eventdatatype = UI_EVENT_DATA_STRING;
     }
     
     if(data->callback) {
@@ -336,6 +339,7 @@ void ui_dialog_create(UiObject *parent, UiDialogArgs args) {
     event->callback = args.result;
     event->userdata = args.resultdata;
     event->customdata = NULL;
+    event->customint = 0;
     event->value = 0;
     event->obj = parent;
     
@@ -361,6 +365,7 @@ void ui_dialog_create(UiObject *parent, UiDialogArgs args) {
         }
         adw_alert_dialog_set_extra_child(ADW_ALERT_DIALOG(dialog), entry);
         event->customdata = entry;
+        event->customint = 0;
     }
     
     g_signal_connect(
@@ -517,6 +522,7 @@ static void filechooser_opened(GObject *source, GAsyncResult *result, void *data
     flist.files = NULL;
     flist.nfiles = 0;
     evt.eventdata = &flist;
+    evt.eventdatatype = UI_EVENT_DATA_FILE_LIST;
     
     if(selection) {
         flist = listmodel2filelist(selection);
@@ -551,6 +557,7 @@ static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsign
     event->callback = file_selected_callback;
     event->userdata = cbdata;
     event->customdata = NULL;
+    event->customint = 0;
     event->value = mode;
     event->obj = obj;
     
index b8ede8ba67c6faba261d8a37797708aee7aff6dd..b421a8aa8e5bfac4b8b374c0a4099ecf3819b0c9 100644 (file)
@@ -173,6 +173,7 @@ static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButton
     e.window = e.obj->window;
     e.document = e.obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = XmToggleButtonGetState(w);
     e.set = ui_get_setop();
     
@@ -282,6 +283,7 @@ static void radiobutton_changed(Widget w, UiVarEventData *event, XmToggleButtonC
     e.window = e.obj->window;
     e.document = e.obj->ctx->document;
     e.eventdata = value;
+    e.eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     e.intval = v;
     e.set = ui_get_setop();
     
index 596e372329126909bbc86ca48fc02452020c285a..4f36550e4d3c59cdc797fdd096051b2d6e97e21d 100644 (file)
@@ -65,7 +65,7 @@ typedef enum UiContainerType UiContainerType;
 typedef struct UiLayout UiLayout;
 
 struct UiLayout {
-    UiTri        fill;
+    UiBool       fill;
     UiBool       newline;
     char         *label;
     UiBool       hexpand;
index aa65be92a0b456a15c5dd1f28c9e5627239be366..ffb915bd6f58425de2167e5d9c48c5313651fce0 100644 (file)
@@ -134,6 +134,7 @@ static void list_callback(UiObject *obj, UiListSelection sel, ui_callback callba
     event.window = obj->window;
     event.document = obj->ctx->document;
     event.eventdata = &sel;
+    event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
     event.intval = sel.count > 0 ? sel.rows[0] : -1;
     callback(&event, userdata);
 }
@@ -248,6 +249,7 @@ static void ui_dropdown_selection(
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
     event.eventdata = elm;
+    event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
     event.intval = index;
     if(listview->onactivate) {
         listview->onactivate(&event, listview->onactivatedata);
index 08ade21f2da6e4065bef5a23c1dbefbed00226c8..ae9bbb01be492cd904b911b5b238f934307190ad 100644 (file)
@@ -961,6 +961,7 @@ static void pathbar_activate(void *data, char *path, int index) {
     evt.window = evt.obj->window;
     evt.document = evt.obj->ctx->document;
     evt.eventdata = path;
+    evt.eventdatatype = UI_EVENT_DATA_STRING;
     evt.intval = index;
     event->callback(&evt, event->userdata);
 }
index 8131fadf9716bddc7933a04d9f8bae1e2f8f4ec6..25ea5465c93851512f1b183572d2744623796a17 100644 (file)
@@ -202,6 +202,7 @@ static Boolean ui_job_finished(void *data) {
         event.document = job->obj->ctx->document;
         event.intval = 0;
         event.eventdata = NULL;
+        event.eventdatatype = 0;
         job->finish_callback(&event, job->finish_data);
     }
     free(job);
index f563d21cc7e2960132b768cc26c89d599ba9f774..5e04f274aae8ed38d4d09cf12cc978c39c5d7c52 100644 (file)
@@ -43,7 +43,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
         button->connect(button, SIGNAL(destroyed()), event, SLOT(destroy()));
     }
     
-    ctn->add(button, false);
+    ctn->add(button);
     
     return button;
 }
@@ -53,6 +53,7 @@ static void togglebutton_event(UiEvent *event, UiEventWrapper *wrapper) {
     event->intval = button->isChecked();
     if(wrapper->var) {
         event->eventdata = wrapper->var->value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     }
 }
 
@@ -87,7 +88,7 @@ UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
         i->set = ui_togglebutton_set;
     }
     
-    ctn->add(button, false);
+    ctn->add(button);
     
     return button;
 }
@@ -111,6 +112,7 @@ static void checkbox_event(UiEvent *event, UiEventWrapper *wrapper) {
     event->intval = button->isChecked();
     if(wrapper->var) {
         event->eventdata = wrapper->var->value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     }
 }
 
@@ -145,7 +147,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
         i->set = ui_checkbox_set;
     }
     
-    ctn->add(checkbox, false);
+    ctn->add(checkbox);
     
     return checkbox;
 }
@@ -169,6 +171,7 @@ static void radiobutton_event(UiEvent *event, UiEventWrapper *wrapper) {
     if(wrapper->var) {
         UiInteger *value = (UiInteger*)wrapper->var->value;
         event->eventdata = value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
         event->intval = value->get(value);
     }
 }
@@ -205,7 +208,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
     button->connect(button, SIGNAL(clicked()), event, SLOT(slot()));
     button->connect(button, SIGNAL(destroyed()), event, SLOT(destroy()));
     
-    ctn->add(button, false);
+    ctn->add(button);
     
     return button;
 }
index b4392ffc272971d555a18a15e9760dd7e2b498c2..07ac46afc40038bf1657d64f928837239518ce19 100644 (file)
@@ -60,17 +60,14 @@ UiBoxContainer::UiBoxContainer(QBoxLayout* box) {
     ui_reset_layout(layout);
 }
 
-void UiBoxContainer::add(QWidget* widget, bool fill) {
-    if(layout.fill != UI_LAYOUT_UNDEFINED) {
-        fill = ui_lb2bool(layout.fill);
-    }
-    
+void UiBoxContainer::add(QWidget* widget) {
+    bool fill = layout.fill;
     if(hasStretchedWidget && fill) {
         fill = false;
         fprintf(stderr, "UiError: container has 2 filled widgets");
     }
     
-    box->addWidget(widget, fill);
+    box->addWidget(widget);
     
     if(!hasStretchedWidget) {
         QSpacerItem *newspace = new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
@@ -93,7 +90,7 @@ UIWIDGET ui_box(UiObject *obj, UiContainerArgs *args, QBoxLayout::Direction dir)
     QWidget *widget = new QWidget();
     QBoxLayout *box = new QBoxLayout(dir);
     widget->setLayout(box);
-    ctn->add(widget, true);
+    ctn->add(widget);
     
     ui_container_add(obj, new UiBoxContainer(box));
     
@@ -133,16 +130,17 @@ UiGridContainer::UiGridContainer(
     ui_reset_layout(layout);
 }
 
-void UiGridContainer::add(QWidget* widget, bool fill) {
+void UiGridContainer::add(QWidget* widget) {
     if(layout.newline) {
         x = 0;
         y++;
     }
     
-    int hexpand = false;
-    int vexpand = false;
-    int hfill = false;
-    int vfill = false;
+    bool fill = layout.fill;
+    bool hexpand = false;
+    bool vexpand = false;
+    bool hfill = false;
+    bool vfill = false;
     if(!layout.override_defaults) {
         if(def_hexpand) {
             hexpand = true;
@@ -158,9 +156,6 @@ void UiGridContainer::add(QWidget* widget, bool fill) {
         }
     }
     
-    if(layout.fill != UI_LAYOUT_UNDEFINED) {
-        fill = ui_lb2bool(layout.fill);
-    }
     if(layout.hexpand) {
         hexpand = true;
         //hfill = true;
@@ -240,7 +235,7 @@ UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) {
     QWidget *widget = new QWidget();
     QGridLayout *grid = new QGridLayout();
     widget->setLayout(grid);
-    ctn->add(widget, true);
+    ctn->add(widget);
     
     ui_container_add(obj, new UiGridContainer(
             grid,
index bb5190873b429053242f9d5efd7fcd3b8f361049..0d166cd80c2f2ad053eece0dd9dec7622d409999 100644 (file)
@@ -64,7 +64,7 @@ typedef enum UiLayoutBool {
 
 typedef struct UiLayout UiLayout;
 struct UiLayout {
-    UiTri        fill;
+    UiBool       fill;
     UiBool       newline;
     char         *label;
     UiBool       hexpand;
@@ -81,7 +81,7 @@ struct UiContainerPrivate {
     UiLayout layout; 
     UIWIDGET current;
 
-    virtual void add(QWidget *widget, bool fill) = 0;
+    virtual void add(QWidget *widget) = 0;
     virtual void end() {}
 };
 
@@ -93,7 +93,7 @@ public:
     
     UiBoxContainer(QBoxLayout *box);
     
-    virtual void add(QWidget *widget, bool fill);
+    virtual void add(QWidget *widget);
 };
 
 class UiGridContainer : public UiContainerPrivate {
@@ -120,7 +120,7 @@ public:
             bool def_hfill,
             bool def_vfill);
     
-    virtual void add(QWidget *widget, bool fill);
+    virtual void add(QWidget *widget);
     virtual void end();
 };
 
index 69d7552fec5acd23725b0006637e8632310664cc..af60ff7b194b85125510d561b4e8c8baf892f7dd 100644 (file)
@@ -126,7 +126,7 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) {
     }
     
     
-    ctn->add(widget, false);
+    ctn->add(widget);
     return widget;
 }
 
index b8130642cf8db30d9106c0d78e87083a3ecfb535..0101b6a45c9eaa3ddd9243919a6636ec2db82b84 100644 (file)
@@ -47,7 +47,7 @@ UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args) {
     }
     widget->setAlignment(align);
     
-    ctn->add(widget, false);
+    ctn->add(widget);
     
     return widget;
 }
index 51d952861fb4e3640433b7e4312d702898e5a04d..a44a93dd3c01d1da5ffa377a02da401037e7fb17 100644 (file)
@@ -84,7 +84,7 @@ UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
             SLOT(selectionChanged(const QItemSelection &, const QItemSelection &)));
     
     
-    ctn->add(view, false);
+    ctn->add(view);
     
     return view;
 }
@@ -124,7 +124,7 @@ UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) {
             SLOT(selectionChanged(const QItemSelection &, const QItemSelection &)));
     
     
-    ctn->add(view, false);
+    ctn->add(view);
     
     return view;
 }
index 86bf75f18b2eb2c4231ea78e85e2b749a4277b3e..4dbb7e1ed5191151b0cfe3d15d8716ccedfbdb56 100644 (file)
@@ -157,6 +157,7 @@ void ui_actiongroup_prepare_event(UiEvent *event, UiAction *action) {
     if(action->var) {
         UiInteger *value = (UiInteger*)action->var->value;
         event->eventdata = value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
         event->intval = value->get(value);
     }
 }
@@ -217,6 +218,7 @@ void ui_add_menus(UiObject *obj, QMainWindow *window) {
 void ui_checkableaction_prepare_event(UiEvent *event, UiAction *action) {
     if(action->var) {
         event->eventdata = action->var->value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     }
     event->intval = action->isChecked();
 }
index c9fc7bc7943ff420fa736f51d64ae0013e2d7c04..e4846b8a74d807c28ebdff2aa21b4cb4358009d8 100644 (file)
@@ -100,6 +100,7 @@ void ListModel::selectionChanged(const QItemSelection& selected, const QItemSele
     event.window = obj->window;
     event.document = obj->ctx->document;
     event.eventdata = &sel;
+    event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
     event.intval = sel.count;
     event.set = ui_get_setop();
     
@@ -213,6 +214,7 @@ void TableModel::selectionChanged(const QItemSelection& selected, const QItemSel
     event.window = obj->window;
     event.document = obj->ctx->document;
     event.eventdata = &sel;
+    event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
     event.intval = sel.count;
     event.set = ui_get_setop();
     
index 5ef157ccbb9ced48ea98c128109a58a250808fa0..31c3fa8a855d12ffa77726b9a9f7988ee9a81058 100644 (file)
@@ -62,7 +62,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
     UI_APPLY_LAYOUT(ctn->layout, args);
     
     QTextEdit *textarea = new QTextEdit();
-    ctn->add(textarea, true);
+    ctn->add(textarea);
     
     QTextDocument *document = nullptr;
     
@@ -215,7 +215,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, bool pass
     UI_APPLY_LAYOUT(ctn->layout, args);
     
     QLineEdit *textfield = new QLineEdit();
-    ctn->add(textfield, false);
+    ctn->add(textfield);
     
     if(password) {
         textfield->setEchoMode(QLineEdit::Password);
index 22e81ded0fbcf7d65a5d783acf1aab3c71106056..2cb1589aa3c14c6d040cec283f52f2ccbc2de11d 100644 (file)
@@ -104,6 +104,7 @@ static void toolbar_togglebutton_event(UiEvent *event, UiEventWrapper *wrapper)
     event->intval = action->isChecked();
     if(wrapper->var) {
         event->eventdata = wrapper->var->value;
+        event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
     }
 }
 
index 7f915c8b8ae6122490445c705f2e474b09d75764..1d1a15ecd890ce070812e0ea7e916cf2ce5987a0 100644 (file)
@@ -137,6 +137,7 @@ void UiEventWrapper::slot() {
     e.window = obj->window;
     e.document = obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = 0;
     e.set = ui_get_setop();
     if(prepare_event) {
@@ -174,6 +175,7 @@ void UiAction::trigger() {
     e.window = obj->window;
     e.document = obj->ctx->document;
     e.eventdata = NULL;
+    e.eventdatatype = 0;
     e.intval = 0;
     e.set = ui_get_setop();
     if(prepare_event) {
index f275efd06ccd7d91b5101beb00abb7b54d3df88c..2a3cbd29cc39be9847c4b9143266ddbd892936df 100644 (file)
@@ -35,7 +35,7 @@ UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widge
     UIWIDGET widget = create_widget(obj, args, userdata);
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
-    ctn->add(widget, false);
+    ctn->add(widget);
     return widget;
 }
 
@@ -47,7 +47,7 @@ UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) {
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
-    ctn->add(separator, false);
+    ctn->add(separator);
     
     return separator;
 }
index 57144b9d2beb006b9b92342ef65362fe9fd94888..fb578f787621d2482f3e20ae1086332943270c53 100644 (file)
@@ -36,7 +36,7 @@ extern "C" {
 #endif
 
 typedef struct UiButtonArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -58,7 +58,7 @@ typedef struct UiButtonArgs {
 } UiButtonArgs;
 
 typedef struct UiToggleArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 51c15bd34cfd4b96729e16f701a78b7d6d9a9b19..75c78b002d14411795982e963ee221e8b9c56593 100644 (file)
@@ -59,7 +59,7 @@ typedef enum UiHeaderbarAlternative {
 
 
 typedef struct UiContainerArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -81,7 +81,7 @@ typedef struct UiContainerArgs {
 } UiContainerArgs;
 
 typedef struct UiFrameArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -104,7 +104,7 @@ typedef struct UiFrameArgs {
 } UiFrameArgs;
 
 typedef struct UiTabViewArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -134,7 +134,7 @@ typedef struct UiTabViewArgs {
 } UiTabViewArgs;
 
 typedef struct UiHeaderbarArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -160,7 +160,7 @@ typedef struct UiSidebarArgs {
 } UiSidebarArgs;
 
 typedef struct UiSplitPaneArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -183,7 +183,7 @@ typedef struct UiSplitPaneArgs {
 } UiSplitPaneArgs;
 
 typedef struct UiItemListContainerArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 6e2b5799e659013fa03bb5b29b85584d857dea7e..3cb3d6597f50a62e631f367915cc3766210a9117 100644 (file)
@@ -58,7 +58,7 @@ enum UiLabelStyle {
 typedef enum UiLabelStyle UiLabelStyle;
 
 typedef struct UiLabelArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -77,7 +77,7 @@ typedef struct UiLabelArgs {
 } UiLabelArgs;
 
 typedef struct UiProgressbarArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -96,7 +96,7 @@ typedef struct UiProgressbarArgs {
 } UiProgressbarArgs;
 
 typedef struct UiProgressbarSpinnerArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 3e0a99f51f22894552bcfdbdd228d8f9e7da6f42..cb1b7f70633f0e67eb0df4c56d9073b897472afb 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
 
 
 typedef struct UiSpinnerArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 49e57ab6583a0326f76c399ee931f349c27ef7f8..405b50946cdc4ddf77261375d410f80a82798fab 100644 (file)
@@ -45,7 +45,7 @@ extern "C" {
     
     
 typedef struct UiImageViewerArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 22002351dc3265c739f5af60caedb43ff3aefe62..0daf925a8504fb768a2d75f567754052a83f01cb 100644 (file)
@@ -36,7 +36,7 @@ extern "C" {
 #endif
 
 typedef struct UiTextAreaArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -57,7 +57,7 @@ typedef struct UiTextAreaArgs {
 } UiTextAreaArgs;
     
 typedef struct UiTextFieldArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -91,7 +91,7 @@ typedef UiPathElm*(*ui_pathelm_func)(const char *full_path, size_t len, size_t *
 
 
 typedef struct UiPathTextFieldArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index ff23a53d137c792f68c61631c75bac73d7d307a9..7b5474272f293da0f7ea5567b894f57afd542294 100644 (file)
@@ -92,7 +92,11 @@ typedef void* UIMENU;   // NSMenu*
 
 #define UIEXPORT __declspec(dllexport)
 
-#define UIWIDGET void*
+typedef struct W32Widget {
+    HWND hwnd;
+} W32Widget;
+
+#define UIWIDGET W32Widget*
 #define UIWINDOW void*
 #define UIMENU   void*
 
@@ -217,7 +221,6 @@ typedef enum UiTri {
     UI_OFF
 } UiTri;
 
-
 enum UiMouseEventType { UI_PRESS = 0, UI_PRESS2 };
 
 typedef enum UiLabelType {
@@ -319,6 +322,7 @@ struct UiEvent {
     void     *document;
     void     *window;
     void     *eventdata;
+    int      eventdatatype;
     int      intval;
     int      set;
 };
@@ -473,6 +477,22 @@ typedef struct UiCondVar {
     int intdata;
 } UiCondVar;
 
+enum UiEventType {
+    UI_EVENT_DATA_NULL = 0,
+    UI_EVENT_DATA_POINTER,
+    UI_EVENT_DATA_STRING,
+    UI_EVENT_DATA_INTEGER_VALUE,
+    UI_EVENT_DATA_STRING_VALUE,
+    UI_EVENT_DATA_TEXT_VALUE,
+    UI_EVENT_DATA_DOUBLE_VALUE,
+    UI_EVENT_DATA_RANGE_VALUE,
+    UI_EVENT_DATA_LIST_SELECTION,
+    UI_EVENT_DATA_LIST_ELM,
+    UI_EVENT_DATA_DND,
+    UI_EVENT_DATA_SUBLIST,
+    UI_EVENT_DATA_FILE_LIST
+};
+
 
 UIEXPORT void ui_init(const char *appname, int argc, char **argv);
 UIEXPORT const char* ui_appname();
index b9f8672b05b2ab0f367d86330f8583da6212f283..af51d086ae5ab5f11926e2b58858a07110ede641 100644 (file)
@@ -115,7 +115,7 @@ struct UiListCallbacks {
 };
 
 struct UiListArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
@@ -150,7 +150,7 @@ struct UiListArgs {
     const int *groups;
 };
 
-typedef void (*ui_sublist_getvalue_func)(void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
+typedef void (*ui_sublist_getvalue_func)(UiList *list, void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata);
 
 struct UiSubList {
     UiList *value;
@@ -184,7 +184,7 @@ struct UiSubListItem {
 };
 
 struct UiSourceListArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index 7e96ab63081925523b1eedde00f9c6dd3579f5e3..fee08d90e27aa50e99b1d07e0694b8d2b2ff1b17 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
 #endif
 
 typedef struct UiWidgetArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
index f31efac23a79e0de4da408ad579322b2ab3a5dc3..563a6fdfe79ec6d57e4ffc3198e15b7ea6d74d24 100644 (file)
@@ -33,4 +33,4 @@ $(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
+       $(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/$(BUILD_LIB_DIR) -lucx
diff --git a/ui/win32/button.c b/ui/win32/button.c
new file mode 100644 (file)
index 0000000..2cb2e17
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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 "button.h"\r
+\r
+UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {\r
+    return NULL;\r
+}\r
diff --git a/ui/win32/button.h b/ui/win32/button.h
new file mode 100644 (file)
index 0000000..6a79f7b
--- /dev/null
@@ -0,0 +1,35 @@
+/*\r
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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 BUTTON_H\r
+#define BUTTON_H\r
+\r
+#include "../ui/button.h"\r
+#include "container.h"\r
+\r
+#endif //BUTTON_H\r
diff --git a/ui/win32/container.c b/ui/win32/container.c
new file mode 100644 (file)
index 0000000..251be4a
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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 "container.h"\r
+\r
+\r
+/* ---------------------------- Box Container ---------------------------- */\r
+\r
+static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) {\r
+    return NULL;\r
+}\r
+\r
+// public\r
+UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) {\r
+    return box_create(obj, args, UI_BOX_VERTICAL);\r
+}\r
+\r
+// public\r
+UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) {\r
+    return box_create(obj, args, UI_BOX_HORIZONTAL);\r
+}\r
+\r
+\r
diff --git a/ui/win32/container.h b/ui/win32/container.h
new file mode 100644 (file)
index 0000000..f1d517e
--- /dev/null
@@ -0,0 +1,91 @@
+/*\r
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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 CONTAINER_H\r
+\r
+#include "../ui/container.h"\r
+\r
+#define CONTAINER_H\r
+\r
+#define UI_APPLY_LAYOUT(layout, args) \\r
+    layout.fill = args->fill; \\r
+    layout.hexpand = args->hexpand; \\r
+    layout.vexpand = args->vexpand; \\r
+    layout.hfill = args->hfill; \\r
+    layout.vfill = args->vfill; \\r
+    layout.override_defaults = args->override_defaults; \\r
+    layout.colspan = args->colspan; \\r
+    layout.rowspan = args->rowspan\r
+\r
+typedef struct UiLayout UiLayout;\r
+\r
+struct UiLayout {\r
+    UiBool       fill;\r
+    UiBool       newline;\r
+    char         *label;\r
+    UiBool       hexpand;\r
+    UiBool       vexpand;\r
+    UiBool       hfill;\r
+    UiBool       vfill;\r
+    UiBool       override_defaults;\r
+    int          width;\r
+    int          colspan;\r
+    int          rowspan;\r
+};\r
+\r
+enum UiBoxOrientation {\r
+    UI_BOX_VERTICAL = 0,\r
+    UI_BOX_HORIZONTAL\r
+};\r
+typedef enum UiBoxOrientation UiBoxOrientation;\r
+\r
+enum UiContainerType {\r
+    UI_CONTAINER_GENERIC = 0,\r
+    UI_CONTAINER_TABVIEW\r
+};\r
+typedef enum UiContainerType UiContainerType;\r
+\r
+typedef struct UiContainerPrivate UiContainerPrivate;\r
+\r
+typedef struct UiRect {\r
+    int x;\r
+    int y;\r
+    int width;\r
+    int height;\r
+} UiRect;\r
+\r
+\r
+struct UiContainerPrivate {\r
+    UiContainerX    container;\r
+    void            (*prepare)(UiContainerPrivate*, UiRect*);\r
+    void            (*add)(UiContainerPrivate*, UiRect*, W32Widget*);\r
+    UiContainerType type;\r
+    UiLayout        layout;\r
+};\r
+\r
+#endif //CONTAINER_H\r
diff --git a/ui/win32/grid.c b/ui/win32/grid.c
new file mode 100644 (file)
index 0000000..b37986f
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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 "grid.h"\r
+\r
+#include "../../ucx/cx/array_list.h"\r
+#include "../common/context.h"\r
+\r
+UiGridLayout* ui_grid_container(UiObject *obj, HWND control, short padding, short columnspacing, short rowspacing) {\r
+    UiGridLayout *grid = cxZalloc(obj->ctx->allocator, sizeof(UiGridLayout));\r
+    grid->hwnd = control;\r
+    grid->widgets = cxArrayListCreate(obj->ctx->allocator, NULL, sizeof(GridElm), 32);\r
+    grid->padding = padding;\r
+    grid->columnspacing = columnspacing;\r
+    grid->rowspacing = rowspacing;\r
+    return grid;\r
+}\r
+\r
+void ui_grid_add_widget(\r
+    UiGridLayout *grid,\r
+    short x,\r
+    short y,\r
+    W32Widget *widget,\r
+    GridLayoutInfo *layout)\r
+{\r
+    GridElm elm;\r
+    elm.widget = widget;\r
+    elm.x = x;\r
+    elm.y = y;\r
+    elm.layout = *layout;\r
+    cxListAdd(grid->widgets, elm);\r
+}\r
+\r
+void ui_grid_layout(UiGridLayout *grid) {\r
+    // TODO\r
+}\r
diff --git a/ui/win32/grid.h b/ui/win32/grid.h
new file mode 100644 (file)
index 0000000..6cbb6b7
--- /dev/null
@@ -0,0 +1,82 @@
+/*\r
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\r
+ *\r
+ * Copyright 2025 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
+#ifndef GRID_H\r
+#define GRID_H\r
+\r
+#include "container.h"\r
+#include <stdbool.h>\r
+#include <cx/array_list.h>\r
+\r
+typedef struct GridElm {\r
+    W32Widget *widget;\r
+    short x;\r
+    short y;\r
+    GridLayoutInfo layout;\r
+} GridElm;\r
+\r
+typedef struct GridLayoutInfo {\r
+    short margin_left;\r
+    short margin_right;\r
+    short margin_top;\r
+    short margin_bottom;\r
+    short colspan;\r
+    short rowspan;\r
+    short preferred_width;\r
+    short preferred_height;\r
+    bool hexpand;\r
+    bool vexpand;\r
+    bool hfill;\r
+    bool vfill;\r
+} GridLayoutInfo;\r
+\r
+typedef struct UiGridLayout {\r
+    HWND hwnd;\r
+\r
+    short padding;\r
+    short columnspacing;\r
+    short rowspacing;\r
+\r
+    /*\r
+     * list element type: GridElm\r
+     */\r
+    CxList *widgets;\r
+\r
+} UiGridLayout;\r
+\r
+UiGridLayout* ui_grid_container(UiObject *obj, HWND control, short padding, short columnspacing, short rowspacing);\r
+\r
+void ui_grid_add_widget(\r
+    UiGridLayout *grid,\r
+    short x,\r
+    short y,\r
+    W32Widget *widget,\r
+    GridLayoutInfo *layout);\r
+\r
+void ui_grid_layout(UiGridLayout *grid);\r
+\r
+#endif //GRID_H\r
index d861b9f9e7128849134425bbe3aa356e2475a4b2..37e9366c908d17a5d0d1561fcee69ebbb7118771 100644 (file)
@@ -32,6 +32,8 @@ WIN32_OBJPRE = $(OBJ_DIR)$(WIN32_SRC_DIR)
 WIN32OBJ  = toolkit.obj
 WIN32OBJ += window.obj
 WIN32OBJ += image.obj
+WIN32OBJ += container.obj
+WIN32OBJ += button.obj
 
 TOOLKITOBJS += $(WIN32OBJ:%=$(WIN32_OBJPRE)%)
 TOOLKITSOURCE += $(WIN32OBJ:%.obj=win32/%.c)
index 8ee0cbb5da9397be8260189f56d290854a92e37e..b121565e00c3ff187c0b472715c82fc143398299 100644 (file)
@@ -39,7 +39,7 @@
 
 static HINSTANCE hInstance;
 
-static const wchar_t *mainWindowClass = L"UiMainWindow";
+static const char *mainWindowClass = "UiMainWindow";
 
 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
     switch(uMsg) {
@@ -62,7 +62,7 @@ void ui_window_init(void) {
     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
 
-    if(!RegisterClassEx(&wc)) {
+    if(!RegisterClassExA(&wc)) {
         MessageBox(NULL, "RegisterClassEx failed", "Error", MB_ICONERROR);
         exit(-1);
     }
@@ -72,10 +72,10 @@ static UiObject* create_window(const char *title, void *window_data, bool simple
     UiObject *obj = uic_object_new_toplevel();
     obj->window = window_data;
        
-       HWND hwnd = CreateWindowEx(
+       HWND hwnd = CreateWindowExA(
                        0,
-                       L"UiMainWindow",
-                       "Test",
+                       "UiMainWindow",
+                       title,
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
             CW_USEDEFAULT,
                        CW_USEDEFAULT,