Thu, 14 Nov 2024 17:26:16 +0100
implement ui groups/states (WINUI)
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2023 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 <Windows.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <ui/ui.h> #include <stdio.h> #include <stdlib.h> #include <ui/ui.h> typedef struct { UiString *str1; UiString *str2; UiString *path; UiText *text; UiDouble *progress; UiList *list; UiList *menulist; UiInteger *radio; UiInteger *tabview; UiGeneric *image; } MyDocument; MyDocument *doc1; MyDocument *doc2; UIWIDGET tabview; static UiCondVar *cond; static int thr_end = 0; static int thr_started = 0; 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_toolbar_dialog(UiEvent *event, void *userdata) { UiObject *dialog = ui_dialog_window(event->obj, .title = "Dialog Window", .lbutton1 = "Cancel 1", .lbutton2 = "Btn 2", .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"); } 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->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->radio = ui_int_new(docctx, "radio"); doc->tabview = ui_int_new(docctx, "tabview"); doc->image = ui_generic_new(docctx, "image"); //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_group(ctx, 1); } else { ui_set_group(ctx, 1); } } void action_group2(UiEvent *event, void *userdata) { UiContext *ctx = event->obj->ctx; if(userdata) { ui_unset_group(ctx, 2); } else { ui_set_group(ctx, 2); } } 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_window("Test", NULL); MyDocument *doc = create_doc(); ui_attach_document(obj->ctx, doc); ui_tabview(obj, .spacing=10, .margin=10, .tabview = UI_TABVIEW_NAVIGATION_SIDE, .varname="tabview") { ui_tab(obj, "Tab 1") { ui_vbox(obj, .fill = UI_OFF, .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 = UI_OFF, .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, .groups = 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_spinner(obj, .step = 5); //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"); 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_combobox(obj, .hexpand = true, .vexpand = false, .colspan = 2, .varname = "list", .getvalue = list_getvalue); 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_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 = "Button 3", .onclick=action_tab2_button); ui_button(obj, .label = "Button 4", .onclick=action_tab2_button); 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 = {0}; 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_grid0(obj) { ui_button(obj, .label = "test1"); ui_newline(obj); ui_textarea(obj, .varname = "text", .vexpand = TRUE, .hexpand = 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"); } ui_tab(obj, "Tab 6") { ui_scrolledwindow(obj, .fill = UI_ON) { 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); } } } } /* */ ui_show(obj); } /* typedef struct WindowData { UiInteger* check; UiInteger* toggle; UiInteger* radio; UiString* text; UiString* password; UiList* list; UiString* t1; UiString* t2; UiString* t3; UiString* path; UiList* list2; UiList* list3; UiDouble* progress; UiInteger* spinner; } WindowData; static UiIcon* folder_icon; UiList* menuList; void event_mt(UiEvent* event, void* data) { char* mt_str = data; printf("%s\n", mt_str); } int test_threadfunc(void *data) { char* str = data; return 0; } void action_thread_test(UiEvent* event, void* data) { ui_job(event->obj, test_threadfunc, "testdata", event_mt, "testdata2"); } void action1(UiEvent* event, void* data) { char* action = data; WindowData* wdata = event->window; int64_t is_checked = ui_get(wdata->check); int64_t radio = ui_get(wdata->radio); printf("data: %s %d\n", data, is_checked); double d = ui_get(wdata->progress); ui_set(wdata->progress, d + 1); int spinner_active = ui_get(wdata->spinner); ui_set(wdata->spinner, !spinner_active); ui_list_append(menuList, "List Item X"); ui_list_append(menuList, "List Item X"); ui_notify(menuList->observers, NULL); } void action_set_checkbox(UiEvent* event, void* data) { char* action = data; WindowData* wdata = event->window; wdata->check->set(wdata->check, 1); } void action_onchange(UiEvent* event, void* data) { printf("onchange: %d\n", event->intval); } void action_switch(UiEvent* event, void* data) { printf("onchange: %d\n", event->intval); } void action_toolbar_button(UiEvent* event, void *data) { printf("toolbar action\n"); } void action_listselection_changed(UiEvent* event, void* data) { printf("selection changed\n"); UiListSelection* sel = event->eventdata; for (int i = 0; i < sel->count; i++) { int row = sel->rows[i]; printf("row: %d\n", row); } } void action_onactivate(UiEvent* event, void* Data) { printf("activate\n"); UiListSelection* sel = event->eventdata; for (int i = 0; i < sel->count; i++) { int row = sel->rows[i]; printf("row: %d\n", row); } } typedef struct TableData { char* col1; char* col2; char* col3; } TableData; void* table_getvalue(void* data, int i) { TableData* t = data; switch (i) { case 0: return folder_icon; case 1: return t->col1; case 2: return t->col2; case 3: return t->col3; } return NULL; } void action_add(UiEvent* event, void* data) { WindowData* wdata = event->window; char* t1 = wdata->t1->get(wdata->t1); char* t2 = wdata->t2->get(wdata->t2); char* t3 = wdata->t3->get(wdata->t3); TableData* tdat = malloc(sizeof(TableData)); tdat->col1 = _strdup(t1); tdat->col2 = _strdup(t2); tdat->col3 = _strdup(t3); ui_list_append(wdata->list2, tdat); wdata->list2->update(wdata->list2, 0); } void action_breadcrumb(UiEvent* event, void* data) { int i = event->intval; char* c = event->eventdata; printf("index: %d\n", i); } void dragstart(UiEvent* event, void* data) { UiListDnd* ldnd = event->eventdata; ui_selection_settext(ldnd->dnd, "Hello World!", -1); } void dragcomplete(UiEvent* event, void* data) { } void dragover(UiEvent* event, void* data) { } void drop(UiEvent* event, void* data) { } void dialog_result(UiEvent *evt, void *data) { char *str = evt->eventdata; printf("dialog: %d\n", (int)evt->intval); } void btn_dialog(UiEvent *evt, void *data) { ui_dialog(evt->obj, .title = "Title", .input = TRUE, .content = "Hello World", .button1_label = "Yes", .button2_label = "No", .closebutton_label = "Close", .result = dialog_result); } void application_startup(UiEvent* event, void* data) { UiContext* gctx = ui_global_context(); menuList = ui_list_new(gctx, "menulist"); ui_list_append(menuList, "List Item 1"); ui_list_append(menuList, "List Item 2"); ui_list_append(menuList, "List Item 3"); ui_list_append(menuList, "List Item 4"); ui_list_append(menuList, "List Item 5"); ui_list_append(menuList, "List Item 6"); UiObject* obj = ui_window("Test", NULL); WindowData* wdata = ui_malloc(obj->ctx, sizeof(WindowData)); obj->window = wdata; wdata->check = ui_int_new(obj->ctx, "check"); wdata->toggle = ui_int_new(obj->ctx, "toggle"); wdata->radio = ui_int_new(obj->ctx, "radio"); wdata->text = ui_string_new(obj->ctx, "text"); wdata->password = ui_string_new(obj->ctx, "password"); wdata->list = ui_list_new(obj->ctx, "list"); wdata->list2 = ui_list_new(obj->ctx, "list2"); wdata->list3 = ui_list_new(obj->ctx, "list3"); wdata->t1 = ui_string_new(obj->ctx, "t1"); wdata->t2 = ui_string_new(obj->ctx, "t2"); wdata->t3 = ui_string_new(obj->ctx, "t3"); wdata->path = ui_string_new(obj->ctx, "path"); wdata->progress = ui_double_new(obj->ctx, "progress"); wdata->spinner = ui_int_new(obj->ctx, "spinner"); ui_list_append(wdata->list, "Hello"); ui_list_append(wdata->list, "World"); ui_list_append(wdata->list, "Item3"); ui_list_append(wdata->list, "Item4"); ui_list_append(wdata->list, "Item5"); ui_list_append(wdata->list, "Item6"); ui_list_append(wdata->list3, "usr"); ui_list_append(wdata->list3, "share"); ui_list_append(wdata->list3, "test"); ui_list_append(wdata->list3, "dir"); //folder_icon = ui_icon("Folder", 32); folder_icon = ui_foldericon(16); TableData* td1 = malloc(sizeof(TableData)); TableData* td2 = malloc(sizeof(TableData)); TableData* td3 = malloc(sizeof(TableData)); TableData* td4 = malloc(sizeof(TableData)); TableData* td5 = malloc(sizeof(TableData)); TableData* td6 = malloc(sizeof(TableData)); td1->col1 = "a1"; td1->col2 = "b1"; td1->col3 = "c1"; td2->col1 = "a2"; td2->col2 = "b2"; td2->col3 = "b3"; td3->col1 = "a3"; td3->col2 = "b3"; td3->col3 = "c3"; td4->col1 = "a3"; td4->col2 = "b3"; td4->col3 = "c3"; td5->col1 = "a3"; td5->col2 = "b3"; td5->col3 = "c3"; td6->col1 = "a3"; td6->col2 = "b3"; td6->col3 = "c3"; ui_list_append(wdata->list2, td1); ui_list_append(wdata->list2, td2); ui_list_append(wdata->list2, td3); ui_list_append(wdata->list2, td4); ui_list_append(wdata->list2, td5); ui_list_append(wdata->list2, td6); ui_scrolledwindow0(obj) { ui_grid(obj, .margin = 10, .columnspacing = 5, .rowspacing = 20) { ui_button(obj, .label = "Thread Test", .onclick = action_thread_test, .onclickdata = "action1"); ui_button(obj, .label = "Button2", .icon = "Back", .onclick = action1, .onclickdata = "action2"); ui_button(obj, .icon = "Forward", .onclick = action1, .onclickdata = "action3", .hexpand = true); ui_newline(obj); ui_button(obj, .label = "Dialog Test", .onclick = btn_dialog, .onclickdata = "action4"); ui_button(obj, .label = "Button5", .onclick = action1, .onclickdata = "action5", .colspan = 2); ui_newline(obj); ui_button(obj, .label = "Very Long Button Label Text ____________ Test", .onclick = action_set_checkbox); ui_newline(obj); ui_checkbox(obj, .label = "Option 1", .value = wdata->check, .onchange = action_onchange); ui_togglebutton(obj, .label = "Option 2", .value = wdata->toggle); ui_newline(obj); ui_label(obj, .label = "Progress"); ui_progressspinner(obj, .value = wdata->spinner); ui_newline(obj); ui_hbox(obj, .colspan = 3) { ui_radiobutton(obj, .label = "Radio 1", .value = wdata->radio); ui_radiobutton(obj, .label = "Radio 2", .value = wdata->radio); ui_radiobutton(obj, .label = "Radio 3", .value = wdata->radio); } ui_newline(obj); ui_radiobutton(obj, .label = "Radio 4", .value = wdata->radio); ui_switch(obj, .label = "test", .onchange = action_switch); ui_newline(obj); //ui_breadcrumbbar(obj, .list = wdata->list3, .onactivate=action_breadcrumb); ui_textfield(obj, .varname = "newtext"); ui_path_textfield(obj, .colspan = 2, .value=wdata->path, .onactivate = action_breadcrumb); ui_newline(obj); wdata->path->set(wdata->path, "/usr/path/test"); ui_textfield(obj, .value = wdata->text); ui_passwordfield(obj, .value = wdata->password); ui_newline(obj); ui_frame(obj, .label = "Test", .colspan = 3) { ui_button(obj, .label = "Button1", .onclick = action1, .onclickdata = "action1"); } ui_newline(obj); ui_expander(obj, .label = "Expand", .colspan = 3, .margin = 10, .spacing = 5, .isexpanded = false) { ui_button(obj, .label = "Button1", .onclick = action1, .onclickdata = "action1"); ui_button(obj, .label = "Button1", .onclick = action1, .onclickdata = "action1"); ui_button(obj, .label = "Button1", .onclick = action1, .onclickdata = "action1"); } ui_newline(obj); ui_combobox(obj, .list = wdata->list, .onselection= action_listselection_changed, .onactivate= action_onactivate); ui_newline(obj); ui_tabview(obj, .colspan = 3, .vexpand = true, .hexpand = true, .tabview = UI_TABVIEW_NAVIGATION_SIDE) { ui_tab(obj, "Tab 1") { ui_button(obj, .label = "Tab 1 Button"); } ui_tab(obj, "Tab 2") { ui_button(obj, .label = "Tab 2 Button"); } ui_tab(obj, "Tab 3") { } } ui_newline(obj); ui_label(obj, .label = "Test Label"); ui_progressbar(obj, .value = wdata->progress, .colspan = 2); ui_newline(obj); ui_newline(obj); ui_textfield(obj, .value = wdata->t1); ui_textfield(obj, .value = wdata->t2); ui_textfield(obj, .value = wdata->t3); ui_newline(obj); ui_button(obj, .label = "Add", .onclick = action_add); ui_newline(obj); ui_newline(obj); UiModel* model = ui_model(obj->ctx, UI_ICON_TEXT, "Col 1", UI_STRING, "Col 2", UI_STRING, "Col 3", -1); model->getvalue = table_getvalue; ui_table(obj, .colspan = 3, .model = model, .list = wdata->list2, .onactivate = action_onactivate, .onselection = action_listselection_changed, .ondragstart = dragstart, .ondragcomplete = dragcomplete, .ondrop = drop); ui_model_free(obj->ctx, model); } } ui_show(obj); } */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { ui_init("app1", NULL, 0); ui_onstartup(application_startup, NULL); // menu ui_menu("File") { ui_menuitem(.label = "Test"); } 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 = "Test 4", .onclick = action_toolbar_button); 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_menuitem("last", .onclick = action_add_menu_item); } ui_toolbar_appmenu() { ui_menuitem("New"); ui_menuitem("Open"); ui_menuitem("Save"); 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); ui_main(); return (EXIT_SUCCESS); /* ui_init("app1", 0, NULL); ui_onstartup(application_startup, NULL); ui_menu("File") { ui_menuitem(.label = "Item 1"); ui_menuitem(.label = "Item 2"); ui_menuseparator(); ui_menu("File Sub") { ui_menuitem(.label = "Sub Item"); } ui_menuitem(.label = "Exit"); } ui_toolbar_item("Test", .label = "Home", .icon = "Home", .onclick = action_toolbar_button); ui_toolbar_toggleitem("Toggle", .label = "Toggle", .onchange = action_toolbar_button); ui_toolbar_toggleitem("Toggle2", .label = "Toggle2", .onchange = action_toolbar_button); ui_toolbar_toggleitem("Toggle3", .label = "Toggle3", .onchange = action_toolbar_button); ui_toolbar_menu("Menu", .label = "Menu") { ui_menuitem(.label = "x", NULL, NULL); ui_menuitem(.label = "x", NULL, NULL); ui_menu_itemlist(.varname = "menulist"); ui_menuitem(.label = "x", NULL, NULL); ui_menuitem(.label = "x", NULL, NULL); ui_menuitem(.label = "x", NULL, NULL); ui_menu("TB Sub") { ui_menuitem("TB subitem", NULL, NULL); } } ui_toolbar_menu(NULL, .label = "Menu") { ui_menuitem("Secondary Test", NULL, NULL); ui_menu("Secondary Sub") { ui_menuitem("Secondary subitem", NULL, NULL); } } ui_toolbar_add_default("Test", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Toggle", UI_TOOLBAR_LEFT); ui_toolbar_add_default("Toggle2", UI_TOOLBAR_CENTER); ui_toolbar_add_default("Toggle3", UI_TOOLBAR_CENTER); ui_toolbar_add_default("Menu", UI_TOOLBAR_RIGHT); ui_main(); return (EXIT_SUCCESS); */ }