#include "gtk2ardour-config.h"
#endif
-#include <fstream>
#include <algorithm>
#include <glib.h>
-#include <pbd/gstdio_compat.h>
+#include "pbd/gstdio_compat.h"
#include <glibmm.h>
#include <glibmm/datetime.h>
#include <gtkmm/filechooser.h>
+#include "pbd/basename.h"
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
#include "pbd/replace_all.h"
#include "pbd/stl_delete.h"
#include "pbd/openuri.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/keyboard.h"
+
#include "ardour/audioengine.h"
#include "ardour/filesystem_paths.h"
#include "ardour/recent_sessions.h"
#include "session_dialog.h"
#include "opts.h"
#include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "tooltips.h"
#include "ui_config.h"
#include "utils.h"
open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT);
back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false);
+ open_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::open_button_pressed), false);
open_button->set_sensitive (false);
back_button->set_sensitive (false);
get_vbox()->pack_start (info_frame, false, false);
setup_new_session_page ();
-
+
if (!new_only) {
setup_initial_choice_box ();
get_vbox()->pack_start (ic_vbox, true, true);
} else {
get_vbox()->pack_start (session_new_vbox, true, true);
}
-
+
if (!template_name.empty()) {
use_template_button.set_active (false);
load_template_override = template_name;
}
-
+
get_vbox()->show_all ();
/* fill data models and show/hide accordingly */
if (cnt > 0) {
recent_scroller.show();
recent_label.show ();
-
+
if (cnt > 4) {
recent_scroller.set_size_request (-1, 300);
+ } else {
+ recent_scroller.set_size_request (-1, 80);
}
} else {
recent_scroller.hide();
get_vbox()->pack_start (recent_scroller, true, true);
get_vbox()->show_all ();
+
recent_scroller.show();
int cnt = redisplay_recent_sessions ();
if (cnt > 4) {
recent_scroller.set_size_request (-1, 300);
+ } else {
+ recent_scroller.set_size_request (-1, 80);
}
+
}
/* Try recent session selection */
TreeIter iter = recent_session_display.get_selection()->get_selected();
-
+
if (iter) {
should_be_new = false;
+ string s = (*iter)[recent_session_columns.fullpath];
+ if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+ return PBD::basename_nosuffix (s);
+ }
return (*iter)[recent_session_columns.visible_name];
}
}
/* Try recent session selection */
-
+
TreeIter iter = recent_session_display.get_selection()->get_selected();
-
+
if (iter) {
string s = (*iter)[recent_session_columns.fullpath];
if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
recent_session_display.show();
recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &SessionDialog::recent_row_activated));
+ recent_session_display.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::recent_button_press), false);
}
void
string image_path;
- if (find_file (ardour_data_search_path(), "small-splash.png", image_path)) {
+ Searchpath rc (ARDOUR::ardour_data_search_path());
+ rc.add_subdirectory_to_paths ("resources");
+
+ if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
Gtk::Image* image;
if ((image = manage (new Gtk::Image (image_path))) != 0) {
hbox->pack_start (*image, false, false);
}
}
-
+
vbox->pack_start (ic_new_session_button, true, true, 20);
hbox->pack_start (*vbox, true, true, 20);
-
+
centering_vbox->pack_start (*hbox, false, false);
/* Possible update message */
recent_scroller.set_no_show_all (true);
recent_label.set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("Recent Sessions")));
-
+
centering_vbox->pack_start (recent_label, false, false, 12);
centering_vbox->pack_start (recent_scroller, true, true);
/* Browse button */
-
+
existing_session_chooser.set_title (_("Select session file"));
existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &SessionDialog::existing_session_selected));
existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
-
+
FileFilter session_filter;
session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
existing_session_chooser.add_filter (session_filter);
+
+ FileFilter archive_filter;
+ archive_filter.add_pattern (X_("*.tar.xz"));
+ archive_filter.set_name (_("Session Archives"));
+ existing_session_chooser.add_filter (archive_filter);
+
existing_session_chooser.set_filter (session_filter);
-
-#ifdef GTKOSX
- existing_session_chooser.add_shortcut_folder ("/Volumes");
-#endif
-
+
+ Gtkmm2ext::add_volume_shortcuts (existing_session_chooser);
+
Label* browse_label = manage (new Label);
browse_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("Other Sessions")));
-
+
centering_vbox->pack_start (*browse_label, false, false, 12);
centering_vbox->pack_start (existing_session_chooser, false, false);
+ /* --disable plugins UI */
+
+ _disable_plugins.set_label (_("Safe Mode: Disable all Plugins"));
+ _disable_plugins.set_flags (Gtk::CAN_FOCUS);
+ _disable_plugins.set_relief (Gtk::RELIEF_NORMAL);
+ _disable_plugins.set_mode (true);
+ _disable_plugins.set_active (ARDOUR::Session::get_disable_all_loaded_plugins());
+ _disable_plugins.set_border_width(0);
+ _disable_plugins.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::disable_plugins_clicked));
+ centering_vbox->pack_start (_disable_plugins, false, false);
+
/* pack it all up */
centering_hbox->pack_start (*centering_vbox, true, true);
return true;
}
+bool
+SessionDialog::open_button_pressed (GdkEventButton* ev)
+{
+ if (Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
+ _disable_plugins.set_active();
+ }
+ response (RESPONSE_ACCEPT);
+ return true;
+}
+
void
SessionDialog::populate_session_templates ()
{
new_folder_chooser.show ();
new_folder_chooser.set_title (_("Select folder for session"));
-#ifdef __APPLE__
- new_folder_chooser.add_shortcut_folder ("/Volumes");
-#endif
+ Gtkmm2ext::add_volume_shortcuts (new_folder_chooser);
vbox1->pack_start (*hbox2, false, false);
-
+
session_new_vbox.pack_start (*vbox1, false, false);
/* --- */
HBox* hbox4a = manage (new HBox);
use_template_button.set_label (_("Use this template"));
-
+
TreeModel::Row row = *template_model->prepend ();
row[session_template_columns.name] = (_("no template"));
row[session_template_columns.path] = string();
-
+
hbox4a->set_spacing (6);
hbox4a->pack_start (use_template_button, false, false);
hbox4a->pack_start (template_chooser, true, true);
-
+
template_chooser.set_model (template_model);
-
+
Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
text_renderer->property_editable() = false;
-
+
template_chooser.pack_start (*text_renderer);
template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
template_chooser.set_active (0);
vbox3->pack_start (*hbox4a, false, false);
/* --- */
-
+
HBox* hbox5 = manage (new HBox);
-
+
hbox5->set_spacing (6);
hbox5->pack_start (more_new_session_options_button, false, false);
-
+
setup_more_options_box ();
more_new_session_options_button.add (more_options_vbox);
-
+
vbox3->pack_start (*hbox5, false, false);
hbox3->pack_start (*vbox3, true, true, 8);
vbox2->pack_start (*hbox3, false, false);
-
+
/* --- */
-
+
session_new_vbox.pack_start (*vbox2, false, false);
session_new_vbox.show_all ();
}
for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
session_directories.push_back ((*i).second);
}
-
+
int session_snapshot_count = 0;
for (vector<std::string>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
float sr;
SampleFormat sf;
- std::string state_file_basename = state_file_names.front();
+ std::string program_version;
+
+ std::string state_file_basename;
+
+ if (state_file_names.size() > 1) {
+ state_file_basename = Session::get_snapshot_from_instant (dirname);
+ std::string s = Glib::build_filename (dirname, state_file_basename + statefile_suffix);
+ if (!Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+ state_file_basename = "";
+ }
+ }
+
+ if (state_file_basename.empty()) {
+ state_file_basename = state_file_names.front();
+ }
std::string s = Glib::build_filename (dirname, state_file_basename + statefile_suffix);
GStatBuf gsb;
g_stat (s.c_str(), &gsb);
- row[recent_session_columns.fullpath] = dirname; /* just the dir, but this works too */
- row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname);
+ row[recent_session_columns.fullpath] = s;
row[recent_session_columns.time_modified] = gsb.st_mtime;
- if (Session::get_info_from_path (s, sr, sf) == 0) {
+ if (Session::get_info_from_path (s, sr, sf, program_version) == 0) {
row[recent_session_columns.sample_rate] = rate_as_string (sr);
switch (sf) {
case FormatFloat:
- row[recent_session_columns.disk_format] = _("32 bit float");
+ row[recent_session_columns.disk_format] = _("32-bit float");
break;
case FormatInt24:
- row[recent_session_columns.disk_format] = _("24 bit");
+ row[recent_session_columns.disk_format] = _("24-bit");
break;
case FormatInt16:
- row[recent_session_columns.disk_format] = _("16 bit");
+ row[recent_session_columns.disk_format] = _("16-bit");
break;
}
} else {
row[recent_session_columns.disk_format] = "--";
}
+ if (program_version.empty()) {
+ row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname);
+ } else {
+ row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname + "\n" + string_compose (_("Last modified with: %1"), program_version));
+ }
+
++session_snapshot_count;
if (state_file_names.size() > 1) {
int64_t most_recent = 0;
// add the children
+ int kidcount = 0;
for (std::vector<std::string>::iterator i2 = state_file_names.begin(); i2 != state_file_names.end(); ++i2) {
s = Glib::build_filename (dirname, *i2 + statefile_suffix);
Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
-
+
child_row[recent_session_columns.visible_name] = *i2;
child_row[recent_session_columns.fullpath] = s;
- child_row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname);
+ child_row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname);
g_stat (s.c_str(), &gsb);
child_row[recent_session_columns.time_modified] = gsb.st_mtime;
if (gsb.st_mtime > most_recent) {
most_recent = gsb.st_mtime;
}
-
- if (Session::get_info_from_path (s, sr, sf) == 0) {
- child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
- switch (sf) {
- case FormatFloat:
- child_row[recent_session_columns.disk_format] = _("32 bit float");
- break;
- case FormatInt24:
- child_row[recent_session_columns.disk_format] = _("24 bit");
- break;
- case FormatInt16:
- child_row[recent_session_columns.disk_format] = _("16 bit");
- break;
+
+ if (++kidcount < 5) {
+ // parse "modified with" for the first 5 snapshots
+ if (Session::get_info_from_path (s, sr, sf, program_version) == 0) {
+#if 0
+ child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
+ switch (sf) {
+ case FormatFloat:
+ child_row[recent_session_columns.disk_format] = _("32-bit float");
+ break;
+ case FormatInt24:
+ child_row[recent_session_columns.disk_format] = _("24-bit");
+ break;
+ case FormatInt16:
+ child_row[recent_session_columns.disk_format] = _("16-bit");
+ break;
+ }
+#else
+ child_row[recent_session_columns.sample_rate] = "";
+ child_row[recent_session_columns.disk_format] = "";
+#endif
+ } else {
+ child_row[recent_session_columns.sample_rate] = "??";
+ child_row[recent_session_columns.disk_format] = "--";
+ }
+ if (!program_version.empty()) {
+ child_row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (string_compose (_("Last modified with: %1"), program_version));
}
} else {
- child_row[recent_session_columns.sample_rate] = "??";
- child_row[recent_session_columns.disk_format] = "--";
+ child_row[recent_session_columns.sample_rate] = "";
+ child_row[recent_session_columns.disk_format] = "";
}
++session_snapshot_count;
response (RESPONSE_ACCEPT);
}
+bool
+SessionDialog::recent_button_press (GdkEventButton* ev)
+{
+ if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3) ) {
+
+ TreeModel::Path path;
+ TreeViewColumn* column;
+ int cellx, celly;
+ if (recent_session_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
+ Glib::RefPtr<Gtk::TreeView::Selection> selection = recent_session_display.get_selection();
+ if (selection) {
+ selection->unselect_all();
+ selection->select(path);
+ }
+ }
+
+ if (recent_session_display.get_selection()->count_selected_rows() > 0) {
+ recent_context_mennu (ev);
+ }
+ }
+ return false;
+}
+
+void
+SessionDialog::recent_context_mennu (GdkEventButton *ev)
+{
+ using namespace Gtk::Menu_Helpers;
+
+ TreeIter iter = recent_session_display.get_selection()->get_selected();
+ assert (iter);
+ string s = (*iter)[recent_session_columns.fullpath];
+ if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+ s = Glib::path_get_dirname (s);
+ }
+ if (!Glib::file_test (s, Glib::FILE_TEST_IS_DIR)) {
+ return;
+ }
+
+ Gtk::Menu* m = manage (new Menu);
+ MenuList& items = m->items ();
+ items.push_back (MenuElem (s));
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remove from recent"), sigc::mem_fun (*this, &SessionDialog::recent_remove_selected)));
+ m->popup (ev->button, ev->time);
+}
+
+void
+SessionDialog::recent_remove_selected ()
+{
+ TreeIter iter = recent_session_display.get_selection()->get_selected();
+ assert (iter);
+ string s = (*iter)[recent_session_columns.fullpath];
+ if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+ s = Glib::path_get_dirname (s);
+ }
+ ARDOUR::remove_recent_sessions (s);
+ redisplay_recent_sessions ();
+}
+
+void
+SessionDialog::disable_plugins_clicked ()
+{
+ ARDOUR::Session::set_disable_all_loaded_plugins (_disable_plugins.get_active());
+}
+
void
SessionDialog::existing_session_selected ()
{