This commit is contained in:
kiilerix 2025-11-08 16:40:26 +01:00 committed by GitHub
commit d6060bda6f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 76 additions and 144 deletions

View file

@ -76,8 +76,16 @@ using namespace ARDOUR;
using namespace ArdourWidgets;
using namespace ARDOUR_UI_UTILS;
enum tab_page_numbers {
page_number_logo = 0,
page_number_new = 1,
page_number_recent = 2,
page_number_open = 3,
page_number_unused
};
SessionDialog::SessionDialog (DialogTab initial_tab, const std::string& session_name, const std::string& session_path, const std::string& template_name, bool cancel_not_quit)
: ArdourDialog (initial_tab == New ? _("Session Setup") : _("Recent Sessions"), true, true)
: ArdourDialog (_("Select Session"), true, true)
, _initial_tab (initial_tab)
, new_name_was_edited (false)
, new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
@ -114,58 +122,35 @@ SessionDialog::SessionDialog (DialogTab initial_tab, const std::string& session_
_open_table.attach (_info_box, 1,3, 0,1, FILL, FILL, 0, 6);
#endif
new_button.set_text("NEW");
new_button.set_name ("tab button");
new_button.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::new_button_pressed), false);
new_button.set_tweaks(ArdourButton::Tweaks(ArdourButton::ForceFlat));
recent_button.set_text("RECENT");
recent_button.set_name ("tab button");
recent_button.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::recent_button_pressed), false);
recent_button.set_tweaks(ArdourButton::Tweaks(ArdourButton::ForceFlat));
existing_button.set_text("OPEN");
existing_button.set_name ("tab button");
existing_button.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::existing_button_pressed), false);
existing_button.set_tweaks(ArdourButton::Tweaks(ArdourButton::ForceFlat));
prefs_button.set_text("SETTINGS");
prefs_button.set_name ("tab button");
prefs_button.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::prefs_button_pressed), false);
prefs_button.set_tweaks(ArdourButton::Tweaks(ArdourButton::ForceFlat));
Glib::RefPtr<SizeGroup> grp = SizeGroup::create (Gtk::SIZE_GROUP_BOTH);
grp->add_widget(new_button);
grp->add_widget(recent_button);
grp->add_widget(existing_button);
int top = 0;
int row = 0;
if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
// page_number_logo = 0
Gtk::Image* image;
if ((image = manage (new Gtk::Image (image_path))) != 0) {
_open_table.attach (*image, 0,1, row , row + 1, FILL, FILL); ++row;
grp->add_widget (*image);
if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
image = manage (new Gtk::Image (image_path));
}
if (image != 0) {
_tabs.append_page (logo_empty_page, *image);
} else {
_tabs.append_page (logo_empty_page, PROGRAM_NAME);
}
_open_table.attach (new_button, 0,1, row, row + 1, FILL, FILL); ++row;
_open_table.attach (recent_button, 0,1, row, row + 1, FILL, FILL); ++row;
_open_table.attach (existing_button, 0,1, row, row + 1, FILL, FILL); ++row;
++row;
Label *vspacer = manage (new Label());
vspacer->set_size_request(8, -1);
_open_table.attach (*vspacer, 1,2, top, row, FILL, FILL|EXPAND, 0, 0);
_open_table.attach (_tabs, 2,3, top, row, FILL|EXPAND, FILL|EXPAND, 0, 0);
_tabs.set_show_tabs(false);
_tabs.set_tab_pos (POS_LEFT);
_tabs.set_show_border(false);
_tabs.append_page(session_new_vbox);
_tabs.append_page(recent_vbox);
_tabs.append_page(existing_session_chooser);
// add page_number_new = 1
_tabs.append_page (session_new_vbox, "_New", true);
// add page_number_recent = 2
_tabs.append_page (recent_vbox, "_Recent", true);
// add page_number_open = 3
_tabs.append_page (existing_session_chooser, "Op_en", true);
session_new_vbox.show_all();
recent_vbox.show_all();
@ -178,8 +163,8 @@ SessionDialog::SessionDialog (DialogTab initial_tab, const std::string& session_
open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT);
open_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::open_button_pressed), false);
_disable_plugins.set_label (_("Safe Mode: Disable all Plugins"));
_disable_plugins.set_can_focus ();
_disable_plugins.set_label (_("Safe Mode: _Disable all Plugins"));
_disable_plugins.set_use_underline ();
_disable_plugins.set_relief (Gtk::RELIEF_NORMAL);
_disable_plugins.set_mode (true);
_disable_plugins.set_active (ARDOUR::Session::get_disable_all_loaded_plugins());
@ -241,16 +226,16 @@ SessionDialog::on_show ()
{
ArdourDialog::on_show ();
_tabs.set_current_page(3); // force change
_tabs.set_current_page (page_number_unused); // force change
switch (_initial_tab) {
case New:
_tabs.set_current_page(0);
_tabs.set_current_page (page_number_new);
break;
case Open:
_tabs.set_current_page(2);
_tabs.set_current_page (page_number_open);
break;
default:
_tabs.set_current_page(1);
_tabs.set_current_page (page_number_recent);
break;
}
}
@ -258,27 +243,24 @@ SessionDialog::on_show ()
void
SessionDialog::tab_page_switched(GtkNotebookPage*, guint page_number)
{
/* clang-format off */
new_button.set_active_state (page_number==0 ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
recent_button.set_active_state (page_number==1 ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
existing_button.set_active_state (page_number==2 ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
prefs_button.set_active_state (page_number==3 ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
/* clang-format on */
//check the status of each tab and sensitize the 'open' button appropriately
open_button->set_sensitive(false);
switch (page_number) {
case 0:
case page_number_logo:
_tabs.set_current_page (1);
break;
case page_number_new:
new_name_changed();
new_name_entry.select_region (0, -1);
new_name_entry.grab_focus ();
_disable_plugins.hide ();
break;
case 1:
case page_number_recent:
recent_session_row_selected();
recent_session_display.grab_focus ();
_disable_plugins.show ();
break;
case 2:
case page_number_open:
existing_file_selected();
_disable_plugins.show ();
break;
@ -391,13 +373,13 @@ std::string
SessionDialog::session_name (bool& should_be_new)
{
switch (_tabs.get_current_page()) {
case 0: {
case page_number_new: {
should_be_new = true;
string val = new_name_entry.get_text ();
strip_whitespace_edges (val);
return val;
} break;
case 1: {
case page_number_recent: {
/* Try recent session selection */
TreeIter iter = recent_session_display.get_selection()->get_selected();
if (iter) {
@ -409,7 +391,7 @@ SessionDialog::session_name (bool& should_be_new)
return (*iter)[recent_session_columns.visible_name];
}
} break;
case 2: {
case page_number_open: {
/* existing session chosen from file chooser */
should_be_new = false;
return existing_session_chooser.get_filename ();
@ -423,14 +405,14 @@ std::string
SessionDialog::session_folder ()
{
switch (_tabs.get_current_page()) {
case 0:
case page_number_new:
{
std::string val = new_name_entry.get_text();
strip_whitespace_edges (val);
std::string legal_session_folder_name = legalize_for_path (val);
return Glib::build_filename (new_folder_chooser.get_filename (), legal_session_folder_name);
}
case 1:
case page_number_recent:
{
/* Try recent session selection */
TreeIter iter = recent_session_display.get_selection()->get_selected();
@ -443,7 +425,7 @@ SessionDialog::session_folder ()
}
}
break;
case 2:
case page_number_open:
/* existing session chosen from file chooser */
return Glib::path_get_dirname (existing_session_chooser.get_current_folder ());
default:
@ -529,7 +511,7 @@ SessionDialog::setup_existing_box ()
void
SessionDialog::existing_file_selected ()
{
if (_tabs.get_current_page()!=2) {
if (_tabs.get_current_page () != page_number_open) {
//gtk filechooser is threaded; don't allow it to mess with open_button sensitivity when it's not actually visible
return;
}
@ -578,45 +560,6 @@ SessionDialog::existing_file_selected ()
open_button->set_sensitive(true); //still potentially openable; checks for session archives, .ptf, and .aaf will have to occur later
}
void
SessionDialog::session_selected ()
{
}
bool
SessionDialog::new_button_pressed (GdkEventButton*)
{
_tabs.set_current_page(0);
return true;
}
bool
SessionDialog::recent_button_pressed (GdkEventButton*)
{
_tabs.set_current_page(1);
return true;
}
bool
SessionDialog::existing_button_pressed (GdkEventButton*)
{
_tabs.set_current_page(2);
return true;
}
bool
SessionDialog::prefs_button_pressed (GdkEventButton*)
{
_tabs.set_current_page(3);
open_button->set_sensitive(false); //do not allow to open a session from this page
return true;
}
bool
SessionDialog::open_button_pressed (GdkEventButton* ev)
{
@ -743,7 +686,9 @@ SessionDialog::setup_new_session_page ()
session_new_vbox.set_spacing (8);
Label* name_label = manage (new Label);
name_label->set_text (_("Session name:"));
name_label->set_text (_("_Session name:"));
name_label->set_use_underline ();
name_label->set_mnemonic_widget (new_name_entry);
HBox* name_hbox = manage (new HBox);
name_hbox->set_spacing (8);
@ -756,7 +701,9 @@ SessionDialog::setup_new_session_page ()
//Folder location for the new session
Label* new_folder_label = manage (new Label);
new_folder_label->set_text (_("Create session folder in:"));
new_folder_label->set_text (_("_Create session folder in:"));
new_folder_label->set_use_underline ();
new_folder_label->set_mnemonic_widget (new_folder_chooser);
HBox* folder_box = manage (new HBox);
folder_box->set_spacing (8);
folder_box->pack_start (*new_folder_label, false, false);
@ -784,7 +731,9 @@ SessionDialog::setup_new_session_page ()
//Timebase for the new session
Label* session_domain_label = manage (new Label);
session_domain_label->set_text (_("Default Time Domain:"));
session_domain_label->set_text (_("_Default Time Domain:"));
session_domain_label->set_use_underline ();
session_domain_label->set_mnemonic_widget (timebase_chooser);
HBox* timebase_box = manage (new HBox);
timebase_box->set_spacing (8);
timebase_box->pack_start (*session_domain_label, false, false);
@ -834,12 +783,9 @@ SessionDialog::setup_new_session_page ()
//template_chooser is the treeview showing available templates
template_model = TreeStore::create (session_template_columns);
template_chooser.set_model (template_model);
template_chooser.append_column (_("Template"), session_template_columns.name);
template_chooser.append_column (_("_Template"), session_template_columns.name); // single column header has value as mnemonic
#ifdef MIXBUS
template_chooser.append_column (_("Modified With"), session_template_columns.modified_with_short);
template_chooser.set_headers_visible (true);
#else
template_chooser.set_headers_visible (false); //there is only one column and its purpose should be obvious
#endif
template_chooser.get_selection()->set_mode (SELECTION_SINGLE);
template_chooser.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::template_row_selected));
@ -895,7 +841,6 @@ SessionDialog::new_name_changed ()
}
if (!new_name_entry.get_text().empty()) {
session_selected ();
open_button->set_sensitive (true);
} else {
open_button->set_sensitive (false);
@ -1156,7 +1101,6 @@ SessionDialog::recent_session_row_selected ()
{
if (recent_session_display.get_selection()->count_selected_rows() > 0) {
open_button->set_sensitive (true);
session_selected ();
} else {
open_button->set_sensitive (false);
}

View file

@ -59,8 +59,7 @@ public:
{
New = 0,
Recent,
Open,
Prefs
Open
};
SessionDialog (DialogTab initial_tab, const std::string& session_name, const std::string& session_path,
@ -93,30 +92,12 @@ private:
Gtk::Button* open_button;
Gtk::Button* quit_button;
ArdourWidgets::ArdourButton new_button;
ArdourWidgets::ArdourButton recent_button;
ArdourWidgets::ArdourButton existing_button;
ArdourWidgets::ArdourButton prefs_button;
Gtk::ComboBoxText timebase_chooser;
bool new_button_pressed (GdkEventButton*);
bool recent_button_pressed (GdkEventButton*);
bool existing_button_pressed (GdkEventButton*);
bool prefs_button_pressed (GdkEventButton*);
bool open_button_pressed (GdkEventButton*);
Gtk::HBox _info_box;
Gtk::Table _open_table;
/* initial choice page */
void setup_existing_box ();
void setup_recent_sessions ();
Gtk::VBox recent_vbox;
DialogTab _initial_tab;
#ifdef MIXBUS
@ -125,9 +106,16 @@ private:
void license_button_clicked ();
#endif
/* tabs */
Gtk::Notebook _tabs;
Gtk::VBox logo_empty_page;
void tab_page_switched (GtkNotebookPage*, guint page_number);
/* recent sessions */
void setup_existing_session_page ();
void setup_recent_sessions ();
Gtk::VBox recent_vbox;
struct RecentSessionsSorter
{
@ -163,7 +151,7 @@ private:
Glib::RefPtr<Gtk::TreeStore> recent_session_model;
Gtk::ScrolledWindow recent_scroller;
Gtk::Label recent_label;
Gtk::FileChooserWidget existing_session_chooser;
int redisplay_recent_sessions ();
void recent_session_row_selected ();
void recent_session_sort_changed ();
@ -172,12 +160,7 @@ private:
void recent_context_mennu (GdkEventButton*);
void recent_remove_selected ();
void session_selected ();
void existing_file_selected();
void existing_file_activated ();
/* new sessions */
/* new sessions (and template stuff) */
void setup_new_session_page ();
Gtk::Entry new_name_entry;
@ -224,7 +207,15 @@ private:
void new_name_activated ();
void populate_session_templates ();
void tab_page_switched(GtkNotebookPage*, guint page_number);
Gtk::ComboBoxText timebase_chooser;
/* open existing session */
void setup_existing_session_page ();
void setup_existing_box ();
Gtk::FileChooserWidget existing_session_chooser;
void existing_file_selected ();
void existing_file_activated ();
/* --disable plugins UI */
Gtk::CheckButton _disable_plugins;
@ -235,15 +226,12 @@ private:
/* always there */
Glib::RefPtr<Pango::Layout> layout;
Gtk::HBox _info_box;
Gtk::Label info_scroller_label;
std::string::size_type info_scroller_count;
bool info_scroller_update();
sigc::connection info_scroller_connection;
void updates_button_clicked ();
Gtk::Notebook _tabs;
};
#endif /* __gtk2_ardour_session_dialog_h__ */

View file

@ -6596,8 +6596,8 @@ gtk_notebook_mnemonic_activate_switch_page (GtkWidget *child,
GtkNotebookPage *page = list->data;
gtk_widget_grab_focus (GTK_WIDGET (notebook)); /* Do this first to avoid focusing new page */
gtk_notebook_switch_page (notebook, page);
focus_tabs_in (notebook);
gtk_notebook_switch_page (notebook, page);
}
return TRUE;