void _lib_navigation_set_position(dt_lib_module_t *self, double x, double y, int wd, int ht) { dt_lib_navigation_t *d = (dt_lib_navigation_t *)self->data; dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); int closeup = dt_control_get_dev_closeup(); float zoom_x = dt_control_get_dev_zoom_x(); float zoom_y = dt_control_get_dev_zoom_y(); if(d->dragging && zoom != DT_ZOOM_FIT) { const int inset = DT_NAVIGATION_INSET; const float width = wd - 2 * inset, height = ht - 2 * inset; const dt_develop_t *dev = darktable.develop; int iwd, iht; dt_dev_get_processed_size(dev, &iwd, &iht); zoom_x = fmaxf( -.5, fminf(((x - inset) / width - .5f) / (iwd * fminf(wd / (float)iwd, ht / (float)iht) / (float)wd), .5)); zoom_y = fmaxf( -.5, fminf(((y - inset) / height - .5f) / (iht * fminf(wd / (float)iwd, ht / (float)iht) / (float)ht), .5)); dt_dev_check_zoom_bounds(darktable.develop, &zoom_x, &zoom_y, zoom, closeup, NULL, NULL); dt_control_set_dev_zoom_x(zoom_x); dt_control_set_dev_zoom_y(zoom_y); /* redraw myself */ gtk_widget_queue_draw(self->widget); /* redraw pipe */ dt_dev_invalidate(darktable.develop); dt_control_queue_redraw_center(); } }
static void _zoom_preset_change(int val) { // dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_develop_t *dev = darktable.develop; if(!dev) return; dt_dev_zoom_t zoom; int closeup, procw, proch; float zoom_x, zoom_y; zoom = dt_control_get_dev_zoom(); closeup = dt_control_get_dev_closeup(); zoom_x = dt_control_get_dev_zoom_x(); zoom_y = dt_control_get_dev_zoom_y(); dt_dev_get_processed_size(dev, &procw, &proch); float scale = 0; zoom_x = 0.0f; //+= (1.0/scale)*(x - .5f*dev->width )/procw; zoom_y = 0.0f; //+= (1.0/scale)*(y - .5f*dev->height)/proch; if(val == 0) { scale = 0.5 * dt_dev_get_zoom_scale(dev, DT_ZOOM_FIT, 1.0, 0); zoom = DT_ZOOM_FREE; } else if(val == 1) { zoom = DT_ZOOM_FIT; scale = dt_dev_get_zoom_scale(dev, DT_ZOOM_FIT, 1.0, 0); } else if(val == 2) { scale = dt_dev_get_zoom_scale(dev, DT_ZOOM_1, 1.0, 0); zoom = DT_ZOOM_1; } else if(val == 3) { scale = 2.0f; zoom = DT_ZOOM_FREE; } dt_dev_check_zoom_bounds(dev, &zoom_x, &zoom_y, zoom, closeup, NULL, NULL); dt_control_set_dev_zoom_scale(scale); dt_control_set_dev_zoom(zoom); dt_control_set_dev_closeup(closeup); dt_control_set_dev_zoom_x(zoom_x); dt_control_set_dev_zoom_y(zoom_y); dt_dev_invalidate(dev); dt_control_queue_redraw(); }
static void _lib_duplicate_thumb_press_callback(GtkWidget *widget, GdkEventButton *event, dt_lib_module_t *self) { dt_lib_duplicate_t *d = (dt_lib_duplicate_t *)self->data; int imgid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),"imgid")); if(event->button == 1) { if(event->type == GDK_BUTTON_PRESS) { dt_develop_t *dev = darktable.develop; if(!dev) return; dt_dev_zoom_t zoom; int closeup; float zoom_x, zoom_y; closeup = dt_control_get_dev_closeup(); float scale = 0; zoom = DT_ZOOM_FIT; scale = dt_dev_get_zoom_scale(dev, DT_ZOOM_FIT, 1.0, 0); dt_dev_check_zoom_bounds(dev, &zoom_x, &zoom_y, zoom, closeup, NULL, NULL); dt_control_set_dev_zoom_scale(scale); dt_control_set_dev_zoom(zoom); dt_control_set_dev_closeup(closeup); dt_control_set_dev_zoom_x(zoom_x); dt_control_set_dev_zoom_y(zoom_y); dt_dev_invalidate(dev); dt_control_queue_redraw(); dt_dev_invalidate(darktable.develop); d->imgid = imgid; dt_control_queue_redraw_center(); } else if(event->type == GDK_2BUTTON_PRESS) { // to select the duplicate, we reuse the filmstrip proxy _do_select(imgid); } } }
static void _lib_snapshots_toggled_callback(GtkToggleButton *widget, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t*)user_data; dt_lib_snapshots_t *d = (dt_lib_snapshots_t *)self->data; /* get current snapshot index */ int which = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),"snapshot")); /* free current snapshot image if exists */ if (d->snapshot_image) { cairo_surface_destroy(d->snapshot_image); d->snapshot_image = NULL; } /* check if snapshot is activated */ if (gtk_toggle_button_get_active(widget)) { /* lets inactivate all togglebuttons except for self */ for(uint32_t k=0; k<d->size; k++) if(GTK_WIDGET(widget) != d->snapshot[k].button) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->snapshot[k].button), FALSE); /* setup snapshot */ d->selected = which; dt_lib_snapshot_t *s = d->snapshot + (which-1); dt_control_set_dev_zoom_y(s->zoom_y); dt_control_set_dev_zoom_x(s->zoom_x); dt_control_set_dev_zoom(s->zoom); dt_control_set_dev_closeup(s->closeup); dt_control_set_dev_zoom_scale(s->zoom_scale); dt_dev_invalidate(darktable.develop); d->snapshot_image = cairo_image_surface_create_from_png(s->filename); } /* redraw center view */ dt_control_queue_redraw_center(); }