int key_pressed(dt_view_t *self, guint key, guint state) { dt_library_t *lib = (dt_library_t *)self->data; dt_control_accels_t *accels = &darktable.control->accels; if(!darktable.control->key_accelerators_on) return 0; int zoom = dt_conf_get_int("plugins/lighttable/images_in_row"); const int layout = dt_conf_get_int("plugins/lighttable/layout"); if(key == accels->lighttable_preview.accel_key && state == accels->lighttable_preview.accel_mods) { int32_t mouse_over_id; DT_CTL_GET_GLOBAL(mouse_over_id, lib_image_mouse_over_id); if(lib->full_preview_id == -1 && mouse_over_id != -1 ) { // encode panel visibility into full_preview lib->full_preview = 0; lib->full_preview_id = mouse_over_id; // let's hide some gui components lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_LEFT)&1) << 0; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_LEFT, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_RIGHT)&1) << 1; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_RIGHT, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM)&1) << 2; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP)&1) << 3; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP, FALSE); //dt_dev_invalidate(darktable.develop); } return 1; } if(key == accels->lighttable_left.accel_key && state == accels->lighttable_left.accel_mods) { if(layout == 1 && zoom == 1) lib->track = -DT_LIBRARY_MAX_ZOOM; else lib->track = -1; return 1; } if(key == accels->lighttable_right.accel_key && state == accels->lighttable_right.accel_mods) { if(layout == 1 && zoom == 1) lib->track = DT_LIBRARY_MAX_ZOOM; else lib->track = 1; return 1; } if(key == accels->lighttable_up.accel_key && state == accels->lighttable_up.accel_mods) { lib->track = -DT_LIBRARY_MAX_ZOOM; return 1; } if(key == accels->lighttable_down.accel_key && state == accels->lighttable_down.accel_mods) { lib->track = DT_LIBRARY_MAX_ZOOM; return 1; } if(key == accels->lighttable_center.accel_key && state == accels->lighttable_center.accel_mods) { lib->center = 1; return 1; } return 0; }
static gboolean expose_borders (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { // draw arrows on borders if(!dt_control_running()) return TRUE; long int which = (long int)user_data; float width = widget->allocation.width, height = widget->allocation.height; cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); GtkStyle *style = gtk_widget_get_style(dt_ui_center(darktable.gui->ui)); cairo_set_source_rgb (cr, .5f*style->bg[GTK_STATE_NORMAL].red/65535.0, .5f*style->bg[GTK_STATE_NORMAL].green/65535.0, .5f*style->bg[GTK_STATE_NORMAL].blue/65535.0 ); // cairo_set_source_rgb (cr, .13, .13, .13); cairo_paint(cr); // draw scrollbar indicators int v = darktable.view_manager->current_view; dt_view_t *view = NULL; if(v >= 0 && v < darktable.view_manager->num_views) view = darktable.view_manager->view + v; // cairo_set_source_rgb (cr, .16, .16, .16); cairo_set_source_rgb (cr, style->bg[GTK_STATE_NORMAL].red/65535.0, style->bg[GTK_STATE_NORMAL].green/65535.0, style->bg[GTK_STATE_NORMAL].blue/65535.0 ); const float border = 0.3; if(!view) cairo_paint(cr); else { switch(which) { case 0: case 1: // left, right: vertical cairo_rectangle(cr, 0.0, view->vscroll_pos/view->vscroll_size * height, width, view->vscroll_viewport_size/view->vscroll_size * height); break; default: // bottom, top: horizontal cairo_rectangle(cr, view->hscroll_pos/view->hscroll_size * width, 0.0, view->hscroll_viewport_size/view->hscroll_size * width, height); break; } cairo_fill(cr); switch(which) { case 0: cairo_rectangle(cr, (1.0-border)*width, 0.0, border*width, height); break; case 1: cairo_rectangle(cr, 0.0, 0.0, border*width, height); break; case 2: cairo_rectangle(cr, (1.0-border)*height, (1.0-border)*height, width-2*(1.0-border)*height, border*height); break; default: cairo_rectangle(cr, (1.0-border)*height, 0.0, width-2*(1.0-border)*height, border*height); break; } cairo_fill(cr); } // draw gui arrows. cairo_set_source_rgb (cr, .6, .6, .6); switch(which) { case 0: // left if(dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_LEFT)) { cairo_move_to (cr, width, height/2-width); cairo_rel_line_to (cr, 0.0, 2*width); cairo_rel_line_to (cr, -width, -width); } else { cairo_move_to (cr, 0.0, height/2-width); cairo_rel_line_to (cr, 0.0, 2*width); cairo_rel_line_to (cr, width, -width); } break; case 1: // right if(dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_RIGHT)) { cairo_move_to (cr, 0.0, height/2-width); cairo_rel_line_to (cr, 0.0, 2*width); cairo_rel_line_to (cr, width, -width); } else { cairo_move_to (cr, width, height/2-width); cairo_rel_line_to (cr, 0.0, 2*width); cairo_rel_line_to (cr, -width, -width); } break; case 2: // top if(dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP)) { cairo_move_to (cr, width/2-height, height); cairo_rel_line_to (cr, 2*height, 0.0); cairo_rel_line_to (cr, -height, -height); } else { cairo_move_to (cr, width/2-height, 0.0); cairo_rel_line_to (cr, 2*height, 0.0); cairo_rel_line_to (cr, -height, height); } break; default: // bottom if(dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM)) { cairo_move_to (cr, width/2-height, 0.0); cairo_rel_line_to (cr, 2*height, 0.0); cairo_rel_line_to (cr, -height, height); } else { cairo_move_to (cr, width/2-height, height); cairo_rel_line_to (cr, 2*height, 0.0); cairo_rel_line_to (cr, -height, -height); } break; } cairo_close_path (cr); cairo_fill(cr); cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }