Optimize automation-event process splitting
[ardour.git] / gtk2_ardour / session_archive_dialog.cc
1 /*
2     Copyright (C) 2015 Paul Davis
3     Copyright (C) 2016 Robin Gareus <robin@gareus.org>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 */
20
21 #include <gtkmm/stock.h>
22 #include <gtkmm/table.h>
23
24 #include "ardour/filename_extensions.h"
25
26 #include "session_archive_dialog.h"
27
28 #include "pbd/i18n.h"
29
30 using namespace std;
31 using namespace Gtk;
32 using namespace ARDOUR;
33
34 SessionArchiveDialog::SessionArchiveDialog ()
35         : ArdourDialog (_("Zip/Archive Current Session"))
36         , ProgressReporter ()
37         , only_used_checkbox (_("Exclude unused audio sources"))
38 {
39         VBox* vbox = get_vbox();
40
41         vbox->set_spacing (6);
42
43         format_selector.append_text (ARDOUR::session_archive_suffix);
44         format_selector.set_active_text (ARDOUR::session_archive_suffix);
45
46         encode_selector.append_text (_("None"));
47         encode_selector.append_text (_("FLAC 16bit"));
48         encode_selector.append_text (_("FLAC 24bit"));
49         encode_selector.set_active_text ("FLAC 16bit"); // TODO remember
50
51         compression_selector.append_text (_("None"));
52         compression_selector.append_text (_("Fast"));
53         compression_selector.append_text (_("Good"));
54         compression_selector.set_active_text ("Good"); // TODO remember
55
56         Gtk::Table* table = manage (new Gtk::Table ());
57         table->set_col_spacings (10);
58         table->set_row_spacings (8);
59
60         Label* label;
61         int row = 0;
62
63         label = manage (new Label (_("Archive Name:"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
64         table->attach (*label, 0, 1, row, row + 1, Gtk::FILL, Gtk::SHRINK);
65
66         HBox* hbox = manage (new HBox);
67         hbox->set_spacing (6);
68         hbox->pack_start (name_entry, true, true);
69         hbox->pack_start (format_selector, false, false);
70         table->attach (*hbox, 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
71
72         ++row;
73
74         label = manage (new Label (_("Target directory/folder:"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
75         table->attach (*label, 0, 1, row, row + 1, Gtk::FILL, Gtk::SHRINK);
76         table->attach (target_folder_selector, 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
77
78         ++row;
79
80         label = manage (new Label (_("Audio Compression:"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
81         table->attach (*label, 0, 1, row, row + 1, Gtk::FILL, Gtk::SHRINK);
82         table->attach (encode_selector, 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
83
84         ++row;
85
86         label = manage (new Label (_("Archive Compression:"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
87         table->attach (*label, 0, 1, row, row + 1, Gtk::FILL, Gtk::SHRINK);
88         table->attach (compression_selector, 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
89
90         ++row;
91
92         table->attach (only_used_checkbox, 0, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
93
94         ++row;
95
96         label = manage (new Label (_("Note: This archives only the current session state, snapshots are not included."), ALIGN_START));
97         label->set_line_wrap (true);
98         table->attach (*label, 0, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
99
100         vbox->pack_start (*table, false, false);
101         vbox->pack_start (progress_bar, true, true, 12);
102
103         vbox->show_all ();
104         progress_bar.hide ();
105
106         add_button (Stock::CANCEL, RESPONSE_CANCEL);
107         add_button (Stock::OK, RESPONSE_OK);
108
109         target_folder_selector.set_action (FILE_CHOOSER_ACTION_SELECT_FOLDER);
110         target_folder_selector.set_current_folder (Config->get_default_session_parent_dir ()); // TODO get/set default_archive_dir
111         name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionArchiveDialog::name_entry_changed));
112         target_folder_selector.signal_current_folder_changed().connect (sigc::mem_fun (*this, &SessionArchiveDialog::name_entry_changed));
113         target_folder_selector.signal_selection_changed().connect (sigc::mem_fun (*this, &SessionArchiveDialog::name_entry_changed));
114         set_response_sensitive (RESPONSE_OK, false);
115 }
116
117
118 void
119 SessionArchiveDialog::name_entry_changed ()
120 {
121         if (name_entry.get_text().empty()) {
122                 set_response_sensitive (RESPONSE_OK, false);
123                 return;
124         }
125
126         std::string dir = Glib::build_filename (target_folder(), name_entry.get_text() + format_selector.get_active_text ());
127
128         if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
129                 set_response_sensitive (RESPONSE_OK, false);
130                 return;
131         }
132
133         set_response_sensitive (RESPONSE_OK);
134 }
135
136 string
137 SessionArchiveDialog::target_folder () const
138 {
139         return target_folder_selector.get_filename ();
140 }
141
142 void
143 SessionArchiveDialog::set_target_folder (const std::string& name)
144 {
145         target_folder_selector.set_current_folder (name);
146         name_entry_changed ();
147 }
148
149 string
150 SessionArchiveDialog::name () const
151 {
152         return name_entry.get_text ();
153 }
154
155 void
156 SessionArchiveDialog::set_name (const std::string& name)
157 {
158         name_entry.set_text (name);
159         name_entry_changed ();
160 }
161
162 bool
163 SessionArchiveDialog::only_used_sources () const
164 {
165         return only_used_checkbox.get_active ();
166 }
167
168 void
169 SessionArchiveDialog::set_only_used_sources (bool en)
170 {
171         only_used_checkbox.set_active (en);
172 }
173
174 ARDOUR::Session::ArchiveEncode
175 SessionArchiveDialog::encode_option () const
176 {
177         string codec = encode_selector.get_active_text ();
178         if (codec == _("FLAC 16bit")) {
179                 return ARDOUR::Session::FLAC_16BIT;
180         }
181         if (codec == _("FLAC 24bit")) {
182                 return ARDOUR::Session::FLAC_24BIT;
183         }
184         return ARDOUR::Session::NO_ENCODE;
185 }
186
187 void
188 SessionArchiveDialog::set_encode_option (ARDOUR::Session::ArchiveEncode e)
189 {
190         switch (e) {
191                 case ARDOUR::Session::FLAC_16BIT:
192                         encode_selector.set_active_text (_("FLAC 16bit"));
193                         break;
194                 case ARDOUR::Session::FLAC_24BIT:
195                         encode_selector.set_active_text (_("FLAC 24bit"));
196                         break;
197                 default:
198                         encode_selector.set_active_text (_("None"));
199                         break;
200         }
201 }
202
203 PBD::FileArchive::CompressionLevel
204 SessionArchiveDialog::compression_level () const
205 {
206         string codec = compression_selector.get_active_text ();
207         if (codec == _("Fast")) {
208                 return PBD::FileArchive::CompressFast;
209         } else if (codec == _("None")) {
210                 return PBD::FileArchive::CompressNone;
211         }
212         return PBD::FileArchive::CompressGood;
213 }
214
215 void
216 SessionArchiveDialog::set_compression_level (PBD::FileArchive::CompressionLevel l)
217 {
218         switch (l) {
219                 case PBD::FileArchive::CompressFast:
220                         encode_selector.set_active_text (_("Fast"));
221                         break;
222                 case PBD::FileArchive::CompressNone:
223                         encode_selector.set_active_text (_("None"));
224                         break;
225                 case PBD::FileArchive::CompressGood:
226                         encode_selector.set_active_text (_("Good"));
227                         break;
228         }
229 }
230
231 void
232 SessionArchiveDialog::update_progress_gui (float p)
233 {
234         set_response_sensitive (RESPONSE_OK, false);
235         set_response_sensitive (RESPONSE_CANCEL, false);
236         progress_bar.show ();
237         if (p < 0) {
238                 progress_bar.set_text (_("Archiving Session"));
239                 return;
240         }
241         if (p > 1.0) {
242                 progress_bar.set_text (_("Encoding Audio"));
243                 return;
244         }
245         progress_bar.set_fraction (p);
246 }