ui/gtk/tree.c

changeset 142
46448d38885c
parent 140
c03c338a7dcf
child 146
dd0ae1c62a72
equal deleted inserted replaced
141:cc2170ea05ad 142:46448d38885c
44 44
45 UIWIDGET ui_listview_str(UiObject *obj, UiList *list, ui_callback f, void *udata) { 45 UIWIDGET ui_listview_str(UiObject *obj, UiList *list, ui_callback f, void *udata) {
46 return ui_listview(obj, list, ui_strmodel_getvalue, f, udata); 46 return ui_listview(obj, list, ui_strmodel_getvalue, f, udata);
47 } 47 }
48 48
49 UIWIDGET ui_listview_var(UiObject *obj, UiVar *var, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 49 UIWIDGET ui_listview_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
50 // create treeview 50 // create treeview
51 GtkWidget *view = gtk_tree_view_new(); 51 GtkWidget *view = gtk_tree_view_new();
52 GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); 52 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
53 GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL); 53 GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL);
54 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); 54 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
62 #endif 62 #endif
63 #else 63 #else
64 // TODO: implement for gtk2 64 // TODO: implement for gtk2
65 #endif 65 #endif
66 66
67 UiModelInfo *modelinfo = ui_model_info(obj->ctx, UI_STRING, "", -1); 67 UiModel *model = ui_model_info(obj->ctx, UI_STRING, "", -1);
68 modelinfo->getvalue = getvalue; 68 model->getvalue = getvalue;
69 UiList *list = var->value; 69 UiList *list = var->value;
70 UiListModel *model = ui_list_model_new(var, modelinfo); 70 UiListModel *listmodel = ui_list_model_new(var, model);
71 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(model)); 71 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel));
72 72
73 UiListView *listview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListView)); 73 UiListView *listview = malloc(sizeof(UiListView));
74 listview->ctx = obj->ctx; 74 listview->ctx = obj->ctx;
75 listview->widget = view; 75 listview->widget = view;
76 listview->var = var; 76 listview->var = var;
77 listview->modelinfo = modelinfo; 77 listview->model = model;
78 g_signal_connect( 78 g_signal_connect(
79 view, 79 view,
80 "destroy", 80 "destroy",
81 G_CALLBACK(ui_listview_destroy), 81 G_CALLBACK(ui_listview_destroy),
82 listview); 82 listview);
116 ct->current = view; 116 ct->current = view;
117 117
118 return scroll_area; 118 return scroll_area;
119 } 119 }
120 120
121 UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 121 UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
122 UiVar *var = malloc(sizeof(UiVar)); 122 UiVar *var = malloc(sizeof(UiVar));
123 var->value = list; 123 var->value = list;
124 var->type = UI_VAR_SPECIAL; 124 var->type = UI_VAR_SPECIAL;
125 return ui_listview_var(obj, var, getvalue, f, udata); 125 return ui_listview_var(obj, var, getvalue, f, udata);
126 } 126 }
127 127
128 UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 128 UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
129 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST); 129 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST);
130 if(var) { 130 if(var) {
131 return ui_listview_var(obj, var, getvalue, f, udata); 131 return ui_listview_var(obj, var, getvalue, f, udata);
132 } else { 132 } else {
133 // TODO: error 133 // TODO: error
134 } 134 }
135 return NULL; 135 return NULL;
136 } 136 }
137 137
138 138
139 UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModelInfo *modelinfo) { 139 UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModel *model, UiListCallbacks cb) {
140 // create treeview 140 // create treeview
141 GtkWidget *view = gtk_tree_view_new(); 141 GtkWidget *view = gtk_tree_view_new();
142 int addi = 0; 142 int addi = 0;
143 for(int i=0;i<modelinfo->columns;i++) { 143 for(int i=0;i<model->columns;i++) {
144 GtkTreeViewColumn *column = NULL; 144 GtkTreeViewColumn *column = NULL;
145 if(modelinfo->types[i] == UI_ICON_TEXT) { 145 if(model->types[i] == UI_ICON_TEXT) {
146 column = gtk_tree_view_column_new(); 146 column = gtk_tree_view_column_new();
147 gtk_tree_view_column_set_title(column, modelinfo->titles[i]); 147 gtk_tree_view_column_set_title(column, model->titles[i]);
148 148
149 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new(); 149 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new();
150 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new(); 150 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new();
151 151
152 gtk_tree_view_column_pack_end(column, textrenderer, TRUE); 152 gtk_tree_view_column_pack_end(column, textrenderer, TRUE);
158 158
159 addi++; 159 addi++;
160 } else { 160 } else {
161 GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); 161 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
162 column = gtk_tree_view_column_new_with_attributes( 162 column = gtk_tree_view_column_new_with_attributes(
163 modelinfo->titles[i], 163 model->titles[i],
164 renderer, 164 renderer,
165 "text", 165 "text",
166 i + addi, 166 i + addi,
167 NULL); 167 NULL);
168 } 168 }
176 #else 176 #else
177 177
178 #endif 178 #endif
179 179
180 UiList *list = var->value; 180 UiList *list = var->value;
181 UiListModel *model = ui_list_model_new(var, modelinfo); 181 UiListModel *listmodel = ui_list_model_new(var, model);
182 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(model)); 182 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel));
183 183
184 // add TreeView as observer to the UiList to update the TreeView if the 184 // add TreeView as observer to the UiList to update the TreeView if the
185 // data changes 185 // data changes
186 UiListView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListView)); 186 UiListView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListView));
187 tableview->ctx = obj->ctx; 187 tableview->ctx = obj->ctx;
188 tableview->widget = view; 188 tableview->widget = view;
189 tableview->var = var; 189 tableview->var = var;
190 tableview->modelinfo = modelinfo; 190 tableview->model = model;
191 g_signal_connect( 191 g_signal_connect(
192 view, 192 view,
193 "destroy", 193 "destroy",
194 G_CALLBACK(ui_listview_destroy), 194 G_CALLBACK(ui_listview_destroy),
195 tableview); 195 tableview);
199 list->obj = tableview; 199 list->obj = tableview;
200 200
201 // add callback 201 // add callback
202 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); 202 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData));
203 event->obj = obj; 203 event->obj = obj;
204 event->activate = modelinfo->activate; 204 event->activate = cb.activate;
205 event->selection = modelinfo->selection; 205 event->selection = cb.selection;
206 event->userdata = modelinfo->userdata; 206 event->userdata = cb.userdata;
207 if(modelinfo->activate) { 207 if(cb.activate) {
208 g_signal_connect( 208 g_signal_connect(
209 view, 209 view,
210 "row-activated", 210 "row-activated",
211 G_CALLBACK(ui_listview_activate_event), 211 G_CALLBACK(ui_listview_activate_event),
212 event); 212 event);
213 } 213 }
214 if(modelinfo->selection) { 214 if(cb.selection) {
215 GtkTreeSelection *selection = gtk_tree_view_get_selection( 215 GtkTreeSelection *selection = gtk_tree_view_get_selection(
216 GTK_TREE_VIEW(view)); 216 GTK_TREE_VIEW(view));
217 g_signal_connect( 217 g_signal_connect(
218 selection, 218 selection,
219 "changed", 219 "changed",
241 ct->current = view; 241 ct->current = view;
242 242
243 return scroll_area; 243 return scroll_area;
244 } 244 }
245 245
246 UIWIDGET ui_table(UiObject *obj, UiList *list, UiModelInfo *modelinfo) { 246 UIWIDGET ui_table(UiObject *obj, UiList *list, UiModel *model, UiListCallbacks cb) {
247 UiVar *var = malloc(sizeof(UiVar)); 247 UiVar *var = malloc(sizeof(UiVar));
248 var->value = list; 248 var->value = list;
249 var->type = UI_VAR_SPECIAL; 249 var->type = UI_VAR_SPECIAL;
250 return ui_table_var(obj, var, modelinfo); 250 return ui_table_var(obj, var, model, cb);
251 } 251 }
252 252
253 UIWIDGET ui_table_nv(UiObject *obj, char *varname, UiModelInfo *modelinfo) { 253 UIWIDGET ui_table_nv(UiObject *obj, char *varname, UiModel *model, UiListCallbacks cb) {
254 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST); 254 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST);
255 if(var) { 255 if(var) {
256 return ui_table_var(obj, var, modelinfo); 256 return ui_table_var(obj, var, model, cb);
257 } else { 257 } else {
258 // TODO: error 258 // TODO: error
259 } 259 }
260 return NULL; 260 return NULL;
261 } 261 }
262 262
263 void ui_listview_update(UiList *list, int i) { 263 void ui_listview_update(UiList *list, int i) {
264 UiListView *view = list->obj; 264 UiListView *view = list->obj;
265 UiListModel *model = ui_list_model_new(view->var, view->modelinfo); 265 UiListModel *model = ui_list_model_new(view->var, view->model);
266 gtk_tree_view_set_model(GTK_TREE_VIEW(view->widget), GTK_TREE_MODEL(model)); 266 gtk_tree_view_set_model(GTK_TREE_VIEW(view->widget), GTK_TREE_MODEL(model));
267 // TODO: free old model 267 // TODO: free old model
268 } 268 }
269 269
270 void ui_listview_destroy(GtkWidget *w, UiListView *v) { 270 void ui_listview_destroy(GtkWidget *w, UiListView *v) {
353 353
354 UIWIDGET ui_combobox_str(UiObject *obj, UiList *list, ui_callback f, void *udata) { 354 UIWIDGET ui_combobox_str(UiObject *obj, UiList *list, ui_callback f, void *udata) {
355 return ui_combobox(obj, list, ui_strmodel_getvalue, f, udata); 355 return ui_combobox(obj, list, ui_strmodel_getvalue, f, udata);
356 } 356 }
357 357
358 UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 358 UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
359 UiVar *var = malloc(sizeof(UiVar)); 359 UiVar *var = malloc(sizeof(UiVar));
360 var->value = list; 360 var->value = list;
361 var->type = UI_VAR_SPECIAL; 361 var->type = UI_VAR_SPECIAL;
362 return ui_combobox_var(obj, var, getvalue, f, udata); 362 return ui_combobox_var(obj, var, getvalue, f, udata);
363 } 363 }
364 364
365 UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 365 UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
366 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST); 366 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST);
367 if(var) { 367 if(var) {
368 return ui_combobox_var(obj, var, getvalue, f, udata); 368 return ui_combobox_var(obj, var, getvalue, f, udata);
369 } else { 369 } else {
370 // TODO: error 370 // TODO: error
371 } 371 }
372 return NULL; 372 return NULL;
373 } 373 }
374 374
375 UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { 375 UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
376 UiModelInfo *modelinfo = ui_model_info(obj->ctx, UI_STRING, "", -1); 376 UiModel *model = ui_model_info(obj->ctx, UI_STRING, "", -1);
377 modelinfo->getvalue = getvalue; 377 model->getvalue = getvalue;
378 UiList *list = var->value; 378 UiListModel *listmodel = ui_list_model_new(var, model);
379 UiListModel *model = ui_list_model_new(var, modelinfo); 379
380 380 GtkWidget *combobox = ui_create_combobox(obj, listmodel, f, udata);
381 GtkWidget *combobox = ui_create_combobox(obj, model, f, udata);
382 UiContainer *ct = uic_get_current_container(obj); 381 UiContainer *ct = uic_get_current_container(obj);
383 ct->add(ct, combobox, FALSE); 382 ct->add(ct, combobox, FALSE);
384 } 383 }
385 384
386 GtkWidget* ui_create_combobox(UiObject *obj, UiListModel *model, ui_callback f, void *udata) { 385 GtkWidget* ui_create_combobox(UiObject *obj, UiListModel *model, ui_callback f, void *udata) {
388 387
389 UiListView *uicbox = malloc(sizeof(UiListView)); 388 UiListView *uicbox = malloc(sizeof(UiListView));
390 uicbox->ctx = obj->ctx; 389 uicbox->ctx = obj->ctx;
391 uicbox->widget = combobox; 390 uicbox->widget = combobox;
392 uicbox->var = model->var; 391 uicbox->var = model->var;
393 uicbox->modelinfo = model->info; 392 uicbox->model = model->info;
394 393
395 g_signal_connect( 394 g_signal_connect(
396 combobox, 395 combobox,
397 "destroy", 396 "destroy",
398 G_CALLBACK(ui_listview_destroy), 397 G_CALLBACK(ui_listview_destroy),
441 e->callback(&event, e->userdata); 440 e->callback(&event, e->userdata);
442 } 441 }
443 442
444 void ui_combobox_modelupdate(UiList *list, int i) { 443 void ui_combobox_modelupdate(UiList *list, int i) {
445 UiListView *view = list->obj; 444 UiListView *view = list->obj;
446 UiListModel *model = ui_list_model_new(view->var, view->modelinfo); 445 UiListModel *model = ui_list_model_new(view->var, view->model);
447 gtk_combo_box_set_model(GTK_COMBO_BOX(view->widget), GTK_TREE_MODEL(model)); 446 gtk_combo_box_set_model(GTK_COMBO_BOX(view->widget), GTK_TREE_MODEL(model));
448 } 447 }
449 448

mercurial