Sun, 07 Dec 2025 20:00:33 +0100
fix settings dialog doesn't open when there is no .dav/config.xml file
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2025 Olaf Wintermann. All rights reserved. |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
77254bd6dccb
update toolkit, adjust UI code
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 |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include "container.h" |
| 112 | 30 | #include "grid.h" |
| 31 | ||
| 32 | #include "../common/context.h" | |
| 33 | #include "../common/container.h" | |
| 34 | #include "../motif/container.h" | |
| 35 | ||
| 36 | ||
| 37 | static W32WidgetClass grid_layout_widget_class = { | |
| 38 | .eventproc = NULL, | |
| 39 | .enable = NULL, | |
| 40 | .show = w32_widget_default_show, | |
| 41 | .get_preferred_size = ui_grid_layout_get_preferred_size, | |
| 42 | .destroy = w32_widget_default_destroy | |
| 43 | }; | |
| 44 | ||
| 45 | UiContainerPrivate* ui_obj_container(UiObject *obj) { | |
| 46 | return (UiContainerPrivate*)obj->container_end; | |
| 47 | } | |
| 48 | ||
| 49 | HWND ui_container_get_parent(UiContainerPrivate *ctn) { | |
| 50 | return ctn->parent ? ctn->parent(ctn) : ctn->hwnd; | |
| 51 | } | |
| 52 | ||
| 53 | void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { | |
| 54 | UiLayout layout2 = *layout; | |
| 55 | if (layout2.margin > 0) { | |
| 56 | layout2.margin_left = layout2.margin; | |
| 57 | layout2.margin_right = layout2.margin; | |
| 58 | layout2.margin_top = layout2.margin; | |
| 59 | layout2.margin_bottom = layout2.margin; | |
| 60 | } | |
| 61 | ctn->add(ctn, widget, &layout2); | |
| 62 | ctn->container.newline = FALSE; | |
| 63 | } | |
| 64 | ||
| 65 | W32Size ui_grid_layout_get_preferred_size(W32Widget *widget) { | |
| 66 | UiGridLayout *grid = widget->layoutmanager; | |
| 67 | W32Size size; | |
| 68 | size.width = grid->preferred_width; | |
| 69 | size.height = grid->preferred_height; | |
| 70 | return size; | |
| 71 | } | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | /* ---------------------------- Box Container ---------------------------- */ |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | return NULL; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | // public |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | return box_create(obj, args, UI_BOX_VERTICAL); |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | // public |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | return box_create(obj, args, UI_BOX_HORIZONTAL); |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | |
| 112 | 90 | UiContainerX* ui_box_container_create(UiObject *obj, HWND hwnd, UiBoxOrientation orientation, short spacing, GridEdgeInsets padding) { |
| 91 | UiBoxContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiBoxContainer)); | |
| 92 | container->container.hwnd = hwnd; | |
| 93 | container->container.add = ui_box_container_add; | |
| 94 | container->layout = ui_grid_layout_create(obj->ctx->allocator, spacing, spacing); | |
| 95 | container->layout->padding = padding; | |
| 96 | container->orientation = orientation; | |
| 97 | return (UiContainerX*)container; | |
| 98 | } | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | |
| 112 | 100 | void ui_box_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| 101 | UiBoxContainer *box = (UiBoxContainer*)ctn; | |
| 102 | GridLayoutInfo gridLayout = (GridLayoutInfo) { | |
| 103 | .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, | |
| 104 | }; | |
| 105 | if (box->orientation == UI_BOX_HORIZONTAL) { | |
| 106 | gridLayout.vexpand = TRUE; | |
| 107 | gridLayout.vfill = TRUE; | |
| 108 | gridLayout.hexpand = layout->fill; | |
| 109 | gridLayout.hfill = layout->fill; | |
| 110 | } else { | |
| 111 | gridLayout.hexpand = TRUE; | |
| 112 | gridLayout.hfill = TRUE; | |
| 113 | gridLayout.vexpand = layout->fill; | |
| 114 | gridLayout.vfill = layout->fill; | |
| 115 | } | |
| 116 | ui_grid_add_widget(box->layout, box->x, box->y, widget, &gridLayout); | |
| 117 | if (box->orientation == UI_BOX_HORIZONTAL) { | |
| 118 | box->x++; | |
| 119 | } else { | |
| 120 | box->y++; | |
| 121 | } | |
| 122 | } | |
| 123 | ||
| 124 | /* ---------------------------- Grid Container ---------------------------- */ | |
| 125 | ||
| 126 | UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { | |
| 127 | HINSTANCE hInstance = GetModuleHandle(NULL); | |
| 128 | UiContainerPrivate *container = ui_obj_container(obj); | |
| 129 | HWND parent = ui_container_get_parent(container); | |
| 130 | UiLayout layout = UI_ARGS2LAYOUT(args); | |
| 131 | ||
| 132 | HWND hwnd = CreateWindowEx( | |
| 133 | 0, | |
| 134 | TEXT("STATIC"), | |
| 135 | NULL, | |
| 136 | WS_CHILD | WS_VISIBLE, | |
| 137 | 0, 0, 100, 100, | |
| 138 | parent, | |
| 139 | NULL, | |
| 140 | hInstance, | |
| 141 | NULL); | |
| 113 | 142 | SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ui_default_eventproc); |
| 112 | 143 | |
| 144 | W32Widget *widget = w32_widget_new(&grid_layout_widget_class, hwnd); | |
| 145 | ui_container_add(container, widget, &layout); | |
| 146 | ||
| 147 | UiContainerX *gridContainer = ui_grid_container_create(obj, hwnd, args->columnspacing, args->rowspacing, INSETS_ZERO); | |
| 148 | uic_object_push_container(obj, gridContainer); | |
| 149 | ||
| 150 | UiGridLayoutContainer *grid = (UiGridLayoutContainer*)gridContainer; | |
| 151 | widget->layout = (W32LayoutFunc)ui_grid_layout; | |
| 152 | widget->layoutmanager = grid->layout; | |
| 153 | grid->layout->preferred_width = 200; | |
| 154 | grid->layout->preferred_height = 200; | |
| 155 | ||
| 156 | return widget; | |
| 157 | } | |
| 158 | ||
| 159 | UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short columnspacing, short rowspacing, GridEdgeInsets padding) { | |
| 160 | UiGridLayoutContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiGridLayoutContainer)); | |
| 161 | container->container.hwnd = hwnd; | |
| 162 | container->container.add = ui_grid_container_add; | |
| 163 | container->layout = ui_grid_layout_create(obj->ctx->allocator, columnspacing, rowspacing); | |
| 164 | container->layout->padding = padding; | |
| 165 | return (UiContainerX*)container; | |
| 166 | } | |
| 167 | ||
| 168 | void ui_grid_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { | |
| 169 | UiGridLayoutContainer *grid = (UiGridLayoutContainer*)ctn; | |
| 170 | if (ctn->container.newline) { | |
| 171 | grid->y++; | |
| 172 | grid->x = 0; | |
| 173 | } | |
| 174 | ||
| 175 | uic_layout_setup_expand_fill(layout, grid->def_hexpand, grid->def_vexpand, grid->def_hfill, grid->def_vfill); | |
| 176 | GridLayoutInfo gridLayout = (GridLayoutInfo) { | |
| 177 | .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, | |
| 178 | .colspan = layout->colspan, | |
| 179 | .rowspan = layout->rowspan, | |
| 180 | .hexpand = layout->hexpand, | |
| 181 | .vexpand = layout->vexpand, | |
| 182 | .hfill = layout->hfill, | |
| 183 | .vfill = layout->vfill, | |
| 184 | }; | |
| 185 | ui_grid_add_widget(grid->layout, grid->x, grid->y, widget, &gridLayout); | |
| 186 | ||
| 187 | grid->x++; | |
| 188 | } | |
| 189 | ||
| 190 | ||
| 191 | /* ---------------------------- Container Helper ---------------------------- */ | |
| 192 | ||
| 193 | void ui_container_begin_close(UiObject *obj) { | |
| 194 | UiContainerX *ct = obj->container_end; | |
| 195 | ct->close = 1; | |
| 196 | } | |
| 197 | ||
| 198 | int ui_container_finish(UiObject *obj) { | |
| 199 | UiContainerX *ct = obj->container_end; | |
| 200 | if(ct->close) { | |
| 201 | ui_end_new(obj); | |
| 202 | return 0; | |
| 203 | } | |
| 204 | return 1; | |
| 205 | } |