extend save-as dialog to allow crude but functional save-as-to-empty-session
[ardour.git] / gtk2_ardour / save_as_dialog.cc
1 /*
2     Copyright (C) 2015 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <gtkmm/stock.h>
21
22 #include "ardour/session.h"
23
24 #include "save_as_dialog.h"
25
26 #include "i18n.h"
27
28 using namespace std;
29 using namespace Gtk;
30 using namespace ARDOUR;
31
32 SaveAsDialog::SaveAsDialog ()
33         : ArdourDialog (_("Save As"))
34         , switch_to_button (_("Switch to newly-saved version"))
35         , copy_media_button (_("Copy media to new session"))
36         , copy_external_button (_("Copy external media into new session"))
37         , no_include_media_button (_("Newly-saved session should be empty"))
38 {
39         VBox* vbox = get_vbox();
40
41         vbox->set_spacing (6);
42         
43         HBox* hbox;
44         Label* label;
45
46         hbox = manage (new HBox);
47         hbox->set_spacing (6);
48         label = manage (new Label (_("Save as session name")));
49         hbox->pack_start (*label, false, false);
50         hbox->pack_start (new_name_entry, true, true);
51         vbox->pack_start (*hbox, false, false);
52
53         hbox = manage (new HBox);
54         hbox->set_spacing (6);
55         label = manage (new Label (_("Parent directory/folder")));
56         hbox->pack_start (*label, false, false);
57         hbox->pack_start (new_parent_folder_selector, true, true);
58         vbox->pack_start (*hbox, false, false);
59
60         vbox->pack_start (switch_to_button, false, false);
61
62         VBox* sub_vbox = manage (new VBox);
63         HBox* sub_hbox = manage (new HBox);
64         HBox* empty = manage (new HBox);
65         
66         sub_vbox->pack_start (copy_media_button, false, false);
67         sub_vbox->pack_start (copy_external_button, false, false);
68
69         /* indent the two media-related buttons by some amount */
70         sub_hbox->set_spacing (24);
71         sub_hbox->pack_start (*empty, false, false);
72         sub_hbox->pack_start (*sub_vbox, false, false);
73
74         vbox->pack_start (no_include_media_button, false, false);
75         vbox->pack_start (*sub_hbox, false, false);
76         
77         switch_to_button.set_active (true);
78         copy_media_button.set_active (true);
79         
80         vbox->show_all ();
81
82         add_button (Stock::CANCEL, RESPONSE_CANCEL);
83         add_button (Stock::OK, RESPONSE_OK);
84
85         no_include_media_button.signal_toggled ().connect (sigc::mem_fun (*this, &SaveAsDialog::no_include_toggled));
86         
87         new_parent_folder_selector.set_action (FILE_CHOOSER_ACTION_SELECT_FOLDER);
88         new_parent_folder_selector.set_current_folder (Glib::get_home_dir());
89         new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
90         set_response_sensitive (RESPONSE_OK, false);
91 }
92
93 void
94 SaveAsDialog::no_include_toggled ()
95 {
96         if (no_include_media_button.get_active()) {
97                 copy_media_button.set_sensitive (false);
98                 copy_external_button.set_sensitive (false);
99         } else {
100                 copy_media_button.set_sensitive (true);
101                 copy_external_button.set_sensitive (true);
102         }
103 }
104
105 void
106 SaveAsDialog::name_entry_changed ()
107 {
108         if (!new_name_entry.get_text().empty()) {
109                 set_response_sensitive (RESPONSE_OK);
110         }
111 }
112
113 string
114 SaveAsDialog::new_parent_folder () const
115 {
116         return new_parent_folder_selector.get_filename ();
117 }
118
119 string
120 SaveAsDialog::new_name () const
121 {
122         return new_name_entry.get_text ();
123 }
124
125 bool
126 SaveAsDialog::switch_to () const
127 {
128         return switch_to_button.get_active ();
129 }
130
131 bool
132 SaveAsDialog::copy_media () const
133 {
134         return copy_media_button.get_active ();
135 }
136
137 bool
138 SaveAsDialog::copy_external () const
139 {
140         return copy_external_button.get_active ();
141 }
142
143 void
144 SaveAsDialog::clear_name ()
145 {
146         new_name_entry.set_text ("");
147         set_response_sensitive (RESPONSE_OK, false);
148 }
149
150 bool
151 SaveAsDialog::include_media () const
152 {
153         return !no_include_media_button.get_active ();
154 }