application/demo_bindings.c

Thu, 23 Oct 2025 21:22:05 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 23 Oct 2025 21:22:05 +0200
changeset 872
1e34a27e016d
child 873
78853bfc47cf
permissions
-rw-r--r--

add first code for binding demo

872
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2017 Olaf Wintermann. All rights reserved.
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "demo_bindings.h"
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 Document* document_create(int id) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 Document* doc = ui_document_new(sizeof(Document));
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 UiContext *ctx = ui_document_context(doc);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 char buf[32];
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 snprintf(buf, 32, "%d", id);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 doc->id = ui_string_new(ctx, "id");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 doc->name = ui_string_new(ctx, "name");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 doc->input_name = ui_string_new(ctx, "input_name");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 ui_set(doc->id, buf);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 return doc;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 void update_name(UiEvent *event, void *userdata) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 Document *doc = event->document;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 if(!doc) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 return;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 char *s = ui_get(doc->input_name);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 ui_set(doc->name, s);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 void switch_document(UiEvent *event, void *userdata) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 MainWindow *wdata = event->window;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 if(event->document) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 ui_detach_document(event->obj->ctx, event->document);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 Document *doc = ui_list_get(wdata->doclist, event->intval);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 if(doc) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 ui_attach_document(event->obj->ctx, doc);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 void* doclist_get_value(void *elm, int col) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 Document *doc = elm;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 return ui_get(doc->id);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 void application_startup(UiEvent *event, void *data) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 UiObject *obj = ui_simple_window("Bindings Demo", NULL);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 MainWindow *wdata = ui_malloc(obj->ctx, sizeof(MainWindow));
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 obj->window = wdata;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 wdata->doclist = ui_list_new(obj->ctx, "doclist");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .fill = TRUE) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 ui_rlabel(obj, .label = "Document:");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 ui_llabel(obj, .varname = "id");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 ui_newline(obj);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 ui_rlabel(obj, .label = "Name:");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 ui_llabel(obj, .varname = "name");
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 ui_newline(obj);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 ui_combobox(obj, .varname = "doclist", .colspan = 2, .onactivate = switch_document, .getvalue = doclist_get_value);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 ui_newline(obj);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 ui_frame(obj, .label = "Document", .colspan = 2, .fill = TRUE) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 ui_rlabel(obj, .label = "Name:", .vfill = TRUE);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 ui_textfield(obj, .varname = "input_name", .onchange = update_name);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 for(int i=0;i<10;i++) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 Document *doc = document_create(i);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 ui_list_append(wdata->doclist, doc);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 ui_list_update(wdata->doclist);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 Document *doc = ui_list_get(wdata->doclist, 0);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 ui_attach_document(obj->ctx, doc);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 ui_show(obj);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 #ifndef UI_WIN32
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 int main(int argc, char **argv) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 ui_init(NULL, argc, argv);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 ui_onstartup(application_startup, NULL);
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 ui_main();
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 return 0;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 #else
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 return 0;
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 }
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129
1e34a27e016d add first code for binding demo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 #endif

mercurial