rename ArdourStartup to NewUserWizard and rename source file(s)
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 9 Oct 2019 03:29:47 +0000 (21:29 -0600)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Oct 2019 22:52:00 +0000 (16:52 -0600)
gtk2_ardour/ardour_ui.cc
gtk2_ardour/ardour_ui_ed.cc
gtk2_ardour/ardour_ui_startup.cc
gtk2_ardour/new_user_wizard.cc [new file with mode: 0644]
gtk2_ardour/new_user_wizard.h [new file with mode: 0644]
gtk2_ardour/startup.cc [deleted file]
gtk2_ardour/startup.h [deleted file]

index d001faf9e2a9993a539eae5ff451a341e4b865f9..eb6529f4531e3c7d4a2028fdc123cff4e2e6621f 100644 (file)
@@ -197,7 +197,6 @@ typedef uint64_t microseconds_t;
 #include "session_option_editor.h"
 #include "speaker_dialog.h"
 #include "splash.h"
-#include "startup.h"
 #include "template_dialog.h"
 #include "time_axis_view_item.h"
 #include "time_info_box.h"
index 6dc5316c1d6852b8bce98d401ed4b2edcc0e2015..c03bb4d5deaff1cf071cca1e565a155d266f03e8 100644 (file)
@@ -63,7 +63,6 @@
 #include "meterbridge.h"
 #include "luawindow.h"
 #include "mixer_ui.h"
-#include "startup.h"
 #include "window_manager.h"
 #include "global_port_matrix.h"
 #include "location_ui.h"
index ac7f69d0b4d1d7d5feb3cf0941e87ba5103c43bf..732252c242d151235c703e4686d7c15c1f691c20 100644 (file)
@@ -71,7 +71,6 @@
 #include "pingback.h"
 #include "public_editor.h"
 #include "splash.h"
-#include "startup.h"
 
 #include "pbd/i18n.h"
 
