From 8ce409b4e3d731a984505fe5d26f9a9c6771ba95 Mon Sep 17 00:00:00 2001 From: waker Date: Mon, 6 Dec 2010 22:28:55 +0100 Subject: implemented converter encoder presets --- plugins/gtkui/callbacks.h | 12 ++ plugins/gtkui/converter.c | 455 +++++++++++++++++++++++++++++++++++++++++-- plugins/gtkui/deadbeef.glade | 96 ++++++++- plugins/gtkui/interface.c | 54 ++++- 4 files changed, 594 insertions(+), 23 deletions(-) (limited to 'plugins') diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h index a4d852d2..7ea048a5 100644 --- a/plugins/gtkui/callbacks.h +++ b/plugins/gtkui/callbacks.h @@ -1049,3 +1049,15 @@ on_edit_channel_maps_clicked (GtkButton *button, GtkWidget* encoder_cmdline_help_link_create (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); + +void +gtkui_dialog_response_ok (GtkEntry *entry, + gpointer user_data); + +void +on_converter_encoder_changed (GtkComboBox *combobox, + gpointer user_data); + +void +on_presets_cursor_changed (GtkTreeView *treeview, + gpointer user_data); diff --git a/plugins/gtkui/converter.c b/plugins/gtkui/converter.c index 5a7795c3..2c47369a 100644 --- a/plugins/gtkui/converter.c +++ b/plugins/gtkui/converter.c @@ -19,24 +19,221 @@ #include #include #include +#include +#include #include "converter.h" #include "support.h" #include "interface.h" #include "gtkui.h" +enum { + DDB_ENCODER_METHOD_PIPE = 0, + DDB_ENCODER_METHOD_FILE = 1, +}; + +enum { + DDB_ENCODER_FMT_8BIT = 0x1, + DDB_ENCODER_FMT_16BIT = 0x2, + DDB_ENCODER_FMT_24BIT = 0x4, + DDB_ENCODER_FMT_32BIT = 0x8, + DDB_ENCODER_FMT_32BITFLOAT = 0x10, +}; + +typedef struct ddb_encoder_preset_s { + char *title; + char *fname; + char *encoder; + int method; // pipe or file + uint32_t formats; // combination of supported flags (FMT_*) + struct ddb_encoder_preset_s *next; +} ddb_encoder_preset_t; + +ddb_encoder_preset_t *encoder_presets; + +ddb_encoder_preset_t * +ddb_encoder_preset_alloc (void) { + ddb_encoder_preset_t *p = malloc (sizeof (ddb_encoder_preset_t)); + if (!p) { + fprintf (stderr, "failed to alloc ddb_encoder_preset_t\n"); + return NULL; + } + memset (p, 0, sizeof (ddb_encoder_preset_t)); + return p; +} + +void +ddb_encoder_preset_free (ddb_encoder_preset_t *p) { + if (p) { + if (p->title) { + free (p->title); + } + if (p->fname) { + free (p->fname); + } + if (p->encoder) { + free (p->encoder); + } + free (p); + } +} + +ddb_encoder_preset_t * +ddb_encoder_preset_load (const char *fname) { + int err = 1; + FILE *fp = fopen (fname, "rt"); + if (!fp) { + return NULL; + } + ddb_encoder_preset_t *p = ddb_encoder_preset_alloc (); + + char str[1024]; + + if (1 != fscanf (fp, "title %1024[^\n]\n", str)) { + goto error; + } + p->title = strdup (str); + + if (1 != fscanf (fp, "fname %1024[^\n]\n", str)) { + goto error; + } + p->fname = strdup (str); + + if (1 != fscanf (fp, "encoder %1024[^\n]\n", str)) { + goto error; + } + p->encoder = strdup (str); + + if (1 != fscanf (fp, "method %d\n", &p->method)) { + goto error; + } + + if (1 != fscanf (fp, "formats %X\n", &p->formats)) { + goto error; + } + + err = 0; +error: + if (err) { + ddb_encoder_preset_free (p); + p = NULL; + } + if (fp) { + fclose (fp); + } + return p; +} + +// @return -1 on path/write error, -2 if file already exists +int +ddb_encoder_preset_save (ddb_encoder_preset_t *p, int overwrite) { + const char *confdir = deadbeef->get_config_dir (); + char path[1024]; + if (snprintf (path, sizeof (path), "%s/presets", confdir) < 0) { + return -1; + } + mkdir (path, 0755); + if (snprintf (path, sizeof (path), "%s/presets/encoders", confdir) < 0) { + return -1; + } + mkdir (path, 0755); + if (snprintf (path, sizeof (path), "%s/presets/encoders/%s.txt", confdir, p->title) < 0) { + return -1; + } + + if (!overwrite) { + FILE *fp = fopen (path, "rb"); + if (fp) { + fclose (fp); + return -2; + } + } + + FILE *fp = fopen (path, "w+b"); + if (!fp) { + return -1; + } + + fprintf (fp, "title %s\n", p->title); + fprintf (fp, "fname %s\n", p->fname); + fprintf (fp, "encoder %s\n", p->encoder); + fprintf (fp, "method %d\n", p->method); + fprintf (fp, "formats %08X\n", p->formats); + + fclose (fp); + return 0; +} + +static int dirent_alphasort (const struct dirent **a, const struct dirent **b) { + return strcmp ((*a)->d_name, (*b)->d_name); +} + +int +enc_preset_filter (const struct dirent *ent) { + char *ext = strrchr (ent->d_name, '.'); + if (ext && !strcasecmp (ext, ".txt")) { + return 1; + } + return 0; +} + +int +load_encoder_presets (void) { + ddb_encoder_preset_t *tail = NULL; + char path[1024]; + if (snprintf (path, sizeof (path), "%s/presets/encoders", deadbeef->get_config_dir ()) < 0) { + return -1; + } + struct dirent **namelist = NULL; + int n = scandir (path, &namelist, enc_preset_filter, dirent_alphasort); + int i; + for (i = 0; i < n; i++) { + char s[1024]; + if (snprintf (s, sizeof (s), "%s/%s", path, namelist[i]->d_name) > 0){ + ddb_encoder_preset_t *p = ddb_encoder_preset_load (s); + if (p) { + if (tail) { + tail->next = p; + tail = p; + } + else { + encoder_presets = tail = p; + } + } + } + free (namelist[i]); + } + free (namelist); + return 0; +} + static GtkWidget *converter; +void +fill_encoder_presets (GtkListStore *mdl) { + ddb_encoder_preset_t *p = encoder_presets; + while (p) { + GtkTreeIter iter; + gtk_list_store_append (mdl, &iter); + gtk_list_store_set (mdl, &iter, 0, p->title, -1); + p = p->next; + } +} + void converter_show (void) { if (!converter) { + if (!encoder_presets) { + load_encoder_presets (); + } + converter = create_converterdlg (); gtk_entry_set_text (GTK_ENTRY (lookup_widget (converter, "output_folder")), deadbeef->conf_get_str ("converter.output_folder", "")); GtkComboBox *combo; // fill encoder presets combo = GTK_COMBO_BOX (lookup_widget (converter, "encoder")); - //GtkTreeModel *mdl = gtk_combo_box_get_model (combobox); - //gtk_combo_box_append_text (combo, _("Preset Name")); + GtkListStore *mdl = GTK_LIST_STORE (gtk_combo_box_get_model (combo)); + fill_encoder_presets (mdl); gtk_combo_box_set_active (combo, deadbeef->conf_get_int ("converter.encoder_preset", 0)); // fill dsp presets @@ -55,11 +252,21 @@ converter_show (void) { gtk_widget_show (converter); } +void +on_converter_encoder_changed (GtkComboBox *combobox, + gpointer user_data) +{ + GtkComboBox *combo = GTK_COMBO_BOX (lookup_widget (converter, "encoder")); + int act = gtk_combo_box_get_active (combo); + deadbeef->conf_set_int ("converter.encoder_preset", act); +} + void on_converter_output_browse_clicked (GtkButton *button, gpointer user_data) { GtkWidget *dlg = gtk_file_chooser_dialog_new (_("Select folder..."), GTK_WINDOW (converter), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (converter)); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), FALSE); // restore folder @@ -113,9 +320,19 @@ on_converter_ok_clicked (GtkButton *button, { char *outfolder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (converter, "output_folder")))); deadbeef->conf_set_str ("converter.output_folder", outfolder); - char *encoder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (converter, "encoder_cmd_line")))); - deadbeef->conf_set_str ("converter.encoder", encoder); deadbeef->conf_save (); + + GtkComboBox *combo = GTK_COMBO_BOX (lookup_widget (converter, "encoder")); + int enc_preset = gtk_combo_box_get_active (combo); + + ddb_encoder_preset_t *p = encoder_presets; + while (enc_preset--) { + p = p->next; + } + if (!p) { + return; + } + gtk_widget_destroy (converter); converter = NULL; @@ -152,6 +369,8 @@ on_converter_ok_clicked (GtkButton *button, fileinfo = NULL; } if (fileinfo) { + char fname[1024]; +#if 0 char *fname = strrchr (it->fname, '/'); if (!fname) { fname = it->fname; @@ -159,14 +378,17 @@ on_converter_ok_clicked (GtkButton *button, else { fname++; } +#endif + int idx = deadbeef->pl_get_idx_of (it); + deadbeef->pl_format_title (it, idx, fname, sizeof (fname), -1, p->fname); char out[1024]; snprintf (out, sizeof (out), "%s/%s", outfolder, fname); char enc[1024]; - snprintf (enc, sizeof (enc), encoder, out); - printf ("executing: %s\n", enc); + snprintf (enc, sizeof (enc), p->encoder, out); + fprintf (stderr, "executing: %s\n", enc); FILE *fp = popen (enc, "w"); if (!fp) { - fprintf (stderr, "converter: failed to open encoder: %s\n", encoder); + fprintf (stderr, "converter: failed to open encoder\n"); } else { // write wave header @@ -207,7 +429,6 @@ on_converter_ok_clicked (GtkButton *button, free (outfolder); - free (encoder); } gboolean @@ -219,13 +440,81 @@ on_converterdlg_delete_event (GtkWidget *widget, return FALSE; } +void +init_encoder_preset_from_dlg (GtkWidget *dlg, ddb_encoder_preset_t *p) { + p->title = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (dlg, "title")))); + p->fname = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (dlg, "fname")))); + p->encoder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (dlg, "encoder")))); + int method_idx = gtk_combo_box_get_active (GTK_COMBO_BOX (lookup_widget (dlg, "method"))); + switch (method_idx) { + case 0: + p->method = DDB_ENCODER_METHOD_PIPE; + break; + case 1: + p->method = DDB_ENCODER_METHOD_FILE; + break; + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_8bit")))) { + p->formats |= DDB_ENCODER_FMT_8BIT; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_16bit")))) { + p->formats |= DDB_ENCODER_FMT_16BIT; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_24bit")))) { + p->formats |= DDB_ENCODER_FMT_24BIT; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_32bit")))) { + p->formats |= DDB_ENCODER_FMT_32BIT; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_32bitfloat")))) { + p->formats |= DDB_ENCODER_FMT_32BITFLOAT; + } +} + void on_encoder_preset_add (GtkButton *button, gpointer user_data) { GtkWidget *dlg = create_convpreset_editor (); - gtk_dialog_run (GTK_DIALOG (dlg)); + GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); + gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (toplevel)); + gtk_combo_box_set_active (GTK_COMBO_BOX (lookup_widget (dlg, "method")), 0); + gtk_window_set_title (GTK_WINDOW (dlg), _("Add new encoder preset")); + gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK); + + for (;;) { + int r = gtk_dialog_run (GTK_DIALOG (dlg)); + if (r == GTK_RESPONSE_OK) { + ddb_encoder_preset_t *p = ddb_encoder_preset_alloc (); + if (p) { + init_encoder_preset_from_dlg (dlg, p); + int err = ddb_encoder_preset_save (p, 0); + if (!err) { + p->next = encoder_presets; + encoder_presets = p; + } + else { + GtkWidget *warndlg = gtk_message_dialog_new (GTK_WINDOW (mainwin), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed to save preset")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (warndlg), err == -1 ? _("Check preset folder permissions, try to pick different title, or free up some disk space") : _("Preset with the same name already exists. Try to pick another title.")); + gtk_window_set_title (GTK_WINDOW (warndlg), _("Error")); + + gtk_window_set_transient_for (GTK_WINDOW (warndlg), GTK_WINDOW (dlg)); + int response = gtk_dialog_run (GTK_DIALOG (warndlg)); + gtk_widget_destroy (dlg); + continue; + } + } + } + break; + } + gtk_widget_destroy (dlg); + + GtkWidget *list = lookup_widget (toplevel, "presets"); + GtkListStore *mdl = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (list))); + gtk_list_store_clear (mdl); + fill_encoder_presets (mdl); } void @@ -233,22 +522,152 @@ on_encoder_preset_edit (GtkButton *button, gpointer user_data) { GtkWidget *dlg = create_convpreset_editor (); - gtk_dialog_run (GTK_DIALOG (dlg)); + gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK); + + GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); + gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (toplevel)); + + GtkWidget *list = lookup_widget (toplevel, "presets"); + GtkTreePath *path; + GtkTreeViewColumn *col; + gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col); + if (!path || !col) { + // nothing selected + return; + } + int *indices = gtk_tree_path_get_indices (path); + int idx = *indices; + g_free (indices); + + ddb_encoder_preset_t *p = encoder_presets; + while (idx--) { + p = p->next; + } + + if (p) { + gtk_entry_set_text (GTK_ENTRY (lookup_widget (dlg, "title")), p->title); + gtk_entry_set_text (GTK_ENTRY (lookup_widget (dlg, "fname")), p->fname); + gtk_entry_set_text (GTK_ENTRY (lookup_widget (dlg, "encoder")), p->encoder); + gtk_combo_box_set_active (GTK_COMBO_BOX (lookup_widget (dlg, "method")), p->method); + if (p->formats & DDB_ENCODER_FMT_8BIT) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_8bit")), 1); + } + if (p->formats & DDB_ENCODER_FMT_16BIT) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_16bit")), 1); + } + if (p->formats & DDB_ENCODER_FMT_24BIT) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_24bit")), 1); + } + if (p->formats & DDB_ENCODER_FMT_32BIT) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_32bit")), 1); + } + if (p->formats & DDB_ENCODER_FMT_32BITFLOAT) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (dlg, "_32bitfloat")), 1); + } + + } + + ddb_encoder_preset_t *old = p; + for (;;) { + int r = gtk_dialog_run (GTK_DIALOG (dlg)); + if (r == GTK_RESPONSE_OK) { + ddb_encoder_preset_t *p = ddb_encoder_preset_alloc (); + if (p) { + init_encoder_preset_from_dlg (dlg, p); + int err = ddb_encoder_preset_save (p, 1); + if (!err) { + if (strcmp (p->title, old->title)) { + char path[1024]; + if (snprintf (path, sizeof (path), "%s/presets/encoders/%s.txt", deadbeef->get_config_dir (), old->title) > 0) { + unlink (path); + } + } + free (old->title); + free (old->fname); + free (old->encoder); + old->title = p->title; + old->fname = p->fname; + old->encoder = p->encoder; + old->method = p->method; + old->formats = p->formats; + free (p); + } + else { + GtkWidget *warndlg = gtk_message_dialog_new (GTK_WINDOW (mainwin), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed to save preset")); + gtk_window_set_transient_for (GTK_WINDOW (warndlg), GTK_WINDOW (dlg)); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (warndlg), err == -1 ? _("Check preset folder permissions, try to pick different title, or free up some disk space") : _("Preset with the same name already exists. Try to pick another title.")); + gtk_window_set_title (GTK_WINDOW (warndlg), _("Error")); + + int response = gtk_dialog_run (GTK_DIALOG (warndlg)); + gtk_widget_destroy (warndlg); + continue; + } + } + } + break; + } + gtk_widget_destroy (dlg); + + GtkListStore *mdl = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (list))); + gtk_list_store_clear (mdl); + fill_encoder_presets (mdl); } void on_encoder_preset_remove (GtkButton *button, gpointer user_data) { + + GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); + GtkWidget *list = lookup_widget (toplevel, "presets"); + GtkTreePath *path; + GtkTreeViewColumn *col; + gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col); + if (!path || !col) { + // nothing selected + return; + } + int *indices = gtk_tree_path_get_indices (path); + int idx = *indices; + g_free (indices); + + ddb_encoder_preset_t *p = encoder_presets; + ddb_encoder_preset_t *prev = NULL; + while (idx--) { + prev = p; + p = p->next; + } + + if (!p) { + return; + } + GtkWidget *dlg = gtk_message_dialog_new (GTK_WINDOW (mainwin), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("Remove preset")); + gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (toplevel)); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dlg), _("This action will delete the selected preset. Are you sure?")); gtk_window_set_title (GTK_WINDOW (dlg), _("Warning")); int response = gtk_dialog_run (GTK_DIALOG (dlg)); gtk_widget_destroy (dlg); - if (response != GTK_RESPONSE_YES) { - // .. remove .. + if (response == GTK_RESPONSE_YES) { + char path[1024]; + if (snprintf (path, sizeof (path), "%s/presets/encoders/%s.txt", deadbeef->get_config_dir (), p->title) > 0) { + unlink (path); + } + + ddb_encoder_preset_t *next = p->next; + if (prev) { + prev->next = next; + } + else { + encoder_presets = next; + } + ddb_encoder_preset_free (p); + + GtkListStore *mdl = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (list))); + gtk_list_store_clear (mdl); + fill_encoder_presets (mdl); } } @@ -257,10 +676,22 @@ on_edit_encoder_presets_clicked (GtkButton *button, gpointer user_data) { GtkWidget *dlg = create_preset_list (); + gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (converter)); g_signal_connect ((gpointer)lookup_widget (dlg, "add"), "clicked", G_CALLBACK (on_encoder_preset_add), NULL); g_signal_connect ((gpointer)lookup_widget (dlg, "remove"), "clicked", G_CALLBACK (on_encoder_preset_remove), NULL); g_signal_connect ((gpointer)lookup_widget (dlg, "edit"), "clicked", G_CALLBACK (on_encoder_preset_edit), NULL); + GtkWidget *list = lookup_widget (dlg, "presets"); + GtkCellRenderer *title_cell = gtk_cell_renderer_text_new (); + GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("Title"), title_cell, "text", 0, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (list), GTK_TREE_VIEW_COLUMN (col)); + GtkListStore *mdl = gtk_list_store_new (1, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (list), GTK_TREE_MODEL (mdl)); + fill_encoder_presets (mdl); + int curr = deadbeef->conf_get_int ("converter.encoder_preset", 0); + GtkTreePath *path = gtk_tree_path_new_from_indices (curr, -1); + gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, col, FALSE); + gtk_tree_path_free (path); gtk_dialog_run (GTK_DIALOG (dlg)); gtk_widget_destroy (dlg); } diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade index ff47c540..d60bb237 100644 --- a/plugins/gtkui/deadbeef.glade +++ b/plugins/gtkui/deadbeef.glade @@ -6300,6 +6300,7 @@ SOCKS5_HOSTNAME True False True + 0 @@ -6764,10 +6765,10 @@ SOCKS5_HOSTNAME True True 0 - + Untitled Encoder True - False + True 0 @@ -6783,6 +6784,91 @@ SOCKS5_HOSTNAME + + + True + False + 9 + + + + True + Output file name + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + True + True + 0 + Untitled Encoder + True + + True + + + 0 + True + True + + + + + + True + title_formatting_help_link_create + 0 + 0 + Fri, 03 Dec 2010 20:39:24 GMT + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + True @@ -6821,16 +6907,16 @@ SOCKS5_HOSTNAME 0 - + True True True True 0 - + encodername - %s True - False + True 0 diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c index ffa724aa..ffb2d602 100644 --- a/plugins/gtkui/interface.c +++ b/plugins/gtkui/interface.c @@ -3438,6 +3438,9 @@ create_converterdlg (void) g_signal_connect ((gpointer) converter_output_browse, "clicked", G_CALLBACK (on_converter_output_browse_clicked), NULL); + g_signal_connect ((gpointer) encoder, "changed", + G_CALLBACK (on_converter_encoder_changed), + NULL); g_signal_connect ((gpointer) edit_encoder_presets, "clicked", G_CALLBACK (on_edit_encoder_presets_clicked), NULL); @@ -3503,10 +3506,15 @@ create_convpreset_editor (void) GtkWidget *hbox70; GtkWidget *label105; GtkWidget *title; + GtkWidget *hbox96; + GtkWidget *label120; + GtkWidget *hbox97; + GtkWidget *fname; + GtkWidget *custom5; GtkWidget *hbox72; GtkWidget *label106; GtkWidget *hbox93; - GtkWidget *cmdline; + GtkWidget *encoder; GtkWidget *custom4; GtkWidget *hbox73; GtkWidget *label107; @@ -3547,7 +3555,34 @@ create_convpreset_editor (void) title = gtk_entry_new (); gtk_widget_show (title); gtk_box_pack_start (GTK_BOX (hbox70), title, TRUE, TRUE, 0); + gtk_entry_set_text (GTK_ENTRY (title), _("Untitled Encoder")); gtk_entry_set_invisible_char (GTK_ENTRY (title), 9679); + gtk_entry_set_activates_default (GTK_ENTRY (title), TRUE); + + hbox96 = gtk_hbox_new (FALSE, 9); + gtk_widget_show (hbox96); + gtk_box_pack_start (GTK_BOX (vbox27), hbox96, TRUE, TRUE, 0); + + label120 = gtk_label_new (_("Output file name")); + gtk_widget_show (label120); + gtk_box_pack_start (GTK_BOX (hbox96), label120, FALSE, FALSE, 0); + + hbox97 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox97); + gtk_box_pack_start (GTK_BOX (hbox96), hbox97, TRUE, TRUE, 0); + + fname = gtk_entry_new (); + gtk_widget_show (fname); + gtk_box_pack_start (GTK_BOX (hbox97), fname, TRUE, TRUE, 0); + gtk_entry_set_text (GTK_ENTRY (fname), _("Untitled Encoder")); + gtk_entry_set_invisible_char (GTK_ENTRY (fname), 9679); + gtk_entry_set_activates_default (GTK_ENTRY (fname), TRUE); + + custom5 = title_formatting_help_link_create ("custom5", "", "", 0, 0); + gtk_widget_show (custom5); + gtk_box_pack_start (GTK_BOX (hbox97), custom5, TRUE, TRUE, 0); + GTK_WIDGET_UNSET_FLAGS (custom5, GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS (custom5, GTK_CAN_DEFAULT); hbox72 = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox72); @@ -3561,10 +3596,12 @@ create_convpreset_editor (void) gtk_widget_show (hbox93); gtk_box_pack_start (GTK_BOX (hbox72), hbox93, TRUE, TRUE, 0); - cmdline = gtk_entry_new (); - gtk_widget_show (cmdline); - gtk_box_pack_start (GTK_BOX (hbox93), cmdline, TRUE, TRUE, 0); - gtk_entry_set_invisible_char (GTK_ENTRY (cmdline), 9679); + encoder = gtk_entry_new (); + gtk_widget_show (encoder); + gtk_box_pack_start (GTK_BOX (hbox93), encoder, TRUE, TRUE, 0); + gtk_entry_set_text (GTK_ENTRY (encoder), _("encodername - %s")); + gtk_entry_set_invisible_char (GTK_ENTRY (encoder), 9679); + gtk_entry_set_activates_default (GTK_ENTRY (encoder), TRUE); custom4 = encoder_cmdline_help_link_create ("custom4", "", "", 0, 0); gtk_widget_show (custom4); @@ -3658,10 +3695,15 @@ create_convpreset_editor (void) GLADE_HOOKUP_OBJECT (convpreset_editor, hbox70, "hbox70"); GLADE_HOOKUP_OBJECT (convpreset_editor, label105, "label105"); GLADE_HOOKUP_OBJECT (convpreset_editor, title, "title"); + GLADE_HOOKUP_OBJECT (convpreset_editor, hbox96, "hbox96"); + GLADE_HOOKUP_OBJECT (convpreset_editor, label120, "label120"); + GLADE_HOOKUP_OBJECT (convpreset_editor, hbox97, "hbox97"); + GLADE_HOOKUP_OBJECT (convpreset_editor, fname, "fname"); + GLADE_HOOKUP_OBJECT (convpreset_editor, custom5, "custom5"); GLADE_HOOKUP_OBJECT (convpreset_editor, hbox72, "hbox72"); GLADE_HOOKUP_OBJECT (convpreset_editor, label106, "label106"); GLADE_HOOKUP_OBJECT (convpreset_editor, hbox93, "hbox93"); - GLADE_HOOKUP_OBJECT (convpreset_editor, cmdline, "cmdline"); + GLADE_HOOKUP_OBJECT (convpreset_editor, encoder, "encoder"); GLADE_HOOKUP_OBJECT (convpreset_editor, custom4, "custom4"); GLADE_HOOKUP_OBJECT (convpreset_editor, hbox73, "hbox73"); GLADE_HOOKUP_OBJECT (convpreset_editor, label107, "label107"); -- cgit v1.2.3