Center port matrix if IO selector window is too large.
[ardour.git] / gtk2_ardour / ardour_ui_ed.cc
index c0e9fa1fa5c9ac976605836e87f3079531ae69c9..d9a6958e70dabcc671e37d008e3770e1015f4187 100644 (file)
@@ -60,7 +60,6 @@ using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace Glib;
-using namespace sigc;
 
 int
 ARDOUR_UI::create_editor ()
@@ -259,7 +258,7 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
+       act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
@@ -366,77 +365,19 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync startup to video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
+       act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
        ActionManager::session_sensitive_actions.push_back (act);
        act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master));
        ActionManager::session_sensitive_actions.push_back (act);
        act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), _(""), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  0U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  1U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  2U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  3U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  4U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  5U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  6U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  7U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  8U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U));
-       ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U));
-       ActionManager::session_sensitive_actions.push_back (act);
+       for (int i = 1; i <= 32; ++i) {
+               string const a = string_compose (X_("ToggleRecordEnableTrack%1"), i);
+               string const n = string_compose (_("Toggle Record Enable Track %1"), i);
+               act = ActionManager::register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1));
+               ActionManager::session_sensitive_actions.push_back (act);
+       }
 
        Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
 
@@ -595,13 +536,22 @@ ARDOUR_UI::setup_clock ()
 
        big_clock_window->set_title (_("Big Clock"));
        big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
-       big_clock_window->signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), big_clock_window,  (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
+       big_clock_window->signal_realize().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_realized));
        big_clock_window->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBigClock")));
        big_clock_window->signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), big_clock_window), false);
+       big_clock_window->signal_size_allocate().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_size_allocate));
 
        manage_window (*big_clock_window);
 }
 
+void
+ARDOUR_UI::big_clock_realized ()
+{
+       set_decoration (big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH));
+       int x, y, w, d;
+       big_clock_window->get_window()->get_geometry (x, y, w, big_clock_height, d);
+}
+
 void
 ARDOUR_UI::float_big_clock (Gtk::Window* parent)
 {
@@ -614,3 +564,111 @@ ARDOUR_UI::float_big_clock (Gtk::Window* parent)
        }
 }
 
+void
+ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& allocation)
+{
+       if (!big_clock_resize_in_progress) {
+               Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::idle_big_clock_text_resizer), 0, 0));
+               big_clock_resize_in_progress = true;
+       }
+
+       big_clock_window->set_size_request (allocation.get_width() - 2, allocation.get_height() - 1);
+}
+
+bool
+ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h)
+{
+       extern void get_pixel_size (Glib::RefPtr<Pango::Layout> layout, int& width, int& height);
+       Glib::RefPtr<Gdk::Window> win = big_clock_window->get_window();
+       assert (win);
+
+       big_clock_resize_in_progress = false;
+
+       Pango::FontDescription fd (big_clock.get_style()->get_font());
+       string family = fd.get_family();
+       int size = fd.get_size ();
+       int original_size;
+       bool absolute = fd.get_size_is_absolute ();
+       int stepsize;
+
+       if (!absolute) {
+               size /= PANGO_SCALE;
+       }
+
+       original_size = size;
+
+       int x, y, winw, winh, d;
+       int w, h;
+       int slop;
+       int limit;
+
+       win->get_geometry (x, y, winw, winh, d);
+
+       Glib::RefPtr<Pango::Layout> layout = big_clock.create_pango_layout ("0");
+       get_pixel_size (layout, w, h);
+
+       /* we want about 10% of the font height as padding, and we'll allow 10% of slop
+          in the accuracy of the fit.
+       */
+
+       slop = 10;
+       limit = winh - (h/4);
+
+       if (h < limit && limit - h < slop) {
+               /* current font is smaller than the window height but not by too much */
+               return false;
+       }
+
+       stepsize = 16;
+       if (h > limit) {
+               /* font is too big, lets get smaller */
+               size -= stepsize;
+       } else {
+               /* font is too big, lets get bigger */
+               size += stepsize;
+       }
+
+       while (1) {
+               
+               char buf[family.length()+16];
+               snprintf (buf, family.length()+16, "%s %d", family.c_str(), size);
+               Pango::FontDescription fd (buf);
+               layout->set_font_description (fd);
+               get_pixel_size (layout, w, h);
+
+               if (abs (h - limit) < slop) {
+                       if (size != original_size) {
+                               
+                               /* use the size from the last loop */
+                               
+                               Glib::RefPtr<Gtk::RcStyle> rcstyle = big_clock.get_modifier_style ();
+                               rcstyle->set_font (fd);
+                               big_clock.modify_style (rcstyle);
+                       }
+                       break;
+               }
+               
+               if (h > limit) {
+                       
+                       /* too big, stepsize should be smaller */
+
+                       if (size < 2) {
+                               break;
+                       }
+                       size -= stepsize;
+
+               } else if (h < limit) {
+
+                       /* too small (but not small enough): step size should be bigger */
+                       
+                       if (size > 720) {
+                               break;
+                       }
+                       size += stepsize;
+               }
+
+               stepsize /= 2;
+       }
+
+       return false;
+}