Sun, 17 Nov 2024 15:19:32 +0100
download/upload refactoring, add cancel button, resolves #498 fixes #506
/* * 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; void action1(UiEvent* event, void* data) { char* action = data; WindowData* wdata = event->window; int64_t is_checked = wdata->check->get(wdata->check); int64_t radio = wdata->radio->get(wdata->radio); printf("data: %s %d\n", data, is_checked); double d = wdata->progress->get(wdata->progress); wdata->progress->set(wdata->progress, d + 1); int spinner_active = wdata->spinner->get(wdata->spinner); wdata->spinner->set(wdata->spinner, !spinner_active); } 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 application_startup(UiEvent* event, void* data) { 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 = "Button1", .onclick = action1, .onclickdata = "action1"); ui_button(obj, .label = "Button2", .onclick = action1, .onclickdata = "action2"); ui_button(obj, .label = "Button3", .onclick = action1, .onclickdata = "action3", .hexpand = true); ui_newline(obj); ui_button(obj, .label = "Button4", .onclick = action1, .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_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); }