don't allow save-as to write to an existing dir.
[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, false);
110                 return;
111         }
112
113         std::string dir = Glib::build_filename (new_parent_folder(), new_name_entry.get_text());
114
115         if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
116                 set_response_sensitive (RESPONSE_OK, false);
117                 return;
118         }
119
120         set_response_sensitive (RESPONSE_OK);
121 }
122
123 string
124 SaveAsDialog::new_parent_folder () const
125 {
126         return new_parent_folder_selector.get_filename ();
127 }
128
129 string
130 SaveAsDialog::new_name () const
131 {
132         return new_name_entry.get_text ();
133 }
134
135 bool
136 SaveAsDialog::switch_to () const
137 {
138         return switch_to_button.get_active ();
139 }
140
141 bool
142 SaveAsDialog::copy_media () const
143 {
144         return copy_media_button.get_active ();
145 }
146
147 bool
148 SaveAsDialog::copy_external () const
149 {
150         return copy_external_button.get_active ();
151 }
152
153 void
154 SaveAsDialog::clear_name ()
155 {
156         new_name_entry.set_text ("");
157         set_response_sensitive (RESPONSE_OK, false);
158 }
159
160 bool
161 SaveAsDialog::include_media () const
162 {
163         return !no_include_media_button.get_active ();
164 }