ardour
export_file_notebook.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 Paul Davis
3  Author: Sakari Bergen
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 "export_file_notebook.h"
22 
24 
25 #include "gui_thread.h"
26 #include "utils.h"
27 #include "i18n.h"
28 
29 using namespace ARDOUR;
30 using namespace ARDOUR_UI_UTILS;
31 using namespace PBD;
32 
34  page_counter (1)
35 {
36  /* Last page */
37 
38  new_file_button.set_image (*Gtk::manage (new Gtk::Image (::get_icon("add"))));
39  new_file_button.set_label (_("Add another format"));
40  new_file_button.set_alignment (0, 0.5);
41  new_file_button.set_relief (Gtk::RELIEF_NONE);
42 
43  new_file_hbox.pack_start (new_file_button, true, true);
44  append_page (new_file_dummy, new_file_hbox);
45  set_tab_label_packing (new_file_dummy, true, true, Gtk::PACK_START);
46  new_file_hbox.show_all_children ();
47 
48  page_change_connection = signal_switch_page().connect (sigc::mem_fun (*this, &ExportFileNotebook::handle_page_change));
49  new_file_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFileNotebook::add_new_file_page));
50 }
51 
52 void
54 {
55  SessionHandlePtr::set_session (s);
56  profile_manager = manager;
57 
59 }
60 
61 void
63 {
64  /* Clear pages from notebook
65  The page switch handling has to be disabled during removing all pages due to a gtk bug
66  */
67 
68  page_change_connection.block();
69  while (get_n_pages() > 1) {
70  remove_page (0);
71  }
72  page_change_connection.block(false);
73 
74  page_counter = 1;
76 
77  /* File notebook */
78 
80  ExportProfileManager::FormatStateList::const_iterator format_it;
82  ExportProfileManager::FilenameStateList::const_iterator filename_it;
83  for (format_it = formats.begin(), filename_it = filenames.begin();
84  format_it != formats.end() && filename_it != filenames.end();
85  ++format_it, ++filename_it) {
86  add_file_page (*format_it, *filename_it);
87  }
88 
89  set_current_page (0);
92 }
93 
94 void
96 {
97  int i;
98  bool show_credentials_entry = false;
100  ExportProfileManager::FormatStateList::const_iterator format_it;
101 
102  for (i = 0, format_it = formats.begin(); format_it != formats.end(); ++i, ++format_it) {
103  FilePage * page;
104  if ((page = dynamic_cast<FilePage *> (get_nth_page (i)))) {
105  bool this_soundcloud_upload = page->get_soundcloud_upload ();
106  (*format_it)->format->set_soundcloud_upload (this_soundcloud_upload);
107  if (this_soundcloud_upload) {
108  show_credentials_entry = true;
109  }
110  }
111  }
112 
113  soundcloud_export_selector->set_visible (show_credentials_entry);
114 
115 }
116 
117 void
119 {
120  int i = 0;
121  FilePage * page;
122  while ((page = dynamic_cast<FilePage *> (get_nth_page (i++)))) {
123  page->update_example_filename();
124  }
125 }
126 
127 void
129 {
130  FilePage * page;
131  if ((page = dynamic_cast<FilePage *> (get_nth_page (get_current_page())))) {
134  }
135 }
136 
137 void
139 {
140  FilePage * page = Gtk::manage (new FilePage (_session, profile_manager, this, page_counter, format_state, filename_state));
141  page->CriticalSelectionChanged.connect (CriticalSelectionChanged.make_slot());
142  insert_page (*page, page->get_tab_widget(), get_n_pages() - 1);
143 
145  show_all_children();
146  ++page_counter;
147 
149 }
150 
151 void
153 {
156 
157  remove_page (*page);
159 
161 }
162 
163 void
165 {
166  FilePage * page;
167  if ((page = dynamic_cast<FilePage *> (get_nth_page (0)))) {
168  if (get_n_pages() > 2) {
169  page->set_remove_sensitive (true);
170  } else {
171  page->set_remove_sensitive (false);
172  }
173  }
174 }
175 
176 void
177 ExportFileNotebook::handle_page_change (GtkNotebookPage*, uint32_t page)
178 {
179  if (page + 1 == (uint32_t) get_n_pages()) {
180  set_current_page (last_visible_page);
181  } else {
182  last_visible_page = page;
183  }
184 }
185 
186 ExportFileNotebook::FilePage::FilePage (Session * s, ManagerPtr profile_manager, ExportFileNotebook * parent, uint32_t number,
189  format_state (format_state),
190  filename_state (filename_state),
191  profile_manager (profile_manager),
192 
193  format_label (_("Format"), Gtk::ALIGN_LEFT),
194  filename_label (_("Location"), Gtk::ALIGN_LEFT),
195  soundcloud_upload_button (_("Upload to Soundcloud")),
196  tab_number (number)
197 {
198  set_border_width (12);
199 
200  pack_start (format_label, false, false, 0);
201  pack_start (format_align, false, false, 0);
202  pack_start (filename_label, false, false, 0);
203  pack_start (filename_align, false, false, 0);
204  pack_start (soundcloud_upload_button, false, false, 0);
205 
207  format_align.set_padding (6, 12, 18, 0);
208 
210  filename_align.set_padding (0, 12, 18, 0);
211 
212  Pango::AttrList bold;
213  Pango::Attribute b = Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD);
214  bold.insert (b);
215 
216  format_label.set_attributes (bold);
217  filename_label.set_attributes (bold);
218  tab_label.set_attributes (bold);
219 
220  /* Set states */
221  format_selector.set_state (format_state, s);
222  filename_selector.set_state (filename_state, s);
223 
224  /* Signals */
225 
226  tab_close_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*parent, &ExportFileNotebook::remove_file_page), this));
227 
229 
231  format_selector.FormatRemoved.connect (sigc::mem_fun (*profile_manager, &ExportProfileManager::remove_format_profile));
232  format_selector.NewFormat.connect (sigc::mem_fun (*profile_manager, &ExportProfileManager::get_new_format));
233 
238 
239  soundcloud_upload_button.signal_toggled().connect (sigc::mem_fun (*parent, &ExportFileNotebook::update_soundcloud_upload));
240  /* Tab widget */
241 
242  tab_close_button.add (*Gtk::manage (new Gtk::Image (::get_icon("close"))));
244  tab_close_alignment.set (0.5, 0.5, 0, 0);
245 
246  tab_widget.pack_start (tab_label, false, false, 3);
247  tab_widget.pack_end (tab_close_alignment, false, false, 0);
248  tab_widget.show_all_children ();
249  update_tab_label ();
251 
252  /* Done */
253 
254  show_all_children ();
255 }
256 
258 {
259 }
260 
261 void
263 {
264  tab_close_button.set_sensitive (value);
265 }
266 
267 std::string
269 {
270  if (format_state && format_state->format) {
271  return format_state->format->name();
272  }
273  return _("No format!");
274 }
275 
276 bool
278 {
279  return soundcloud_upload_button.get_active ();
280 }
281 
282 void
284 {
286 }
287 
288 void
290 {
291  tab_label.set_text (string_compose (_("Format %1: %2"), tab_number, get_format_name()));
292 }
293 
294 void
296 {
297  if (profile_manager) {
298 
299  std::string example;
300  if (format_state->format) {
302  filename_state->filename, format_state->format);
303  }
304 
305  if (example != "") {
306  filename_selector.set_example_filename(Glib::path_get_basename (example));
307  } else {
308  filename_selector.set_example_filename("");
309  }
310  }
311 }
312 
313 void
315 {
316  update_tab_label();
317  update_example_filename();
319 }
sigc::signal< void, FormatPtr > FormatRemoved
std::list< FilenameStatePtr > FilenameStateList
FilePage(ARDOUR::Session *s, ManagerPtr profile_manager, ExportFileNotebook *parent, uint32_t number, ARDOUR::ExportProfileManager::FormatStatePtr format_state, ARDOUR::ExportProfileManager::FilenameStatePtr filename_state)
std::string get_sample_filename_for_format(ExportFilenamePtr filename, ExportFormatSpecPtr format)
Definition: ardour_ui.h:130
void remove_format_state(FormatStatePtr state)
FormatStateList const & get_formats()
void remove_file_page(FilePage *page)
ARDOUR::ExportProfileManager::FilenameStatePtr get_filename_state() const
FormatStatePtr duplicate_format_state(FormatStatePtr state)
sigc::signal< void > CriticalSelectionChanged
void save_format_to_manager(FormatPtr format)
sigc::signal< void, FormatPtr > FormatEdited
sigc::signal< void > CriticalSelectionChanged
#define invalidator(x)
Definition: gui_thread.h:40
void set_session_and_manager(ARDOUR::Session *s, boost::shared_ptr< ARDOUR::ExportProfileManager > manager)
ARDOUR::ExportProfileManager::FormatStatePtr get_format_state() const
#define _(Text)
Definition: i18n.h:11
FilenameStateList const & get_filenames()
void set_state(ARDOUR::ExportProfileManager::FilenameStatePtr state_, ARDOUR::Session *session_)
Definition: amp.h:29
boost::shared_ptr< SoundcloudExportSelector > soundcloud_export_selector
#define gui_context()
Definition: gui_thread.h:36
sigc::signal< FormatPtr, FormatPtr > NewFormat
void remove_filename_state(FilenameStatePtr state)
std::string get_format_name() const
void handle_page_change(GtkNotebookPage *, uint32_t page)
void add_file_page(ARDOUR::ExportProfileManager::FormatStatePtr format_state, ARDOUR::ExportProfileManager::FilenameStatePtr filename_state)
Definition: debug.h:30
sigc::connection page_change_connection
std::string save_format_to_disk(ExportFormatSpecPtr format)
void set_state(ARDOUR::ExportProfileManager::FormatStatePtr state_, ARDOUR::Session *session_)
ExportFormatSelector format_selector
sigc::signal< void > CriticalSelectionChanged
sigc::signal< void > CriticalSelectionChanged
Glib::RefPtr< Gdk::Pixbuf > get_icon(const char *cname)
Definition: utils.cc:674
PBD::Signal0< void > FormatListChanged
FilenameStatePtr duplicate_filename_state(FilenameStatePtr state)
ARDOUR::Session * _session
PBD::ScopedConnection format_connection
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208
ExportFilenameSelector filename_selector
std::list< FormatStatePtr > FormatStateList