ui/gtk/list.c

changeset 1256
da0899b1699d
parent 1254
dac36413bad1
equal deleted inserted replaced
1255:4681df3739f7 1256:da0899b1699d
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;

mercurial