latched rec-enable
[ardour.git] / gtk2_ardour / region_editor.cc
index d3fb96ee63cade83b84d1e0d9781a15cf7b39ea3..73aa3465d974a260c716de3c3c81560acef2094d 100644 (file)
@@ -28,6 +28,7 @@
 #include "regionview.h"
 #include "ardour_ui.h"
 #include "utils.h"
+#include "gui_thread.h"
 
 #include "i18n.h"
 
@@ -44,10 +45,12 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
          lock_button (_("lock")),
          mute_button (_("mute")),
          opaque_button (_("opaque")),
-         raise_arrow (GTK_ARROW_UP, Gtk::SHADOW_OUT),
-         lower_arrow (GTK_ARROW_DOWN, Gtk::SHADOW_OUT),
+         envelope_active_button(_("active")),
+         envelope_view_button(_("visible")),
+         raise_arrow (Gtk::ARROW_UP, Gtk::SHADOW_OUT),
+         lower_arrow (Gtk::ARROW_DOWN, Gtk::SHADOW_OUT),
          layer_label (_("Layer")),
-         audition_label (_("play")),
+         audition_button (_("play")),
          time_table (3, 2),
          start_clock ("AudioRegionEditorClock", true),
          end_clock ("AudioRegionEditorClock", true),
@@ -70,9 +73,6 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        name_entry.set_name ("AudioRegionEditorEntry");
        name_label.set_name ("AudioRegionEditorLabel");
 
-       name_entry.signal_focus_in_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       name_entry.signal_focus_out_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       
        name_hbox.set_spacing (5);
        name_hbox.pack_start (name_label, false, false);
        name_hbox.pack_start (name_entry, false, false);
@@ -94,8 +94,6 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        layer_hbox.pack_start (lower_button, false, false);
 #endif
 
-       audition_button.add (audition_label);
-
        mute_button.set_name ("AudioRegionEditorToggleButton");
        opaque_button.set_name ("AudioRegionEditorToggleButton");
        lock_button.set_name ("AudioRegionEditorToggleButton");
@@ -123,14 +121,14 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        fade_out_active_button.unset_flags (Gtk::CAN_FOCUS);
        audition_button.unset_flags (Gtk::CAN_FOCUS);
        
