/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2009 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "dlg-rename-series.h"
#include "gth-template-editor-dialog.h"
#include "gth-template-selector.h"
#include "gth-rename-task.h"
#include "preferences.h"
enum {
SORT_DATA_COLUMN,
SORT_NAME_COLUMN,
SORT_NUM_COLUMNS
};
enum {
PREVIEW_OLD_NAME_COLUMN,
PREVIEW_NEW_NAME_COLUMN,
PREVIEW_NUM_COLUMNS
};
#define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name))
#define DEFAULT_START_AT 1
#define DEFAULT_CHANGE_CASE GTH_CHANGE_CASE_NONE
#define UPDATE_DELAY 250
static GthTemplateCode Rename_Special_Codes[] = {
{ GTH_TEMPLATE_CODE_TYPE_ENUMERATOR, N_("Enumerator") },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("Original filename"), 'F', 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("Original extension"), 'E', 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("Original enumerator"), 'N', 0 },
{ GTH_TEMPLATE_CODE_TYPE_DATE, N_("Modification date"), 'M', 0 },
{ GTH_TEMPLATE_CODE_TYPE_DATE, N_("Digitalization date"), 'D', 0 },
{ GTH_TEMPLATE_CODE_TYPE_FILE_ATTRIBUTE, N_("File attribute"), 'A', 0 }
};
typedef struct {
GthBrowser *browser;
GSettings *settings;
GList *file_list;
GList *file_data_list;
GList *new_file_list;
GList *new_names_list;
gboolean single_file;
gboolean first_update;
GtkBuilder *builder;
GtkWidget *dialog;
GtkWidget *list_view;
GtkWidget *sort_combobox;
GtkWidget *change_case_combobox;
GtkListStore *list_store;
GtkListStore *sort_model;
char *required_attributes;
guint update_id;
gboolean template_changed;
GList *tasks;
gboolean closing;
} DialogData;
static void
destroy_dialog (DialogData *data)
{
if (data->dialog != NULL)
gtk_widget_destroy (data->dialog);
data->dialog = NULL;
gth_browser_set_dialog (data->browser, "rename_series", NULL);
if (data->update_id != 0) {
g_source_remove (data->update_id);
data->update_id = 0;
}
g_free (data->required_attributes);
g_object_unref (data->builder);
_g_object_list_unref (data->file_data_list);
_g_object_list_unref (data->file_list);
_g_string_list_free (data->new_names_list);
g_list_free (data->new_file_list);
g_object_unref (data->settings);
g_free (data);
}
typedef struct {
GthFileData *file_data;
int n;
} TemplateData;
static char *
get_original_enum (GthFileData *file_data)
{
char *basename;
char *value = NULL;
basename = g_file_get_basename (file_data->file);
value = _g_utf8_find_expr (basename, "[0-9]+");
g_free (basename);
return value;
}
static char *
get_attribute_value (GthFileData *file_data,
const char *attribute)
{
char *value;
if (_g_str_empty (attribute))
return NULL;
value = gth_file_data_get_attribute_as_string (file_data, attribute);
if (value != NULL) {
char *tmp = _g_utf8_replace_pattern (value, "[\r\n]", " ");
g_free (value);
value = tmp;
}
return value;
}
static gboolean
template_eval_cb (TemplateFlags flags,
gunichar parent_code,
gunichar code,
char **args,
GString *result,
gpointer user_data)
{
TemplateData *template_data = user_data;
char *text = NULL;
char *path;
GTimeVal timeval;
switch (code) {
case '#':
text = _g_template_replace_enumerator (args[0], template_data->n);
break;
case 'A':
text = get_attribute_value (template_data->file_data, args[0]);
break;
case 'E':
path = g_file_get_path (template_data->file_data->file);
text = g_strdup (_g_path_get_extension (path));
g_free (path);
break;
case 'F':
path = g_file_get_path (template_data->file_data->file);
text = g_strdup (_g_path_get_basename (path));
g_free (path);
break;
case 'N':
text = get_original_enum (template_data->file_data);
break;
case 'D':
if (gth_file_data_get_digitalization_time (template_data->file_data, &timeval))
text = _g_time_val_strftime (&timeval, (args[0] != NULL) ? args[0] : DEFAULT_STRFTIME_FORMAT);
break;
case 'M':
timeval = *gth_file_data_get_modification_time (template_data->file_data);
text = _g_time_val_strftime (&timeval, (args[0] != NULL) ? args[0] : DEFAULT_STRFTIME_FORMAT);
break;
}
if (text != NULL) {
g_string_append (result, text);
g_free (text);
}
return FALSE;
}
static gboolean
collect_file_attributes_cb (gunichar parent_code,
gunichar code,
char **args,
gpointer user_data)
{
GHashTable *attributes = user_data;
int i;
switch (code) {
case 'A':
g_hash_table_add (attributes, g_strdup (args[0]));
break;
case 'D':
for (i = 0; FileDataDigitalizationTags[i] != NULL; i++)
g_hash_table_add (attributes, g_strdup (FileDataDigitalizationTags[i]));
break;
case 'M':
g_hash_table_add (attributes, g_strdup (G_FILE_ATTRIBUTE_TIME_MODIFIED "," G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC));
break;
}
return FALSE;
}
static char *
get_required_attributes (DialogData *data)
{
GHashTable *attributes;
GtkTreeIter iter;
char **attributev;
char *result;
attributes = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_add (attributes, g_strdup (GFILE_STANDARD_ATTRIBUTES));
/* attributes required for sorting */
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (data->sort_combobox), &iter)) {
GthFileDataSort *sort_type;
gtk_tree_model_get (GTK_TREE_MODEL (data->sort_model),
&iter,
SORT_DATA_COLUMN, &sort_type,
-1);
if (! _g_str_empty (sort_type->required_attributes))
g_hash_table_add (attributes, g_strdup (sort_type->required_attributes));
}
/* attributes required for renaming */
_g_template_for_each_token (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry"))),
0,
collect_file_attributes_cb,
attributes);
attributev = (char **) g_hash_table_get_keys_as_array (attributes, NULL);
result = g_strjoinv (",", attributev);
g_free (attributev);
g_hash_table_unref (attributes);
return result;
}
/* update_file_list */
typedef struct {
DialogData *data;
ReadyFunc ready_func;
GthTask *task;
gulong task_completed_id;
} UpdateData;
static void
update_data_free (UpdateData *update_data)
{
g_free(update_data);
}
static void update_preview_cb (GtkWidget *widget, DialogData *data);
static void
update_file_list__step2 (gpointer user_data)
{
UpdateData *update_data = user_data;
DialogData *data = update_data->data;
GtkTreeIter iter;
int change_case;
const char *template;
TemplateData template_data;
GList *scan;
GError *error = NULL;
if (data->first_update) {
if (data->file_data_list->next == NULL) {
GthFileData *file_data = data->file_data_list->data;
const char *edit_name;
const char *end_pos;
g_signal_handlers_block_by_func (GET_WIDGET ("template_entry"), update_preview_cb, data);
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("template_entry")), g_file_info_get_attribute_string (file_data->info, G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME));
g_signal_handlers_unblock_by_func (GET_WIDGET ("template_entry"), update_preview_cb, data);
gtk_widget_grab_focus (GET_WIDGET ("template_entry"));
edit_name = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry")));
end_pos = g_utf8_strrchr (edit_name, -1, '.');
if (end_pos != NULL) {
glong nchars;
nchars = g_utf8_strlen (edit_name, (gssize) (end_pos - edit_name));
gtk_editable_select_region (GTK_EDITABLE (GET_WIDGET ("template_entry")), 0, nchars);
}
}
else {
gtk_widget_grab_focus (GET_WIDGET ("template_entry"));
gtk_editable_select_region (GTK_EDITABLE (GET_WIDGET ("template_entry")), 0, -1);
}
}
data->first_update = FALSE;
if (data->new_names_list != NULL) {
_g_string_list_free (data->new_names_list);
data->new_names_list = NULL;
}
if (data->new_file_list != NULL) {
g_list_free (data->new_file_list);
data->new_file_list = NULL;
}
data->new_file_list = g_list_copy (data->file_data_list);
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (data->sort_combobox), &iter)) {
GthFileDataSort *sort_type;
gtk_tree_model_get (GTK_TREE_MODEL (data->sort_model),
&iter,
SORT_DATA_COLUMN, &sort_type,
-1);
if (sort_type->cmp_func != NULL)
data->new_file_list = g_list_sort (data->new_file_list, (GCompareFunc) sort_type->cmp_func);
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton"))))
data->new_file_list = g_list_reverse (data->new_file_list);
change_case = gtk_combo_box_get_active (GTK_COMBO_BOX (data->change_case_combobox));
template = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry")));
template_data.n = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("start_at_spinbutton")));
for (scan = data->new_file_list; scan; scan = scan->next) {
char *new_name;
char *tmp;
template_data.file_data = (GthFileData *) scan->data;
new_name = _g_template_eval (template,
0,
template_eval_cb,
&template_data);
switch (change_case) {
case GTH_CHANGE_CASE_LOWER:
tmp = g_utf8_strdown (new_name, -1);
g_free (new_name);
new_name = tmp;
break;
case GTH_CHANGE_CASE_UPPER:
tmp = g_utf8_strup (new_name, -1);
g_free (new_name);
new_name = tmp;
break;
default:
break;
}
data->new_names_list = g_list_prepend (data->new_names_list, new_name);
template_data.n++;
}
data->new_names_list = g_list_reverse (data->new_names_list);
if (update_data->ready_func)
update_data->ready_func (error, update_data->data);
update_data_free (update_data);
}
static void
load_file_data_task_completed_cb (GthTask *task,
GError *error,
gpointer user_data)
{
UpdateData *update_data = user_data;
DialogData *data = update_data->data;
gtk_widget_hide (GET_WIDGET ("task_box"));
gtk_widget_set_sensitive (GET_WIDGET ("options_table"), TRUE);
gtk_dialog_set_response_sensitive (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, TRUE);
data->tasks = g_list_remove (data->tasks, update_data->task);
g_object_unref (update_data->task);
update_data->task = NULL;
update_data->task_completed_id = 0;
if (error != NULL) {
if (! data->closing && update_data->ready_func)
update_data->ready_func (error, update_data->data);
update_data_free (update_data);
if (data->tasks == NULL)
destroy_dialog (data);
return;
}
_g_object_list_unref (data->file_data_list);
data->file_data_list = _g_object_list_ref (gth_load_file_data_task_get_result (GTH_LOAD_FILE_DATA_TASK (task)));
data->template_changed = FALSE;
update_file_list__step2 (update_data);
}
static void
update_file_list (DialogData *data,
ReadyFunc ready_func)
{
UpdateData *update_data;
update_data = g_new (UpdateData, 1);
update_data->data = data;
update_data->ready_func = ready_func;
if (data->template_changed) {
char *required_attributes;
gboolean reload_required;
required_attributes = get_required_attributes (data);
reload_required = attribute_list_reload_required (data->required_attributes, required_attributes);
g_free (data->required_attributes);
data->required_attributes = required_attributes;
if (reload_required) {
GtkWidget *child;
gtk_widget_set_sensitive (GET_WIDGET ("options_table"), FALSE);
gtk_dialog_set_response_sensitive (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, FALSE);
gtk_widget_show (GET_WIDGET ("task_box"));
update_data->task = gth_load_file_data_task_new (data->file_list, data->required_attributes);
update_data->task_completed_id = g_signal_connect (update_data->task,
"completed",
G_CALLBACK (load_file_data_task_completed_cb),
update_data);
data->tasks = g_list_prepend (data->tasks, update_data->task);
child = gth_task_progress_new (update_data->task);
gtk_widget_show (child);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("task_box")), child, TRUE, TRUE, 0);
gth_task_exec (update_data->task, NULL);
return;
}
}
call_when_idle (update_file_list__step2, update_data);
}
static void
ok_button_clicked__step2 (GError *error,
gpointer user_data)
{
DialogData *data = user_data;
GtkTreeIter iter;
GList *old_files;
GList *new_files;
GList *scan1;
GList *scan2;
GthTask *task;
if (error != NULL) {
_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->dialog), _("Could not rename the files"), error);
return;
}
/* -- save preferences -- */
if (data->file_list->next != NULL)
g_settings_set_string (data->settings, PREF_RENAME_SERIES_TEMPLATE, gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry"))));
g_settings_set_int (data->settings, PREF_RENAME_SERIES_START_AT, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("start_at_spinbutton"))));
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (data->sort_combobox), &iter)) {
GthFileDataSort *sort_type;
gtk_tree_model_get (GTK_TREE_MODEL (data->sort_model),
&iter,
SORT_DATA_COLUMN, &sort_type,
-1);
g_settings_set_string (data->settings, PREF_RENAME_SERIES_SORT_BY, sort_type->name);
}
g_settings_set_boolean (data->settings, PREF_RENAME_SERIES_REVERSE_ORDER, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton"))));
g_settings_set_enum (data->settings, PREF_RENAME_SERIES_CHANGE_CASE, gtk_combo_box_get_active (GTK_COMBO_BOX (data->change_case_combobox)));
/* -- prepare and exec rename task -- */
old_files = NULL;
new_files = NULL;
for (scan1 = data->new_file_list, scan2 = data->new_names_list;
scan1 && scan2;
scan1 = scan1->next, scan2 = scan2->next)
{
GthFileData *file_data = scan1->data;
char *new_name = scan2->data;
GFile *parent;
GFile *new_file;
parent = g_file_get_parent (file_data->file);
new_file = g_file_get_child (parent, new_name);
old_files = g_list_prepend (old_files, g_object_ref (file_data->file));
new_files = g_list_prepend (new_files, new_file);
g_object_unref (parent);
}
old_files = g_list_reverse (old_files);
new_files = g_list_reverse (new_files);
task = gth_rename_task_new (old_files, new_files);
gth_browser_exec_task (data->browser, task, GTH_TASK_FLAGS_DEFAULT);
g_object_unref (task);
destroy_dialog (data);
}
static void
ok_button_clicked (DialogData *data)
{
if (data->update_id != 0) {
g_source_remove (data->update_id);
data->update_id = 0;
}
update_file_list (data, ok_button_clicked__step2);
}
static void
dialog_response_cb (GtkDialog *dialog,
int response_id,
gpointer user_data)
{
DialogData *data = user_data;
switch (response_id) {
case GTK_RESPONSE_DELETE_EVENT:
case GTK_RESPONSE_CANCEL:
if (data->tasks != NULL) {
GList *tasks;
data->closing = TRUE;
tasks = g_list_copy (data->tasks);
g_list_foreach (tasks, (GFunc) gth_task_cancel, NULL);
g_list_free (tasks);
}
else
destroy_dialog (data);
break;
case GTK_RESPONSE_OK:
ok_button_clicked (data);
break;
default:
break;
}
}
static void
error_dialog_response_cb (GtkDialog *dialog,
int response,
gpointer user_data)
{
DialogData *data = user_data;
gtk_widget_destroy (GTK_WIDGET (dialog));
destroy_dialog (data);
}
static void
update_preview__step2 (GError *error,
gpointer user_data)
{
DialogData *data = user_data;
GList *scan1, *scan2;
if (error != NULL) {
GtkWidget *d;
d = _gtk_message_dialog_new (GTK_WINDOW (data->dialog),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
_GTK_ICON_NAME_DIALOG_ERROR,
_("Could not rename the files"),
error->message,
_GTK_LABEL_OK, GTK_RESPONSE_OK,
NULL);
g_signal_connect (d, "response", G_CALLBACK (error_dialog_response_cb), data);
gtk_window_present (GTK_WINDOW (d));
return;
}
/* -- update the list view -- */
gtk_list_store_clear (data->list_store);
for (scan1 = data->new_file_list, scan2 = data->new_names_list;
scan1 && scan2;
scan1 = scan1->next, scan2 = scan2->next)
{
GthFileData *file_data1 = scan1->data;
GthFileData *new_name = scan2->data;
GtkTreeIter iter;
gtk_list_store_append (data->list_store, &iter);
gtk_list_store_set (data->list_store, &iter,
PREVIEW_OLD_NAME_COLUMN, g_file_info_get_display_name (file_data1->info),
PREVIEW_NEW_NAME_COLUMN, new_name,
-1);
}
}
static void
dlg_rename_series_update_preview (DialogData *data)
{
update_file_list (data, update_preview__step2);
}
static gboolean
update_preview_after_delay_cb (gpointer user_data)
{
DialogData *data = user_data;
if (data->update_id != 0) {
g_source_remove (data->update_id);
data->update_id = 0;
}
dlg_rename_series_update_preview (data);
return FALSE;
}
static void
update_preview_cb (GtkWidget *widget,
DialogData *data)
{
data->template_changed = TRUE;
if (data->update_id != 0)
g_source_remove (data->update_id);
data->update_id = g_timeout_add (UPDATE_DELAY, update_preview_after_delay_cb, data);
}
static void
edit_template_button_clicked_cb (GtkWidget *widget,
DialogData *data)
{
GtkWidget *dialog;
dialog = gth_template_editor_dialog_new (Rename_Special_Codes,
G_N_ELEMENTS (Rename_Special_Codes),
0,
_("Edit Template"),
GTK_WINDOW (data->dialog));
gth_template_editor_dialog_set_template (GTH_TEMPLATE_EDITOR_DIALOG (dialog),
gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry"))));
g_signal_connect (dialog,
"response",
G_CALLBACK (gth_template_editor_dialog_default_response),
GET_WIDGET ("template_entry"));
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
gtk_window_present (GTK_WINDOW (dialog));
}
static void
revert_template_button_clicked_cb (GtkWidget *widget,
DialogData *data)
{
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("template_entry")),
g_settings_get_string (data->settings, PREF_RENAME_SERIES_TEMPLATE));
}
static void
return_pressed_callback (GtkDialog *dialog,
gpointer user_data)
{
ok_button_clicked (user_data);
}
void
dlg_rename_series (GthBrowser *browser,
GList *file_list)
{
DialogData *data;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
int i;
GList *sort_types;
GList *scan;
int change_case;
int start_at;
char *sort_by;
gboolean found;
if (gth_browser_get_dialog (browser, "rename_series") != NULL) {
gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "rename_series")));
return;
}
data = g_new0 (DialogData, 1);
data->browser = browser;
data->builder = _gtk_builder_new_from_file ("rename-series.ui", "rename_series");
data->settings = g_settings_new (PIX_RENAME_SERIES_SCHEMA);
data->file_list = _g_file_list_dup (file_list);
data->first_update = TRUE;
data->template_changed = TRUE;
data->closing = FALSE;
/* Get the widgets. */
data->dialog = g_object_new (GTK_TYPE_DIALOG,
"title", _("Rename"),
"transient-for", GTK_WINDOW (browser),
"modal", FALSE,
"destroy-with-parent", FALSE,
"use-header-bar", _gtk_settings_get_dialogs_use_header (),
NULL);
gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))),
_gtk_builder_get_widget (data->builder, "dialog_content"));
gtk_dialog_add_buttons (GTK_DIALOG (data->dialog),
_GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
_("_Rename"), GTK_RESPONSE_OK,
NULL);
_gtk_dialog_add_class_to_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION);
gth_browser_set_dialog (browser, "rename_series", data->dialog);
g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data);
/* Set widgets data. */
data->list_store = gtk_list_store_new (PREVIEW_NUM_COLUMNS,
G_TYPE_STRING,
G_TYPE_STRING);
data->list_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (data->list_store));
g_object_unref (data->list_store);
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
column = gtk_tree_view_column_new_with_attributes (_("Old Name"),
renderer,
"text", PREVIEW_OLD_NAME_COLUMN,
NULL);
gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_column_set_resizable (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_tree_view_append_column (GTK_TREE_VIEW (data->list_view), column);
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
column = gtk_tree_view_column_new_with_attributes (_("New Name"),
renderer,
"text", PREVIEW_NEW_NAME_COLUMN,
NULL);
gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_column_set_resizable (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_tree_view_append_column (GTK_TREE_VIEW (data->list_view), column);
gtk_widget_show (data->list_view);
gtk_widget_set_vexpand (data->list_view, TRUE);
gtk_container_add (GTK_CONTAINER (GET_WIDGET ("preview_scrolledwindow")), data->list_view);
gtk_label_set_mnemonic_widget (GTK_LABEL (GET_WIDGET ("preview_label")), data->list_view);
if (data->file_list->next != NULL)
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("template_entry")),
g_settings_get_string (data->settings, PREF_RENAME_SERIES_TEMPLATE));
start_at = g_settings_get_int (data->settings, PREF_RENAME_SERIES_START_AT);
if (start_at < 0)
start_at = DEFAULT_START_AT;
gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("start_at_spinbutton")), start_at * 1.0);
/* sort by */
data->sort_model = gtk_list_store_new (SORT_NUM_COLUMNS,
G_TYPE_POINTER,
G_TYPE_STRING);
data->sort_combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL (data->sort_model));
g_object_unref (data->sort_model);
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (data->sort_combobox), renderer, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (data->sort_combobox),
renderer,
"text", SORT_NAME_COLUMN,
NULL);
sort_by = g_settings_get_string (data->settings, PREF_RENAME_SERIES_SORT_BY);
found = FALSE;
sort_types = gth_main_get_all_sort_types ();
for (i = 0, scan = sort_types; scan; scan = scan->next, i++) {
GthFileDataSort *sort_type = scan->data;
GtkTreeIter iter;
gtk_list_store_append (data->sort_model, &iter);
gtk_list_store_set (data->sort_model, &iter,
SORT_DATA_COLUMN, sort_type,
SORT_NAME_COLUMN, sort_type->display_name,
-1);
if (strcmp (sort_by, sort_type->name) == 0) {
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (data->sort_combobox), &iter);
found = TRUE;
}
}
g_list_free (sort_types);
g_free (sort_by);
if (!found)
gtk_combo_box_set_active (GTK_COMBO_BOX (data->sort_combobox), 0);
gtk_widget_show (data->sort_combobox);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("sort_by_box")), data->sort_combobox, FALSE, FALSE, 0);
gtk_label_set_mnemonic_widget (GTK_LABEL (GET_WIDGET ("sort_by_label")), data->sort_combobox);
/* reverse order */
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton")),
g_settings_get_boolean (data->settings, PREF_RENAME_SERIES_REVERSE_ORDER));
/* change case */
change_case = g_settings_get_enum (data->settings, PREF_RENAME_SERIES_CHANGE_CASE);
if ((change_case < GTH_CHANGE_CASE_NONE) || (change_case > GTH_CHANGE_CASE_UPPER))
change_case = DEFAULT_CHANGE_CASE;
data->change_case_combobox = _gtk_combo_box_new_with_texts (_("Keep original case"),
_("Convert to lower-case"),
_("Convert to upper-case"),
NULL);
gtk_combo_box_set_active (GTK_COMBO_BOX (data->change_case_combobox), change_case);
gtk_widget_show (data->change_case_combobox);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("change_case_box")), data->change_case_combobox, FALSE, FALSE, 0);
gtk_label_set_mnemonic_widget (GTK_LABEL (GET_WIDGET ("change_case_label")), data->change_case_combobox);
/* Set the signals handlers. */
g_signal_connect (data->dialog,
"delete-event",
G_CALLBACK (gtk_true),
NULL);
g_signal_connect (data->dialog,
"response",
G_CALLBACK (dialog_response_cb),
data);
g_signal_connect (GET_WIDGET ("template_entry"),
"changed",
G_CALLBACK (update_preview_cb),
data);
g_signal_connect (GET_WIDGET("template_entry"),
"activate",
G_CALLBACK (return_pressed_callback),
data);
g_signal_connect (GET_WIDGET ("start_at_spinbutton"),
"value_changed",
G_CALLBACK (update_preview_cb),
data);
g_signal_connect (data->sort_combobox,
"changed",
G_CALLBACK (update_preview_cb),
data);
g_signal_connect (data->change_case_combobox,
"changed",
G_CALLBACK (update_preview_cb),
data);
g_signal_connect (GET_WIDGET ("reverse_order_checkbutton"),
"toggled",
G_CALLBACK (update_preview_cb),
data);
g_signal_connect (GET_WIDGET ("edit_template_button"),
"clicked",
G_CALLBACK (edit_template_button_clicked_cb),
data);
g_signal_connect (GET_WIDGET ("revert_template_button"),
"clicked",
G_CALLBACK (revert_template_button_clicked_cb),
data);
/* Run dialog. */
gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser));
gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE);
gtk_widget_show (data->dialog);
dlg_rename_series_update_preview (data);
}