Mercurial > geeqie
view src/window.c @ 8:e0d0593d519e
Sync to GQview 1.5.9 release.
########
DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS!
This CVS is never up to date with current development and is provided
solely for reference purposes, please use the latest official release
package when making any changes or translation updates.
########
author | gqview |
---|---|
date | Sat, 26 Feb 2005 00:07:07 +0000 |
parents | c0e337a01cb7 |
children |
line wrap: on
line source
/* * GQview image viewer * (C)2000 John Ellis * * Author: John Ellis * */ #include "gqview.h" #define MAINWINDOW_DEF_WIDTH 500 #define MAINWINDOW_DEF_HEIGHT 400 #define TOOLWINDOW_DEF_WIDTH 224 #define TOOLWINDOW_DEF_HEIGHT 450 #define LIST_DEFAULT_WIDTH -1 #define LIST_DEFAULT_HEIGHT 100 static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand); static void info_area_create(GtkWidget *vbox); static void toolwindow_create(); static void toolwindow_destroy(); static void toolwindow_show(); static void image_focus_paint(GtkWidget *widget); static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data); static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips); static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data); /* *----------------------------------------------------------------------------- * information widget creation routines (private) *----------------------------------------------------------------------------- */ static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand) { GtkWidget *label; GtkWidget *frame; frame = gtk_frame_new (NULL); if (size) gtk_widget_set_usize (frame, size, -1); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN); if (start) gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0); else gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0); gtk_widget_show(frame); label = gtk_label_new(text); gtk_container_add (GTK_CONTAINER (frame), label); gtk_widget_show(label); return label; } static void info_area_create(GtkWidget *vbox) { gchar *status_text; gchar *details_text; gchar *zoom_text; gchar *buf; if (info_status) { gtk_label_get(GTK_LABEL(info_status), &buf); status_text = g_strdup(buf); gtk_label_get(GTK_LABEL(info_details), &buf); details_text = g_strdup(buf); gtk_label_get(GTK_LABEL(info_zoom), &buf); zoom_text = g_strdup(buf); } else { status_text = g_strdup(""); details_text = g_strdup("GQview"); zoom_text = g_strdup(":"); } if (info_box) { gtk_widget_destroy(info_box); info_box = NULL; } if (vbox) { GtkWidget *hbox; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); info_progress_bar = gtk_progress_bar_new(); gtk_widget_set_usize(info_progress_bar,150,-1); gtk_box_pack_start (GTK_BOX (hbox), info_progress_bar, FALSE, FALSE, 0); gtk_widget_show(info_progress_bar); info_zoom = add_label(zoom_text, hbox, FALSE, 48, FALSE); info_status = add_label(status_text, vbox, TRUE, 0, FALSE); info_details = add_label(details_text, vbox, TRUE, 0, FALSE); } else { info_box = gtk_hbox_new(FALSE, 0); info_progress_bar = gtk_progress_bar_new(); gtk_widget_set_usize(info_progress_bar,150,-1); gtk_box_pack_start (GTK_BOX (info_box), info_progress_bar, FALSE, FALSE, 0); gtk_widget_show(info_progress_bar); info_status = add_label(status_text, info_box, TRUE, 0, TRUE); info_details = add_label(details_text, info_box, TRUE, 0, TRUE); info_zoom = add_label(zoom_text, info_box, FALSE, 48, FALSE); gtk_widget_show(info_box); } image_set_labels(info_details, info_zoom); g_free(status_text); g_free(details_text); g_free(zoom_text); } /* *----------------------------------------------------------------------------- * tool window create/show/hide routines (private) *----------------------------------------------------------------------------- */ static void toolwindow_destroy_cb(GtkWidget *widget, gpointer data) { toolwindow_float(); } static void toolwindow_create() { GtkWidget *vbox; GtkAllocation req_size; toolwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (toolwindow), "delete_event",(GtkSignalFunc) toolwindow_destroy_cb, NULL); gtk_window_set_policy(GTK_WINDOW(toolwindow), TRUE, TRUE, FALSE); gtk_window_set_title (GTK_WINDOW (toolwindow), _("GQview Tools")); gtk_window_set_wmclass(GTK_WINDOW (toolwindow), "tools", "GQview"); gtk_container_border_width (GTK_CONTAINER (toolwindow), 0); gtk_window_add_accel_group(GTK_WINDOW(toolwindow),mainwindow_accel_grp); gtk_signal_connect(GTK_OBJECT(toolwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); if (save_window_positions) { gtk_window_set_default_size (GTK_WINDOW(toolwindow), float_window_w, float_window_h); gtk_widget_set_uposition(toolwindow, float_window_x, float_window_y); req_size.x = req_size.y = 0; req_size.width = float_window_w; req_size.height = float_window_h; } else { gtk_window_set_default_size (GTK_WINDOW(toolwindow), TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT); req_size.x = req_size.y = 0; req_size.width = TOOLWINDOW_DEF_WIDTH; req_size.height = TOOLWINDOW_DEF_HEIGHT; } gtk_widget_size_allocate(toolwindow, &req_size); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(toolwindow), vbox); gtk_widget_realize(toolwindow); gtk_widget_realize(vbox); if (tool_vbox->parent) { gtk_widget_ref(tool_vbox); gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); gtk_widget_unref(tool_vbox); } else { gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); } info_area_create(vbox); gtk_widget_show_all(vbox); } static void toolwindow_destroy() { if (toolwindow && GTK_WIDGET_VISIBLE(toolwindow)) { gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); } info_area_create(NULL); gtk_widget_ref(tool_vbox); gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); gtk_widget_unref(tool_vbox); gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); gtk_widget_destroy(toolwindow); toolwindow = NULL; } static void toolwindow_show() { gtk_widget_show(toolwindow); if (save_window_positions) gdk_window_move(toolwindow->window, float_window_x, float_window_y); } /* *----------------------------------------------------------------------------- * tool window hide/float routines (public) *----------------------------------------------------------------------------- */ void toolwindow_float() { if (toolwindow) { if (GTK_WIDGET_VISIBLE(toolwindow)) { toolwindow_destroy(); tools_float = FALSE; tools_hidden = FALSE; } else { toolwindow_show(); tools_float = TRUE; tools_hidden = FALSE; } } else { toolwindow_create(); toolwindow_show(); tools_float = TRUE; tools_hidden = FALSE; } } void toolwindow_hide() { if (toolwindow) { if (GTK_WIDGET_VISIBLE(toolwindow)) { gtk_widget_hide(toolwindow); gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); tools_hidden = TRUE; } else { if (tools_float) toolwindow_show(); else toolwindow_destroy(); tools_hidden = FALSE; } } else { toolwindow_create(); tools_hidden = TRUE; } } /* *----------------------------------------------------------------------------- * image viewport focus display (private) *----------------------------------------------------------------------------- */ static void image_focus_paint(GtkWidget *widget) { gint width, height; gdk_window_get_size (widget->window, &width, &height); gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE, 0, 0, width - 1, height - 1); } static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data) { image_focus_paint (widget); return TRUE; } static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) { gtk_signal_connect_after (GTK_OBJECT (widget), "draw", GTK_SIGNAL_FUNC (image_focus_expose), NULL); gtk_signal_connect (GTK_OBJECT (widget), "expose_event", GTK_SIGNAL_FUNC (image_focus_paint), NULL); GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); gtk_widget_queue_draw (widget); return FALSE; } static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) { gtk_signal_disconnect_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (image_focus_paint), NULL); gtk_signal_disconnect_by_func (GTK_OBJECT (widget), GTK_SIGNAL_FUNC (image_focus_expose), NULL); GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS); gtk_widget_queue_clear (widget); gtk_viewport_set_shadow_type (GTK_VIEWPORT(widget), GTK_SHADOW_IN); return FALSE; } /* *----------------------------------------------------------------------------- * main window setup *----------------------------------------------------------------------------- */ static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips) { GtkWidget *menu_bar; GtkWidget *button_bar; GtkWidget *vpaned; GtkWidget *scrolled; GtkWidget *tabcomp; tool_vbox = gtk_vbox_new(FALSE, 0); menu_bar = create_menu_bar(accel_grp); gtk_box_pack_start (GTK_BOX(tool_vbox), menu_bar,FALSE,FALSE,0); gtk_widget_show(menu_bar); button_bar = create_button_bar(tooltips); gtk_box_pack_start (GTK_BOX(tool_vbox), button_bar,FALSE,FALSE,0); gtk_widget_show(button_bar); /* path entry */ tabcomp = tab_completion_new(&path_entry, mainwindow, NULL, path_entry_cb, NULL); tab_completion_add_tab_func(path_entry, path_entry_tab_cb, NULL); gtk_box_pack_start (GTK_BOX (tool_vbox), tabcomp, FALSE, FALSE, 0); gtk_widget_show (tabcomp); /* history button */ history_menu = gtk_option_menu_new (); gtk_box_pack_start (GTK_BOX (tool_vbox), history_menu, FALSE, FALSE, 0); gtk_widget_show (history_menu); vpaned = gtk_vpaned_new (); gtk_paned_handle_size (GTK_PANED(vpaned), 10); gtk_paned_gutter_size (GTK_PANED(vpaned), 10); gtk_box_pack_start (GTK_BOX (tool_vbox), vpaned, TRUE, TRUE, 0); gtk_widget_show (vpaned); /* dir list */ scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_paned_add1 (GTK_PANED(vpaned), scrolled); gtk_widget_show(scrolled); dir_clist=gtk_clist_new(1); gtk_signal_connect (GTK_OBJECT (dir_clist), "button_press_event",(GtkSignalFunc) dir_press_cb, NULL); gtk_signal_connect (GTK_OBJECT (dir_clist), "select_row",(GtkSignalFunc) dir_select_cb, NULL); gtk_clist_column_titles_passive (GTK_CLIST (dir_clist)); gtk_widget_set_usize(dir_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled), dir_clist); gtk_widget_show(dir_clist); /* file list */ scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_paned_add2 (GTK_PANED(vpaned), scrolled); gtk_widget_show(scrolled); file_clist=gtk_clist_new(1); gtk_clist_set_selection_mode(GTK_CLIST(file_clist), GTK_SELECTION_EXTENDED); gtk_signal_connect (GTK_OBJECT (file_clist), "button_press_event",(GtkSignalFunc) file_press_cb, NULL); gtk_signal_connect (GTK_OBJECT (file_clist), "select_row",(GtkSignalFunc) file_select_cb, NULL); gtk_signal_connect_after (GTK_OBJECT (file_clist), "unselect_row",(GtkSignalFunc) file_unselect_cb, NULL); gtk_clist_column_titles_passive (GTK_CLIST (file_clist)); gtk_widget_set_usize(file_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled), file_clist); gtk_widget_show(file_clist); gtk_widget_show(tool_vbox); } static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data) { exit_gqview(); } void create_main_window() { GtkWidget *image_window; GtkAllocation req_size; GtkTooltips *tooltips; GdkColormap *colormap; static GdkColor tooltip_color = { 0, 0xffff, 0xf9f9, 0xcbcb }; /*255 249 203*/ mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_policy(GTK_WINDOW(mainwindow), TRUE, TRUE, FALSE); gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",(GtkSignalFunc) mainwindow_destroy_cb, NULL); gtk_window_set_title(GTK_WINDOW (mainwindow), "GQview"); gtk_window_set_wmclass(GTK_WINDOW (mainwindow), "gqview", "GQview"); gtk_container_border_width (GTK_CONTAINER (mainwindow), 0); gtk_signal_connect(GTK_OBJECT(mainwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); if (save_window_positions) { req_size.x = main_window_x; req_size.y = main_window_y; req_size.width = main_window_w; req_size.height = main_window_h; gtk_window_set_default_size (GTK_WINDOW(mainwindow), main_window_w, main_window_h); gtk_widget_set_uposition(mainwindow, main_window_x, main_window_y); } else { req_size.x = 0; req_size.y = 0; req_size.width = MAINWINDOW_DEF_WIDTH; req_size.height = MAINWINDOW_DEF_HEIGHT; gtk_window_set_default_size (GTK_WINDOW(mainwindow), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT); } gtk_widget_size_allocate(mainwindow, &req_size); gtk_widget_realize(mainwindow); mainwindow_accel_grp = gtk_accel_group_new (); gtk_window_add_accel_group(GTK_WINDOW(mainwindow),mainwindow_accel_grp); tooltips = gtk_tooltips_new(); colormap = gdk_window_get_colormap (mainwindow->window); gdk_color_alloc (colormap, &tooltip_color); gtk_tooltips_set_colors(tooltips, &tooltip_color, &mainwindow->style->fg[GTK_STATE_NORMAL]); create_menu_popups(); create_tools(mainwindow_accel_grp, tooltips); image_window = image_create(); mainwindow_vbox = gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (mainwindow), mainwindow_vbox); gtk_widget_show(mainwindow_vbox); mainwindow_hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(mainwindow_vbox), mainwindow_hbox, TRUE, TRUE, 0); gtk_widget_show(mainwindow_hbox); if (tools_float || tools_hidden) { toolwindow_create(); if (!tools_hidden) { toolwindow_show(); } } else { info_area_create(NULL); gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); } gtk_box_pack_end(GTK_BOX(mainwindow_hbox), image_window, TRUE, TRUE, 0); gtk_widget_show_all(image_window); GTK_WIDGET_SET_FLAGS(main_image->viewport, GTK_CAN_FOCUS); gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_in_event", GTK_SIGNAL_FUNC(image_focus_in_cb), NULL); gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_out_event", GTK_SIGNAL_FUNC(image_focus_out_cb), NULL); gtk_widget_show(mainwindow); if (save_window_positions) gdk_window_move(mainwindow->window, main_window_x, main_window_y); }