-       mute_button.set_events (mute_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       opaque_button.set_events (opaque_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       lock_button.set_events (lock_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       envelope_active_button.set_events (envelope_active_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       envelope_view_button.set_events (envelope_view_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       fade_in_active_button.set_events (fade_in_active_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       fade_out_active_button.set_events (fade_out_active_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
-       audition_button.set_events (audition_button.get_events() & ~(GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK));
+       mute_button.set_events (mute_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       opaque_button.set_events (opaque_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       lock_button.set_events (lock_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       envelope_active_button.set_events (envelope_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       envelope_view_button.set_events (envelope_view_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       fade_in_active_button.set_events (fade_in_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       fade_out_active_button.set_events (fade_out_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+       audition_button.set_events (audition_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
 
        top_row_button_hbox.set_border_width (5);
        top_row_button_hbox.set_spacing (5);
@@ -163,27 +161,22 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        end_alignment.add (end_label);
        length_alignment.add (length_label);
 
-       time_table.attach (start_alignment, 0, 1, 0, 1);
-       time_table.attach (start_clock, 1, 2, 0, 1, 0, 0);
+       time_table.attach (start_alignment, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
+       time_table.attach (start_clock, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL);
 
-       time_table.attach (end_alignment, 0, 1, 1, 2);
-       time_table.attach (end_clock, 1, 2, 1, 2, 0, 0);
+       time_table.attach (end_alignment, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
+       time_table.attach (end_clock, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL);
 
-       time_table.attach (length_alignment, 0, 1, 2, 3);
-       time_table.attach (length_clock, 1, 2, 2, 3, 0, 0);
+       time_table.attach (length_alignment, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
+       time_table.attach (length_clock, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);
 
        envelope_label.set_name ("AudioRegionEditorLabel");
 
-       envelope_active_button_label.set_text (_("active"));
-       envelope_active_button.add (envelope_active_button_label);
-       envelope_view_button_label.set_text (_("visible"));
-       envelope_view_button.add (envelope_view_button_label);
-
        envelope_loop_table.set_border_width (5);
        envelope_loop_table.set_row_spacings (2);
-       envelope_loop_table.attach (envelope_label, 0, 1, 0, 1, 0, 0);
-       envelope_loop_table.attach (envelope_active_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, 0);
-       envelope_loop_table.attach (envelope_view_button, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, 0);
+       envelope_loop_table.attach (envelope_label, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
+       envelope_loop_table.attach (envelope_active_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
+       envelope_loop_table.attach (envelope_view_button, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
        /* fade in */
 
@@ -204,9 +197,7 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
 
        fade_in_length_spinner.set_digits (3);
 
-       fade_in_length_spinner.signal_focus_in_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       fade_in_length_spinner.signal_focus_out_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       fade_in_length_spinner.activate.connect (mem_fun(*this, &AudioRegionEditor::activation));
+       // fade_in_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation));
 
        Gtkmm2ext::set_size_request_to_display_given_text (fade_in_length_spinner, "500g", 20, -1);
 
@@ -214,12 +205,12 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        fade_in_label_align.set (0.5);
 
 
-       fade_in_table.attach (fade_in_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, 0, 0, 0);
+       fade_in_table.attach (fade_in_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
-       fade_in_table.attach (fade_in_length_label,   0, 1, 1, 2, Gtk::EXPAND, 0, 0, 0);
-       fade_in_table.attach (fade_in_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, 0, 0, 0);
+       fade_in_table.attach (fade_in_length_label,   0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL);
+       fade_in_table.attach (fade_in_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
-       fade_in_table.attach (fade_in_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, 0);
+       fade_in_table.attach (fade_in_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
        /* fade out */
 
@@ -240,21 +231,19 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        
        fade_out_length_spinner.set_digits (3);
 
-       fade_out_length_spinner.signal_focus_in_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       fade_out_length_spinner.signal_focus_out_event().connect (mem_fun(*this, &AudioRegionEditor::focus_change));
-       fade_out_length_spinner.activate.connect (mem_fun(*this, &AudioRegionEditor::activation));
+       fade_out_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation));
 
        Gtkmm2ext::set_size_request_to_display_given_text (fade_out_length_spinner, "500g", 20, -1);
 
        fade_out_label_align.add (fade_out_label);
        fade_out_label_align.set (0.5);
 
-       fade_out_table.attach (fade_out_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, 0, 0, 0);
+       fade_out_table.attach (fade_out_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
-       fade_out_table.attach (fade_out_length_label,   0, 1, 1, 2, Gtk::EXPAND, 0, 0, 0);
-       fade_out_table.attach (fade_out_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, 0, 0, 0);
+       fade_out_table.attach (fade_out_length_label,   0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL);
+       fade_out_table.attach (fade_out_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
-       fade_out_table.attach (fade_out_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, 0);
+       fade_out_table.attach (fade_out_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
 
        lower_hbox.pack_start (time_table, true, true);
        lower_hbox.pack_start (sep1, false, false);
@@ -263,20 +252,21 @@ AudioRegionEditor::AudioRegionEditor (Session&s, AudioRegion& r, AudioRegionView
        lower_hbox.pack_start (fade_in_table, true, true);
        lower_hbox.pack_start (fade_out_table, true, true);
 
-       upper_vbox.pack_start (top_row_hbox, true, true);
-       upper_vbox.pack_start (sep3, false, false);
-       upper_vbox.pack_start (lower_hbox, true, true);
+       get_vbox()->pack_start (top_row_hbox, true, true);
+       get_vbox()->pack_start (sep3, false, false);
+       get_vbox()->pack_start (lower_hbox, true, true);
 
-       add (upper_vbox);
        set_name ("AudioRegionEditorWindow");
        add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
 
-       delete_event.connect (bind (ptr_fun (just_hide_it), static_cast<Window *> (this)));
+       signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (this)));
 
        string title = _("ardour: region ");
        title += _region.name();
        set_title (title);
 
+       show_all();
+
        name_changed ();
        bounds_changed (Change (StartChanged|LengthChanged|PositionChanged));
        envelope_active_changed ();
@@ -375,10 +365,11 @@ AudioRegionEditor::bpressed (GdkEventButton* ev, Gtk::SpinButton* but, void (Aud
        case 3:
                if (ev->type == GDK_BUTTON_PRESS) { /* no double clicks here */
                        if (!spin_arrow_grab) {
-                               if ((ev->window == but->gobj()->panel)) {
-                                       spin_arrow_grab = true;
-                                       (this->*pmf)();
-                               } 
+                               // GTK2FIX probably nuke the region editor
+                               // if ((ev->window == but->gobj()->panel)) {
+                               // spin_arrow_grab = true;
+                               // (this->*pmf)();
+                               // } 
                        } 
                } 
                break;
@@ -425,37 +416,38 @@ AudioRegionEditor::stop_editing_fade_out ()
 void
 AudioRegionEditor::connect_editor_events ()
 {
-       name_entry.changed.connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed));
+  name_entry.signal_changed().connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed));
 
        start_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::start_clock_changed));
        end_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::end_clock_changed));
        length_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::length_clock_changed));
 
-       fade_in_length_spinner.button_press_event.connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_in_length_spinner, 
+       fade_in_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_in_length_spinner, 
                                                                 &AudioRegionEditor::start_editing_fade_in));
-       fade_in_length_spinner.button_release_event.connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_in_length_spinner, 
+       fade_in_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_in_length_spinner, 
                                                                   &AudioRegionEditor::stop_editing_fade_in));
 
-       fade_out_length_spinner.button_press_event.connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_out_length_spinner, 
+       fade_out_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_out_length_spinner, 
                                                                 &AudioRegionEditor::start_editing_fade_out));
-       fade_out_length_spinner.button_release_event.connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_out_length_spinner, 
+       fade_out_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_out_length_spinner, 
                                                                   &AudioRegionEditor::stop_editing_fade_out));
 
-       fade_in_length_adjustment.value_changed.connect (mem_fun(*this, &AudioRegionEditor::fade_in_length_adjustment_changed));
-       fade_out_length_adjustment.value_changed.connect (mem_fun(*this, &AudioRegionEditor::fade_out_length_adjustment_changed));
+       fade_in_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_in_length_adjustment_changed));
+       fade_out_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_out_length_adjustment_changed));
 
-       fade_in_active_button.toggled.connect (mem_fun(*this, &AudioRegionEditor::fade_in_active_toggled));
-       fade_out_active_button.toggled.connect (mem_fun(*this, &AudioRegionEditor::fade_out_active_toggled));
+       fade_in_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_in_active_toggled));
+       fade_out_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_out_active_toggled));
 
-       envelope_active_button.button_press_event.connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_press));
-       envelope_active_button.button_release_event.connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_release));
-       audition_button.toggled.connect (mem_fun(*this, &AudioRegionEditor::audition_button_toggled));
-       envelope_view_button.toggled.connect (mem_fun(*this, &AudioRegionEditor::envelope_view_button_toggled));
+       envelope_active_button.signal_button_press_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_press));
+       envelope_active_button.signal_button_release_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_release));
+       audition_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::audition_button_toggled));
+       envelope_view_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::envelope_view_button_toggled));
        lock_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lock_button_clicked));
        mute_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::mute_button_clicked));
        opaque_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::opaque_button_clicked));
        raise_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::raise_button_clicked));
        lower_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lower_button_clicked));
+       _session.AuditionActive.connect (mem_fun(*this, &AudioRegionEditor::audition_state_changed));
 }
 
 void
@@ -622,21 +614,10 @@ AudioRegionEditor::bounds_changed (Change what_changed)
        }
 }
 
-gint
-AudioRegionEditor::focus_change (GdkEventFocus *ev)
-{
-       if (ev->in) {
-               ARDOUR_UI::instance()->allow_focus (true);
-       } else {
-               ARDOUR_UI::instance()->allow_focus (false);
-       }
-       return TRUE;
-}
-
 void
 AudioRegionEditor::activation ()
 {
-       ARDOUR_UI::instance()->allow_focus (false);
+       
 }      
 
 void
@@ -737,3 +718,14 @@ AudioRegionEditor::fade_in_active_changed ()
                fade_in_active_button.set_active (x);
        }
 }
+
+void
+AudioRegionEditor::audition_state_changed (bool yn)
+{
+       ENSURE_GUI_THREAD (bind (mem_fun(*this, &AudioRegionEditor::audition_state_changed), yn));
+
+       if (!yn) {
+               audition_button.set_active (false);
+       }
+}
+