1 /*
2  * preset-browser.c
3  * Copyright 2014-2015 John Lindgren
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions, and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions, and the following disclaimer in the documentation
13  *    provided with the distribution.
14  *
15  * This software is provided "as is" and without any warranty, express or
16  * implied. In no event shall the authors be liable for any damages arising from
17  * the use of this software.
18  */
19 
20 #define AUD_GLIB_INTEGRATION
21 #include "internal.h"
22 #include "libaudgui.h"
23 #include "preset-browser.h"
24 
25 #include <gtk/gtk.h>
26 
27 #include <libaudcore/audstrings.h>
28 #include <libaudcore/drct.h>
29 #include <libaudcore/i18n.h>
30 #include <libaudcore/vfs.h>
31 
32 typedef void (* PresetAction) (const char * filename, const EqualizerPreset * preset);
33 
browser_response(GtkWidget * dialog,int response,void * data)34 static void browser_response (GtkWidget * dialog, int response, void * data)
35 {
36     if (response == GTK_RESPONSE_ACCEPT)
37     {
38         CharPtr filename (gtk_file_chooser_get_uri ((GtkFileChooser *) dialog));
39         auto preset = (const EqualizerPreset *)
40          g_object_get_data ((GObject *) dialog, "eq-preset");
41 
42         ((PresetAction) data) (filename, preset);
43     }
44 
45     gtk_widget_destroy (dialog);
46 }
47 
show_preset_browser(const char * title,gboolean save,const char * default_filename,PresetAction callback,const EqualizerPreset * preset)48 static void show_preset_browser (const char * title, gboolean save,
49  const char * default_filename, PresetAction callback,
50  const EqualizerPreset * preset)
51 {
52     GtkWidget * browser = gtk_file_chooser_dialog_new (title, nullptr, save ?
53      GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, _("Cancel"),
54      GTK_RESPONSE_CANCEL, save ? _("Save") : _("Load"), GTK_RESPONSE_ACCEPT,
55      nullptr);
56 
57     gtk_file_chooser_set_local_only ((GtkFileChooser *) browser, false);
58 
59     if (default_filename)
60         gtk_file_chooser_set_current_name ((GtkFileChooser *) browser, default_filename);
61 
62     if (preset)
63         g_object_set_data_full ((GObject *) browser, "eq-preset",
64          new EqualizerPreset (* preset), aud::delete_obj<EqualizerPreset>);
65 
66     g_signal_connect (browser, "response", (GCallback) browser_response, (void *) callback);
67 
68     audgui_show_unique_window (AUDGUI_PRESET_BROWSER_WINDOW, browser);
69 }
70 
do_load_file(const char * filename,const EqualizerPreset *)71 static void do_load_file (const char * filename, const EqualizerPreset *)
72 {
73     Index<EqualizerPreset> presets;
74     presets.append ();
75 
76     VFSFile file (filename, "r");
77     if (! file || ! aud_load_preset_file (presets[0], file))
78         return;
79 
80     audgui_import_eq_presets (presets);
81 }
82 
eq_preset_load_file()83 void eq_preset_load_file ()
84 {
85     show_preset_browser (_("Load Preset File"), false, nullptr, do_load_file, nullptr);
86 }
87 
do_load_eqf(const char * filename,const EqualizerPreset *)88 static void do_load_eqf (const char * filename, const EqualizerPreset *)
89 {
90     VFSFile file (filename, "r");
91     if (! file)
92         return;
93 
94     audgui_import_eq_presets (aud_import_winamp_presets (file));
95 }
96 
eq_preset_load_eqf()97 void eq_preset_load_eqf ()
98 {
99     show_preset_browser (_("Load EQF File"), false, nullptr, do_load_eqf, nullptr);
100 }
101 
do_save_file(const char * filename,const EqualizerPreset * preset)102 static void do_save_file (const char * filename, const EqualizerPreset * preset)
103 {
104     g_return_if_fail (preset);
105 
106     VFSFile file (filename, "w");
107     if (file)
108         aud_save_preset_file (* preset, file);
109 }
110 
eq_preset_save_file(const EqualizerPreset & preset)111 void eq_preset_save_file (const EqualizerPreset & preset)
112 {
113     StringBuf name = str_concat ({preset.name, ".preset"});
114     show_preset_browser (_("Save Preset File"), true, name, do_save_file, & preset);
115 }
116 
do_save_eqf(const char * filename,const EqualizerPreset * preset)117 static void do_save_eqf (const char * filename, const EqualizerPreset * preset)
118 {
119     g_return_if_fail (preset);
120 
121     VFSFile file (filename, "w");
122     if (! file)
123         return;
124 
125     aud_export_winamp_preset (* preset, file);
126 }
127 
eq_preset_save_eqf(const EqualizerPreset & preset)128 void eq_preset_save_eqf (const EqualizerPreset & preset)
129 {
130     StringBuf name = str_concat ({preset.name, ".eqf"});
131     show_preset_browser (_("Save EQF File"), true, name, do_save_eqf, & preset);
132 }
133