Add a missing #define to our MSVC project (portaudio_backend)
[ardour.git] / gtk2_ardour / insert_remove_time_dialog.cc
index 888a0bdf20c4a38097c09022598df88f1010dd8d..f58bfdbaea0f87de78c7455f62d70f57a6bf8190 100644 (file)
 #include <gtkmm/alignment.h>
 #include "insert_remove_time_dialog.h"
 #include "audio_clock.h"
-#include "i18n.h"
+#include "ardour_ui.h"
+#include "main_clock.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Editing;
+using namespace ARDOUR;
 
 InsertRemoveTimeDialog::InsertRemoveTimeDialog (PublicEditor& e, bool remove)
        : ArdourDialog (remove ? _("Remove Time") : _("Insert Time"))
        , _editor (e)
-       , _clock ("insertTimeClock", true, "",
+       , duration_clock ("insertTimeClock", true, "",
                        true,   // editable
                        false,  // follows_playhead
                        true,   // duration
                        false,  // with_info
                        true    // accept_on_focus_out
                )
+       , position_clock ("insertPosTimeClock", true, "",
+                       true,   // editable
+                       false,  // follows_playhead
+                       false,   // duration
+                       false,  // with_info
+                       true    // accept_on_focus_out
+               )
 {
        set_session (_editor.session ());
 
-       framepos_t const pos = _editor.get_preferred_edit_position (EDIT_IGNORE_MOUSE);
-
        get_vbox()->set_border_width (12);
        get_vbox()->set_spacing (4);
 
-       Table* table = manage (new Table (2, 2));
+       Table* table = manage (new Table (2, 3));
        table->set_spacings (4);
 
-       Label* time_label = manage (new Label (remove ? _("Time to remove") : _("Time to insert:")));
+       Label* time_label = manage (new Label (remove ? _("Remove Time starting at:") : _("Insert Time starting at:")));
        time_label->set_alignment (1, 0.5);
        table->attach (*time_label, 0, 1, 0, 1, FILL | EXPAND);
-       _clock.set (0);
-       _clock.set_session (_session);
-       _clock.set_bbt_reference (pos);
-       table->attach (_clock, 1, 2, 0, 1);
+       position_clock.set_session (_session);
+       position_clock.set_mode (ARDOUR_UI::instance()->secondary_clock->mode());
+       table->attach (position_clock, 1, 2, 0, 1);
 
+       time_label = manage (new Label (remove ? _("Time to remove:") : _("Time to insert:")));
+       time_label->set_alignment (1, 0.5);
+       table->attach (*time_label, 0, 1, 1, 2, FILL | EXPAND);
+       duration_clock.set_session (_session);
+       duration_clock.set_mode (ARDOUR_UI::instance()->secondary_clock->mode());
+       table->attach (duration_clock, 1, 2, 1, 2);
+
+       //if a Range is selected, assume the user wants to insert/remove the length of the range
+       if ( _editor.get_selection().time.length() != 0 ) {
+               position_clock.set ( _editor.get_selection().time.start(), true );
+               duration_clock.set ( _editor.get_selection().time.end_frame(), true,  _editor.get_selection().time.start() );
+               duration_clock.set_bbt_reference (_editor.get_selection().time.start());
+       } else {
+               framepos_t const pos = _editor.get_preferred_edit_position (EDIT_IGNORE_MOUSE);
+               position_clock.set ( pos, true );
+               duration_clock.set_bbt_reference (pos);
+               duration_clock.set (0);
+       }
+       
        if (!remove) {
                Label* intersected_label = manage (new Label (_("Intersected regions should:")));
                intersected_label->set_alignment (1, 0.5);
-               table->attach (*intersected_label, 0, 1, 1, 2, FILL | EXPAND);
+               table->attach (*intersected_label, 0, 1, 2, 3, FILL | EXPAND);
                _intersected_combo.append_text (_("stay in position"));
                _intersected_combo.append_text (_("move"));
                _intersected_combo.append_text (_("be split"));
                _intersected_combo.set_active (0);
-               table->attach (_intersected_combo, 1, 2, 1, 2);
+               table->attach (_intersected_combo, 1, 2, 2, 3);
        }
 
        get_vbox()->pack_start (*table);
@@ -73,12 +99,14 @@ InsertRemoveTimeDialog::InsertRemoveTimeDialog (PublicEditor& e, bool remove)
        _all_playlists.set_label (_("Apply to all the track's playlists"));
        get_vbox()->pack_start (_all_playlists);
 
-       _move_glued.set_label (_("Move glued regions"));
+       _move_glued.set_label (_("Move glued-to-musical-time regions (MIDI regions)"));
+       _move_glued.set_active();
        get_vbox()->pack_start (_move_glued);
        _move_markers.set_label (_("Move markers"));
        get_vbox()->pack_start (_move_markers);
        _move_markers.signal_toggled().connect (sigc::mem_fun (*this, &InsertRemoveTimeDialog::move_markers_toggled));
-       _move_glued_markers.set_label (_("Move glued markers"));
+       _move_glued_markers.set_label (_("Move glued-to-musical-time markers"));
+       _move_glued_markers.set_active();
        Alignment* indent = manage (new Alignment);
        indent->set_padding (0, 0, 12, 0);
        indent->add (_move_glued_markers);
@@ -96,7 +124,9 @@ InsertRemoveTimeDialog::InsertRemoveTimeDialog (PublicEditor& e, bool remove)
        get_vbox()->pack_start (*tempo_box);
 
        add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
-       add_button (remove ? _("Cut time") : _("Insert time"), Gtk::RESPONSE_OK);
+       Gtk::Button *btn = manage (new Gtk::Button (remove ? _("Remove time") : _("Insert time")));
+       btn->signal_clicked().connect (sigc::mem_fun(*this, &InsertRemoveTimeDialog::doit));
+       get_action_area()->pack_start (*btn);
        show_all ();
 
        move_markers_toggled ();
@@ -159,10 +189,27 @@ InsertRemoveTimeDialog::move_locked_markers () const
        return _move_locked_markers.get_active ();
 }
 
+framepos_t
+InsertRemoveTimeDialog::position () const
+{
+       return position_clock.current_time();
+}
+
 framepos_t
 InsertRemoveTimeDialog::distance () const
 {
-       return _clock.current_duration (_editor.get_preferred_edit_position ());
+       return duration_clock.current_duration ( position_clock.current_time() );
+}
+
+void
+InsertRemoveTimeDialog::doit ()
+{
+       if (distance () == 0) {
+               Gtk::MessageDialog msg (*this, _("Invalid or zero duration entered. Please enter a valid duration"));
+               msg.run ();
+               return;
+       }
+       response (RESPONSE_OK);
 }
 
 void