| 3082 |
3082 |
| 3083 static void ui_destroy_sourcelist2(GtkWidget *w, UiListBox2 *v) { |
3083 static void ui_destroy_sourcelist2(GtkWidget *w, UiListBox2 *v) { |
| 3084 cxListFree(v->rows); |
3084 cxListFree(v->rows); |
| 3085 free(v->onactivate_action); |
3085 free(v->onactivate_action); |
| 3086 free(v->onbuttonclick_action); |
3086 free(v->onbuttonclick_action); |
| |
3087 free(v->oncontextmenupopup_action); |
| |
3088 if(v->contextmenu) { |
| |
3089 ui_menubuilder_unref(v->contextmenu); |
| |
3090 } |
| 3087 free(v); |
3091 free(v); |
| 3088 } |
3092 } |
| 3089 |
3093 |
| 3090 static void ui_destroy_listbox2_row(UiListBox2Row *row) { |
3094 static void ui_destroy_listbox2_row(UiListBox2Row *row) { |
| 3091 cxListFree(row->children); |
3095 cxListFree(row->children); |
| 3124 uilistbox->onactivatedata = args->onactivatedata; |
3128 uilistbox->onactivatedata = args->onactivatedata; |
| 3125 uilistbox->onactivate_action = args->onactivate_action ? strdup(args->onactivate_action) : NULL; |
3129 uilistbox->onactivate_action = args->onactivate_action ? strdup(args->onactivate_action) : NULL; |
| 3126 uilistbox->onbuttonclick = args->onbuttonclick; |
3130 uilistbox->onbuttonclick = args->onbuttonclick; |
| 3127 uilistbox->onbuttonclickdata = args->onbuttonclickdata; |
3131 uilistbox->onbuttonclickdata = args->onbuttonclickdata; |
| 3128 uilistbox->onbuttonclick_action = args->onbuttonclick_action ? strdup(args->onbuttonclick_action) : NULL; |
3132 uilistbox->onbuttonclick_action = args->onbuttonclick_action ? strdup(args->onbuttonclick_action) : NULL; |
| |
3133 uilistbox->oncontextmenupopup = args->oncontextmenupopup; |
| |
3134 uilistbox->oncontextmenupopupdata = args->oncontextmenupopupdata; |
| |
3135 uilistbox->oncontextmenupopup_action = args->oncontextmenupopup_action ? strdup(args->oncontextmenupopup_action) : NULL; |
| |
3136 uilistbox->contextmenu = NULL; |
| |
3137 |
| |
3138 if(args->contextmenu) { |
| |
3139 uilistbox->contextmenu = args->contextmenu; |
| |
3140 ui_menubuilder_ref(args->contextmenu); |
| |
3141 } |
| 3129 |
3142 |
| 3130 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
3143 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
| 3131 uilistbox->var = var; |
3144 uilistbox->var = var; |
| 3132 if(var) { |
3145 if(var) { |
| 3133 UiList *list = var->value; |
3146 UiList *list = var->value; |
| 3141 // register uilistbox for both widgets, so it doesn't matter which |
3154 // register uilistbox for both widgets, so it doesn't matter which |
| 3142 // widget is used later |
3155 // widget is used later |
| 3143 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox); |
3156 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox); |
| 3144 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox); |
3157 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox); |
| 3145 |
3158 |
| 3146 if(args->contextmenu) { |
|
| 3147 UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, listbox); |
|
| 3148 ui_widget_set_contextmenu(listbox, menu); |
|
| 3149 } |
|
| 3150 |
|
| 3151 // signals |
3159 // signals |
| 3152 g_signal_connect( |
3160 g_signal_connect( |
| 3153 listbox, |
3161 listbox, |
| 3154 "destroy", |
3162 "destroy", |
| 3155 G_CALLBACK(ui_destroy_sourcelist2), |
3163 G_CALLBACK(ui_destroy_sourcelist2), |
| 3229 return TRUE; |
3237 return TRUE; |
| 3230 } |
3238 } |
| 3231 |
3239 |
| 3232 #endif |
3240 #endif |
| 3233 |
3241 |
| |
3242 static void listbox2_on_contextmenu_popup(UiEvent *ununsed, void *userdata) { |
| |
3243 UiListBox2Row *row = userdata; |
| |
3244 |
| |
3245 UiListSelection sel; |
| |
3246 sel.count = 1; |
| |
3247 sel.rows = &row->index; |
| |
3248 |
| |
3249 UiEvent event; |
| |
3250 event.obj = row->listbox->obj; |
| |
3251 event.window = event.obj->window; |
| |
3252 event.document = event.obj->ctx->document; |
| |
3253 event.eventdata = &sel; |
| |
3254 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION; |
| |
3255 event.intval = row->index; |
| |
3256 event.set = 0; |
| |
3257 |
| |
3258 if(row->listbox->oncontextmenupopup) { |
| |
3259 row->listbox->oncontextmenupopup(&event, row->listbox->oncontextmenupopupdata); |
| |
3260 } |
| |
3261 if(row->listbox->oncontextmenupopup_action) { |
| |
3262 uic_action_callback(&event, row->listbox->oncontextmenupopup_action); |
| |
3263 } |
| |
3264 } |
| |
3265 |
| 3234 #define LISTBOX2_ITEM_HBOX_SPACING 10 |
3266 #define LISTBOX2_ITEM_HBOX_SPACING 10 |
| 3235 static void listbox2_update_item(UiListBox2Row *rowdata, GtkWidget *row, UiSourceListItem *item, int identation) { |
3267 static void listbox2_update_item(UiListBox2Row *rowdata, GtkWidget *row, UiSourceListItem *item, int identation) { |
| 3236 GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, LISTBOX2_ITEM_HBOX_SPACING); |
3268 GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, LISTBOX2_ITEM_HBOX_SPACING); |
| 3237 |
3269 |
| 3238 rowdata->expanded = 1; |
3270 rowdata->expanded = 1; |
| 3239 GtkWidget *expander = gtk_image_new(); |
3271 GtkWidget *expander = gtk_image_new(); |
| 3240 GtkWidget *expander0 = expander; |
3272 GtkWidget *expander0 = expander; |
| 3241 IMAGE_SET_ICON(expander, "pan-down-symbolic"); |
3273 IMAGE_SET_ICON(expander, "pan-down-symbolic"); |
| 3242 int exp_width = 0; |
3274 int exp_width = 0; |
| 3368 row_data.depth = item.depth; |
3400 row_data.depth = item.depth; |
| 3369 cxListAdd(listbox->rows, &row_data); |
3401 cxListAdd(listbox->rows, &row_data); |
| 3370 UiListBox2Row *row_data_ptr = cxListLast(listbox->rows); |
3402 UiListBox2Row *row_data_ptr = cxListLast(listbox->rows); |
| 3371 listbox2_update_item(row_data_ptr, row0, &item, item.depth - (item.depth > 0 ? heading : 0)); |
3403 listbox2_update_item(row_data_ptr, row0, &item, item.depth - (item.depth > 0 ? heading : 0)); |
| 3372 |
3404 |
| |
3405 if(listbox->contextmenu) { |
| |
3406 row_data_ptr->contextmenu_popup_handler.callback = listbox2_on_contextmenu_popup; |
| |
3407 row_data_ptr->contextmenu_popup_handler.userdata = row_data_ptr; |
| |
3408 g_object_set_data(G_OBJECT(row), "ui_contextmenu_handler", &row_data_ptr->contextmenu_popup_handler); |
| |
3409 UIMENU menu = ui_contextmenu_create(listbox->contextmenu, listbox->obj, row); |
| |
3410 ui_widget_set_contextmenu(row, menu); |
| |
3411 } |
| |
3412 |
| 3373 if(item.depth >= stack_size) { |
3413 if(item.depth >= stack_size) { |
| 3374 stack_size += 8; |
3414 stack_size += 8; |
| 3375 stack = realloc(stack, stack_size * sizeof(UiListBox2Row*)); |
3415 stack = realloc(stack, stack_size * sizeof(UiListBox2Row*)); |
| 3376 } |
3416 } |
| 3377 stack[item.depth] = row_data_ptr; |
3417 stack[item.depth] = row_data_ptr; |