diff --git a/gtk2_ardour/new_user_wizard.cc b/gtk2_ardour/new_user_wizard.cc
new file mode 100644 (file)
index 0000000..0481f0c
--- /dev/null
@@ -0,0 +1,505 @@
+/*
+ * Copyright (C) 2009-2011 David Robillard <d@drobilla.net>
+ * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
+ * Copyright (C) 2009-2016 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2012-2015 Tim Mayberry <mojofunk@gmail.com>
+ * Copyright (C) 2012-2019 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2013 Colin Fletcher <colin.m.fletcher@googlemail.com>
+ * Copyright (C) 2013 Michael R. Fisher <mfisher@bketech.com>
+ * Copyright (C) 2015 John Emmas <john@creativepost.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#include "gtk2ardour-version.h"
+#endif
+
+#include <algorithm>
+#include <fcntl.h>
+
+#include "pbd/gstdio_compat.h"
+
+#include <gtkmm.h>
+
+#include "pbd/failed_constructor.h"
+#include "pbd/scoped_file_descriptor.h"
+#include "pbd/file_utils.h"
+#include "pbd/replace_all.h"
+#include "pbd/whitespace.h"
+#include "pbd/stacktrace.h"
+#include "pbd/openuri.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/plugin_manager.h"
+#include "ardour/recent_sessions.h"
+#include "ardour/session.h"
+#include "ardour/session_state_utils.h"
+#include "ardour/template_utils.h"
+#include "ardour/profile.h"
+
+#include "gtkmm2ext/utils.h"
+
+#include "new_user_wizard.h"
+#include "opts.h"
+#include "ui_config.h"
+#include "pbd/i18n.h"
+#include "utils.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace Gdk;
+using namespace Glib;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+
+NewUserWizard::NewUserWizard ()
+       : config_modified (false)
+       , default_dir_chooser (0)
+       , monitor_via_hardware_button (string_compose (_("Use an external mixer or the hardware mixer of your audio interface.\n"
+                                                        "%1 will play NO role in monitoring"), PROGRAM_NAME))
+       , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME))
+       , audio_page_index (-1)
+       , new_user_page_index (-1)
+       , default_folder_page_index (-1)
+       , monitoring_page_index (-1)
+       , final_page_index (-1)
+{
+       set_position (WIN_POS_CENTER);
+       set_border_width (12);
+
+       if (! (icon_pixbuf = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
+               throw failed_constructor();
+       }
+
+       list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
+       Glib::RefPtr<Gdk::Pixbuf> icon;
+
+       if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
+               window_icons.push_back (icon);
+       }
+       if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
+               window_icons.push_back (icon);
+       }
+       if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
+               window_icons.push_back (icon);
+       }
+       if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
+               window_icons.push_back (icon);
+       }
+       if (!window_icons.empty ()) {
+               set_default_icon_list (window_icons);
+       }
+
+       setup_new_user_page ();
+       setup_first_time_config_page ();
+       setup_monitoring_choice_page ();
+       setup_monitor_section_choice_page ();
+       setup_final_page ();
+}
+
+NewUserWizard::~NewUserWizard ()
+{
+}
+
+bool
+NewUserWizard::required ()
+{
+       if (Glib::file_test (ARDOUR::been_here_before_path (), Glib::FILE_TEST_EXISTS)) {
+               return false;
+       }
+
+       return true;
+}
+
+void
+NewUserWizard::setup_new_user_page ()
+{
+       Label* foomatic = manage (new Label);
+
+       foomatic->set_markup (string_compose (_("\
+<span size=\"larger\">%1 is a digital audio workstation. You can use it to \
+record, edit and mix multi-track audio. You can produce your \
+own CDs, mix video soundtracks, or experiment with new \
+ideas about music and sound. \
+\n\n\
+There are a few things that need to be configured before you start \
+using the program.</span> \
+"), PROGRAM_NAME));
+       foomatic->set_justify (JUSTIFY_FILL);
+       foomatic->set_line_wrap ();
+
+       VBox* vbox = manage (new VBox);
+       vbox->set_border_width (24);
+       vbox->pack_start (*foomatic, true, true, 12);
+
+#ifndef __APPLE__
+       Label* barmatic = manage (new Label);
+       barmatic->set_text (_("GUI and Font scaling:"));
+
+       Label* bazmatic = manage (new Label);
+       bazmatic->set_markup (_("<small><i>This can later be changed in Preferences &gt; Appearance.</i></small>"));
+
+       ui_font_scale.append_text (_("100%"));
+       ui_font_scale.append_text (_("150%"));
+       ui_font_scale.append_text (_("200%"));
+       ui_font_scale.append_text (_("250%"));
+       ui_font_scale.set_active_text (_("100%"));
+
+       HBox* hbox = manage (new HBox);
+       HBox* cbox = manage (new HBox);
+
+       hbox->pack_start (*barmatic, false, false);
+       hbox->pack_start (ui_font_scale, false, false);
+       cbox->pack_start (*hbox, true, false);
+
+       vbox->pack_start (*cbox, false, false, 2);
+       vbox->pack_start (*bazmatic, false, false);
+
+       ui_font_scale.show ();
+       barmatic->show ();
+       bazmatic->show ();
+       hbox->show ();
+       cbox->show ();
+
+       guess_default_ui_scale ();
+       ui_font_scale.signal_changed ().connect (sigc::mem_fun (*this, &NewUserWizard::rescale_ui));
+#endif
+
+       foomatic->show ();
+       vbox->show ();
+
+       new_user_page_index = append_page (*vbox);
+       set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
+       set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
+       set_page_header_image (*vbox, icon_pixbuf);
+       set_page_complete (*vbox, true);
+}
+
+void
+NewUserWizard::rescale_ui ()
+{
+       int rn = ui_font_scale.get_active_row_number ();
+       if (rn < 0 ) {
+               return;
+       }
+       float ui_scale = 100 + rn * 50;
+       UIConfiguration::instance ().set_font_scale (1024 * ui_scale);
+       UIConfiguration::instance ().reset_dpi ();
+}
+
+void
+NewUserWizard::guess_default_ui_scale ()
+{
+       gint width = 0;
+       gint height = 0;
+       GdkScreen* screen = gdk_display_get_screen (gdk_display_get_default (), 0);
+       gint n_monitors = gdk_screen_get_n_monitors (screen);
+
+       if (!screen) {
+               return;
+       }
+
+       for (gint i = 0; i < n_monitors; ++i) {
+               GdkRectangle rect;
+               gdk_screen_get_monitor_geometry (screen, i, &rect);
+               width = std::max (width, rect.width);
+               height = std::max (height, rect.height);
+       }
+
+       float wx = width  / 1920.f;
+       float hx = height / 1080.f;
+       float sx = std::min (wx, hx);
+
+       if (sx < 1.25) {
+               ui_font_scale.set_active (0); // 100%
+       } else if (sx < 1.6) {
+               ui_font_scale.set_active (1); // 150%
+       } else if (sx < 2.1) {
+               ui_font_scale.set_active (2); // 200%
+       } else {
+               ui_font_scale.set_active (3); // 250%
+       }
+       rescale_ui ();
+}
+
+void
+NewUserWizard::default_dir_changed ()
+{
+       Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
+       // make new session folder chooser point to the new default
+       new_folder_chooser.set_current_folder (Config->get_default_session_parent_dir());
+       config_changed ();
+}
+
+void
+NewUserWizard::config_changed ()
+{
+       config_modified = true;
+}
+
+void
+NewUserWizard::setup_first_time_config_page ()
+{
+       default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
+                                                            FILE_CHOOSER_ACTION_SELECT_FOLDER));
+       Gtk::Label* txt = manage (new Label);
+       HBox* hbox = manage (new HBox);
+       VBox* vbox = manage (new VBox);
+
+       txt->set_markup (string_compose (_("\
+Each project that you work on with %1 has its own folder.\n\
+These can require a lot of disk space if you are recording audio.\n\
+\n\
+Where would you like new %1 sessions to be stored by default?\n\n\
+<i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
+       txt->set_alignment (0.0, 0.0);
+
+       vbox->set_spacing (18);
+       vbox->set_border_width (24);
+
+       hbox->pack_start (*default_dir_chooser, false, true, 8);
+       vbox->pack_start (*txt, false, false);
+       vbox->pack_start (*hbox, false, true);
+
+       cerr << "set default folder to " << poor_mans_glob (Config->get_default_session_parent_dir()) << endl;
+       Gtkmm2ext::add_volume_shortcuts (*default_dir_chooser);
+       default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
+       default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &NewUserWizard::default_dir_changed));
+       default_dir_chooser->show ();
+
+       vbox->show_all ();
+
+       default_folder_page_index = append_page (*vbox);
+       set_page_title (*vbox, _("Default folder for new sessions"));
+       set_page_header_image (*vbox, icon_pixbuf);
+       set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
+
+       /* user can just skip all these settings if they want to */
+
+       set_page_complete (*vbox, true);
+}
+
+void
+NewUserWizard::setup_monitoring_choice_page ()
+{
+       mon_vbox.set_spacing (18);
+       mon_vbox.set_border_width (24);
+
+       HBox* hbox = manage (new HBox);
+       VBox* vbox = manage (new VBox);
+       /* first button will be on by default */
+       RadioButton::Group g (monitor_via_ardour_button.get_group());
+       monitor_via_hardware_button.set_group (g);
+
+       monitor_label.set_markup(_("\
+While recording instruments or vocals, you probably want to listen to the\n\
+signal as well as record it. This is called \"monitoring\". There are\n\
+different ways to do this depending on the equipment you have and the\n\
+configuration of that equipment. The two most common are presented here.\n\
+Please choose whichever one is right for your setup.\n\n\
+<i>(You can change this preference at any time, via the Preferences dialog)</i>\n\n\
+<i>If you do not understand what this is about, just accept the default.</i>"));
+       monitor_label.set_alignment (0.0, 0.0);
+
+       vbox->set_spacing (6);
+
+       vbox->pack_start (monitor_via_hardware_button, false, true);
+       vbox->pack_start (monitor_via_ardour_button, false, true);
+       hbox->pack_start (*vbox, true, true, 8);
+       mon_vbox.pack_start (monitor_label, false, false);
+       mon_vbox.pack_start (*hbox, false, false);
+
+       mon_vbox.show_all ();
+
+       monitoring_page_index = append_page (mon_vbox);
+       set_page_title (mon_vbox, _("Monitoring Choices"));
+       set_page_header_image (mon_vbox, icon_pixbuf);
+
+       monitor_via_hardware_button.signal_toggled().connect (sigc::mem_fun (*this, &NewUserWizard::config_changed));
+       monitor_via_ardour_button.signal_toggled().connect (sigc::mem_fun (*this, &NewUserWizard::config_changed));
+
+       /* user could just click on "Forward" if default
+        * choice is correct.
+        */
+
+       set_page_complete (mon_vbox, true);
+}
+
+void
+NewUserWizard::setup_monitor_section_choice_page ()
+{
+       mon_sec_vbox.set_spacing (18);
+       mon_sec_vbox.set_border_width (24);
+
+       HBox* hbox = manage (new HBox);
+       VBox* main_vbox = manage (new VBox);
+       VBox* vbox;
+       Label* l = manage (new Label);
+
+       main_vbox->set_spacing (32);
+
+       no_monitor_section_button.set_label (_("Use a Master bus directly"));
+       l->set_alignment (0.0, 1.0);
+       l->set_markup(_("Connect the Master bus directly to your hardware outputs. This is preferable for simple usage."));
+
+       vbox = manage (new VBox);
+       vbox->set_spacing (6);
+       vbox->pack_start (no_monitor_section_button, false, true);
+       vbox->pack_start (*l, false, true);
+
+       main_vbox->pack_start (*vbox, false, false);
+
+       use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
+       l = manage (new Label);
+       l->set_alignment (0.0, 1.0);
+       l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
+greater control in monitoring without affecting the mix."));
+
+       vbox = manage (new VBox);
+       vbox->set_spacing (6);
+       vbox->pack_start (use_monitor_section_button, false, true);
+       vbox->pack_start (*l, false, true);
+
+       main_vbox->pack_start (*vbox, false, false);
+
+       RadioButton::Group g (use_monitor_section_button.get_group());
+       no_monitor_section_button.set_group (g);
+
+       if (Config->get_use_monitor_bus()) {
+               use_monitor_section_button.set_active (true);
+       } else {
+               no_monitor_section_button.set_active (true);
+       }
+
+       use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &NewUserWizard::config_changed));
+       no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &NewUserWizard::config_changed));
+
+       monitor_section_label.set_markup(_("<i>You can change this preference at any time via the Preferences dialog.\nYou can also add or remove the monitor section to/from any session.</i>\n\n\
+<i>If you do not understand what this is about, just accept the default.</i>"));
+       monitor_section_label.set_alignment (0.0, 0.0);
+
+       hbox->pack_start (*main_vbox, true, true, 8);
+       mon_sec_vbox.pack_start (*hbox, false, false);
+       mon_sec_vbox.pack_start (monitor_section_label, false, false);
+
+       mon_sec_vbox.show_all ();
+
+       monitor_section_page_index = append_page (mon_sec_vbox);
+       set_page_title (mon_sec_vbox, _("Monitor Section"));
+       set_page_header_image (mon_sec_vbox, icon_pixbuf);
+
+       /* user could just click on "Forward" if default
+        * choice is correct.
+        */
+
+       set_page_complete (mon_sec_vbox, true);
+}
+
+void
+NewUserWizard::setup_final_page ()
+{
+       string msg = string_compose (_("%1 is ready for use"), PROGRAM_NAME);
+
+       plugin_disco_button.signal_clicked().connect (sigc::mem_fun(*this, &NewUserWizard::discover_plugins));
+       plugin_disco_button.set_label (_("Scan for Plugins"));
+       plugin_disco_button.show ();
+
+       Gtk::Label* final_label = manage (new Label);
+       final_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", msg));
+       final_label->show ();
+
+       VBox* vbox = manage (new VBox);
+       vbox->pack_start (*final_label, true, true);
+       if (!Profile->get_mixbus()) {
+               vbox->pack_start (plugin_disco_button, true, false);
+       }
+       vbox->show ();
+
+       final_page_index = append_page (*vbox);
+       set_page_complete (*vbox, true);
+       set_page_header_image (*vbox, icon_pixbuf);
+       set_page_type (*vbox, ASSISTANT_PAGE_CONFIRM);
+}
+
+void
+NewUserWizard::discover_plugins () {
+       plugin_disco_button.set_sensitive (false);
+       PluginManager::instance().refresh();
+}
+
+void
+NewUserWizard::on_cancel ()
+{
+       _signal_response (int (RESPONSE_CANCEL));
+}
+
+bool
+NewUserWizard::on_delete_event (GdkEventAny*)
+{
+       _signal_response (int (RESPONSE_CLOSE));
+       return true;
+}
+
+void
+NewUserWizard::on_apply ()
+{
+       /* file-chooser button does not emit 'current_folder_changed' signal
+        * when a folder from the dropdown or the sidebar is chosen.
+        * -> explicitly poll for the dir as suggested by the gtk documentation.
+        */
+       if (default_dir_chooser && default_dir_chooser->get_filename() != Config->get_default_session_parent_dir ()) {
+               config_modified = true;
+       }
+
+       if (config_modified) {
+
+               if (default_dir_chooser) {
+                       Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
+               }
+
+               if (monitor_via_hardware_button.get_active()) {
+                       Config->set_monitoring_model (ExternalMonitoring);
+               } else if (monitor_via_ardour_button.get_active()) {
+                       Config->set_monitoring_model (SoftwareMonitoring);
+               }
+
+               Config->set_use_monitor_bus (use_monitor_section_button.get_active());
+
+               Config->save_state ();
+
+       }
+
+       {
+               /* "touch" the been-here-before path now we've successfully
+                  made it through the first time setup (at least)
+               */
+               PBD::ScopedFileDescriptor fout (g_open (been_here_before_path ().c_str(), O_CREAT|O_TRUNC|O_RDWR, 0666));
+
+       }
+
+       _signal_response (int (RESPONSE_OK));
+}
+
+
+void
+NewUserWizard::move_along_now ()
+{
+       on_apply ();
+}
diff --git a/gtk2_ardour/new_user_wizard.h b/gtk2_ardour/new_user_wizard.h
new file mode 100644 (file)
index 0000000..95e9e55
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2009-2011 Carl Hetherington <carl@carlh.net>
+ * Copyright (C) 2009-2011 David Robillard <d@drobilla.net>
+ * Copyright (C) 2009-2016 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2015-2017 Robin Gareus <robin@gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __gtk2_ardour_startup_h__
+#define __gtk2_ardour_startup_h__
+
+#include <string>
+
+#include <gtkmm/assistant.h>
+#include <gtkmm/label.h>
+#include <gtkmm/expander.h>
+#include <gtkmm/box.h>
+#include <gtkmm/radiobutton.h>
+#include <gtkmm/filechooserbutton.h>
+#include <gtkmm/comboboxtext.h>
+
+#include "ardour/utils.h"
+
+class EngineControl;
+
+class NewUserWizard : public Gtk::Assistant
+{
+public:
+       NewUserWizard ();
+       ~NewUserWizard ();
+
+       static bool required ();
+
+       /* It's not a dialog so we have to fake this to make it behave like a
+        * dialog. This allows the StartupFSM to treat everything similarly.
+        */
+
+       sigc::signal1<void,int>& signal_response() { return _signal_response; }
+
+private:
+       bool config_modified;
+       bool new_user;
+
+       void on_apply ();
+       void on_cancel ();
+       bool on_delete_event (GdkEventAny*);
+       void discover_plugins ();
+
+       Glib::RefPtr<Gdk::Pixbuf> icon_pixbuf;
+
+       void setup_prerelease_page ();
+       void setup_new_user_page ();
+       Glib::RefPtr<Gdk::Pixbuf> splash_pixbuf;
+
+       void setup_first_time_config_page ();
+       void config_changed ();
+
+       /* Welcome */
+       Gtk::ComboBoxText ui_font_scale;
+       void rescale_ui ();
+       void guess_default_ui_scale ();
+
+       /* first page */
+       Gtk::FileChooserButton* default_dir_chooser;
+       void default_dir_changed();
+       void setup_first_page ();
+       Gtk::FileChooserButton new_folder_chooser;
+
+       /* monitoring choices */
+
+       Gtk::VBox mon_vbox;
+       Gtk::Label monitor_label;
+       Gtk::RadioButton monitor_via_hardware_button;
+       Gtk::RadioButton monitor_via_ardour_button;
+       void setup_monitoring_choice_page ();
+
+       /* monitor section choices */
+
+       Gtk::VBox mon_sec_vbox;
+       Gtk::Label monitor_section_label;
+       Gtk::RadioButton use_monitor_section_button;
+       Gtk::RadioButton no_monitor_section_button;
+       void setup_monitor_section_choice_page ();
+
+       /* final page */
+
+       void setup_final_page ();
+       Gtk::Button plugin_disco_button;
+
+       /* always there */
+
+       Glib::RefPtr<Pango::Layout> layout;
+
+       /* page indices */
+
+       gint audio_page_index;
+       gint new_user_page_index;
+       gint default_folder_page_index;
+       gint monitoring_page_index;
+       gint monitor_section_page_index;
+       gint final_page_index;
+
+       void move_along_now ();
+
+       sigc::signal1<void,int> _signal_response;
+};
+
+#endif /* __gtk2_ardour_startup_h__ */
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
deleted file mode 100644 (file)
index bb03bc3..0000000
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright (C) 2009-2011 David Robillard <d@drobilla.net>
- * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
- * Copyright (C) 2009-2016 Paul Davis <paul@linuxaudiosystems.com>
- * Copyright (C) 2012-2015 Tim Mayberry <mojofunk@gmail.com>
- * Copyright (C) 2012-2019 Robin Gareus <robin@gareus.org>
- * Copyright (C) 2013 Colin Fletcher <colin.m.fletcher@googlemail.com>
- * Copyright (C) 2013 Michael R. Fisher <mfisher@bketech.com>
- * Copyright (C) 2015 John Emmas <john@creativepost.co.uk>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifdef WAF_BUILD
-#include "gtk2ardour-config.h"
-#include "gtk2ardour-version.h"
-#endif
-
-#include <algorithm>
-#include <fcntl.h>
-
-#include "pbd/gstdio_compat.h"
-
-#include <gtkmm.h>
-
-#include "pbd/failed_constructor.h"
-#include "pbd/scoped_file_descriptor.h"
-#include "pbd/file_utils.h"
-#include "pbd/replace_all.h"
-#include "pbd/whitespace.h"
-#include "pbd/stacktrace.h"
-#include "pbd/openuri.h"
-
-#include "ardour/audioengine.h"
-#include "ardour/filesystem_paths.h"
-#include "ardour/filename_extensions.h"
-#include "ardour/plugin_manager.h"
-#include "ardour/recent_sessions.h"
-#include "ardour/session.h"
-#include "ardour/session_state_utils.h"
-#include "ardour/template_utils.h"
-#include "ardour/profile.h"
-
-#include "gtkmm2ext/utils.h"
-
-#include "startup.h"
-#include "opts.h"
-#include "ui_config.h"
-#include "pbd/i18n.h"
-#include "utils.h"
-
-using namespace std;
-using namespace Gtk;
-using namespace Gdk;
-using namespace Glib;
-using namespace PBD;
-using namespace ARDOUR;
-using namespace ARDOUR_UI_UTILS;
-
-ArdourStartup::ArdourStartup ()
-       : config_modified (false)
-       , default_dir_chooser (0)
-       , monitor_via_hardware_button (string_compose (_("Use an external mixer or the hardware mixer of your audio interface.\n"
-                                                        "%1 will play NO role in monitoring"), PROGRAM_NAME))
-       , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME))
-       , audio_page_index (-1)
-       , new_user_page_index (-1)
-       , default_folder_page_index (-1)
-       , monitoring_page_index (-1)
-       , final_page_index (-1)
-{
-       set_position (WIN_POS_CENTER);
-       set_border_width (12);
-
-       if (! (icon_pixbuf = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
-               throw failed_constructor();
-       }
-
-       list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
-       Glib::RefPtr<Gdk::Pixbuf> icon;
-
-       if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
-               window_icons.push_back (icon);
-       }
-       if (!window_icons.empty ()) {
-               set_default_icon_list (window_icons);
-       }
-
-       setup_new_user_page ();
-       setup_first_time_config_page ();
-       setup_monitoring_choice_page ();
-       setup_monitor_section_choice_page ();
-       setup_final_page ();
-}
-
-ArdourStartup::~ArdourStartup ()
-{
-}
-
-bool
-ArdourStartup::required ()
-{
-       if (Glib::file_test (ARDOUR::been_here_before_path (), Glib::FILE_TEST_EXISTS)) {
-               return false;
-       }
-
-       return true;
-}
-
-void
-ArdourStartup::setup_new_user_page ()
-{
-       Label* foomatic = manage (new Label);
-
-       foomatic->set_markup (string_compose (_("\
-<span size=\"larger\">%1 is a digital audio workstation. You can use it to \
-record, edit and mix multi-track audio. You can produce your \
-own CDs, mix video soundtracks, or experiment with new \
-ideas about music and sound. \
-\n\n\
-There are a few things that need to be configured before you start \
-using the program.</span> \
-"), PROGRAM_NAME));
-       foomatic->set_justify (JUSTIFY_FILL);
-       foomatic->set_line_wrap ();
-
-       VBox* vbox = manage (new VBox);
-       vbox->set_border_width (24);
-       vbox->pack_start (*foomatic, true, true, 12);
-
-#ifndef __APPLE__
-       Label* barmatic = manage (new Label);
-       barmatic->set_text (_("GUI and Font scaling:"));
-
-       Label* bazmatic = manage (new Label);
-       bazmatic->set_markup (_("<small><i>This can later be changed in Preferences &gt; Appearance.</i></small>"));
-
-       ui_font_scale.append_text (_("100%"));
-       ui_font_scale.append_text (_("150%"));
-       ui_font_scale.append_text (_("200%"));
-       ui_font_scale.append_text (_("250%"));
-       ui_font_scale.set_active_text (_("100%"));
-
-       HBox* hbox = manage (new HBox);
-       HBox* cbox = manage (new HBox);
-
-       hbox->pack_start (*barmatic, false, false);
-       hbox->pack_start (ui_font_scale, false, false);
-       cbox->pack_start (*hbox, true, false);
-
-       vbox->pack_start (*cbox, false, false, 2);
-       vbox->pack_start (*bazmatic, false, false);
-
-       ui_font_scale.show ();
-       barmatic->show ();
-       bazmatic->show ();
-       hbox->show ();
-       cbox->show ();
-
-       guess_default_ui_scale ();
-       ui_font_scale.signal_changed ().connect (sigc::mem_fun (*this, &ArdourStartup::rescale_ui));
-#endif
-
-       foomatic->show ();
-       vbox->show ();
-
-       new_user_page_index = append_page (*vbox);
-       set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
-       set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
-       set_page_header_image (*vbox, icon_pixbuf);
-       set_page_complete (*vbox, true);
-}
-
-void
-ArdourStartup::rescale_ui ()
-{
-       int rn = ui_font_scale.get_active_row_number ();
-       if (rn < 0 ) {
-               return;
-       }
-       float ui_scale = 100 + rn * 50;
-       UIConfiguration::instance ().set_font_scale (1024 * ui_scale);
-       UIConfiguration::instance ().reset_dpi ();
-}
-
-void
-ArdourStartup::guess_default_ui_scale ()
-{
-       gint width = 0;
-       gint height = 0;
-       GdkScreen* screen = gdk_display_get_screen (gdk_display_get_default (), 0);
-       gint n_monitors = gdk_screen_get_n_monitors (screen);
-
-       if (!screen) {
-               return;
-       }
-
-       for (gint i = 0; i < n_monitors; ++i) {
-               GdkRectangle rect;
-               gdk_screen_get_monitor_geometry (screen, i, &rect);
-               width = std::max (width, rect.width);
-               height = std::max (height, rect.height);
-       }
-
-       float wx = width  / 1920.f;
-       float hx = height / 1080.f;
-       float sx = std::min (wx, hx);
-
-       if (sx < 1.25) {
-               ui_font_scale.set_active (0); // 100%
-       } else if (sx < 1.6) {
-               ui_font_scale.set_active (1); // 150%
-       } else if (sx < 2.1) {
-               ui_font_scale.set_active (2); // 200%
-       } else {
-               ui_font_scale.set_active (3); // 250%
-       }
-       rescale_ui ();
-}
-
-void
-ArdourStartup::default_dir_changed ()
-{
-       Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
-       // make new session folder chooser point to the new default
-       new_folder_chooser.set_current_folder (Config->get_default_session_parent_dir());
-       config_changed ();
-}
-
-void
-ArdourStartup::config_changed ()
-{
-       config_modified = true;
-}
-
-void
-ArdourStartup::setup_first_time_config_page ()
-{
-       default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
-                                                            FILE_CHOOSER_ACTION_SELECT_FOLDER));
-       Gtk::Label* txt = manage (new Label);
-       HBox* hbox = manage (new HBox);
-       VBox* vbox = manage (new VBox);
-
-       txt->set_markup (string_compose (_("\
-Each project that you work on with %1 has its own folder.\n\
-These can require a lot of disk space if you are recording audio.\n\
-\n\
-Where would you like new %1 sessions to be stored by default?\n\n\
-<i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
-       txt->set_alignment (0.0, 0.0);
-
-       vbox->set_spacing (18);
-       vbox->set_border_width (24);
-
-       hbox->pack_start (*default_dir_chooser, false, true, 8);
-       vbox->pack_start (*txt, false, false);
-       vbox->pack_start (*hbox, false, true);
-
-       cerr << "set default folder to " << poor_mans_glob (Config->get_default_session_parent_dir()) << endl;
-       Gtkmm2ext::add_volume_shortcuts (*default_dir_chooser);
-       default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
-       default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed));
-       default_dir_chooser->show ();
-
-       vbox->show_all ();
-
-       default_folder_page_index = append_page (*vbox);
-       set_page_title (*vbox, _("Default folder for new sessions"));
-       set_page_header_image (*vbox, icon_pixbuf);
-       set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
-
-       /* user can just skip all these settings if they want to */
-
-       set_page_complete (*vbox, true);
-}
-
-void
-ArdourStartup::setup_monitoring_choice_page ()
-{
-       mon_vbox.set_spacing (18);
-       mon_vbox.set_border_width (24);
-
-       HBox* hbox = manage (new HBox);
-       VBox* vbox = manage (new VBox);
-       /* first button will be on by default */
-       RadioButton::Group g (monitor_via_ardour_button.get_group());
-       monitor_via_hardware_button.set_group (g);
-
-       monitor_label.set_markup(_("\
-While recording instruments or vocals, you probably want to listen to the\n\
-signal as well as record it. This is called \"monitoring\". There are\n\
-different ways to do this depending on the equipment you have and the\n\
-configuration of that equipment. The two most common are presented here.\n\
-Please choose whichever one is right for your setup.\n\n\
-<i>(You can change this preference at any time, via the Preferences dialog)</i>\n\n\
-<i>If you do not understand what this is about, just accept the default.</i>"));
-       monitor_label.set_alignment (0.0, 0.0);
-
-       vbox->set_spacing (6);
-
-       vbox->pack_start (monitor_via_hardware_button, false, true);
-       vbox->pack_start (monitor_via_ardour_button, false, true);
-       hbox->pack_start (*vbox, true, true, 8);
-       mon_vbox.pack_start (monitor_label, false, false);
-       mon_vbox.pack_start (*hbox, false, false);
-
-       mon_vbox.show_all ();
-
-       monitoring_page_index = append_page (mon_vbox);
-       set_page_title (mon_vbox, _("Monitoring Choices"));
-       set_page_header_image (mon_vbox, icon_pixbuf);
-
-       monitor_via_hardware_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
-       monitor_via_ardour_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
-
-       /* user could just click on "Forward" if default
-        * choice is correct.
-        */
-
-       set_page_complete (mon_vbox, true);
-}
-
-void
-ArdourStartup::setup_monitor_section_choice_page ()
-{
-       mon_sec_vbox.set_spacing (18);
-       mon_sec_vbox.set_border_width (24);
-
-       HBox* hbox = manage (new HBox);
-       VBox* main_vbox = manage (new VBox);
-       VBox* vbox;
-       Label* l = manage (new Label);
-
-       main_vbox->set_spacing (32);
-
-       no_monitor_section_button.set_label (_("Use a Master bus directly"));
-       l->set_alignment (0.0, 1.0);
-       l->set_markup(_("Connect the Master bus directly to your hardware outputs. This is preferable for simple usage."));
-
-       vbox = manage (new VBox);
-       vbox->set_spacing (6);
-       vbox->pack_start (no_monitor_section_button, false, true);
-       vbox->pack_start (*l, false, true);
-
-       main_vbox->pack_start (*vbox, false, false);
-
-       use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
-       l = manage (new Label);
-       l->set_alignment (0.0, 1.0);
-       l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
-greater control in monitoring without affecting the mix."));
-
-       vbox = manage (new VBox);
-       vbox->set_spacing (6);
-       vbox->pack_start (use_monitor_section_button, false, true);
-       vbox->pack_start (*l, false, true);
-
-       main_vbox->pack_start (*vbox, false, false);
-
-       RadioButton::Group g (use_monitor_section_button.get_group());
-       no_monitor_section_button.set_group (g);
-
-       if (Config->get_use_monitor_bus()) {
-               use_monitor_section_button.set_active (true);
-       } else {
-               no_monitor_section_button.set_active (true);
-       }
-
-       use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
-       no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
-
-       monitor_section_label.set_markup(_("<i>You can change this preference at any time via the Preferences dialog.\nYou can also add or remove the monitor section to/from any session.</i>\n\n\
-<i>If you do not understand what this is about, just accept the default.</i>"));
-       monitor_section_label.set_alignment (0.0, 0.0);
-
-       hbox->pack_start (*main_vbox, true, true, 8);
-       mon_sec_vbox.pack_start (*hbox, false, false);
-       mon_sec_vbox.pack_start (monitor_section_label, false, false);
-
-       mon_sec_vbox.show_all ();
-
-       monitor_section_page_index = append_page (mon_sec_vbox);
-       set_page_title (mon_sec_vbox, _("Monitor Section"));
-       set_page_header_image (mon_sec_vbox, icon_pixbuf);
-
-       /* user could just click on "Forward" if default
-        * choice is correct.
-        */
-
-       set_page_complete (mon_sec_vbox, true);
-}
-
-void
-ArdourStartup::setup_final_page ()
-{
-       string msg = string_compose (_("%1 is ready for use"), PROGRAM_NAME);
-
-       plugin_disco_button.signal_clicked().connect (sigc::mem_fun(*this, &ArdourStartup::discover_plugins));
-       plugin_disco_button.set_label (_("Scan for Plugins"));
-       plugin_disco_button.show ();
-
-       Gtk::Label* final_label = manage (new Label);
-       final_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", msg));
-       final_label->show ();
-
-       VBox* vbox = manage (new VBox);
-       vbox->pack_start (*final_label, true, true);
-       if (!Profile->get_mixbus()) {
-               vbox->pack_start (plugin_disco_button, true, false);
-       }
-       vbox->show ();
-
-       final_page_index = append_page (*vbox);
-       set_page_complete (*vbox, true);
-       set_page_header_image (*vbox, icon_pixbuf);
-       set_page_type (*vbox, ASSISTANT_PAGE_CONFIRM);
-}
-
-void
-ArdourStartup::discover_plugins () {
-       plugin_disco_button.set_sensitive (false);
-       PluginManager::instance().refresh();
-}
-
-void
-ArdourStartup::on_cancel ()
-{
-       _signal_response (int (RESPONSE_CANCEL));
-}
-
-bool
-ArdourStartup::on_delete_event (GdkEventAny*)
-{
-       _signal_response (int (RESPONSE_CLOSE));
-       return true;
-}
-
-void
-ArdourStartup::on_apply ()
-{
-       /* file-chooser button does not emit 'current_folder_changed' signal
-        * when a folder from the dropdown or the sidebar is chosen.
-        * -> explicitly poll for the dir as suggested by the gtk documentation.
-        */
-       if (default_dir_chooser && default_dir_chooser->get_filename() != Config->get_default_session_parent_dir ()) {
-               config_modified = true;
-       }
-
-       if (config_modified) {
-
-               if (default_dir_chooser) {
-                       Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
-               }
-
-               if (monitor_via_hardware_button.get_active()) {
-                       Config->set_monitoring_model (ExternalMonitoring);
-               } else if (monitor_via_ardour_button.get_active()) {
-                       Config->set_monitoring_model (SoftwareMonitoring);
-               }
-
-               Config->set_use_monitor_bus (use_monitor_section_button.get_active());
-
-               Config->save_state ();
-
-       }
-
-       {
-               /* "touch" the been-here-before path now we've successfully
-                  made it through the first time setup (at least)
-               */
-               PBD::ScopedFileDescriptor fout (g_open (been_here_before_path ().c_str(), O_CREAT|O_TRUNC|O_RDWR, 0666));
-
-       }
-
-       _signal_response (int (RESPONSE_OK));
-}
-
-
-void
-ArdourStartup::move_along_now ()
-{
-       on_apply ();
-}
diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h
deleted file mode 100644 (file)
index 1e70e28..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2009-2011 Carl Hetherington <carl@carlh.net>
- * Copyright (C) 2009-2011 David Robillard <d@drobilla.net>
- * Copyright (C) 2009-2016 Paul Davis <paul@linuxaudiosystems.com>
- * Copyright (C) 2015-2017 Robin Gareus <robin@gareus.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __gtk2_ardour_startup_h__
-#define __gtk2_ardour_startup_h__
-
-#include <string>
-
-#include <gtkmm/assistant.h>
-#include <gtkmm/label.h>
-#include <gtkmm/expander.h>
-#include <gtkmm/box.h>
-#include <gtkmm/radiobutton.h>
-#include <gtkmm/filechooserbutton.h>
-#include <gtkmm/comboboxtext.h>
-
-#include "ardour/utils.h"
-
-class EngineControl;
-
-class ArdourStartup : public Gtk::Assistant
-{
-public:
-       ArdourStartup ();
-       ~ArdourStartup ();
-
-       static bool required ();
-
-       /* It's not a dialog so we have to fake this to make it behave like a
-        * dialog. This allows the StartupFSM to treat everything similarly.
-        */
-
-       sigc::signal1<void,int>& signal_response() { return _signal_response; }
-
-private:
-       bool config_modified;
-       bool new_user;
-
-       void on_apply ();
-       void on_cancel ();
-       bool on_delete_event (GdkEventAny*);
-       void discover_plugins ();
-
-       Glib::RefPtr<Gdk::Pixbuf> icon_pixbuf;
-
-       void setup_prerelease_page ();
-       void setup_new_user_page ();
-       Glib::RefPtr<Gdk::Pixbuf> splash_pixbuf;
-
-       void setup_first_time_config_page ();
-       void config_changed ();
-
-       /* Welcome */
-       Gtk::ComboBoxText ui_font_scale;
-       void rescale_ui ();
-       void guess_default_ui_scale ();
-
-       /* first page */
-       Gtk::FileChooserButton* default_dir_chooser;
-       void default_dir_changed();
-       void setup_first_page ();
-       Gtk::FileChooserButton new_folder_chooser;
-
-       /* monitoring choices */
-
-       Gtk::VBox mon_vbox;
-       Gtk::Label monitor_label;
-       Gtk::RadioButton monitor_via_hardware_button;
-       Gtk::RadioButton monitor_via_ardour_button;
-       void setup_monitoring_choice_page ();
-
-       /* monitor section choices */
-
-       Gtk::VBox mon_sec_vbox;
-       Gtk::Label monitor_section_label;
-       Gtk::RadioButton use_monitor_section_button;
-       Gtk::RadioButton no_monitor_section_button;
-       void setup_monitor_section_choice_page ();
-
-       /* final page */
-
-       void setup_final_page ();
-       Gtk::Button plugin_disco_button;
-
-       /* always there */
-
-       Glib::RefPtr<Pango::Layout> layout;
-
-       /* page indices */
-
-       gint audio_page_index;
-       gint new_user_page_index;
-       gint default_folder_page_index;
-       gint monitoring_page_index;
-       gint monitor_section_page_index;
-       gint final_page_index;
-
-       void move_along_now ();
-
-       sigc::signal1<void,int> _signal_response;
-};
-
-#endif /* __gtk2_ardour_startup_h__ */