📄 layout.c
字号:
{ if (!layout_valid(&lw)) return -1; if (lw->vfl) return vflist_index_by_path(lw->vfl, path); if (lw->vfi) return vficon_index_by_path(lw->vfi, path); return -1;}void layout_list_sync_path(LayoutWindow *lw, const gchar *path){ if (!layout_valid(&lw)) return; if (lw->vfl) vflist_select_by_path(lw->vfl, path); if (lw->vfi) vficon_select_by_path(lw->vfi, path);}static void layout_list_sync_sort(LayoutWindow *lw){ if (!layout_valid(&lw)) return; if (lw->vfl) vflist_sort_set(lw->vfl, lw->sort_method, lw->sort_ascend); if (lw->vfi) vficon_sort_set(lw->vfi, lw->sort_method, lw->sort_ascend);}GList *layout_selection_list(LayoutWindow *lw){ if (!layout_valid(&lw)) return NULL; if (layout_image_get_collection(lw, NULL)) { const gchar *path; path = layout_image_get_path(lw); if (path) return g_list_append(NULL, g_strdup(path)); return NULL; } if (lw->vfl) return vflist_selection_get_list(lw->vfl); if (lw->vfi) return vficon_selection_get_list(lw->vfi); return NULL;}GList *layout_selection_list_by_index(LayoutWindow *lw){ if (!layout_valid(&lw)) return NULL; if (lw->vfl) return vflist_selection_get_list_by_index(lw->vfl); if (lw->vfi) return vficon_selection_get_list_by_index(lw->vfi); return NULL;}gint layout_selection_count(LayoutWindow *lw, gint64 *bytes){ if (!layout_valid(&lw)) return 0; if (lw->vfl) return vflist_selection_count(lw->vfl, bytes); if (lw->vfi) return vficon_selection_count(lw->vfi, bytes); return 0;}void layout_select_all(LayoutWindow *lw){ if (!layout_valid(&lw)) return; if (lw->vfl) vflist_select_all(lw->vfl); if (lw->vfi) vficon_select_all(lw->vfi);}void layout_select_none(LayoutWindow *lw){ if (!layout_valid(&lw)) return; if (lw->vfl) vflist_select_none(lw->vfl); if (lw->vfi) vficon_select_none(lw->vfi);}/* *----------------------------------------------------------------------------- * access *----------------------------------------------------------------------------- */const gchar *layout_get_path(LayoutWindow *lw){ if (!layout_valid(&lw)) return NULL; return lw->path;}static void layout_sync_path(LayoutWindow *lw){ if (!lw->path) return; lw->last_time = filetime(lw->path); gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->path); if (lw->vdl) vdlist_set_path(lw->vdl, lw->path); if (lw->vdt) vdtree_set_path(lw->vdt, lw->path); if (lw->vfl) vflist_set_path(lw->vfl, lw->path); if (lw->vfi) vficon_set_path(lw->vfi, lw->path);}gint layout_set_path(LayoutWindow *lw, const gchar *path){ gint have_file = FALSE; if (!layout_valid(&lw)) return FALSE; if (!path || !isname(path)) return FALSE; if (lw->path && path && strcmp(path, lw->path) == 0) { return TRUE; } if (isdir(path)) { g_free(lw->path); lw->path = g_strdup(path); } else { gchar *base; base = remove_level_from_path(path); if (lw->path && strcmp(lw->path, base) == 0) { g_free(base); } else if (isdir(base)) { g_free(lw->path); lw->path = base; } else { g_free(base); return FALSE; } if (isfile(path)) have_file = TRUE; } if (lw->path_entry) tab_completion_append_to_history(lw->path_entry, lw->path); layout_sync_path(lw); if (have_file) { gint row; row = layout_list_get_index(lw, path); if (row >= 0) { layout_image_set_index(lw, row); } else { layout_image_set_path(lw, path); } } else if (!lazy_image_sync) { layout_image_set_index(lw, 0); } return TRUE;}static void layout_refresh_lists(LayoutWindow *lw){ if (lw->path) lw->last_time = filetime(lw->path); if (lw->vdl) vdlist_refresh(lw->vdl); if (lw->vdt) vdtree_refresh(lw->vdt); if (lw->vfl) vflist_refresh(lw->vfl); if (lw->vfi) vficon_refresh(lw->vfi);}static void layout_refresh_by_time(LayoutWindow *lw){ layout_refresh_lists(lw); if (lw->image && filetime(layout_image_get_path(lw)) >= lw->last_time) { layout_image_refresh(lw); }}void layout_refresh(LayoutWindow *lw){ if (!layout_valid(&lw)) return; if (debug) printf("layout refresh\n"); layout_refresh_lists(lw); if (lw->image) layout_image_refresh(lw);}static gint layout_check_for_update_cb(gpointer data){ LayoutWindow *lw = data; if (!update_on_time_change) return TRUE; if (lw->path) { time_t new_time; new_time = filetime(lw->path); if (new_time > 0 && new_time > lw->last_time) { if (debug) printf("layout path time changed, refreshing...\n"); layout_refresh_by_time(lw); } } return TRUE;}void layout_thumb_set(LayoutWindow *lw, gint enable){ if (!layout_valid(&lw)) return; if (lw->thumbs_enabled == enable) return; lw->thumbs_enabled = enable; layout_util_sync_thumb(lw); layout_list_sync_thumb(lw);}gint layout_thumb_get(LayoutWindow *lw){ if (!layout_valid(&lw)) return FALSE; return lw->thumbs_enabled;}void layout_sort_set(LayoutWindow *lw, SortType type, gint ascend){ if (!layout_valid(&lw)) return; if (lw->sort_method == type && lw->sort_ascend == ascend) return; lw->sort_method = type; lw->sort_ascend = ascend; if (lw->info_sort) gtk_label_set_text(GTK_LABEL(GTK_BIN(lw->info_sort)->child), sort_type_get_text(type)); layout_list_sync_sort(lw);}gint layout_sort_get(LayoutWindow *lw, SortType *type, gint *ascend){ if (!layout_valid(&lw)) return FALSE; if (type) *type = lw->sort_method; if (ascend) *ascend = lw->sort_ascend; return TRUE;}gint layout_geometry_get(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h){ if (!layout_valid(&lw)) return FALSE; gdk_window_get_root_origin(lw->window->window, x, y); gdk_drawable_get_size(lw->window->window, w, h); return TRUE;}gint layout_geometry_get_dividers(LayoutWindow *lw, gint *h, gint *v){ if (!layout_valid(&lw)) return FALSE; if (lw->h_pane && GTK_PANED(lw->h_pane)->child1->allocation.x >= 0) { *h = GTK_PANED(lw->h_pane)->child1->allocation.width; } else if (h != &lw->div_h) { *h = lw->div_h; } if (lw->v_pane && GTK_PANED(lw->v_pane)->child1->allocation.x >= 0) { *v = GTK_PANED(lw->v_pane)->child1->allocation.height; } else if (v != &lw->div_v) { *v = lw->div_v; } return TRUE;}void layout_views_set(LayoutWindow *lw, gint tree, gint icons){ if (!layout_valid(&lw)) return; if (lw->tree_view == tree && lw->icon_view == icons) return; lw->tree_view = tree; lw->icon_view = icons; layout_style_set(lw, -1, NULL);}gint layout_views_get(LayoutWindow *lw, gint *tree, gint *icons){ if (!layout_valid(&lw)) return FALSE; *tree = lw->tree_view; *icons = lw->icon_view; return TRUE;}/* *----------------------------------------------------------------------------- * location utils *----------------------------------------------------------------------------- */static gint layout_location_single(LayoutLocation l){ return (l == LAYOUT_LEFT || l == LAYOUT_RIGHT || l == LAYOUT_TOP || l == LAYOUT_BOTTOM);}static gint layout_location_vertical(LayoutLocation l){ return (l & LAYOUT_TOP || l & LAYOUT_BOTTOM);}static gint layout_location_first(LayoutLocation l){ return (l & LAYOUT_TOP || l & LAYOUT_LEFT);}static LayoutLocation layout_grid_compass(LayoutWindow *lw){ if (layout_location_single(lw->dir_location)) return lw->dir_location; if (layout_location_single(lw->file_location)) return lw->file_location; return lw->image_location;}static void layout_location_compute(LayoutLocation l1, LayoutLocation l2, GtkWidget *s1, GtkWidget *s2, GtkWidget **d1, GtkWidget **d2){ LayoutLocation l; l = l1 & l2; /* get common compass direction */ l = l1 - l; /* remove it */ if (layout_location_first(l)) { *d1 = s1; *d2 = s2; } else { *d1 = s2; *d2 = s1; }}/* *----------------------------------------------------------------------------- * tools window (for floating/hidden) *----------------------------------------------------------------------------- */gint layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h, gint *divider_pos){ if (!layout_valid(&lw)) return FALSE; if (!lw->tools || !GTK_WIDGET_VISIBLE(lw->tools)) { /* use the stored values (sort of breaks success return value) */ *divider_pos = lw->div_float; return FALSE; } gdk_window_get_root_origin(lw->tools->window, x, y); gdk_drawable_get_size(lw->tools->window, w, h); if (GTK_IS_VPANED(lw->tools_pane)) { *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.height; } else { *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.width; } return TRUE;}static void layout_tools_geometry_sync(LayoutWindow *lw){ layout_geometry_get_tools(lw, &float_window_x, &float_window_x, &float_window_w, &float_window_h, &lw->div_float);}static void layout_tools_hide(LayoutWindow *lw, gint hide){ if (!lw->tools) return; if (hide) { if (GTK_WIDGET_VISIBLE(lw->tools)) { layout_tools_geometry_sync(lw); gtk_widget_hide(lw->tools); } } else { if (!GTK_WIDGET_VISIBLE(lw->tools)) { gtk_widget_show(lw->tools); if (lw->vfi) vficon_refresh(lw->vfi); } } lw->tools_hidden = hide;}static gint layout_tools_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data){ LayoutWindow *lw = data; layout_tools_float_toggle(lw); return TRUE;}static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *files){ GtkWidget *vbox; GtkWidget *w1, *w2; gint vertical; gint new_window = FALSE; vertical = (layout_location_single(lw->image_location) && !layout_location_vertical(lw->image_location)) || (!layout_location_single(lw->image_location) && layout_location_vertical(layout_grid_compass(lw)));#if 0 layout_location_compute(lw->dir_location, lw->file_location, tools, files, &w1, &w2);#endif /* for now, tools/dir are always first in order */ w1 = tools; w2 = files; if (!lw->tools) { GdkGeometry geometry; GdkWindowHints hints; lw->tools = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(lw->tools), "delete_event", G_CALLBACK(layout_tools_delete_cb), lw); layout_keyboard_init(lw, lw->tools); if (save_window_positions) { hints = GDK_HINT_USER_POS; } else { hints = 0; } geometry.min_width = 32; geometry.min_height = 32; geometry.base_width = TOOLWINDOW_DEF_WIDTH; geometry.base_height = TOOLWINDOW_DEF_HEIGHT; gtk_window_set_geometry_hints(GTK_WINDOW(lw->tools), NULL, &geometry, GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints); gtk_window_set_resizable(GTK_WINDOW(lw->tools), TRUE); gtk_window_set_title(GTK_WINDOW(lw->tools), _("GQview Tools")); gtk_window_set_wmclass(GTK_WINDOW(lw->tools), "tools", "GQview"); gtk_container_set_border_width(GTK_CONTAINER(lw->tools), 0); window_set_icon(lw->tools, (const gchar **)tools_xpm, NULL); new_window = TRUE; } else { layout_tools_geometry_sync(lw); /* dump the contents */ gtk_widget_destroy(GTK_BIN(lw->tools)->child); } layout_actions_add_window(lw, lw->tools); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(lw->tools), vbox); gtk_widget_show(vbox); layout_status_setup(lw, vbox, TRUE); if (vertical) { lw->tools_pane = gtk_vpaned_new(); } else { lw->tools_pane = gtk_hpaned_new(); } gtk_box_pack_start(GTK_BOX(vbox), lw->tools_pane, TRUE, TRUE, 0); gtk_widget_show(lw->tools_pane); gtk_paned_pack1(GTK_PANED(lw->tools_pane), w1, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(lw->tools_pane), w2, TRUE, TRUE); gtk_widget_show(tools); gtk_widget_show(files); if (new_window) { if (save_window_positions) { gtk_window_set_default_size(GTK_WINDOW(lw->tools), float_window_w, float_window_h); gtk_window_move(GTK_WINDOW(lw->tools), float_window_x, float_window_y); } else { if (vertical) { gtk_window_set_default_size(GTK_WINDOW(lw->tools), TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT); } else { gtk_window_set_default_size(GTK_WINDOW(lw->tools), TOOLWINDOW_DEF_HEIGHT, TOOLWINDOW_DEF_WIDTH); } } } if (!save_window_positions) { if (vertical) { lw->div_float = MAIN_WINDOW_DIV_VPOS; } else { lw->div_float = MAIN_WINDOW_DIV_HPOS; } } gtk_paned_set_position(GTK_PANED(lw->tools_pane), lw->div_float);}/* *----------------------------------------------------------------------------- * glue (layout arrangement) *----------------------------------------------------------------------------- */static void layout_grid_compute(LayoutWindow *lw, GtkWidget *image, GtkWidget *tools, GtkWidget *files, GtkWidget **w1, GtkWidget **w2, GtkWidget **w3){ /* heh, this was fun */ if (layout_location_single(lw->dir_location)) { if (layout_location_first(lw->dir_location)) { *w1 = tools; layout_location_compute(lw->file_location, lw->image_location, files, image, w2, w3); } else { *w3 = tools; layout_location_compute(lw->file_location, lw->image_location, files, image, w1, w2); } } else if (layout_location_single(lw->file_location)) { if (layout_location_first(lw->file_location)) { *w1 = files; layout_location_compute(lw->dir_location, lw->image_location, tools, image, w2, w3); } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -