Sun, 29 Sep 2024 15:01:14 +0200
add option to name widgets and add css classes (GTK)
/* * 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> 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", 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); }