2 Copyright (C) 2008 Paul Davis
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.
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.
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.
21 #include "export_file_notebook.h"
23 #include "ardour/export_format_specification.h"
28 using namespace ARDOUR
;
30 ExportFileNotebook::ExportFileNotebook () :
35 new_file_button
.set_image (*Gtk::manage (new Gtk::Image (::get_icon("add"))));
36 new_file_button
.set_label (_(" Click here to add another format"));
37 new_file_button
.set_alignment (0, 0.5);
38 new_file_button
.set_relief (Gtk::RELIEF_NONE
);
40 new_file_hbox
.pack_start (new_file_button
, true, true);
41 append_page (new_file_dummy
, new_file_hbox
);
42 set_tab_label_packing (new_file_dummy
, true, true, Gtk::PACK_START
);
43 new_file_hbox
.show_all_children ();
45 page_change_connection
= signal_switch_page().connect (sigc::mem_fun (*this, &ExportFileNotebook::handle_page_change
));
46 new_file_button
.signal_clicked().connect (sigc::mem_fun (*this, &ExportFileNotebook::add_new_file_page
));
50 ExportFileNotebook::set_session_and_manager (ARDOUR::Session
* s
, boost::shared_ptr
<ARDOUR::ExportProfileManager
> manager
)
53 profile_manager
= manager
;
59 ExportFileNotebook::sync_with_manager ()
61 /* Clear pages from notebook
62 The page switch handling has to be disabled during removing all pages due to a gtk bug
65 page_change_connection
.block();
66 while (get_n_pages() > 1) {
69 page_change_connection
.block(false);
72 last_visible_page
= 0;
76 ExportProfileManager::FormatStateList
const & formats
= profile_manager
->get_formats ();
77 ExportProfileManager::FormatStateList::const_iterator format_it
;
78 ExportProfileManager::FilenameStateList
const & filenames
= profile_manager
->get_filenames ();
79 ExportProfileManager::FilenameStateList::const_iterator filename_it
;
80 for (format_it
= formats
.begin(), filename_it
= filenames
.begin();
81 format_it
!= formats
.end() && filename_it
!= filenames
.end();
82 ++format_it
, ++filename_it
) {
83 add_file_page (*format_it
, *filename_it
);
87 CriticalSelectionChanged ();
91 ExportFileNotebook::get_nth_format_name (uint32_t n
)
94 if ((page
= dynamic_cast<FilePage
*> (get_nth_page (n
- 1)))) {
95 return page
->get_format_name();
101 ExportFileNotebook::add_new_file_page ()
104 if ((page
= dynamic_cast<FilePage
*> (get_nth_page (get_current_page())))) {
105 add_file_page (profile_manager
->duplicate_format_state (page
->get_format_state()),
106 profile_manager
->duplicate_filename_state (page
->get_filename_state()));
111 ExportFileNotebook::add_file_page (ARDOUR::ExportProfileManager::FormatStatePtr format_state
, ARDOUR::ExportProfileManager::FilenameStatePtr filename_state
)
113 FilePage
* page
= Gtk::manage (new FilePage (session
, profile_manager
, this, page_counter
, format_state
, filename_state
));
114 page
->CriticalSelectionChanged
.connect (CriticalSelectionChanged
.make_slot());
115 insert_page (*page
, page
->get_tab_widget(), get_n_pages() - 1);
117 update_remove_file_page_sensitivity ();
121 CriticalSelectionChanged ();
125 ExportFileNotebook::remove_file_page (FilePage
* page
)
127 profile_manager
->remove_format_state (page
->get_format_state());
128 profile_manager
->remove_filename_state (page
->get_filename_state());
131 update_remove_file_page_sensitivity ();
133 CriticalSelectionChanged ();
137 ExportFileNotebook::update_remove_file_page_sensitivity ()
140 if ((page
= dynamic_cast<FilePage
*> (get_nth_page (0)))) {
141 if (get_n_pages() > 2) {
142 page
->set_remove_sensitive (true);
144 page
->set_remove_sensitive (false);
150 ExportFileNotebook::handle_page_change (GtkNotebookPage
*, uint32_t page
)
152 if (page
+ 1 == (uint32_t) get_n_pages()) {
153 set_current_page (last_visible_page
);
155 last_visible_page
= page
;
159 ExportFileNotebook::FilePage::FilePage (Session
* s
, ManagerPtr profile_manager
, ExportFileNotebook
* parent
, uint32_t number
,
160 ExportProfileManager::FormatStatePtr format_state
,
161 ExportProfileManager::FilenameStatePtr filename_state
) :
162 format_state (format_state
),
163 filename_state (filename_state
),
164 profile_manager (profile_manager
),
166 format_label (_("Format"), Gtk::ALIGN_LEFT
),
167 filename_label (_("Location"), Gtk::ALIGN_LEFT
),
170 set_border_width (12);
172 pack_start (format_label
, false, false, 0);
173 pack_start (format_align
, false, false, 0);
174 pack_start (filename_label
, false, false, 0);
175 pack_start (filename_align
, false, false, 0);
177 format_align
.add (format_selector
);
178 format_align
.set_padding (6, 12, 18, 0);
180 filename_align
.add (filename_selector
);
181 filename_align
.set_padding (0, 12, 18, 0);
183 Pango::AttrList bold
;
184 Pango::Attribute b
= Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD
);
187 format_label
.set_attributes (bold
);
188 filename_label
.set_attributes (bold
);
189 tab_label
.set_attributes (bold
);
192 format_selector
.set_state (format_state
, s
);
193 filename_selector
.set_state (filename_state
, s
);
197 tab_close_button
.signal_clicked().connect (sigc::bind (sigc::mem_fun (*parent
, &ExportFileNotebook::remove_file_page
), this));
199 profile_manager
->FormatListChanged
.connect (sigc::mem_fun (format_selector
, &ExportFormatSelector::update_format_list
));
201 format_selector
.FormatEdited
.connect (sigc::mem_fun (*this, &ExportFileNotebook::FilePage::save_format_to_manager
));
202 format_selector
.FormatRemoved
.connect (sigc::mem_fun (*profile_manager
, &ExportProfileManager::remove_format_profile
));
203 format_selector
.NewFormat
.connect (sigc::mem_fun (*profile_manager
, &ExportProfileManager::get_new_format
));
205 format_selector
.CriticalSelectionChanged
.connect (sigc::mem_fun (*this, &ExportFileNotebook::FilePage::update_tab_label
));
206 filename_selector
.CriticalSelectionChanged
.connect (CriticalSelectionChanged
.make_slot());
210 tab_close_button
.add (*Gtk::manage (new Gtk::Image (::get_icon("close"))));
211 tab_close_alignment
.add (tab_close_button
);
212 tab_close_alignment
.set (0.5, 0.5, 0, 0);
214 tab_widget
.pack_start (tab_label
, false, false, 3);
215 tab_widget
.pack_end (tab_close_alignment
, false, false, 0);
216 tab_widget
.show_all_children ();
221 show_all_children ();
224 ExportFileNotebook::FilePage::~FilePage ()
229 ExportFileNotebook::FilePage::set_remove_sensitive (bool value
)
231 tab_close_button
.set_sensitive (value
);
235 ExportFileNotebook::FilePage::get_format_name () const
237 if (format_state
&& format_state
->format
) {
238 return format_state
->format
->name();
244 ExportFileNotebook::FilePage::save_format_to_manager (FormatPtr format
)
246 profile_manager
->save_format_to_disk (format
);
250 ExportFileNotebook::FilePage::update_tab_label ()
252 tab_label
.set_text (string_compose ("Format %1: %2", tab_number
, get_format_name()));
253 CriticalSelectionChanged();