UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2014 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef CONTAINER_H 30 #define CONTAINER_H 31 32 #include "../ui/toolkit.h" 33 #include "../ui/container.h" 34 #include <cx/list.h> 35 #include <string.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 #define UI_APPLY_LAYOUT(layout, args) \ 42 layout.fill = args.fill; \ 43 layout.hexpand = args.hexpand; \ 44 layout.vexpand = args.vexpand; \ 45 layout.hfill = args.hfill; \ 46 layout.vfill = args.vfill; \ 47 layout.colspan = args.colspan; \ 48 layout.rowspan = args.rowspan 49 50 typedef enum UiBoxOrientation UiBoxOrientation; 51 52 #define ui_reset_layout(layout) memset(&(layout), 0, sizeof(UiLayout)) 53 #define ui_lb2bool(b) ((b) == UI_LAYOUT_TRUE ? TRUE : FALSE) 54 #define ui_bool2lb(b) ((b) ? UI_LAYOUT_TRUE : UI_LAYOUT_FALSE) 55 56 #define ui_obj_container(obj) (UiContainerPrivate*)obj->container_end 57 58 typedef struct UiLayout UiLayout; 59 60 struct UiLayout { 61 UiTri fill; 62 UiBool newline; 63 char *label; 64 UiBool hexpand; 65 UiBool vexpand; 66 UiBool hfill; 67 UiBool vfill; 68 int width; 69 int colspan; 70 int rowspan; 71 }; 72 73 enum UiBoxOrientation { 74 UI_BOX_VERTICAL = 0, 75 UI_BOX_HORIZONTAL 76 }; 77 78 typedef struct UiContainerPrivate UiContainerPrivate; 79 80 81 struct UiContainerPrivate { 82 UiContainerX container; 83 Widget (*prepare)(UiContainerPrivate*, Arg *, int*); 84 void (*add)(UiContainerPrivate*, Widget); 85 Widget widget; 86 UiLayout layout; 87 }; 88 89 typedef struct UiBoxContainer { 90 UiContainerPrivate container; 91 Dimension n; 92 } UiBoxContainer; 93 94 typedef struct UiGridContainer { 95 UiContainerPrivate container; 96 Dimension x; 97 Dimension y; 98 } UiGridContainer; 99 100 UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation); 101 Widget ui_vbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n); 102 Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n); 103 void ui_box_container_add(UiContainerPrivate *ctn, Widget widget); 104 105 106 UiContainerX* ui_grid_container(UiObject *obj, Widget grid); 107 Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n); 108 void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget); 109 110 #ifdef __cplusplus 111 } 112 #endif 113 114 #endif /* CONTAINER_H */ 115 116