ui/motif/tree.c

changeset 153
ee49d1852a5f
parent 128
c284c15509a8
child 157
0b33b9396851
equal deleted inserted replaced
152:62921b370c60 153:ee49d1852a5f
36 #include "container.h" 36 #include "container.h"
37 #include "../common/object.h" 37 #include "../common/object.h"
38 #include "../common/context.h" 38 #include "../common/context.h"
39 #include "../../ucx/utils.h" 39 #include "../../ucx/utils.h"
40 40
41 UIWIDGET ui_table(UiObject *obj, UiList *model, UiModelInfo *modelinfo) { 41 UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModel *model, UiListCallbacks cb) {
42 // TODO: check if modelinfo is complete 42 // TODO: check if modelinfo is complete
43 43
44 Arg args[32]; 44 Arg args[32];
45 int n = 0; 45 int n = 0;
46 46
56 ct->add(ct, scrollw); 56 ct->add(ct, scrollw);
57 XtManageChild(scrollw); 57 XtManageChild(scrollw);
58 58
59 // create table headers 59 // create table headers
60 XmStringTable header = (XmStringTable)XtMalloc( 60 XmStringTable header = (XmStringTable)XtMalloc(
61 modelinfo->columns * sizeof(XmString)); 61 model->columns * sizeof(XmString));
62 for(int i=0;i<modelinfo->columns;i++) { 62 for(int i=0;i<model->columns;i++) {
63 header[i] = XmStringCreateLocalized(modelinfo->titles[i]); 63 header[i] = XmStringCreateLocalized(model->titles[i]);
64 } 64 }
65 n = 0; 65 n = 0;
66 XtSetArg(args[n], XmNdetailColumnHeading, header); 66 XtSetArg(args[n], XmNdetailColumnHeading, header);
67 n++; 67 n++;
68 XtSetArg(args[n], XmNdetailColumnHeadingCount, modelinfo->columns); 68 XtSetArg(args[n], XmNdetailColumnHeadingCount, model->columns);
69 n++; 69 n++;
70 70
71 // set res 71 // set res
72 XtSetArg(args[n], XmNlayoutType, XmDETAIL); 72 XtSetArg(args[n], XmNlayoutType, XmDETAIL);
73 n++; 73 n++;
86 XtManageChild(container); 86 XtManageChild(container);
87 87
88 // add callbacks 88 // add callbacks
89 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); 89 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData));
90 event->obj = obj; 90 event->obj = obj;
91 event->activate = modelinfo->activate; 91 event->activate = cb.activate;
92 event->selection = modelinfo->selection; 92 event->selection = cb.selection;
93 event->userdata = modelinfo->userdata; 93 event->userdata = cb.userdata;
94 event->last_selection = NULL; 94 event->last_selection = NULL;
95 if(modelinfo->selection) { 95 if(cb.selection) {
96 XtAddCallback( 96 XtAddCallback(
97 container, 97 container,
98 XmNselectionCallback, 98 XmNselectionCallback,
99 (XtCallbackProc)ui_table_select_callback, 99 (XtCallbackProc)ui_table_select_callback,
100 event); 100 event);
101 } 101 }
102 if(modelinfo->activate) { 102 if(cb.activate) {
103 XtAddCallback( 103 XtAddCallback(
104 container, 104 container,
105 XmNdefaultActionCallback, 105 XmNdefaultActionCallback,
106 (XtCallbackProc)ui_table_action_callback, 106 (XtCallbackProc)ui_table_action_callback,
107 event); 107 event);
108 } 108 }
109 109
110 // add initial data 110 // add initial data
111 void *data = model->first(model); 111 UiList *list = var->value;
112 void *data = list->first(list);
112 int width = 0; 113 int width = 0;
113 while(data) { 114 while(data) {
114 int w = ui_add_icon_gadget(container, modelinfo, data); 115 int w = ui_add_icon_gadget(container, model, data);
115 if(w > width) { 116 if(w > width) {
116 width = w; 117 width = w;
117 } 118 }
118 data = model->next(model); 119 data = list->next(list);
119 } 120 }
120 121
121 UiTableView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiTableView)); 122 UiTableView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiTableView));
122 tableview->widget = container; 123 tableview->widget = container;
123 tableview->list = model; 124 tableview->var = var;
124 tableview->modelinfo = modelinfo; 125 tableview->model = model;
125 model->observers = ui_add_observer(
126 model->observers,
127 (ui_callback)ui_table_update,
128 tableview);
129 126
130 // set new XmContainer width 127 // set new XmContainer width
131 XtVaSetValues(container, XmNwidth, width, NULL); 128 XtVaSetValues(container, XmNwidth, width, NULL);
132 129
133 // cleanup 130 // cleanup
134 for(int i=0;i<modelinfo->columns;i++) { 131 for(int i=0;i<model->columns;i++) {
135 XmStringFree(header[i]); 132 XmStringFree(header[i]);
136 } 133 }
137 XtFree((char*)header); 134 XtFree((char*)header);
138 135
139 return scrollw; 136 return scrollw;
137 }
138
139 UIWIDGET ui_table(UiObject *obj, UiList *data, UiModel *model, UiListCallbacks cb) {
140 UiVar *var = malloc(sizeof(UiVar));
141 var->value = data;
142 var->type = UI_VAR_SPECIAL;
143 return ui_table_var(obj, var, model, cb);
140 } 144 }
141 145
142 void ui_table_update(UiEvent *event, UiTableView *view) { 146 void ui_table_update(UiEvent *event, UiTableView *view) {
143 // clear container 147 // clear container
144 Widget *children; 148 Widget *children;
154 158
155 for(int i=0;i<nc;i++) { 159 for(int i=0;i<nc;i++) {
156 XtDestroyWidget(children[i]); 160 XtDestroyWidget(children[i]);
157 } 161 }
158 162
159 UiList *model = view->list; 163 UiList *list = view->var->value;
160 164
161 void *data = model->first(model); 165 void *data = list->first(list);
162 int width = 0; 166 int width = 0;
163 while(data) { 167 while(data) {
164 int w = ui_add_icon_gadget(view->widget, view->modelinfo, data); 168 int w = ui_add_icon_gadget(view->widget, view->model, data);
165 if(w > width) { 169 if(w > width) {
166 width = w; 170 width = w;
167 } 171 }
168 data = model->next(model); 172 data = list->next(list);
169 } 173 }
170 174
171 } 175 }
172 176
173 #define UI_COL_CHAR_WIDTH 12 177 #define UI_COL_CHAR_WIDTH 12
174 178
175 int ui_add_icon_gadget(Widget container, UiModelInfo *modelinfo, void *data) { 179 int ui_add_icon_gadget(Widget container, UiModel *model, void *data) {
176 int width = 50; 180 int width = 50;
177 181
178 if(modelinfo->columns == 0) { 182 if(model->columns == 0) {
179 return width; 183 return width;
180 } 184 }
181 185
182 XmString label = NULL; 186 XmString label = NULL;
183 Arg args[8]; 187 Arg args[8];
184 Boolean f; 188 Boolean f;
185 // first column 189 // first column
186 if(modelinfo->types[0] != 12345678) { // TODO: icon/label type 190 if(model->types[0] != 12345678) { // TODO: icon/label type
187 char *str = ui_type_to_string( 191 char *str = ui_type_to_string(
188 modelinfo->types[0], 192 model->types[0],
189 modelinfo->getvalue(data, 0), 193 model->getvalue(data, 0),
190 &f); 194 &f);
191 195
192 // column width 196 // column width
193 width += strlen(str) * UI_COL_CHAR_WIDTH; 197 width += strlen(str) * UI_COL_CHAR_WIDTH;
194 198
202 // TODO 206 // TODO
203 } 207 }
204 208
205 // remaining columns are the icon gadget details 209 // remaining columns are the icon gadget details
206 XmStringTable details = (XmStringTable)XtMalloc( 210 XmStringTable details = (XmStringTable)XtMalloc(
207 (modelinfo->columns - 1) * sizeof(XmString)); 211 (model->columns - 1) * sizeof(XmString));
208 for(int i=1;i<modelinfo->columns;i++) { 212 for(int i=1;i<model->columns;i++) {
209 char *str = ui_type_to_string( 213 char *str = ui_type_to_string(
210 modelinfo->types[i], 214 model->types[i],
211 modelinfo->getvalue(data, i), 215 model->getvalue(data, i),
212 &f); 216 &f);
213 217
214 // column width 218 // column width
215 width += strlen(str) * UI_COL_CHAR_WIDTH; 219 width += strlen(str) * UI_COL_CHAR_WIDTH;
216 220
218 if(f) { 222 if(f) {
219 free(str); 223 free(str);
220 } 224 }
221 } 225 }
222 XtSetArg(args[1], XmNdetail, details); 226 XtSetArg(args[1], XmNdetail, details);
223 XtSetArg(args[2], XmNdetailCount, modelinfo->columns - 1); 227 XtSetArg(args[2], XmNdetailCount, model->columns - 1);
224 XtSetArg(args[3], XmNshadowThickness, 0); 228 XtSetArg(args[3], XmNshadowThickness, 0);
225 // create widget 229 // create widget
226 Widget item = XmCreateIconGadget(container, "table_item", args, 4); 230 Widget item = XmCreateIconGadget(container, "table_item", args, 4);
227 XtManageChild(item); 231 XtManageChild(item);
228 232
229 // cleanup 233 // cleanup
230 XmStringFree(label); 234 XmStringFree(label);
231 for(int i=0;i<modelinfo->columns-1;i++) { 235 for(int i=0;i<model->columns-1;i++) {
232 XmStringFree(details[i]); 236 XmStringFree(details[i]);
233 } 237 }
234 XtFree((char*)details); 238 XtFree((char*)details);
235 239
236 return width; 240 return width;

mercurial