/*
* Geeqie
* (C) 2006 John Ellis
+ * Copyright (C) 2008 The Geeqie Team
*
* Author: John Ellis
*
#include "main.h"
#include "preferences.h"
+#include "bar_exif.h"
#include "cache_maint.h"
#include "editors.h"
-#include "filelist.h"
+#include "exif.h"
+#include "filedata.h"
+#include "filefilter.h"
#include "fullscreen.h"
#include "image.h"
+#include "image-overlay.h"
+#include "color-man.h"
#include "img-view.h"
#include "layout_config.h"
#include "layout_util.h"
#include "pixbuf_util.h"
#include "slideshow.h"
+#include "trash.h"
#include "utilops.h"
#include "ui_fileops.h"
#include "ui_misc.h"
#include "ui_tabcomp.h"
#include "ui_utildlg.h"
-#include "bar_exif.h"
-#include "exif.h"
+#include "window.h"
#include <math.h>
enum {
FE_ENABLE,
FE_EXTENSION,
- FE_DESCRIPTION
+ FE_DESCRIPTION,
+ FE_CLASS,
+ FE_WRITABLE,
+ FE_ALLOW_SIDECAR
};
+
+static gchar *format_class_list[] = {
+ N_("Unknown"),
+ N_("Image"),
+ N_("RAW Image"),
+ N_("Metadata")
+ };
+
+
/* config memory values */
static ConfOptions *c_options = NULL;
static GtkWidget *configwindow = NULL;
static GtkWidget *startup_path_entry;
+static GtkWidget *home_path_entry;
static GtkListStore *filter_store = NULL;
-static GtkWidget *editor_name_entry[GQ_EDITOR_SLOTS];
-static GtkWidget *editor_command_entry[GQ_EDITOR_SLOTS];
static GtkWidget *layout_widget;
#define CONFIG_WINDOW_DEF_WIDTH 700
-#define CONFIG_WINDOW_DEF_HEIGHT 500
+#define CONFIG_WINDOW_DEF_HEIGHT 600
/*
*-----------------------------------------------------------------------------
* option widget callbacks (private)
*-----------------------------------------------------------------------------
- */
+ */
static void startup_path_set_current(GtkWidget *widget, gpointer data)
{
gtk_entry_set_text(GTK_ENTRY(startup_path_entry), layout_get_path(NULL));
}
-static void zoom_mode_original_cb(GtkWidget *widget, gpointer data)
+static void home_path_set_current(GtkWidget *widget, gpointer data)
{
- if (GTK_TOGGLE_BUTTON (widget)->active)
- c_options->image.zoom_mode = ZOOM_RESET_ORIGINAL;
+ gtk_entry_set_text(GTK_ENTRY(home_path_entry), layout_get_path(NULL));
}
-static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data)
+static void zoom_mode_cb(GtkWidget *widget, gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
- c_options->image.zoom_mode = ZOOM_RESET_FIT_WINDOW;
+ c_options->image.zoom_mode = GPOINTER_TO_INT(data);
}
-static void zoom_mode_none_cb(GtkWidget *widget, gpointer data)
+static void scroll_reset_cb(GtkWidget *widget, gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
- c_options->image.zoom_mode = ZOOM_RESET_NONE;
+ c_options->image.scroll_reset_method = GPOINTER_TO_INT(data);
}
static void zoom_increment_cb(GtkWidget *spin, gpointer data)
static void slideshow_delay_cb(GtkWidget *spin, gpointer data)
{
c_options->slideshow.delay = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
- (double)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
+ (gdouble)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
}
/*
*-----------------------------------------------------------------------------
* sync progam to config window routine (private)
*-----------------------------------------------------------------------------
- */
+ */
-static void config_window_apply(void)
+static void config_entry_to_option(GtkWidget *entry, gchar **option, gchar *(*func)(const gchar *))
{
const gchar *buf;
- gchar *l_conf;
- gint new_style;
+
+ g_free(*option);
+ *option = NULL;
+ buf = gtk_entry_get_text(GTK_ENTRY(entry));
+ if (buf && strlen(buf) > 0)
+ {
+ if (func)
+ *option = func(buf);
+ else
+ *option = g_strdup(buf);
+ }
+}
+
+#if 0
+static void config_parse_editor_entries(GtkWidget **editor_name_entry, GtkWidget **editor_command_entry)
+{
gint i;
- gint refresh = FALSE;
+ const gchar *buf;
+ GString *errmsg = g_string_new("");
- for(i = 0; i < GQ_EDITOR_SLOTS; i++)
+ for (i = 0; i < GQ_EDITOR_SLOTS; i++)
{
+ gchar *command = NULL;
+
if (i < GQ_EDITOR_GENERIC_SLOTS)
{
- g_free(options->editor_name[i]);
- options->editor_name[i] = NULL;
+ gchar *name = NULL;
+
buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i]));
- if (buf && strlen(buf) > 0) options->editor_name[i] = g_strdup(buf);
+ if (buf && strlen(buf) > 0) name = g_strdup(buf);
+ editor_set_name(i, name);
+ g_free(name);
}
- g_free(options->editor_command[i]);
- options->editor_command[i] = NULL;
buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i]));
- if (buf && strlen(buf) > 0) options->editor_command[i] = g_strdup(buf);
+ if (buf && strlen(buf) > 0)
+ {
+ gint flags = editor_command_parse(buf, NULL, NULL);
+
+ if (flags & EDITOR_ERROR_MASK)
+ {
+ if (errmsg->str[0]) g_string_append(errmsg, "\n\n");
+ g_string_append_printf(errmsg, _("%s\n#%d \"%s\":\n%s"), editor_get_error_str(flags),
+ i+1, options->editor[i].name, buf);
+
+ }
+ command = g_strdup(buf);
+ }
+
+ editor_set_command(i, command);
+ g_free(command);
+ }
+
+ if (errmsg->str[0])
+ {
+ file_util_warning_dialog(_("Invalid editor command"), errmsg->str, GTK_STOCK_DIALOG_ERROR, NULL);
}
- layout_edit_update_all();
- g_free(options->startup_path);
- options->startup_path = NULL;
- buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry));
- if (buf && strlen(buf) > 0) options->startup_path = remove_trailing_slash(buf);
+ g_string_free(errmsg, TRUE);
+}
+#endif
+
+static void config_window_apply(void)
+{
+ gint new_style;
+ gint i;
+ gint refresh = FALSE;
- g_free(options->file_ops.safe_delete_path);
- options->file_ops.safe_delete_path = NULL;
- buf = gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry));
- if (buf && strlen(buf) > 0) options->file_ops.safe_delete_path = remove_trailing_slash(buf);
+// config_parse_editor_entries(editor_name_entry, editor_command_entry);
+// layout_edit_update_all();
- if (options->file_filter.show_dot_files != c_options->file_filter.show_dot_files) refresh = TRUE;
+ config_entry_to_option(safe_delete_path_entry, &options->file_ops.safe_delete_path, remove_trailing_slash);
+
+ if (options->file_filter.show_hidden_files != c_options->file_filter.show_hidden_files) refresh = TRUE;
+ if (options->file_filter.show_dot_directory != c_options->file_filter.show_dot_directory) refresh = TRUE;
if (options->file_sort.case_sensitive != c_options->file_sort.case_sensitive) refresh = TRUE;
if (options->file_filter.disable != c_options->file_filter.disable) refresh = TRUE;
- options->startup_path_enable = c_options->startup_path_enable;
+ options->startup.restore_path = c_options->startup.restore_path;
+ options->startup.use_last_path = c_options->startup.use_last_path;
+ config_entry_to_option(startup_path_entry, &options->startup.path, remove_trailing_slash);
+ config_entry_to_option(home_path_entry, &options->layout.home_path, remove_trailing_slash);
+
options->file_ops.confirm_delete = c_options->file_ops.confirm_delete;
options->file_ops.enable_delete_key = c_options->file_ops.enable_delete_key;
options->file_ops.safe_delete_enable = c_options->file_ops.safe_delete_enable;
options->layout.tools_restore_state = c_options->layout.tools_restore_state;
options->layout.save_window_positions = c_options->layout.save_window_positions;
options->image.zoom_mode = c_options->image.zoom_mode;
+ options->image.scroll_reset_method = c_options->image.scroll_reset_method;
options->image.zoom_2pass = c_options->image.zoom_2pass;
options->image.fit_window_to_image = c_options->image.fit_window_to_image;
options->image.limit_window_size = c_options->image.limit_window_size;
options->thumbnails.enable_caching = c_options->thumbnails.enable_caching;
options->thumbnails.cache_into_dirs = c_options->thumbnails.cache_into_dirs;
options->thumbnails.fast = c_options->thumbnails.fast;
+ options->thumbnails.use_exif = c_options->thumbnails.use_exif;
#if 0
options->thumbnails.use_xvpics = c_options->thumbnails.use_xvpics;
#endif
options->thumbnails.spec_standard = c_options->thumbnails.spec_standard;
- options->enable_metadata_dirs = c_options->enable_metadata_dirs;
- options->file_filter.show_dot_files = c_options->file_filter.show_dot_files;
+ options->metadata.enable_metadata_dirs = c_options->metadata.enable_metadata_dirs;
+ options->file_filter.show_hidden_files = c_options->file_filter.show_hidden_files;
+ options->file_filter.show_dot_directory = c_options->file_filter.show_dot_directory;
+
options->file_sort.case_sensitive = c_options->file_sort.case_sensitive;
options->file_filter.disable = c_options->file_filter.disable;
- sidecar_ext_parse(gtk_entry_get_text(GTK_ENTRY(sidecar_ext_entry)), FALSE);
+ config_entry_to_option(sidecar_ext_entry, &options->sidecar.ext, NULL);
+ sidecar_ext_parse(options->sidecar.ext, FALSE);
options->slideshow.random = c_options->slideshow.random;
options->slideshow.repeat = c_options->slideshow.repeat;
options->collections.rectangular_selection = c_options->collections.rectangular_selection;
options->image.tile_cache_max = c_options->image.tile_cache_max;
+ options->image.image_cache_max = c_options->image.image_cache_max;
+
+ options->image.read_buffer_size = c_options->image.read_buffer_size;
+ options->image.idle_read_loop_count = c_options->image.idle_read_loop_count;
options->thumbnails.quality = c_options->thumbnails.quality;
options->image.zoom_quality = c_options->image.zoom_quality;
options->fullscreen.clean_flip = c_options->fullscreen.clean_flip;
options->fullscreen.disable_saver = c_options->fullscreen.disable_saver;
options->fullscreen.above = c_options->fullscreen.above;
- options->fullscreen.show_info = c_options->fullscreen.show_info;
- if (c_options->fullscreen.info)
- {
- g_free(options->fullscreen.info);
- options->fullscreen.info = g_strdup(c_options->fullscreen.info);
- }
-
+ options->image_overlay.common.show_at_startup = c_options->image_overlay.common.show_at_startup;
+ if (c_options->image_overlay.common.template_string)
+ set_image_overlay_template_string(&options->image_overlay.common.template_string,
+ c_options->image_overlay.common.template_string);
+
options->update_on_time_change = c_options->update_on_time_change;
options->image.exif_rotate_enable = c_options->image.exif_rotate_enable;
options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
options->tree_descend_subdirs = c_options->tree_descend_subdirs;
+
+ options->open_recent_list_maxsize = c_options->open_recent_list_maxsize;
+ options->dnd_icon_size = c_options->dnd_icon_size;
+
+ if (options->show_copy_path != c_options->show_copy_path)
+ {
+ options->show_copy_path = c_options->show_copy_path;
+ layout_copy_path_update_all();
+ }
+
+ options->metadata.save_in_image_file = c_options->metadata.save_in_image_file;
+ options->metadata.save_legacy_IPTC = c_options->metadata.save_legacy_IPTC;
+ options->metadata.warn_on_write_problems = c_options->metadata.warn_on_write_problems;
+ options->metadata.save_legacy_format = c_options->metadata.save_legacy_format;
+ options->metadata.sync_grouped_files = c_options->metadata.sync_grouped_files;
+ options->metadata.confirm_write = c_options->metadata.confirm_write;
+ options->metadata.confirm_timeout = c_options->metadata.confirm_timeout;
+ options->metadata.confirm_after_timeout = c_options->metadata.confirm_after_timeout;
+ options->metadata.confirm_on_image_change = c_options->metadata.confirm_on_image_change;
+ options->metadata.confirm_on_dir_change = c_options->metadata.confirm_on_dir_change;
+
#ifdef DEBUG
- debug = debug_c;
+ set_debug_level(debug_c);
#endif
#ifdef HAVE_LCMS
for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
{
- g_free(options->color_profile.input_name[i]);
- options->color_profile.input_name[i] = NULL;
- buf = gtk_entry_get_text(GTK_ENTRY(color_profile_input_name_entry[i]));
- if (buf && strlen(buf) > 0) options->color_profile.input_name[i] = g_strdup(buf);
-
- g_free(options->color_profile.input_file[i]);
- options->color_profile.input_file[i] = NULL;
- buf = gtk_entry_get_text(GTK_ENTRY(color_profile_input_file_entry[i]));
- if (buf && strlen(buf) > 0) options->color_profile.input_file[i] = g_strdup(buf);
+ config_entry_to_option(color_profile_input_name_entry[i], &options->color_profile.input_name[i], NULL);
+ config_entry_to_option(color_profile_input_file_entry[i], &options->color_profile.input_file[i], NULL);
}
- g_free(options->color_profile.screen_file);
- options->color_profile.screen_file = NULL;
- buf = gtk_entry_get_text(GTK_ENTRY(color_profile_screen_file_entry));
- if (buf && strlen(buf) > 0) options->color_profile.screen_file = g_strdup(buf);
+ config_entry_to_option(color_profile_screen_file_entry, &options->color_profile.screen_file, NULL);
#endif
- for (i=0; ExifUIList[i].key; i++)
+ for (i = 0; ExifUIList[i].key; i++)
{
ExifUIList[i].current = ExifUIList[i].temp;
}
- l_conf = layout_config_get(layout_widget, &new_style);
+ {
+ gchar *layout_order = layout_config_get(layout_widget, &new_style);
if (new_style != options->layout.style ||
- (l_conf == NULL) != (options->layout.order == NULL) ||
+ (layout_order == NULL) != (options->layout.order == NULL) ||
!options->layout.order ||
- strcmp(buf, options->layout.order) != 0)
+ strcmp(layout_order, options->layout.order) != 0)
{
if (refresh) filter_rebuild();
refresh = FALSE;
g_free(options->layout.order);
- options->layout.order = l_conf;
- l_conf = NULL;
+ options->layout.order = layout_order;
+ layout_order = NULL; /* g_free() later */
options->layout.style = new_style;
layout_styles_update();
}
- g_free(l_conf);
+ g_free(layout_order);
+ }
+
+ if (options->layout.show_directory_date != c_options->layout.show_directory_date)
+ {
+ options->layout.show_directory_date = c_options->layout.show_directory_date;
+ refresh = TRUE;
+ }
image_options_sync();
*-----------------------------------------------------------------------------
* config window main button callbacks (private)
*-----------------------------------------------------------------------------
- */
+ */
static void config_window_close_cb(GtkWidget *widget, gpointer data)
{
config_window_apply();
}
+static void config_window_save_cb(GtkWidget *widget, gpointer data)
+{
+ config_window_apply();
+ save_options(options);
+}
+
/*
*-----------------------------------------------------------------------------
* config window setup (private)
*-----------------------------------------------------------------------------
- */
+ */
static void exif_item_cb(GtkWidget *combo, gpointer data)
{
*option = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
}
-static void exif_item(GtkWidget *table, gint column, gint row,
+static void exif_item(GtkWidget *table, gint column, gint row,
const gchar *text, gint option, gint *option_c)
{
GtkWidget *combo;
combo = gtk_combo_box_new_text();
- /* note: the order is important, it must match the values of
+ /* note: the order is important, it must match the values of
* EXIF_UI_OFF, _IFSET, _ON */
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Never"));
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("If set"));
g_signal_connect(G_OBJECT(combo), "changed",
G_CALLBACK(exif_item_cb), option_c);
- gtk_table_attach(GTK_TABLE(table), combo,
+ gtk_table_attach(GTK_TABLE(table), combo,
column + 1, column + 2, row, row + 1,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
gtk_widget_show(combo);
}
static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
- gint option, gint *option_c)
+ guint option, guint *option_c)
{
GtkWidget *combo;
gint current = 0;
gint n;
n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+ if (n < 0) return;
- if (n >= 0 && n < sizeof(thumb_size_list) / sizeof(ThumbSize))
+ if ((guint) n < sizeof(thumb_size_list) / sizeof(ThumbSize))
{
c_options->thumbnails.max_width = thumb_size_list[n].w;
c_options->thumbnails.max_height = thumb_size_list[n].h;
}
- else if (n > 0)
+ else
{
c_options->thumbnails.max_width = options->thumbnails.max_width;
c_options->thumbnails.max_height = options->thumbnails.max_height;
combo = gtk_combo_box_new_text();
current = -1;
- for (i = 0; i < sizeof(thumb_size_list) / sizeof(ThumbSize); i++)
+ for (i = 0; (guint) i < sizeof(thumb_size_list) / sizeof(ThumbSize); i++)
{
gint w, h;
gchar *buf;
buf = g_strdup_printf("%d x %d", w, h);
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
g_free(buf);
-
+
if (w == options->thumbnails.max_width && h == options->thumbnails.max_height) current = i;
}
filter_rebuild();
}
+static void filter_store_class_edit_cb(GtkCellRendererText *cell, gchar *path_str,
+ gchar *new_text, gpointer data)
+{
+
+ GtkWidget *model = data;
+ FilterEntry *fe = data;
+ GtkTreePath *tpath;
+ GtkTreeIter iter;
+ gint i;
+
+ if (!new_text || strlen(new_text) < 1) return;
+
+ tpath = gtk_tree_path_new_from_string(path_str);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+ for (i = 0; i < FILE_FORMAT_CLASSES; i++)
+ {
+ if (strcmp(new_text, _(format_class_list[i])) == 0)
+ {
+ fe->file_class = i;
+ break;
+ }
+ }
+
+ gtk_tree_path_free(tpath);
+ filter_rebuild();
+}
+
static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str,
gchar *new_text, gpointer data)
{
filter_rebuild();
}
+static void filter_store_writable_cb(GtkCellRendererToggle *renderer,
+ gchar *path_str, gpointer data)
+{
+ GtkWidget *model = data;
+ FilterEntry *fe;
+ GtkTreePath *tpath;
+ GtkTreeIter iter;
+
+ tpath = gtk_tree_path_new_from_string(path_str);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+ fe->writable = !fe->writable;
+ if (fe->writable) fe->allow_sidecar = FALSE;
+
+ gtk_tree_path_free(tpath);
+ filter_rebuild();
+}
+
+static void filter_store_sidecar_cb(GtkCellRendererToggle *renderer,
+ gchar *path_str, gpointer data)
+{
+ GtkWidget *model = data;
+ FilterEntry *fe;
+ GtkTreePath *tpath;
+ GtkTreeIter iter;
+
+ tpath = gtk_tree_path_new_from_string(path_str);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+ fe->allow_sidecar = !fe->allow_sidecar;
+ if (fe->allow_sidecar) fe->writable = FALSE;
+
+ gtk_tree_path_free(tpath);
+ filter_rebuild();
+}
+
static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
{
g_object_set(GTK_CELL_RENDERER(cell),
"text", fe->description, NULL);
break;
+ case FE_CLASS:
+ g_object_set(GTK_CELL_RENDERER(cell),
+ "text", _(format_class_list[fe->file_class]), NULL);
+ break;
+ case FE_WRITABLE:
+ g_object_set(GTK_CELL_RENDERER(cell),
+ "active", fe->writable, NULL);
+ break;
+ case FE_ALLOW_SIDECAR:
+ g_object_set(GTK_CELL_RENDERER(cell),
+ "active", fe->allow_sidecar, NULL);
+ break;
}
}
static void filter_add_cb(GtkWidget *widget, gpointer data)
{
- filter_add_unique("description", ".new", FORMAT_CLASS_IMAGE, TRUE);
+ filter_add_unique("description", ".new", FORMAT_CLASS_IMAGE, TRUE, FALSE, TRUE);
filter_store_populate();
/* FIXME: implement the scroll to/select row stuff for tree view */
FilterEntry *fe;
if (!filter_store) return;
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1);
if (!fe) return;
GenericDialog *gd;
gd = generic_dialog_new(_("Reset filters"),
- GQ_WMCLASS, "reset_filter", widget, TRUE,
+ "reset_filter", widget, TRUE,
dummy_cancel_cb, NULL);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"),
_("This will reset the file filters to the defaults.\nContinue?"));
gtk_widget_show(gd->dialog);
}
-static void filter_disable_cb(GtkWidget* widget, gpointer data)
+static void filter_disable_cb(GtkWidget *widget, gpointer data)
{
GtkWidget *frame = data;
!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
}
+#if 0
static void editor_default_ok_cb(GenericDialog *gd, gpointer data)
{
gint i;
{
if (i < GQ_EDITOR_GENERIC_SLOTS)
gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),
- (options->editor_name[i]) ? options->editor_name[i] : "");
+ (options->editor[i].name) ? options->editor[i].name : "");
gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]),
- (options->editor_command[i]) ? options->editor_command[i] : "");
+ (options->editor[i].command) ? options->editor[i].command : "");
}
}
GenericDialog *gd;
gd = generic_dialog_new(_("Reset editors"),
- GQ_WMCLASS, "reset_filter", widget, TRUE,
+ "reset_filter", widget, TRUE,
dummy_cancel_cb, NULL);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"),
_("This will reset the edit commands to the defaults.\nContinue?"));
{
help_window_show("editors");
}
+#endif
-static void safe_delete_view_cb(GtkWidget* widget, gpointer data)
+static void safe_delete_view_cb(GtkWidget *widget, gpointer data)
{
layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
}
file_util_trash_clear();
}
-static void safe_delete_clear_cb(GtkWidget* widget, gpointer data)
+static void safe_delete_clear_cb(GtkWidget *widget, gpointer data)
{
GenericDialog *gd;
GtkWidget *entry;
gd = generic_dialog_new(_("Clear trash"),
- GQ_WMCLASS, "clear_trash", widget, TRUE,
+ "clear_trash", widget, TRUE,
dummy_cancel_cb, NULL);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"),
_("This will remove the trash contents."));
gtk_widget_show(gd->dialog);
}
-static void fullscreen_info_view_changed_cb(GtkWidget* widget, gpointer data)
+static void image_overlay_template_view_changed_cb(GtkWidget *widget, gpointer data)
{
GtkWidget *pTextView;
- GtkTextBuffer* pTextBuffer;
+ GtkTextBuffer *pTextBuffer;
GtkTextIter iStart;
GtkTextIter iEnd;
gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
- if (c_options->fullscreen.info) g_free(c_options->fullscreen.info);
- c_options->fullscreen.info = gtk_text_buffer_get_text(pTextBuffer, &iStart, &iEnd, TRUE);
+ set_image_overlay_template_string(&c_options->image_overlay.common.template_string,
+ gtk_text_buffer_get_text(pTextBuffer, &iStart, &iEnd, TRUE));
+}
+
+static void image_overlay_default_template_ok_cb(GenericDialog *gd, gpointer data)
+{
+ GtkTextView *text_view = data;
+ GtkTextBuffer *buffer;
+
+ set_default_image_overlay_template_string(&options->image_overlay.common.template_string);
+ if (!configwindow) return;
+
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
+ gtk_text_buffer_set_text(buffer, options->image_overlay.common.template_string, -1);
+}
+
+static void image_overlay_default_template_cb(GtkWidget *widget, gpointer data)
+{
+ GenericDialog *gd;
+
+ gd = generic_dialog_new(_("Reset image overlay template string"),
+ "reset_image_overlay_template_string", widget, TRUE,
+ dummy_cancel_cb, data);
+ generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset image overlay template string"),
+ _("This will reset the image overlay template string to the default.\nContinue?"));
+ generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, image_overlay_default_template_ok_cb, TRUE);
+ gtk_widget_show(gd->dialog);
+}
+
+static void image_overlay_help_cb(GtkWidget *widget, gpointer data)
+{
+ help_window_show("overlay");
+}
+
+static GtkWidget *scrolled_notebook_page(GtkWidget *notebook, const gchar *title)
+{
+ GtkWidget *label;
+ GtkWidget *vbox;
+ GtkWidget *scrolled;
+ GtkWidget *viewport;
+
+ scrolled = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ label = gtk_label_new(title);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
+ gtk_widget_show(scrolled);
+
+ viewport = gtk_viewport_new(NULL, NULL);
+ gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
+ gtk_container_add(GTK_CONTAINER(scrolled), viewport);
+ gtk_widget_show(viewport);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(viewport), vbox);
+ gtk_widget_show(vbox);
+
+ return vbox;
}
/* general options tab */
static void config_tab_general(GtkWidget *notebook)
{
- GtkWidget *label;
GtkWidget *hbox;
GtkWidget *vbox;
+ GtkWidget *subvbox;
GtkWidget *group;
GtkWidget *subgroup;
GtkWidget *button;
GtkWidget *table;
GtkWidget *spin;
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
- gtk_widget_show(vbox);
- label = gtk_label_new(_("General"));
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label);
+ vbox = scrolled_notebook_page(notebook, _("General"));
group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL);
- button = pref_checkbox_new_int(group, _("Change to folder:"),
- options->startup_path_enable, &c_options->startup_path_enable);
+ button = pref_checkbox_new_int(group, _("Restore folder on startup"),
+ options->startup.restore_path, &c_options->startup.restore_path);
- hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
- pref_checkbox_link_sensitivity(button, hbox);
+ subvbox = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
+ pref_checkbox_link_sensitivity(button, subvbox);
- tabcomp = tab_completion_new(&startup_path_entry, options->startup_path, NULL, NULL);
+ hbox = pref_box_new(subvbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+ tabcomp = tab_completion_new(&startup_path_entry, options->startup.path, NULL, NULL);
tab_completion_add_select_button(startup_path_entry, NULL, TRUE);
gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
gtk_widget_show(tabcomp);
button = pref_button_new(hbox, NULL, _("Use current"), FALSE,
G_CALLBACK(startup_path_set_current), NULL);
+ button = pref_checkbox_new_int(subvbox, _("Use last path"),
+ options->startup.use_last_path, &c_options->startup.use_last_path);
+ pref_checkbox_link_sensitivity_swap(button, hbox);
+
+
group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL);
table = pref_table_new(group, 2, 2, FALSE, FALSE);
pref_checkbox_new_int(group, _("Faster jpeg thumbnailing (may reduce quality)"),
options->thumbnails.fast, &c_options->thumbnails.fast);
+ pref_checkbox_new_int(group, _("Use EXIF thumbnails when available"),
+ options->thumbnails.use_exif, &c_options->thumbnails.use_exif);
+
group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL);
c_options->slideshow.delay = options->slideshow.delay;
spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"),
SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1,
- options->slideshow.delay ? (double)options->slideshow.delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
+ options->slideshow.delay ? (gdouble)options->slideshow.delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
G_CALLBACK(slideshow_delay_cb), NULL);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
/* image tab */
static void config_tab_image(GtkWidget *notebook)
{
- GtkWidget *label;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *group;
GtkWidget *table;
GtkWidget *spin;
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
- gtk_widget_show(vbox);
- label = gtk_label_new(_("Image"));
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label);
+ vbox = scrolled_notebook_page(notebook, _("Image"));
group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL);
c_options->image.zoom_increment = options->image.zoom_increment;
spin = pref_spin_new(group, _("Zoom increment:"), NULL,
- 0.1, 4.0, 0.1, 1, (double)options->image.zoom_increment / 10.0,
+ 0.1, 4.0, 0.1, 1, (gdouble)options->image.zoom_increment / 10.0,
G_CALLBACK(zoom_increment_cb), NULL);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
c_options->image.zoom_mode = options->image.zoom_mode;
button = pref_radiobutton_new(group, NULL, _("Zoom to original size"),
(options->image.zoom_mode == ZOOM_RESET_ORIGINAL),
- G_CALLBACK(zoom_mode_original_cb), NULL);
+ G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_ORIGINAL));
button = pref_radiobutton_new(group, button, _("Fit image to window"),
(options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW),
- G_CALLBACK(zoom_mode_fit_cb), NULL);
+ G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_FIT_WINDOW));
button = pref_radiobutton_new(group, button, _("Leave Zoom at previous setting"),
(options->image.zoom_mode == ZOOM_RESET_NONE),
- G_CALLBACK(zoom_mode_none_cb), NULL);
+ G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_NONE));
+
+ group = pref_group_new(vbox, FALSE, _("Scroll reset method:"), GTK_ORIENTATION_VERTICAL);
+
+ c_options->image.scroll_reset_method = options->image.scroll_reset_method;
+ button = pref_radiobutton_new(group, NULL, _("Top left"),
+ (options->image.scroll_reset_method == SCROLL_RESET_TOPLEFT),
+ G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_TOPLEFT));
+ button = pref_radiobutton_new(group, button, _("Center"),
+ (options->image.scroll_reset_method == SCROLL_RESET_CENTER),
+ G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_CENTER));
+ button = pref_radiobutton_new(group, button, _("No change"),
+ (options->image.scroll_reset_method == SCROLL_RESET_NOCHANGE),
+ G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_NOCHANGE));
+
group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
/* windows tab */
static void config_tab_windows(GtkWidget *notebook)
{
- GtkWidget *label;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *group;
GtkWidget *ct_button;
GtkWidget *spin;
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
- gtk_widget_show(vbox);
- label = gtk_label_new(_("Windows"));
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+ vbox = scrolled_notebook_page(notebook, _("Windows"));
group = pref_group_new(vbox, FALSE, _("State"), GTK_ORIENTATION_VERTICAL);
gtk_widget_show(layout_widget);
}
+static GtkTreeModel *create_class_model(void)
+{
+ GtkListStore *model;
+ GtkTreeIter iter;
+ gint i;
+
+ /* create list store */
+ model = gtk_list_store_new (1, G_TYPE_STRING);
+ for (i = 0; i < FILE_FORMAT_CLASSES; i++)
+ {
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set(model, &iter, 0, _(format_class_list[i]), -1);
+ }
+ return GTK_TREE_MODEL (model);
+}
+
+
/* filtering tab */
static void config_tab_filtering(GtkWidget *notebook)
{
GtkWidget *hbox;
GtkWidget *frame;
- GtkWidget *label;
GtkWidget *vbox;
GtkWidget *group;
GtkWidget *button;
GtkTreeSelection *selection;
GtkTreeViewColumn *column;
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER (vbox), PREF_PAD_BORDER);
- gtk_widget_show(vbox);
- label = gtk_label_new(_("Filtering"));
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+ vbox = scrolled_notebook_page(notebook, _("Filtering"));
group = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
- pref_checkbox_new_int(group, _("Show entries that begin with a dot"),
- options->file_filter.show_dot_files, &c_options->file_filter.show_dot_files);
+ pref_checkbox_new_int(group, _("Show hidden files or folders"),
+ options->file_filter.show_hidden_files, &c_options->file_filter.show_hidden_files);
+ pref_checkbox_new_int(group, _("Show dot directory"),
+ options->file_filter.show_dot_directory, &c_options->file_filter.show_dot_directory);
pref_checkbox_new_int(group, _("Case sensitive sort"),
options->file_sort.case_sensitive, &c_options->file_sort.case_sensitive);
group = pref_group_new(vbox, FALSE, _("Grouping sidecar extensions"), GTK_ORIENTATION_VERTICAL);
sidecar_ext_entry = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(sidecar_ext_entry), sidecar_ext_to_string());
+ gtk_entry_set_text(GTK_ENTRY(sidecar_ext_entry), options->sidecar.ext);
gtk_box_pack_start(GTK_BOX(group), sidecar_ext_entry, FALSE, FALSE, 0);
gtk_widget_show(sidecar_ext_entry);
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
gtk_widget_show(scrolled);
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
GINT_TO_POINTER(FE_ENABLE), NULL);
-
+
renderer = gtk_cell_renderer_text_new();
g_signal_connect(G_OBJECT(renderer), "edited",
G_CALLBACK(filter_store_ext_edit_cb), filter_store);
GINT_TO_POINTER(FE_DESCRIPTION), NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Class"));
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ renderer = gtk_cell_renderer_combo_new();
+ g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE,
+ "model", create_class_model(),
+ "text-column", 0,
+ "has-entry", FALSE,
+ NULL);
+
+ g_signal_connect(G_OBJECT(renderer), "edited",
+ G_CALLBACK(filter_store_class_edit_cb), filter_store);
+ gtk_tree_view_column_pack_start(column, renderer, TRUE);
+ gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+ GINT_TO_POINTER(FE_CLASS), NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Writable"));
+ gtk_tree_view_column_set_resizable(column, FALSE);
+ renderer = gtk_cell_renderer_toggle_new();
+ g_signal_connect(G_OBJECT(renderer), "toggled",
+ G_CALLBACK(filter_store_writable_cb), filter_store);
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+ GINT_TO_POINTER(FE_WRITABLE), NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Sidecar is allowed"));
+ gtk_tree_view_column_set_resizable(column, FALSE);
+ renderer = gtk_cell_renderer_toggle_new();
+ g_signal_connect(G_OBJECT(renderer), "toggled",
+ G_CALLBACK(filter_store_sidecar_cb), filter_store);
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+ GINT_TO_POINTER(FE_ALLOW_SIDECAR), NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+
+
filter_store_populate();
gtk_container_add(GTK_CONTAINER(scrolled), filter_view);
gtk_widget_show(filter_view);
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
}
-
+#if 0
/* editors tab */
static void config_tab_editors(GtkWidget *notebook)
{
GtkWidget *table;
gint i;
- vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
- gtk_widget_show(vbox);
- label = gtk_label_new(_("Editors"));
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+ vbox = scrolled_notebook_page(notebook, _("Editors"));
table = pref_table_new(vbox, 3, 9, FALSE, FALSE);
gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
if (i < GQ_EDITOR_GENERIC_SLOTS)
{
gchar *buf;
-
+
buf = g_strdup_printf("%d", i+1);
pref_table_label(table, 0, i+1, buf, 1.0);
g_free(buf);
entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), EDITOR_NAME_MAX_LENGTH);
gtk_widget_set_size_request(entry, 80, -1);
- if (options->editor_name[i])
- gtk_entry_set_text(GTK_ENTRY(entry), options->editor_name[i]);
+ if (options->editor[i].name)
+ gtk_entry_set_text(GTK_ENTRY(entry), options->editor[i].name);
}
else
{
- entry = gtk_label_new(options->editor_name[i]);
+ entry = gtk_label_new(options->editor[i].name);
gtk_misc_set_alignment(GTK_MISC(entry), 0.0, 0.5);
}
-
- gtk_table_attach(GTK_TABLE (table), entry, 1, 2, i+1, i+2,
+
+ gtk_table_attach(GTK_TABLE(table), entry, 1, 2, i+1, i+2,
GTK_FILL | GTK_SHRINK, 0, 0, 0);
gtk_widget_show(entry);
editor_name_entry[i] = entry;
gtk_entry_set_max_length(GTK_ENTRY(entry), EDITOR_COMMAND_MAX_LENGTH);
gtk_widget_set_size_request(entry, 160, -1);
tab_completion_add_to_entry(entry, NULL, NULL);
- if (options->editor_command[i])
- gtk_entry_set_text(GTK_ENTRY(entry), options->editor_command[i]);
- gtk_table_attach(GTK_TABLE (table), entry, 2, 3, i+1, i+2,
+ if (options->editor[i].command)
+ gtk_entry_set_text(GTK_ENTRY(entry), options->editor[i].command);
+ gtk_table_attach(GTK_TABLE(table), entry, 2, 3, i+1, i+2,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_widget_show(entry);
editor_command_entry[i] = entry;
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
}
+#endif
/* properties tab */
static void config_tab_properties(GtkWidget *notebook)
GtkWidget *vbox;
GtkWidget *group;
GtkWidget *table;
- GtkWidget *scrolled;
- GtkWidget *viewport;
gint i;
- scrolled = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
- label = gtk_label_new(_("Properties"));
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
- gtk_widget_show(scrolled);
+ vbox = scrolled_notebook_page(notebook, _("Properties"));
- viewport = gtk_viewport_new(NULL, NULL);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
- gtk_container_add(GTK_CONTAINER(scrolled), viewport);
- gtk_widget_show(viewport);
+ group = pref_group_new(vbox, FALSE, _("Exif"),
+ GTK_ORIENTATION_VERTICAL);
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(viewport), vbox);
- gtk_widget_show(vbox);
- group = pref_group_new(vbox, FALSE, _("Exif"),
- GTK_ORIENTATION_VERTICAL);
-
-
pref_spacer(group, PREF_PAD_INDENT - PREF_PAD_SPACE);
label = pref_label_new(group, _("What to show in properties dialog:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
for (i = 0; ExifUIList[i].key; i++)
{
- const gchar *title;
-
- title = exif_get_description_by_key(ExifUIList[i].key);
+ gchar *title;
+
+ title = exif_get_description_by_key(ExifUIList[i].key);
exif_item(table, 0, i, title, ExifUIList[i].current,
&ExifUIList[i].temp);
+ g_free(title);
}
}
GtkWidget *ct_button;
GtkWidget *table;
GtkWidget *spin;
+ GtkWidget *image_overlay_template_view;
GtkWidget *scrolled;
- GtkWidget *viewport;
- GtkWidget *fullscreen_info_view;
GtkTextBuffer *buffer;
gint i;
- scrolled = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- label = gtk_label_new(_("Advanced"));
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
- gtk_widget_show(scrolled);
-
- viewport = gtk_viewport_new(NULL, NULL);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
- gtk_container_add(GTK_CONTAINER(scrolled), viewport);
- gtk_widget_show(viewport);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(viewport), vbox);
- gtk_widget_show(vbox);
+ vbox = scrolled_notebook_page(notebook, _("Advanced"));
group = pref_group_new(vbox, FALSE, _("Full screen"), GTK_ORIENTATION_VERTICAL);
options->fullscreen.clean_flip, &c_options->fullscreen.clean_flip);
pref_checkbox_new_int(group, _("Disable screen saver"),
options->fullscreen.disable_saver, &c_options->fullscreen.disable_saver);
- pref_checkbox_new_int(group, _("Always show fullscreen info"),
- options->fullscreen.show_info, &c_options->fullscreen.show_info);
- pref_label_new(group, _("Fullscreen info string"));
+
+
+ group = pref_group_new(vbox, FALSE, _("Overlay Screen Display"), GTK_ORIENTATION_VERTICAL);
+
+ pref_checkbox_new_int(group, _("Always show image overlay at startup"),
+ options->image_overlay.common.show_at_startup, &c_options->image_overlay.common.show_at_startup);
+ pref_label_new(group, _("Image overlay template"));
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_size_request(scrolled, 200, 150);
gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 5);
gtk_widget_show(scrolled);
- fullscreen_info_view = gtk_text_view_new();
+ image_overlay_template_view = gtk_text_view_new();
#if GTK_CHECK_VERSION(2,12,0)
- gtk_widget_set_tooltip_markup(fullscreen_info_view,
+ gtk_widget_set_tooltip_markup(image_overlay_template_view,
_("<i>%name%</i> results in the filename of the picture.\n"
"Also available: <i>%collection%</i>, <i>%number%</i>, <i>%total%</i>, <i>%date%</i>,\n"
"<i>%size%</i> (filesize), <i>%width%</i>, <i>%height%</i>, <i>%res%</i> (resolution)\n"
- "To access exif data use the exif name, e. g. <i>%fCamera%</i> is the formatted camera name,\n"
+ "To access exif data use the exif name, e. g. <i>%formatted.Camera%</i> is the formatted camera name,\n"
"<i>%Exif.Photo.DateTimeOriginal%</i> the date of the original shot.\n"
- "<i>%fCamera:20</i> notation will truncate the displayed data to 20 characters and will add 3 dots at the end to denote the truncation.\n"
+ "<i>%formatted.Camera:20</i> notation will truncate the displayed data to 20 characters and will add 3 dots at the end to denote the truncation.\n"
"If two or more variables are connected with the |-sign, it prints available variables with a separator.\n"
- "<i>%fShutterSpeed%</i>|<i>%fISOSpeedRating%</i>|<i>%fFocalLength%</i> could show \"1/20s - 400 - 80 mm\" or \"1/200 - 80 mm\",\n"
+ "<i>%formatted.ShutterSpeed%</i>|<i>%formatted.ISOSpeedRating%</i>|<i>%formatted.FocalLength%</i> could show \"1/20s - 400 - 80 mm\" or \"1/200 - 80 mm\",\n"
"if there's no ISO information in the Exif data.\n"
"If a line is empty, it is removed. This allows to add lines that totally disappear when no data is available.\n"
));
#endif
- gtk_container_add(GTK_CONTAINER(scrolled), fullscreen_info_view);
- gtk_widget_show(fullscreen_info_view);
+ gtk_container_add(GTK_CONTAINER(scrolled), image_overlay_template_view);
+ gtk_widget_show(image_overlay_template_view);
+
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
+
+ button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
+ G_CALLBACK(image_overlay_default_template_cb), image_overlay_template_view);
+ gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show(button);
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(fullscreen_info_view));
- gtk_text_buffer_set_text(buffer, options->fullscreen.info, -1);
+ button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
+ G_CALLBACK(image_overlay_help_cb), NULL);
+ gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show(button);
+
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(image_overlay_template_view));
+ if (options->image_overlay.common.template_string) gtk_text_buffer_set_text(buffer, options->image_overlay.common.template_string, -1);
g_signal_connect(G_OBJECT(buffer), "changed",
- G_CALLBACK(fullscreen_info_view_changed_cb), fullscreen_info_view);
+ G_CALLBACK(image_overlay_template_view_changed_cb), image_overlay_template_view);
group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL);
pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP);
spin = pref_spin_new_int(hbox, _("Maximum size:"), _("MB"),
- 0, 2048, 1, options->file_ops.safe_delete_folder_maxsize, &c_options->file_ops.safe_delete_folder_maxsize);
+ 0, 2048, 1, options->file_ops.safe_delete_folder_maxsize, &c_options->file_ops.safe_delete_folder_maxsize);
#if GTK_CHECK_VERSION(2,12,0)
gtk_widget_set_tooltip_markup(spin, _("Set to 0 for unlimited size"));
#endif
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
+
group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
pref_checkbox_new_int(group, _("Descend folders in tree view"),
options->tree_descend_subdirs, &c_options->tree_descend_subdirs);
+ pref_checkbox_new_int(group, _("Show date in directories list view"),
+ options->layout.show_directory_date, &c_options->layout.show_directory_date);
+
pref_checkbox_new_int(group, _("In place renaming"),
options->file_ops.enable_in_place_rename, &c_options->file_ops.enable_in_place_rename);
+ pref_checkbox_new_int(group, _("Show \"Copy path\" menu item which write the path of selected files to clipboard"),
+ options->show_copy_path, &c_options->show_copy_path);
+
+ pref_spin_new_int(group, _("Open recent list maximum size"), NULL,
+ 1, 50, 1, options->open_recent_list_maxsize, &c_options->open_recent_list_maxsize);
+
+ pref_spin_new_int(group, _("Drag'n drop icon size"), NULL,
+ 16, 256, 16, options->dnd_icon_size, &c_options->dnd_icon_size);
+
group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
pref_checkbox_new_int(group, _("Mouse wheel scrolls image"),
options->mousewheel_scrolls, &c_options->mousewheel_scrolls);
- group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL);
+ pref_label_new(group, _("Home button path (empty to use your home directory)"));
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+ tabcomp = tab_completion_new(&home_path_entry, options->layout.home_path, NULL, NULL);
+ tab_completion_add_select_button(home_path_entry, NULL, TRUE);
+ gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
+ gtk_widget_show(tabcomp);
+
+ button = pref_button_new(hbox, NULL, _("Use current"), FALSE,
+ G_CALLBACK(home_path_set_current), NULL);
+
+
+ group = pref_group_new(vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL);
+
+ pref_checkbox_new_int(group, _("Store metadata and cache files in source image's directory"),
+ options->metadata.enable_metadata_dirs, &c_options->metadata.enable_metadata_dirs);
+
+ ct_button = pref_checkbox_new_int(group, _("Store keywords and comments as XMP tags in image files"),
+ options->metadata.save_in_image_file, &c_options->metadata.save_in_image_file);
+
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
+ pref_checkbox_link_sensitivity(ct_button, hbox);
+
+ pref_checkbox_new_int(hbox, _("Store keywords and comments also in legacy IPTC tags"),
+ options->metadata.save_legacy_IPTC, &c_options->metadata.save_legacy_IPTC);
+
+ pref_checkbox_new_int(hbox, _("Warn if the image files are unwritable"),
+ options->metadata.warn_on_write_problems, &c_options->metadata.warn_on_write_problems);
+
+ pref_checkbox_new_int(hbox, _("Ask before writing to image files"),
+ options->metadata.confirm_write, &c_options->metadata.confirm_write);
- pref_checkbox_new_int(group, _("Store keywords and comments local to source images"),
- options->enable_metadata_dirs, &c_options->enable_metadata_dirs);
+ pref_checkbox_new_int(group, _("Save metadata in GQview legacy metadata format"),
+ options->metadata.save_legacy_format, &c_options->metadata.save_legacy_format);
+
+ pref_checkbox_new_int(group, _("Write the same keywords and comment to all files in a group"),
+ options->metadata.sync_grouped_files, &c_options->metadata.sync_grouped_files);
+
+ ct_button = pref_checkbox_new_int(group, _("Write metadata after timeout"),
+ options->metadata.confirm_after_timeout, &c_options->metadata.confirm_after_timeout);
+
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+ pref_checkbox_link_sensitivity(ct_button, hbox);
+
+ pref_spin_new_int(hbox, _("Timeout (seconds):"), NULL, 0, 900, 1,
+ options->metadata.confirm_timeout, &c_options->metadata.confirm_timeout);
+
+ pref_checkbox_new_int(group, _("Write metadata on image change"),
+ options->metadata.confirm_on_image_change, &c_options->metadata.confirm_on_image_change);
+
+ pref_checkbox_new_int(group, _("Write metadata on directory change"),
+ options->metadata.confirm_on_dir_change, &c_options->metadata.confirm_on_dir_change);
+
+ group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
- 0, 100, 1, options->duplicates_similarity_threshold, &c_options->duplicates_similarity_threshold);
+ 0, 100, 1, options->duplicates_similarity_threshold, (int *)&c_options->duplicates_similarity_threshold);
+
+ group = pref_group_new(vbox, FALSE, _("Image loading and caching"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Offscreen cache size (Mb per image):"), NULL,
0, 128, 1, options->image.tile_cache_max, &c_options->image.tile_cache_max);
+ pref_spin_new_int(group, _("Decoded image cache size (Mb):"), NULL,
+ 0, 1024, 1, options->image.image_cache_max, &c_options->image.image_cache_max);
+
+ pref_spin_new_int(group, _("Image read buffer size (bytes):"), NULL,
+ IMAGE_LOADER_READ_BUFFER_SIZE_MIN, IMAGE_LOADER_READ_BUFFER_SIZE_MAX, 512,
+ options->image.read_buffer_size, &c_options->image.read_buffer_size);
+
+ pref_spin_new_int(group, _("Image idle loop read count:"), NULL,
+ IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MIN, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MAX, 1,
+ options->image.idle_read_loop_count, &c_options->image.idle_read_loop_count);
+
+
group = pref_group_new(vbox, FALSE, _("Color profiles"), GTK_ORIENTATION_VERTICAL);
#ifndef HAVE_LCMS
gtk_widget_set_sensitive(pref_group_parent(group), FALSE);
GtkWidget *entry;
gchar *buf;
- buf = g_strdup_printf("Input %d:", i + 1);
+ buf = g_strdup_printf("Input %d:", i + COLOR_PROFILE_FILE);
pref_table_label(table, 0, i + 1, buf, 1.0);
g_free(buf);
entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), EDITOR_NAME_MAX_LENGTH);
- gtk_widget_set_size_request(editor_name_entry[i], 30, -1);
+// gtk_widget_set_size_request(editor_name_entry[i], 30, -1);
if (options->color_profile.input_name[i])
{
gtk_entry_set_text(GTK_ENTRY(entry), options->color_profile.input_name[i]);
group = pref_group_new(vbox, FALSE, _("Debugging"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Debug level:"), NULL,
- 0, 9, 1, debug, &debug_c);
+ DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX, 1, get_debug_level(), &debug_c);
#endif
}
configwindow = window_new(GTK_WINDOW_TOPLEVEL, "preferences", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Preferences"));
gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
- g_signal_connect(G_OBJECT (configwindow), "delete_event",
+ g_signal_connect(G_OBJECT(configwindow), "delete_event",
G_CALLBACK(config_window_delete), NULL);
- gtk_window_set_default_size(GTK_WINDOW(configwindow), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
+ gtk_window_set_default_size(GTK_WINDOW(configwindow), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
gtk_window_set_resizable(GTK_WINDOW(configwindow), TRUE);
gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
ct_button = button;
+ button = pref_button_new(NULL, GTK_STOCK_SAVE, NULL, FALSE,
+ G_CALLBACK(config_window_save_cb), NULL);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+ gtk_widget_show(button);
+
button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE,
G_CALLBACK(config_window_apply_cb), NULL);
gtk_container_add(GTK_CONTAINER(hbox), button);
}
notebook = gtk_notebook_new();
- gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
config_tab_general(notebook);
config_tab_image(notebook);
config_tab_windows(notebook);
config_tab_filtering(notebook);
- config_tab_editors(notebook);
+// config_tab_editors(notebook);
config_tab_properties(notebook);
config_tab_advanced(notebook);
*-----------------------------------------------------------------------------
* config window show (public)
*-----------------------------------------------------------------------------
- */
+ */
void show_config_window(void)
{
gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
gtk_widget_show(button);
- buf = g_strdup_printf(_("%s %s\n\nCopyright (c) %s John Ellis\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
+ buf = g_strdup_printf(_("%s %s\n\nCopyright (c) 2006 John Ellis\nCopyright (c) %s The Geeqie Team\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
GQ_APPNAME,
VERSION,
- "2006",
+ "2008",
GQ_WEBSITE,
GQ_EMAIL_ADDRESS);
label = gtk_label_new(buf);
gtk_widget_show(about);
}
-
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */