Mercurial > geeqie.yaz
diff src/layout_image.c @ 127:271afad04d07
implemented split windows
TODO: menus and hotkeys, connected zoom, activating on drag
author | nadvornik |
---|---|
date | Fri, 29 Jun 2007 15:16:46 +0000 |
parents | e2a8b7f2165b |
children | 98e2632b5d3d |
line wrap: on
line diff
--- a/src/layout_image.c Wed Jan 17 21:52:24 2007 +0000 +++ b/src/layout_image.c Fri Jun 29 15:16:46 2007 +0000 @@ -703,6 +703,43 @@ layout_tools_hide_toggle(lw); } +static void li_pop_menu_split_none_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + layout_split_change(lw, SPLIT_NONE); +} + +static void li_pop_menu_split_hor_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + layout_split_change(lw, SPLIT_HOR); +} + +static void li_pop_menu_split_vert_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + layout_split_change(lw, SPLIT_VERT); +} + +static void li_pop_menu_split_quad_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + layout_split_change(lw, SPLIT_QUAD); +} + +static void li_pop_menu_connect_scroll_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + lw->connect_scroll = !lw->connect_scroll; +} + +static void li_pop_menu_connect_zoom_cb(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + lw->connect_zoom = !lw->connect_zoom; +} + + static GtkWidget *layout_image_pop_menu(LayoutWindow *lw) { GtkWidget *menu; @@ -721,6 +758,18 @@ menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw); menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); menu_item_add_divider(menu); + if (!fullscreen) + { + menu_item_add(menu, _("No split"), G_CALLBACK(li_pop_menu_split_none_cb), lw); + menu_item_add(menu, _("Split horizontaly"), G_CALLBACK(li_pop_menu_split_hor_cb), lw); + menu_item_add(menu, _("Split verticaly"), G_CALLBACK(li_pop_menu_split_vert_cb), lw); + menu_item_add(menu, _("Split quad"), G_CALLBACK(li_pop_menu_split_quad_cb), lw); + menu_item_add_check(menu, _("Connected scroll"), lw->connect_scroll, + G_CALLBACK(li_pop_menu_connect_scroll_cb), lw); + menu_item_add_check(menu, _("Connected zoom"), lw->connect_zoom, + G_CALLBACK(li_pop_menu_connect_zoom_cb), lw); + menu_item_add_divider(menu); + } submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw); if (!path) gtk_widget_set_sensitive(item, FALSE); @@ -815,6 +864,20 @@ guint time, gpointer data) { LayoutWindow *lw = data; + gint i; + + + for (i=0; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i] && lw->split_images[i]->pr == widget) + break; + } + if (i < MAX_SPLIT_IMAGES) + { + printf("dnd image activate %d\n", i); + layout_image_activate(lw, i); + } + if (info == TARGET_URI_LIST || info == TARGET_APP_COLLECTION_MEMBER) { @@ -883,8 +946,21 @@ { LayoutWindow *lw = data; const gchar *path; - - path = layout_image_get_path(lw); + gint i; + + + for (i=0; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i] && lw->split_images[i]->pr == widget) + break; + } + if (i < MAX_SPLIT_IMAGES) + { + printf("dnd get from %d\n", i); + path = image_get_path(lw->split_images[i]); + } + else + path = layout_image_get_path(lw); if (path) { @@ -947,21 +1023,23 @@ } } -static void layout_image_dnd_init(LayoutWindow *lw) +static void layout_image_dnd_init(LayoutWindow *lw, gint i) { - gtk_drag_source_set(lw->image->pr, GDK_BUTTON2_MASK, + ImageWindow *imd = lw->split_images[i]; + + gtk_drag_source_set(imd->pr, GDK_BUTTON2_MASK, dnd_file_drag_types, dnd_file_drag_types_count, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); - g_signal_connect(G_OBJECT(lw->image->pr), "drag_data_get", + g_signal_connect(G_OBJECT(imd->pr), "drag_data_get", G_CALLBACK(layout_image_dnd_get), lw); - g_signal_connect(G_OBJECT(lw->image->pr), "drag_end", + g_signal_connect(G_OBJECT(imd->pr), "drag_end", G_CALLBACK(layout_image_dnd_end), lw); - gtk_drag_dest_set(lw->image->pr, + gtk_drag_dest_set(imd->pr, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, dnd_file_drop_types, dnd_file_drop_types_count, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); - g_signal_connect(G_OBJECT(lw->image->pr), "drag_data_received", + g_signal_connect(G_OBJECT(imd->pr), "drag_data_received", G_CALLBACK(layout_image_dnd_receive), lw); } @@ -1065,14 +1143,14 @@ { if (!layout_valid(&lw)) return; - if (path) +/* if (path) { const gchar *old_path; old_path = layout_image_get_path(lw); if (old_path && strcmp(path, old_path) == 0) return; } - +*/ layout_image_set_path(lw, path); if (enable_read_ahead) image_prebuffer_set(lw->image, read_ahead_path); } @@ -1340,6 +1418,23 @@ *---------------------------------------------------------------------------- */ +static gint image_idx(LayoutWindow *lw, ImageWindow *imd) +{ + gint i; + + for (i=0; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i] == imd) + break; + } + if (i < MAX_SPLIT_IMAGES) + { + return i; + } + return -1; +} + + static void layout_image_button_cb(ImageWindow *imd, gint button, guint32 time, gdouble x, gdouble y, guint state, gpointer data) { @@ -1372,6 +1467,15 @@ { LayoutWindow *lw = data; + gint i = image_idx(lw, imd); + + if (i != -1) + { + printf("image activate scroll %d\n", i); + layout_image_activate(lw, i); + } + + if (state & GDK_CONTROL_MASK) { switch (direction) @@ -1422,12 +1526,55 @@ } } +static void layout_image_scroll_notify_cb(ImageWindow *imd, gint x, gint y, gint width, gint height, gpointer data) +{ + gint i; + printf("scroll cb %d %d %d %d\n", x,y,width, height); + LayoutWindow *lw = data; + + + for (i=0; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i] && lw->split_images[i] != imd) +// if (lw->connect_zoom) +// image_sync_zoom_from_image(lw->split_images[i], imd); + if (lw->connect_scroll) + image_sync_scroll_from_image_absolute(lw->split_images[i], imd); + } +} + +static gint layout_image_mouse_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + + printf("mouse press\n"); + +} + +static void layout_image_button_inactive_cb(ImageWindow *imd, gint button, guint32 time, + gdouble x, gdouble y, guint state, gpointer data) +{ + LayoutWindow *lw = data; + gint i = image_idx(lw, imd); + + if (i != -1) + { + printf("image activate %d\n", i); + layout_image_activate(lw, i); + } +} + static void layout_image_set_buttons(LayoutWindow *lw) { image_set_button_func(lw->image, layout_image_button_cb, lw); image_set_scroll_func(lw->image, layout_image_scroll_cb, lw); } +static void layout_image_set_buttons_inactive(LayoutWindow *lw, gint i) +{ + image_set_button_func(lw->split_images[i], layout_image_button_inactive_cb, lw); + image_set_scroll_func(lw->split_images[i], layout_image_scroll_cb, lw); +} + /* *---------------------------------------------------------------------------- * setup @@ -1440,29 +1587,247 @@ layout_status_update_image(lw); } -GtkWidget *layout_image_new(LayoutWindow *lw, const gchar *path) +GtkWidget *layout_image_new(LayoutWindow *lw, gint i) { - if (!lw->image) + if (!lw->split_images[i]) { - lw->image = image_new( (!lw->tools_float && !lw->tools_hidden) ); - if (black_window_background) image_background_set_black(lw->image, TRUE); - image_set_update_func(lw->image, layout_image_update_cb, lw); - layout_image_set_buttons(lw); - layout_image_dnd_init(lw); + lw->split_images[i] = image_new(TRUE); + + gtk_widget_ref(lw->split_images[i]->widget); - image_attach_window(lw->image, lw->window, NULL, "GQview", FALSE); + g_signal_connect(G_OBJECT(lw->split_images[i]->widget), "button_press_event", + G_CALLBACK(layout_image_mouse_press_cb), lw); + + + if (black_window_background) image_background_set_black(lw->split_images[i], TRUE); image_auto_refresh(lw->image, 0); + layout_image_dnd_init(lw, i); image_color_profile_set(lw->image, color_profile_input_type, color_profile_screen_type, color_profile_use_image); image_color_profile_set_use(lw->image, color_profile_enabled); } - return lw->image->widget; + return lw->split_images[i]->widget; +} + +void layout_image_deactivate(LayoutWindow *lw, gint i) +{ + + if (!lw->split_images[i]) return; + image_set_update_func(lw->split_images[i], NULL, NULL); + layout_image_set_buttons_inactive(lw, i); + image_set_scroll_notify_func(lw->split_images[i], NULL, NULL); + + image_attach_window(lw->split_images[i], NULL, NULL, NULL, FALSE); + image_select(lw->split_images[i], FALSE); +} + + +void layout_image_activate(LayoutWindow *lw, gint i) +{ + const gchar *path; + + gchar *base; + gint row; + gint j; + + if (!lw->split_images[i]) return; + + /* deactivate currently active */ + if (lw->active_split_image != i) + layout_image_deactivate(lw, lw->active_split_image); + + lw->image = lw->split_images[i]; + lw->active_split_image = i; + + image_set_update_func(lw->image, layout_image_update_cb, lw); + layout_image_set_buttons(lw); + image_set_scroll_notify_func(lw->image, layout_image_scroll_notify_cb, lw); + + image_attach_window(lw->image, lw->window, NULL, "GQview", FALSE); + + image_select(lw->split_images[i], TRUE); + + path = image_get_path(lw->image); + + if (path) + { +// layout_list_sync_path(lw, path); + layout_set_path(lw, path); + } +} + + +GtkWidget *layout_image_setup_split_none(LayoutWindow *lw) +{ + gint i; + + if (!lw->split_images[0]) + { + layout_image_new(lw, 0); + layout_image_activate(lw, 0); + } + + for (i=1; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i]) + { + gtk_widget_unref(lw->split_images[i]->widget); + lw->split_images[i] = NULL; + } + } + + if (!lw->image || lw->active_split_image != 0) + { + layout_image_activate(lw, 0); + } + + lw->split_mode = SPLIT_NONE; + + lw->split_image_widget = lw->split_images[0]->widget; + + return lw->split_image_widget; + } +GtkWidget *layout_image_setup_split_hv(LayoutWindow *lw, gboolean horizontal) +{ + GtkWidget *paned; + gint i; + + if (!lw->split_images[0]) + { + layout_image_new(lw, 0); + layout_image_activate(lw, 0); + } + + if (!lw->split_images[1]) + { + layout_image_new(lw, 1); + if (lw->image) + image_change_path(lw->split_images[1], + image_get_path(lw->image), image_zoom_get_real(lw->image)); + layout_image_deactivate(lw, 1); + } + + + for (i=2; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i]) + { + gtk_widget_unref(lw->split_images[i]->widget); + lw->split_images[i] = NULL; + } + } + + if (!lw->image || lw->active_split_image < 0 || lw->active_split_image > 1) + { + layout_image_activate(lw, 0); + } + + if (horizontal) + paned = gtk_hpaned_new (); + else + paned = gtk_vpaned_new (); + + gtk_paned_pack1 (GTK_PANED (paned), lw->split_images[0]->widget, TRUE, TRUE); + gtk_paned_pack2 (GTK_PANED (paned), lw->split_images[1]->widget, TRUE, TRUE); + + gtk_widget_show (lw->split_images[0]->widget); + gtk_widget_show (lw->split_images[1]->widget); + + + lw->split_mode = horizontal ? SPLIT_HOR : SPLIT_VERT; + lw->split_image_widget = paned; + + return lw->split_image_widget; + +} + +GtkWidget *layout_image_setup_split_quad(LayoutWindow *lw) +{ + GtkWidget *hpaned; + GtkWidget *vpaned1; + GtkWidget *vpaned2; + gint i; + + if (!lw->split_images[0]) + { + layout_image_new(lw, 0); + layout_image_activate(lw, 0); + } + + for (i=1; i < 4; i++) + if (!lw->split_images[i]) + { + layout_image_new(lw, i); + if (lw->image) + image_change_path(lw->split_images[i], + image_get_path(lw->image), image_zoom_get_real(lw->image)); + layout_image_deactivate(lw, i); + } + + for (i=4; i < MAX_SPLIT_IMAGES; i++) + { + if (lw->split_images[i]) + { + gtk_widget_unref(lw->split_images[i]->widget); + lw->split_images[i] = NULL; + } + } + + if (!lw->image || lw->active_split_image < 0 || lw->active_split_image > 3) + { + layout_image_activate(lw, 0); + } + + hpaned = gtk_hpaned_new (); + vpaned1 = gtk_vpaned_new (); + vpaned2 = gtk_vpaned_new (); + + gtk_paned_pack1 (GTK_PANED (vpaned1), lw->split_images[0]->widget, TRUE, TRUE); + gtk_paned_pack2 (GTK_PANED (vpaned1), lw->split_images[2]->widget, TRUE, TRUE); + + gtk_paned_pack1 (GTK_PANED (vpaned2), lw->split_images[1]->widget, TRUE, TRUE); + gtk_paned_pack2 (GTK_PANED (vpaned2), lw->split_images[3]->widget, TRUE, TRUE); + + gtk_paned_pack1 (GTK_PANED (hpaned), vpaned1, TRUE, TRUE); + gtk_paned_pack2 (GTK_PANED (hpaned), vpaned2, TRUE, TRUE); + + + for (i=0; i < 4; i++) + gtk_widget_show (lw->split_images[i]->widget); + gtk_widget_show (vpaned1); + gtk_widget_show (vpaned2); + + + lw->split_mode = SPLIT_QUAD; + lw->split_image_widget = hpaned; + + return lw->split_image_widget; + +} + +GtkWidget *layout_image_setup_split(LayoutWindow *lw, ImageSplitMode mode) +{ + switch (mode) + { + case SPLIT_HOR: + return layout_image_setup_split_hv(lw, TRUE); + case SPLIT_VERT: + return layout_image_setup_split_hv(lw, FALSE); + case SPLIT_QUAD: + return layout_image_setup_split_quad(lw); + case SPLIT_NONE: + default: + return layout_image_setup_split_none(lw); + } +} + + /* *----------------------------------------------------------------------------- * maintenance (for rename, move, remove)