Sun, 07 Dec 2025 19:20:48 +0100
implement radiobutton (Client)
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2017 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ui/ui.h> #include <cx/buffer.h> #include "cx/string.h" #include "cx/list.h" //define UI_TEST #ifdef UI_TEST #define STATE_DOC 10 #define STATE_SUB 100 typedef struct ToplevelDoc { UiContext *ctx; UiList *doclist; void *current; } ToplevelDoc; typedef struct Document { UiContext *ctx; UiString *name; char *name_str; UiInteger *i; UiString *s; UiText *t; UiList *ls1; UiList *ls2; } Document; Document* create_doc(int i) { Document *doc = ui_document_new(sizeof(Document)); doc->ctx = ui_document_context(doc); doc->name = ui_string_new(doc->ctx, "name"); doc->i = ui_int_new(doc->ctx, "int"); doc->s = ui_string_new(doc->ctx, "string"); doc->t = ui_text_new(doc->ctx, "text"); doc->ls1 = ui_list_new(doc->ctx, "list1"); doc->ls2 = ui_list_new(doc->ctx, "list2"); ui_list_append(doc->ls1, "Hello"); ui_list_append(doc->ls1, "World"); ui_list_append(doc->ls1, "Test"); for(int x=0;x<(i+1)*2;x++) { char buf[32]; snprintf(buf, 32, "%d", x); ui_list_append(doc->ls2, strdup(buf)); } return doc; } ToplevelDoc* create_toplevel() { ToplevelDoc *doc = ui_document_new(sizeof(ToplevelDoc)); doc->ctx = ui_document_context(doc); doc->doclist = ui_list_new(doc->ctx, "doclist"); for(int i=0;i<3;i++) { Document *sub = create_doc(i); char buf[32]; snprintf(buf, 32, "%d", i); ui_set(sub->name, buf); sub->name_str = strdup(buf); ui_list_append(doc->doclist, sub); } return doc; } static void* doclist_getvalue(void *elm, int col) { Document *doc = elm; return doc->name_str; } static void action_document_selected(UiEvent *event, void *userdata) { Document *sub = event->eventdata; ToplevelDoc *doc = event->document; if(doc->current) { ui_detach_document(doc->ctx, doc->current); } ui_attach_document(doc->ctx, sub); doc->current = sub; } void application_startup(UiEvent *event, void *data) { UiObject *obj = ui_window("Test", NULL); ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10) { ui_hbox(obj, .colspan = 2, .spacing = 10) { ui_dropdown(obj, .varname = "doclist", .getvalue = doclist_getvalue, .onactivate = action_document_selected); ui_textfield(obj, .varname = "name"); ui_button(obj, .colspan = 4, .label = "Test Groups", .groups = UI_GROUPS(STATE_DOC, STATE_SUB)); } ui_newline(obj); ui_rlabel(obj, .label = "Integer", .vfill = TRUE); ui_togglebutton(obj, .label = "Test", .varname = "int", .hfill = TRUE); ui_newline(obj); ui_rlabel(obj, .label = "String", .vfill = TRUE); ui_textfield(obj, .varname = "string", .hfill = TRUE); ui_newline(obj); ui_rlabel(obj, .label = "Text"); UIWIDGET textarea = ui_textarea(obj, .varname = "text", .hfill =TRUE); ui_widget_set_size(textarea, 300, 300); ui_newline(obj); ui_rlabel(obj, .label = "List 1", .vfill = TRUE); ui_dropdown(obj, .varname = "list1"); } ToplevelDoc *doc = create_toplevel(); ui_attach_document(obj->ctx, doc); ui_show(obj); } int main(int argc, char** argv) { ui_init("app1", argc, argv); ui_onstartup(application_startup, NULL); ui_set_property("ui.gtk.window.showtitle", "main"); // menu ui_menu("File") { ui_menuitem(.label = "Static Item"); ui_menuseparator(); ui_menu_itemlist(.varname = "list2"); } ui_main(); return (EXIT_SUCCESS); } #endif #if !defined(UI_COCOA) && !defined(UI_MOTIF) && !defined(UI_WIN32) && !defined(UI_QT) && !defined(UI_TEST) typedef struct { UiString *str1; UiString *str2; UiString *path; UiText *text; UiDouble *progress; UiList *list; UiList *list2; UiList *menulist; UiInteger *radio; UiInteger *tabview; UiGeneric *image; UiList *srclist1; UiList *srclist2; UiList *items; UiGeneric *web; UiString *list_input; UiString *list_new_col; UiList *list11; UiString *link; UiString *link_label; UiString *link_uri; UiList *submenulist; UiModel *model; } MyDocument; MyDocument *doc1; MyDocument *doc2; UIWIDGET tabview; static UiCondVar *cond; static int thr_end = 0; static int thr_started = 0; static UiThreadpool *threadpool; int threadfunc(void *data) { printf("thr wait for data...\n"); ui_condvar_wait(cond); printf("thr data received: {%s} [%d]\n", cond->data, cond->intdata); ui_condvar_destroy(cond); cond = NULL; return 0; } void action_start_thread(UiEvent *event, void *data) { if(!thr_started) { cond = ui_condvar_create(); ui_job(event->obj, threadfunc, NULL, NULL, NULL); thr_started = 1; } } void action_notify_thread(UiEvent *event, void *data) { if(!thr_end) { ui_condvar_signal(cond, "hello thread", 123); thr_end = 1; } } void action_menu(UiEvent *event, void *userdata) { } void action_file_selected(UiEvent *event, void *userdata) { UiFileList *files = event->eventdata; MyDocument *doc = event->document; printf("files: %d\n", (int)files->nfiles); if(files->nfiles > 0) { printf("selected file: %s\n", files->files[0]); ui_image_load_file(doc->image, files->files[0]); } } void action_button(UiEvent *event, void *userdata) { ui_openfiledialog(event->obj, UI_FILEDIALOG_SELECT_SINGLE, action_file_selected, NULL); } void action_switch(UiEvent *event, void *userdata) { } void action_toolbar_button(UiEvent *event, void *userdata) { printf("toolbar button\n"); ui_dialog(event->obj, .title = "Dialog Title", .content = "Content Label", .button1_label = "btn1", .button2_label = "btn2", .input = TRUE, .closebutton_label = "Cancel"); } void action_dialog_button(UiEvent *event, void *userdata) { ui_close(event->obj); } void action_dialog_onactivate(UiEvent *event, void *userdata) { printf("textfield activate\n"); ui_close(event->obj); } void action_toolbar_dialog(UiEvent *event, void *userdata) { UiObject *dialog = ui_dialog_window(event->obj, .title = "Dialog Window", .lbutton1 = "Cancel 1", .lbutton2 = "Btn2", .rbutton3 = "Btn3", .rbutton4 = "Login 4", .onclick = action_dialog_button, .default_button = 4, .show_closebutton = UI_OFF); ui_vbox(dialog, .margin = 10, .spacing = 10) { ui_label(dialog, .label = "Enter password:"); ui_passwordfield(dialog, .varname = "password", .onactivate = action_dialog_onactivate); } ui_show(dialog); } void action_toolbar_newwindow(UiEvent *event, void *userdata) { UiObject *obj = ui_simple_window("New Window", NULL); ui_headerbar0(obj) { ui_headerbar_start(obj) { ui_button(obj, .label = "Open"); } ui_headerbar_end(obj) { ui_button(obj, .label = "Test"); } } ui_textarea(obj, .varname="text"); ui_show(obj); } MyDocument* create_doc(void) { MyDocument *doc = ui_document_new(sizeof(MyDocument)); UiContext *docctx = ui_document_context(doc); doc->submenulist = ui_list_new(docctx, "sub_menulist"); ui_list_append(doc->submenulist, "Sub Menu List Item 1"); ui_list_append(doc->submenulist, "Sub Menu List Item 2"); ui_list_append(doc->submenulist, "Sub Menu List Item 3"); ui_list_append(doc->submenulist, "Sub Menu List Item 4"); ui_list_append(doc->submenulist, "Sub Menu List Item 5"); ui_list_append(doc->submenulist, "Sub Menu List Item 6"); doc->str1 = ui_string_new(docctx, "str1"); doc->str1 = ui_string_new(docctx, "str2"); doc->path = ui_string_new(docctx, "path"); doc->progress = ui_double_new(docctx, "progress"); doc->list = ui_list_new(docctx, "list"); ui_list_append(doc->list, "test1"); ui_list_append(doc->list, "test2"); ui_list_append(doc->list, "test3"); doc->list2 = ui_list_new(docctx, "list2"); ui_list_append(doc->list2, strdup("test1")); ui_list_append(doc->list2, strdup("test2")); ui_list_append(doc->list2, strdup("test3")); doc->radio = ui_int_new(docctx, "radio"); doc->tabview = ui_int_new(docctx, "tabview"); doc->image = ui_generic_new(docctx, "image"); doc->srclist1 = ui_list_new(docctx, "srclist1"); doc->srclist2 = ui_list_new(docctx, "srclist2"); ui_list_append(doc->srclist1, "test1"); ui_list_append(doc->srclist1, "test2"); ui_list_append(doc->srclist1, "test3"); ui_list_append(doc->srclist2, "x1"); ui_list_append(doc->srclist2, "x2"); ui_list_append(doc->srclist2, "select 0"); doc->items = ui_list_new(docctx, "items"); ui_list_append(doc->items, "Item 1"); ui_list_append(doc->items, "Item 2"); ui_list_append(doc->items, "Item 3"); doc->web = ui_generic_new(docctx, NULL); doc->list_input = ui_string_new(docctx, "list_input"); doc->list_new_col = ui_string_new(docctx, NULL); doc->list11 = ui_list_new(docctx, "list11"); ui_list_append(doc->list11, "Item 1"); ui_list_append(doc->list11, "Item 2"); ui_list_append(doc->list11, "Item 3"); doc->link = ui_string_new(docctx, "link"); doc->link_label = ui_string_new(docctx, "link_label"); doc->link_uri = ui_string_new(docctx, "link_uri"); //doc->text = ui_text_new(docctx, "text"); return doc; } UiIcon *icon = NULL; static void* list_getvalue(void *elm, int col) { /* if(col == 0) { if(!icon) { icon = ui_icon("folder", 24); } return icon; } */ char *str = elm; return col == 0 ? str : "x"; } static UiList *menu_list; int new_item_count = 0; void action_add_menu_item(UiEvent *event, void *userdata) { char str[64]; snprintf(str, 64, "new item %d", new_item_count++); ui_list_append(menu_list, strdup(str)); ui_list_notify(menu_list); } void action_menu_list(UiEvent *event, void *userdata) { printf("menu list item: %d\n", event->intval); } static int tab_x = 0; void action_tab2_button(UiEvent *event, void *userdata) { MyDocument *doc = event->document; printf("current page: %d\n", (int)ui_get(doc->tabview)); ui_set(doc->tabview, 0); } void action_group1(UiEvent *event, void *userdata) { UiContext *ctx = event->obj->ctx; if(userdata) { ui_unset_state(ctx, 1); } else { ui_set_state(ctx, 1); } } void action_group2(UiEvent *event, void *userdata) { UiContext *ctx = event->obj->ctx; if(userdata) { ui_unset_state(ctx, 2); } else { ui_set_state(ctx, 2); } } static UiObject *ref_window; void action_button_ref(UiEvent *event, void *userdata) { UiObject *obj = event->obj; printf("action_button_ref: %u\n", obj->ref); ui_object_ref(obj); ref_window = obj; } void action_button_unref(UiEvent *event, void *userdata) { UiObject *obj = userdata; printf("action_button_unref: %u\n", obj->ref); ui_object_unref(obj); } void action_toolbar_unrefwindow(UiEvent *event, void *userdata) { UiObject *obj = ui_simple_window("Unref", NULL); ui_grid(obj, .margin = 20) { ui_button(obj, .label = "Unref", .onclick = action_button_unref, .onclickdata = ref_window); } ui_show(obj); } void action_sourcelist_activate(UiEvent *event, void *userdata) { UiSubListEventData *eventdata = event->eventdata; printf("sourcelist %s index %d\n", eventdata->row_data, eventdata->row_index); if(eventdata->row_index >= 0) { ui_list_update_row(eventdata->list, eventdata->row_index); } UiListSelection sel = ui_list_getselection(eventdata->list); printf("sel: %d: %d\n", sel.count, sel.count > 0 ? sel.rows[0] : -1); if(eventdata->sublist_index == 1 && eventdata->row_index == 2) { ui_list_setselection(eventdata->list, 0); } } void action_table_activate(UiEvent *event, void *userdata) { char *s = userdata; printf("table event: %s\n", s); UiListSelection *sel = event->eventdata; for(int i=0;i<sel->count;i++) { printf("%d\n", sel->rows[i]); } printf("\n"); } UiMenuBuilder *menubuilder; UiMenuBuilder *sourcelist_menu; void* table_getvalue(void *row, int col) { return "test"; switch(col) { case 0: return ui_foldericon(16); case 1: return row; case 2: return (void*)(intptr_t)1234; case 3: return ui_foldericon(16); case 4: return ui_fileicon(16); case 5: return "file"; case 6: return (void*)(intptr_t)123; case 7: return "edit me"; case 8: return "edit me too"; case 9: return (void*)(intptr_t)1; } return NULL; } UiBool table_getstyle(UiList *list, void *elm, int row, int col, void *userdata, UiTextStyle *style) { if(col > 6) { return FALSE; } if(row < 2 && col != -1) { style->text_style = UI_TEXT_STYLE_BOLD; if(col == 2) { style->text_style = UI_TEXT_STYLE_ITALIC; } if(row == 1) { style->text_style |= UI_TEXT_STYLE_UNDERLINE; } style->fg.blue = col == 1 ? 255 : 0; style->fg.green = col == 2 ? 255 : 0; style->fg.red = col == 5 ? 255 : 0; style->fg_set = TRUE; return TRUE; } return FALSE; } void sourcelist_getvalue(UiList *list, void *sublistdata, void *rowdata, int index, UiSubListItem *item, void *userdata) { ui_menubuilder_ref(sourcelist_menu); item->label = strdup(rowdata); item->button_icon = strdup("view-more-horizontal"); item->button_menu = sourcelist_menu; item->eventdata = sublistdata; } typedef struct Item { UiObject *obj; MyDocument *doc; void *elm; } Item; void item_remove(UiEvent *event, void *userdata) { Item *item = userdata; int index = 0; void *elm = ui_list_first(item->doc->items); while(elm) { if(elm == item->elm) { break; } elm = ui_list_next(item->doc->items); index++; } ui_list_remove(item->doc->items, index); ui_list_update(item->doc->items); } void create_item(UiObject *obj, int index, void *elm, void *userdata) { Item *i = ui_malloc(obj->ctx, sizeof(Item)); i->obj = obj; i->elm = elm; i->doc = userdata; char *item = elm; ui_button(obj, .label = item); ui_checkbox(obj, .label = "Check"); ui_label(obj, .fill = UI_ON); ui_button(obj, .label = "X", .onclick = item_remove, .onclickdata = i); } static void action_static_dropdown(UiEvent *event, void *userdata) { printf("dropdown[%d]: %s\n", event->intval, event->eventdata); } static void action_update_list(UiEvent *event, void *userdata) { MyDocument *doc = event->document; char *newvalue = ui_get(doc->list_input); CxList *list2 = doc->list2->data; cxListRemove(list2, 1); cxListInsert(list2, 1, strdup(newvalue)); doc->list2->update(doc->list2, 1); } static void action_add_col(UiEvent *event, void *userdata) { MyDocument *doc = event->document; char *colname = ui_get(doc->list_new_col); ui_model_add_column(doc->model, UI_STRING, colname, 200); } static void action_list_selection(UiEvent *event, void *userdata) { UiListSelection *sel = event->eventdata; printf("list selection[%d]\n", sel->count); for(int i=0;i<sel->count;i++) { printf("[%d]: %d\n", i, sel->rows[i]); } printf("\n"); } static void action_list_activate(UiEvent *event, void *userdata) { printf("activate\n"); action_list_selection(event, userdata); } static void action_link(UiEvent *event, void *userdata) { printf("action_link: %s\n", event->eventdata); } static void action_change_link(UiEvent *event, void *userdata) { MyDocument *doc = event->document; char *label = ui_get(doc->link_label); char *uri = ui_get(doc->link_uri); ui_linkbutton_value_set(doc->link, label, uri); } static UiBool list_save(UiList *list, int row, int col, UiCellValue *value, void *userdata) { printf("list new value at [%d, %d]: %s\n", row, col, value->string); return FALSE; } static void draw(UiEvent *event, UiGraphics *g, void *userdata) { ui_draw_line(g, 0, 0, g->width, g->height); ui_draw_line(g, g->width, 0, 0, g->height); ui_draw_rect(g, (g->width/2)-80, (g->height/2)-40, 160, 80, FALSE); } void application_startup(UiEvent *event, void *data) { // global list UiContext *global = ui_global_context(); menu_list = ui_list_new(global, "menulist"); ui_list_append(menu_list, "menu list item 1"); ui_list_append(menu_list, "menu list item 2"); ui_list_append(menu_list, "menu list item 3"); UiObject *obj = ui_splitview_window("Test", TRUE); MyDocument *doc = create_doc(); ui_attach_document(obj->ctx, doc); ui_sidebar(obj, .margin = 0, .spacing = 0) { ui_sourcelist(obj, .fill = TRUE, .getvalue = sourcelist_getvalue, .header_is_item = TRUE, .sublists = UI_SUBLISTS(UI_SUBLIST(.varname = "srclist1", .header = "Header 1", .userdata = "Sublist1"), UI_SUBLIST(.varname = "srclist2", .header = "Header 2", .userdata = "Sublist2")), .onactivate = action_sourcelist_activate); } ui_right_panel(obj, .margin = 10, .spacing = 10) { ui_button(obj, .label = "Test"); } ui_tabview(obj, .spacing=10, .margin=10, .tabview = UI_TABVIEW_NAVIGATION_SIDE, .varname="tabview", .fill = TRUE) { ui_tab(obj, "Tab 0") { ui_vbox(obj, .fill = FALSE, .margin = 15, .spacing = 15) { ui_button(obj, .label = "Test Button", .icon = "application-x-generic", .onclick = action_button); ui_togglebutton(obj, .label = "Toggle"); ui_checkbox(obj, .label = "My Checkbox"); } ui_grid(obj, .fill = FALSE, .columnspacing = 15, .rowspacing = 15, .margin = 15) { ui_button(obj, .label = "Activate Group 1", .hexpand = TRUE, .onclick = action_group1); ui_button(obj, .label = "Disable Group 1", .onclick = action_group1, .onclickdata = "disable"); ui_newline(obj); ui_button(obj, .label = "Activate Group 2", .hexpand = TRUE, .onclick = action_group2); ui_button(obj, .label = "Disable Group 2", .onclick = action_group2, .onclickdata = "disable"); ui_newline(obj); ui_button(obj, .label = "Groups 1,2", .colspan = 2, .states = UI_GROUPS(1, 2)); ui_newline(obj); ui_label(obj, .label = "Label Col 1", .align = UI_ALIGN_LEFT); ui_label(obj, .label = "Label Col 2", .style = UI_LABEL_STYLE_TITLE, .align = UI_ALIGN_RIGHT); ui_newline(obj); ui_spinbox(obj, .step = 5); ui_newline(obj); ui_switch(obj, .varname = "switch"); ui_newline(obj); ui_progressbar(obj, .colspan = 2, .varname = "progress"); ui_set(doc->progress, 0.75); ui_newline(obj); ui_textfield(obj, .value = doc->str1); ui_newline(obj); //ui_button(obj, .label="Test"); ui_path_textfield(obj, .varname = "path", .hfill = TRUE, .hexpand = TRUE); ui_set(doc->path, "/test/path/longdirectoryname/123"); ui_newline(obj); //UiModel *model = ui_model(obj->ctx, UI_ICON_TEXT, "Col 1", UI_STRING, "Col 2", -1); //model->getvalue = list_getvalue; ui_dropdown(obj, .hexpand = true, .vexpand = false, .colspan = 2, .varname = "list", .getvalue = list_getvalue); ui_newline(obj); char *dropdown[] = { "Sun", "Apple", "IBM", "SGI", "HP" }; ui_dropdown(obj, .hexpand = true, .vexpand = false, .colspan = 2, .static_elements = dropdown, .static_nelm = 5, .onactivate = action_static_dropdown); ui_newline(obj); ui_hbox0(obj) { ui_radiobutton(obj, .label = "Radio 1", .varname = "radio"); ui_radiobutton(obj, .label = "Radio 2", .varname = "radio"); ui_radiobutton(obj, .label = "Radio 3", .varname = "radio"); } ui_newline(obj); } } ui_tab(obj, "Tab 1") { //UiModel *model = ui_model(obj->ctx, UI_ICON_TEXT, "col1", UI_INTEGER, "col2", UI_ICON, "col3", UI_ICON_TEXT, "col4", UI_INTEGER, "col5", UI_STRING_EDITABLE, "edit6", UI_STRING_EDITABLE, "edit7", UI_BOOL_EDITABLE, "Check", -1); UiModel *model = ui_model(obj->ctx, UI_STRING, "Col", -1); model->columnsize[0] = -1; doc->model = model; ui_table(obj, .model = model, .list = doc->list2, .colspan = 2, .fill = TRUE, .contextmenu = menubuilder, .multiselection = TRUE, .fill = TRUE, .getvalue = table_getvalue, .getstyle = table_getstyle, .onsave = list_save, .onactivate = action_table_activate, .onactivatedata = "activate", .onselection = action_table_activate, .onselectiondata = "selection"); ui_hbox(obj, .fill = FALSE, .columnspacing = 4) { ui_textfield(obj, .value = doc->list_input); ui_button(obj, .label = "Update List Item 1", .onclick = action_update_list); ui_label(obj, .label = "Column Name"); ui_textfield(obj, .value = doc->list_new_col); ui_button(obj, .label = "Add Column", .onclick = action_add_col); } } ui_tab(obj, "Tab 2") { ui_button(obj, .label = "Button 1 Start Thread", .onclick=action_start_thread); ui_button(obj, .label = "Button 2 Notify Thread", .onclick=action_notify_thread); ui_button(obj, .label = "Obj Ref", .onclick=action_button_ref); ui_button(obj, .label = "Obj Unref", .onclick=action_button_unref, .onclickdata = obj); ui_button(obj, .label = "Button 5", .onclick=action_tab2_button); ui_button(obj, .label = "Button 6", .onclick=action_tab2_button); } ui_tab(obj, "Tab 3") { UiTabViewArgs args = {.fill = TRUE}; UI_CTN(obj, tabview=ui_tabview_create(obj, &args)) { UiObject *tab1 = ui_tabview_add(tabview, "Sub 1", -1); ui_button(tab1, .label = "Button 1"); UiObject *tab2 = ui_tabview_add(tabview, "Sub 2", -1); ui_button(tab2, .label = "Button 2"); } } ui_tab(obj, "Tab 4") { ui_textarea(obj, .varname = "text", .fill = TRUE); } ui_tab(obj, "Tab 5") { ui_button(obj, .label = "Test Button", .icon = "application-x-generic", .onclick = action_button); ui_imageviewer(obj, .varname = "image", .style_class = "imageviewer", .contextmenu = menubuilder, .scrollarea = TRUE, .useradjustable = TRUE, .autoscale = TRUE, .fill = TRUE); } ui_tab(obj, "Tab 6") { ui_scrolledwindow(obj, .fill = TRUE) { ui_expander(obj, .label = "Expander", .margin = 10, .spacing = 10) { ui_label(obj, .label = "Test"); ui_button(obj, .label = "Button"); } ui_frame(obj, .label = "Frame", .margin = 10, .spacing = 10) { ui_label(obj, .label = "Title", .style = UI_LABEL_STYLE_TITLE); ui_label(obj, .label = "Sub-Title", .style = UI_LABEL_STYLE_SUBTITLE); ui_label(obj, .label = "Dim Label", .style = UI_LABEL_STYLE_DIM); ui_label(obj, .label = "No Style"); } for(int i=0;i<100;i++) { char labelstr[32]; snprintf(labelstr, 32, "button %d", i); ui_button(obj, .label = labelstr, .margin_left = i, .margin_right = 99-i, .margin_top = 5, .margin_bottom = 5); } } } ui_tab(obj, "Tab 7") { ui_itemlist(obj, .create_ui = create_item, .varname = "items", .subcontainer = UI_CONTAINER_HBOX, .sub_spacing = 10, .margin = 10, .spacing = 4, .userdata = doc, .fill = TRUE); } ui_tab(obj, "Tab 8") { ui_hsplitpane(obj, .initial_position = 100, .position_property = "hsplitpane.position", .fill = TRUE) { ui_button(obj, .label = "Button 1"); ui_button(obj, .label = "Button 2"); } } ui_tab(obj, "Tab 9") { #ifdef UI_WEBVIEW ui_webview(obj, .fill = TRUE, .value = doc->web); cxstring html = CX_STR("<html><body><h1>Hello Toolkit</h1><p>Toolkit WebView</p></body></html>"); ui_webview_load_content(doc->web, "mypage", html.ptr, html.length, NULL, NULL); #else ui_label(obj, .label = "Webview is not supported"); #endif } ui_tab(obj, "Tab 10") { ui_grid(obj, .margin = 10, .rowspacing = 10, .columnspacing = 10, .def_vfill = TRUE) { ui_label(obj, 1, .label = "Name"); ui_textfield(obj, .hexpand = TRUE); ui_newline(obj); ui_label(obj, .label = "No vfill", .override_defaults = TRUE); ui_textfield(obj, .hexpand = TRUE); ui_newline(obj); ui_label(obj, .label = "Manual vfill", .override_defaults = TRUE, .vfill = TRUE); ui_textfield(obj, .hexpand = TRUE); ui_newline(obj); } } ui_tab(obj, "Tab 11") { ui_grid(obj, .margin = 10, .rowspacing = 10, .columnspacing = 10, .fill = TRUE) { ui_listview(obj, .varname = "list11", .multiselection = FALSE, .onselection = action_list_selection, .onactivate = action_list_activate, .hexpand = TRUE, .hfill = TRUE, .vexpand = TRUE, .vfill = TRUE); ui_newline(obj); ui_grid(obj, .rowspacing = 10, .columnspacing = 10) { ui_rlabel(obj, .label = "Link: ", .vfill = TRUE); ui_linkbutton(obj, .varname = "link", .label = "Linkbutton", .onclick = action_link, .style_class = "ui-nopadding", .vfill = TRUE); ui_newline(obj); ui_rlabel(obj, .label = "Test1"); ui_llabel(obj, .label = "Test2"); } ui_newline(obj); ui_vbox(obj, .spacing = 10, .colspan = 2) { ui_textfield(obj, .varname = "link_label", .colspan = 2); ui_textfield(obj, .varname = "link_uri", .colspan = 2); ui_button(obj, .label = "Update Link", .onclick = action_change_link, .colspan = 2); } } } ui_tab(obj, "Tab 12") { ui_drawingarea(obj, .fill = TRUE, .draw = draw); } } /* */ ui_show(obj); } int main(int argc, char** argv) { ui_init("app1", argc, argv); ui_onstartup(application_startup, NULL); ui_set_property("ui.gtk.window.showtitle", "sidebar"); ui_set_property("ui.gtk.window.appmenu.position", "rightpanel"); // menu ui_menu("File") { ui_menuitem(.label = "Test"); } ui_contextmenu(&menubuilder) { ui_menuitem(.label = "Context Item 1"); ui_menuitem(.label = "Context Item 2"); ui_menu("Context Submenu") { ui_menuitem(.label = "Context Sub Item"); } } ui_contextmenu(&sourcelist_menu) { ui_menuitem(.label = "Item 1"); ui_menuitem(.label = "Item 2"); } ui_menu("Edit") { ui_menuitem(.label = "Undo"); ui_menuseparator(); ui_menu("Submenu") { ui_menuitem(.label = "Subitem"); } } ui_toolbar_item("Test", .label = "Test", .onclick = action_toolbar_button); ui_toolbar_item("Test2", .label = "New Window", .onclick = action_toolbar_newwindow); ui_toolbar_item("Test3", .label = "Dialog", .onclick = action_toolbar_dialog); ui_toolbar_item("Test4", .label = "Unref Window", .onclick = action_toolbar_unrefwindow); ui_toolbar_item("Test5", .label = "Test 5", .onclick = action_toolbar_button); ui_toolbar_item("Test6", .label = "Test 6", .onclick = action_toolbar_button); ui_toolbar_toggleitem("Toggle", .label = "Toggle", .onchange = action_toolbar_button); ui_toolbar_menu("Menu", .label = "Menu") { ui_menuitem("Secondary Test", .onclick = action_toolbar_button, NULL); ui_menu("Secondary Sub") { ui_menuitem("Secondary subitem", NULL, NULL); } ui_menuseparator(); ui_menu_itemlist(.varname = "menulist", .onselect=action_menu_list); ui_menuseparator(); ui_menu("Sub Menu List") { ui_menu_itemlist(.varname = "sub_menulist"); } ui_menuitem("last", .onclick = action_add_menu_item); } ui_toolbar_appmenu() { ui_menuitem("New"); ui_menuitem("Open"); ui_menuitem("Save"); ui_menuseparator(); ui_menu_radioitem(.label = "Option 1", .varname = "menu_radio"); ui_menu_radioitem(.label = "Option 2", .varname = "menu_radio"); ui_menu_radioitem(.label = "Option 3", .varname = "menu_radio"); ui_menuseparator(); ui_menuitem("Close"); } ui_toolbar_add_default("Test", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Test6", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Toggle", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Menu", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Test2", UI_TOOLBAR_CENTER); ui_toolbar_add_default("Test3", UI_TOOLBAR_CENTER); ui_toolbar_add_default("Test4", UI_TOOLBAR_RIGHT); ui_toolbar_add_default("Test5", UI_TOOLBAR_RIGHT); threadpool = ui_threadpool_create(10); ui_main(); return (EXIT_SUCCESS); } #endif #if (defined(UI_COCOA) || defined(UI_MOTIF)) && !defined(UI_TEST) static UiList *menulist; int items = 4; void action_button(UiEvent *event, void *data) { printf("action_button\n"); char *newitem = malloc(32); snprintf(newitem, 32, "Item %d", ++items); ui_list_append(menulist, newitem); ui_list_notify(menulist); } typedef struct WData { UIWIDGET tabview; UiString *path; UiList *list; UiInteger *spinner; UiInteger *tab; UiDouble *num; UiInteger *toggle1; UiInteger *toggle2; UiInteger *checkbox1; } WData; int lsitems = 4; void action_button2(UiEvent *event, void *data) { WData *wdata = event->window; char *newitem = malloc(32); snprintf(newitem, 32, "List Item %d", ++lsitems); ui_list_append(wdata->list, newitem); ui_list_update(wdata->list); UiListSelection sel; int index = lsitems-1; sel.count = 1; sel.rows = &index; wdata->list->setselection(wdata->list, sel); } void action_listevent(UiEvent *event, void *data) { printf("%s: %d\n", data, event->intval); UiListSelection *sel = event->eventdata; for(int i=0;i<sel->count;i++) { printf("sel: %d\n", sel->rows[i]); } printf("\n"); } static void action_remove_tab3(UiEvent *event, void *data) { WData *wdata = event->window; printf("remove tab 3\n"); ui_tabview_remove(wdata->tabview, 2); } static void action_next_tab(UiEvent *event, void *data) { WData *wdata = event->window; int index = ui_get(wdata->tab); ui_set(wdata->tab, index+1); } static void action_menu_toggle(UiEvent *event, void *data) { WData *wdata = event->window; printf("toggle1: %d\n", (int)ui_get(wdata->toggle1)); printf("toggle2: %d\n\n", (int)ui_get(wdata->toggle2)); } static void action_show_button1(UiEvent *event, void *data) { WData *wdata = event->window; if(event->intval) { ui_set_state(event->obj->ctx, 10); } else { ui_unset_state(event->obj->ctx, 10); } } void application_startup(UiEvent *event, void *data) { menulist = ui_list_new(ui_global_context(), "menulist"); ui_list_append(menulist, "Item 1"); ui_list_append(menulist, "Item 2"); ui_list_append(menulist, "Item 3"); ui_list_append(menulist, "Item 4"); UiObject *obj = ui_window("Test", NULL); WData *wdata = ui_malloc(obj->ctx, sizeof(WData)); wdata->path = ui_string_new(obj->ctx, NULL); wdata->list = ui_list_new(obj->ctx, NULL); wdata->spinner = ui_int_new(obj->ctx, NULL); wdata->tab = ui_int_new(obj->ctx, NULL); wdata->num = ui_double_new(obj->ctx, "num"); wdata->toggle1 = ui_int_new(obj->ctx, "toggle1"); wdata->toggle2 = ui_int_new(obj->ctx, "toggle2"); wdata->checkbox1 = ui_int_new(obj->ctx, NULL); obj->window = wdata; ui_list_append(wdata->list, "List Item 1"); ui_list_append(wdata->list, "List Item 2"); ui_list_append(wdata->list, "List Item 3"); ui_list_append(wdata->list, "List Item 4"); /* ui_button(obj, .label = "Add Menu Item", .onclick = action_button, .name = "mybutton1"); ui_button(obj, .label = "Add List Item", .onclick = action_button2); ui_hbox0(obj) { ui_progressbar(obj, .name = "pb", .fill = UI_ON); ui_progressspinner(obj, .value = wdata->spinner); } ui_listview(obj, .list = wdata->list, .fill = UI_ON, .multiselection = TRUE, .onactivate = action_listevent, .onactivatedata = "activate", .onselection = action_listevent, .onselectiondata = "selection"); */ ui_button(obj, .label = "Next Tab", .onclick = action_next_tab); ui_tabview_w(obj, wdata->tabview, .value = wdata->tab, .fill = UI_ON) { ui_tab(obj, "Tab 1") { ui_vbox(obj, .margin = 10, .spacing = 10) { UIWIDGET w = ui_button(obj, .label = "Button 1"); int state = 10; ui_widget_set_visibility_states(obj->ctx, w, &state, 1); ui_button(obj, .label = "Button 2"); ui_checkbox(obj, .label = "Hide Button 1", .value = wdata->checkbox1, .onchange = action_show_button1); } } ui_tab(obj, "Tab 2") { } } ui_set(wdata->checkbox1, 1); ui_set_state(obj->ctx, 10); ui_show(obj); ui_set(wdata->spinner, 1); } void action_test(UiEvent *event, void *data) { printf("action test\n"); } int main(int argc, char** argv) { ui_init("app1", argc, argv); ui_onstartup(application_startup, NULL); // menu ui_menu("File") { ui_menuitem(.label = "Test 1", .onclick = action_test); ui_menuitem(.label = "Test 2", .onclick = action_test); ui_menuitem(.label = "Test 3", .onclick = action_test); ui_menuseparator(); ui_menu_toggleitem(.label = "Toggle 1", .varname = "toggle1", .onchange = action_menu_toggle); ui_menu_toggleitem(.label = "Toggle 2", .varname = "toggle2", .onchange = action_menu_toggle); ui_menuseparator(); ui_menu_radioitem(.label = "Radio 1", .varname = "menu_radio"); ui_menu_radioitem(.label = "Radio 2", .varname = "menu_radio"); ui_menu_radioitem(.label = "Radio 3", .varname = "menu_radio"); ui_menu_radioitem(.label = "Radio 4", .varname = "menu_radio"); ui_menuseparator(); ui_menu_itemlist(.varname = "menulist"); ui_menuseparator(); ui_menuitem(.label = "Quit"); } ui_main(); return (EXIT_SUCCESS); } #endif #ifdef UI_QT static void list_activate(UiEvent *event, void *userdata) { UiListSelection *sel = event->eventdata; printf("selection [%d]\n", sel->rows[0]); } void* table_getvalue(void *elm, int col) { char *s = elm; if(col == 0) { return s; } else { return (void*)(intptr_t)12; } } void application_startup(UiEvent *event, void *data) { UiObject *obj = ui_window("My Window", NULL); UiList *list = ui_list_new(obj->ctx, "mylist"); ui_list_append(list, "Entry 1"); ui_list_append(list, "Entry 2"); ui_list_append(list, "Entry 3"); ui_list_append(list, "Entry 4"); ui_list_append(list, "Entry 5"); ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10) { ui_button(obj, .label = "Button 1"); ui_button(obj, .label = "Button 2", .hexpand = TRUE, .hfill = TRUE); ui_button(obj, .label = "Button end"); ui_newline(obj); ui_textarea(obj, .vexpand = TRUE, .vfill = TRUE); UiModel *model = ui_model(obj->ctx, UI_STRING, "col1", UI_INTEGER, "col2", -1); model->columnsize[0] = -1; ui_table(obj, .model = model, .getvalue = table_getvalue, .varname = "mylist", .colspan = 2, .fill = UI_ON, .multiselection = TRUE, .fill = TRUE, .onactivate = list_activate); ui_newline(obj); ui_button(obj, .label = "Button Y"); ui_checkbox(obj, .label = "Checkbox"); ui_spinbox(obj, .digits = 2); ui_newline(obj); ui_hbox(obj, .colspan = 3) { ui_radiobutton(obj, .label = "Radio 1", .varname = "radio"); ui_radiobutton(obj, .label = "Radio 2", .varname = "radio"); ui_radiobutton(obj, .label = "Radio 3", .varname = "radio"); ui_radiobutton(obj, .label = "Radio 4", .varname = "radio"); } ui_newline(obj); ui_hbox(obj, .colspan = 3) { ui_button(obj, .label = "Margin Test 1", .margin_top = 10); ui_button(obj, .label = "Margin Test 2", .margin_top = 20); UIWIDGET w = ui_button(obj, .label = "Margin Test 3", .margin = 30); //ui_set_visible(w, FALSE); ui_button(obj, .label = "Margin Test 4", .margin_top = 40); ui_button(obj, .label = "Margin Test 5", .margin_top = 50); ui_button(obj, .label = "Margin Test 6", .margin_top = 60); } } ui_show(obj); } int main(int argc, char **argv) { ui_init("app1", 0, NULL); ui_onstartup(application_startup, NULL); // menu ui_menu("File") { ui_menuitem(.label = "Test"); } ui_menu("Edit") { ui_menuitem(.label = "Undo"); ui_menu_toggleitem(.label = "Checkbox"); ui_menuseparator(); ui_menu_radioitem(.label = "Option 1", .varname = "menuoption"); ui_menu_radioitem(.label = "Option 2", .varname = "menuoption"); ui_menu_radioitem(.label = "Option 3", .varname = "menuoption"); ui_menu_radioitem(.label = "Option 4", .varname = "menuoption"); ui_menuseparator(); ui_menu("Submenu") { ui_menuitem(.label = "Subitem"); } } ui_toolbar_item("new", .label = "New"); ui_toolbar_item("add", .label = "Add"); ui_toolbar_item("copy", .label = "Copy"); ui_toolbar_item("paste", .label = "Paste"); ui_toolbar_toggleitem("toggle", .label = "Toggle"); ui_toolbar_add_default("new", UI_TOOLBAR_LEFT); ui_toolbar_add_default("add", UI_TOOLBAR_LEFT); ui_toolbar_add_default("copy", UI_TOOLBAR_LEFT); ui_toolbar_add_default("paste", UI_TOOLBAR_LEFT); ui_toolbar_add_default("toggle", UI_TOOLBAR_LEFT); ui_main(); return 0; } #endif #ifdef UI_WIN32 static void action_button(UiEvent *event, void *data) { printf("button clicked\n"); } typedef struct Person { char *name; char *email; } Person; Person person1 = { "Alice", "alice@localhost" }; Person person2 = { "Bob", "bob@localhost" }; void* person_getvalue(void *elm, int col) { Person *p = (Person *) elm; if (col == 0) { return p->name; } else { return p->email; } } void list_onselection(UiEvent *event, void *userdata) { UiListSelection *sel = event->eventdata; for (int i=0;i<sel->count;i++) { printf("selection: %d\n", sel->rows[i]); } printf("\n"); fflush(stdout); } void application_startup(UiEvent *event, void *data) { UiObject *obj = ui_window("Test w32", NULL); UiList *list = ui_list_new(obj->ctx, "persons"); ui_list_append(list, &person1); ui_list_append(list, &person2); ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .fill = TRUE) { //UiModel *model = ui_model(obj->ctx, UI_STRING, "Name", UI_STRING, "Email", -1); //ui_table(obj, .fill = TRUE, .varname = "persons", .model = model, .getvalue = person_getvalue, .onselection = list_onselection); //ui_model_free(obj->ctx, model); ui_dropdown(obj, .varname = "persons", .getvalue = person_getvalue, .onactivate = list_onselection, .hexpand = TRUE, .hfill = TRUE); ui_button(obj, .label = "Test 1"); ui_newline(obj); ui_button(obj, .label = "Button 1", .hfill = TRUE); ui_button(obj, .label = "Button 2"); ui_button(obj, .label = "Button 2"); ui_newline(obj); ui_textarea(obj, .colspan = 3, .fill = TRUE); } ui_show(obj); } int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //int main() { ui_init("app1", 0, NULL); ui_menu("File") { ui_menuitem("Open"); ui_menuitem("Close"); } ui_onstartup(application_startup, NULL); ui_main(); return 0; } #endif