From a8d3424cf91afde899fe4a2abe4002139af8ca04 Mon Sep 17 00:00:00 2001 From: YPozdnyakov Date: Wed, 3 Dec 2014 18:22:30 +0200 Subject: [PATCH] [Summary]: add Recent Session menuitems --- gtk2_ardour/ardour_ui.cc | 86 +++++++++++++++++++++++++++++ gtk2_ardour/ardour_ui.h | 14 +++++ gtk2_ardour/ardour_ui_ed.cc | 56 +++++++++++++++++-- gtk2_ardour/editor.cc | 4 ++ gtk2_ardour/session_dialog.logic.cc | 1 + gtk2_ardour/trackslive.menus.in | 12 ++++ 6 files changed, 169 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 970e6cf1a0..c393dc279b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1416,6 +1416,92 @@ ARDOUR_UI::open_recent_session () } } +void +ARDOUR_UI::get_recent_session_names_and_paths(std::vector& session_names,std::vector& session_paths) +{ + ARDOUR::RecentSessions rs; + ARDOUR::read_recent_sessions (rs); + + /* after reading we should check that */ + /* recent_session is still existing */ + + int i=0; + for (ARDOUR::RecentSessions::iterator it = rs.begin(); + (i < MAX_RECENT_SESSION_COUNTS) && (it != rs.end()); + ++it) + { + std::vector state_file_paths; + + // now get available states for this session + + get_state_files_in_directory ((*it).second, state_file_paths); + + // vector item; + string dirname = (*it).second; + + /* remove any trailing / */ + if (dirname[dirname.length()-1] == '/') { + dirname = dirname.substr (0, dirname.length()-1); + } + + /* check whether session still exists */ + if (!Glib::file_test(dirname.c_str(), Glib::FILE_TEST_EXISTS)) { + /* session doesn't exist */ + continue; + } + + /* now get available states for this session */ + + vector states; + states = Session::possible_states (dirname); + + if (states.empty()) { + /* no state file? */ + continue; + } + + std::vector state_file_names(get_file_names_no_extension (state_file_paths)); + + if (state_file_names.empty()) { + continue; + } + + session_paths.push_back(Glib::build_filename((*it).second,state_file_names.front() + statefile_suffix) ); + session_names.push_back(state_file_names.front()); + //std::cout<<"state_file_names.front()= "<& session_names,std::vector& session_paths); + + //recent session menuitem id + const std::string recent_session_menuitem_id="recent-session-"; + + //full path to recent sessions + std::vector recent_session_full_paths; + }; #endif /* __ardour_gui_h__ */ diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index fb2770cd1b..91fcab722e 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -447,6 +447,47 @@ ARDOUR_UI::update_frame_rate_button () _frame_rate_button->set_text (timecode_format_string); } +void +ARDOUR_UI::update_recent_session_menuitems () +{ + std::vector recent_session_names; + recent_session_full_paths.clear(); + get_recent_session_names_and_paths(recent_session_names,recent_session_full_paths); + + + int i; + + for(i=0;i act; + + std::string label=string_compose( ("%1%2"), recent_session_menuitem_id.c_str(),i ) ; + act=ActionManager::get_action_from_name(X_(label.c_str())); + + // set label for existing recent session menuitem + act->set_label(X_(recent_session_names[i].c_str())); + + /* + act->set_visible(true); + std::cout<<"i= "<set_label(X_("")); + recent_session_full_paths.push_back(""); + + //act->set_visible(false); + + + } + +} + void ARDOUR_UI::install_actions () { @@ -456,7 +497,8 @@ ARDOUR_UI::install_actions () /* menus + submenus that need action items */ - ActionManager::register_action (main_menu_actions, X_("Session"), _("File")); + act=ActionManager::register_action (main_menu_actions, X_("Session"), _("File")); + ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (main_actions, X_("Cleanup"), _("CleanUp")); ActionManager::session_sensitive_actions.push_back (act); ActionManager::register_action (main_menu_actions, X_("Sync"), _("Sync")); @@ -481,7 +523,14 @@ ARDOUR_UI::install_actions () act = ActionManager::register_action (main_actions, X_("New"), _("New"), hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, ""))); ActionManager::register_action (main_actions, X_("Open"), _("Open"), sigc::mem_fun(*this, &ARDOUR_UI::open_session)); - ActionManager::register_action (main_actions, X_("Recent"), _("Recent Sessions"), sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session)); + ActionManager::register_action (main_actions, X_("Recent"), _("Recent"), sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session)); + /* register act for recent_session_menuitems */ + for(int i=0;imaster_bus_set_visible ( set_master_bus_visible ); _set_session_in_progress = false; + + /* it is neccessary to update recent session menuitems */ + /* because new session could be created */ + ARDOUR_UI::instance()->update_recent_session_menuitems(); } void diff --git a/gtk2_ardour/session_dialog.logic.cc b/gtk2_ardour/session_dialog.logic.cc index 0138cf1670..2fe97a693f 100644 --- a/gtk2_ardour/session_dialog.logic.cc +++ b/gtk2_ardour/session_dialog.logic.cc @@ -271,6 +271,7 @@ SessionDialog::redisplay_recent_sessions () ++session_snapshot_count; } + //ARDOUR_UI::instance()->update_recent_session_menuitems(); return session_snapshot_count; } diff --git a/gtk2_ardour/trackslive.menus.in b/gtk2_ardour/trackslive.menus.in index 36f9d26e50..4446a69122 100644 --- a/gtk2_ardour/trackslive.menus.in +++ b/gtk2_ardour/trackslive.menus.in @@ -20,6 +20,18 @@ + + + + + + + + + + + +