static void _add_circle(GtkWidget *widget, GdkEventButton *e, dt_iop_module_t *self) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { //we unset the creation mode dt_masks_form_t *form = darktable.develop->form_visible; if (form) dt_masks_free_form(form); dt_masks_change_form_gui(NULL); dt_masks_init_formgui(darktable.develop); GTK_TOGGLE_BUTTON(widget)->active = FALSE; return; } //we want to be sure that the iop has focus dt_iop_request_focus(self); //we create the new form dt_masks_form_t *spot = dt_masks_create(DT_MASKS_CIRCLE|DT_MASKS_CLONE); dt_masks_change_form_gui(spot); darktable.develop->form_gui->creation = TRUE; darktable.develop->form_gui->creation_module = self; dt_control_queue_redraw_center(); }
static int dt_circle_events_button_released(struct dt_iop_module_t *module,float pzx, float pzy, int which, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui,int index) { if (which == 3 && parentid > 0 && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_init_formgui(darktable.develop); //we hide the form if (!(darktable.develop->form_visible->type & DT_MASKS_GROUP)) darktable.develop->form_visible = NULL; else if (g_list_length(darktable.develop->form_visible->points) < 2) darktable.develop->form_visible = NULL; else { GList *forms = g_list_first(darktable.develop->form_visible->points); while (forms) { dt_masks_point_group_t *gpt = (dt_masks_point_group_t *)forms->data; if (gpt->formid == form->formid) { darktable.develop->form_visible->points = g_list_remove(darktable.develop->form_visible->points,gpt); break; } forms = g_list_next(forms); } } //we remove the shape dt_masks_form_remove(module,dt_masks_get_from_id(darktable.develop,parentid),form); dt_dev_masks_list_remove(darktable.develop,form->formid,parentid); return 1; } if (gui->form_dragging) { //we get the circle dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *) (g_list_first(form->points)->data); //we end the form dragging gui->form_dragging = FALSE; //we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = {pzx*wd+gui->dx,pzy*ht+gui->dy}; dt_dev_distort_backtransform(darktable.develop,pts,1); circle->center[0] = pts[0]/darktable.develop->preview_pipe->iwidth; circle->center[1] = pts[1]/darktable.develop->preview_pipe->iheight; dt_masks_write_form(form,darktable.develop); //we recreate the form points dt_masks_gui_form_remove(form,gui,index); dt_masks_gui_form_create(form,gui,index); //we save the move dt_masks_update_image(darktable.develop); return 1; } else if (gui->source_dragging) { //we end the form dragging gui->source_dragging = FALSE; if (gui->scrollx != 0.0 || gui->scrolly != 0.0) { dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *) (g_list_first(form->points)->data); form->source[0] = circle->center[0] + circle->radius; form->source[1] = circle->center[1] - circle->radius; gui->scrollx = gui->scrolly = 0.0; } else { //we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = {pzx*wd+gui->dx,pzy*ht+gui->dy}; dt_dev_distort_backtransform(darktable.develop,pts,1); form->source[0] = pts[0]/darktable.develop->preview_pipe->iwidth; form->source[1] = pts[1]/darktable.develop->preview_pipe->iheight; } dt_masks_write_form(form,darktable.develop); //we recreate the form points dt_masks_gui_form_remove(form,gui,index); dt_masks_gui_form_create(form,gui,index); //we save the move dt_masks_update_image(darktable.develop); return 1; } return 0; }