summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2010-12-06 22:28:55 +0100
committerGravatar waker <wakeroid@gmail.com>2010-12-06 22:28:55 +0100
commit8ce409b4e3d731a984505fe5d26f9a9c6771ba95 (patch)
tree2ae3de2d3c157c4f93249af90347e5cce6cec86f /plugins
parentcc7a3786ef2f4a610f4f4634df691b33509ece03 (diff)
implemented converter encoder presets
Diffstat (limited to 'plugins')
-rw-r--r--plugins/gtkui/callbacks.h12
-rw-r--r--plugins/gtkui/converter.c455
-rw-r--r--plugins/gtkui/deadbeef.glade96
-rw-r--r--plugins/gtkui/interface.c54
4 files changed, 594 insertions, 23 deletions
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 <string.h>
#include <stdlib.h>
#include <assert.h>
+#include <sys/stat.h>
+#include <dirent.h>
#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
@@ -56,10 +253,20 @@ converter_show (void) {
}
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
@@ -220,12 +441,80 @@ on_converterdlg_delete_event (GtkWidget *widget,
}
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</property>
<property name="visible">True</property>
<property name="add_tearoffs">False</property>
<property name="focus_on_click">True</property>
+ <signal name="changed" handler="on_converter_encoder_changed" last_modification_time="Mon, 06 Dec 2010 20:55:31 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -6764,10 +6765,10 @@ SOCKS5_HOSTNAME</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
+ <property name="text" translatable="yes">Untitled Encoder</property>
<property name="has_frame">True</property>
<property name="invisible_char">●</property>
- <property name="activates_default">False</property>
+ <property name="activates_default">True</property>
</widget>
<packing>
<property name="padding">0</property>
@@ -6784,6 +6785,91 @@ SOCKS5_HOSTNAME</property>
</child>
<child>
+ <widget class="GtkHBox" id="hbox96">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">9</property>
+
+ <child>
+ <widget class="GtkLabel" id="label120">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Output file name</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox97">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkEntry" id="fname">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes">Untitled Encoder</property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="Custom" id="custom5">
+ <property name="visible">True</property>
+ <property name="creation_function">title_formatting_help_link_create</property>
+ <property name="int1">0</property>
+ <property name="int2">0</property>
+ <property name="last_modification_time">Fri, 03 Dec 2010 20:39:24 GMT</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkHBox" id="hbox72">
<property name="visible">True</property>
<property name="homogeneous">False</property>
@@ -6821,16 +6907,16 @@ SOCKS5_HOSTNAME</property>
<property name="spacing">0</property>
<child>
- <widget class="GtkEntry" id="cmdline">
+ <widget class="GtkEntry" id="encoder">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
+ <property name="text" translatable="yes">encodername - %s</property>
<property name="has_frame">True</property>
<property name="invisible_char">●</property>
- <property name="activates_default">False</property>
+ <property name="activates_default">True</property>
</widget>
<packing>
<property name="padding">0</property>
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");