a few tweaks for audio clocks (handle loss of focus, change editing colors at the...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 18 Nov 2011 01:22:40 +0000 (01:22 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 18 Nov 2011 01:22:40 +0000 (01:22 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@10669 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui_ed.cc
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_clock.h

index 328328040f5e842026ea2101d35a409554cfed43..41a113b430b4eec571099bced262e15105543afa 100644 (file)
@@ -637,7 +637,6 @@ ARDOUR_UI::setup_clock ()
 
        big_clock_window->set (new Window (WINDOW_TOPLEVEL), false);
 
 
        big_clock_window->set (new Window (WINDOW_TOPLEVEL), false);
 
-       big_clock_window->get()->set_resizable (true);
        big_clock_window->get()->set_keep_above (true);
        big_clock_window->get()->set_border_width (0);
        big_clock_window->get()->add (*big_clock);
        big_clock_window->get()->set_keep_above (true);
        big_clock_window->get()->set_border_width (0);
        big_clock_window->get()->add (*big_clock);
index f2347d749cbf23b182da75cbe17d6004affb0441..f3bde6187f755884743e46e11b67ca5bcc351341 100644 (file)
@@ -374,6 +374,7 @@ AudioClock::start_edit ()
        editing = true;
 
        show_edit_status (1);
        editing = true;
 
        show_edit_status (1);
+       queue_draw ();
 
        Keyboard::magic_widget_grab_focus ();
        grab_focus ();
 
        Keyboard::magic_widget_grab_focus ();
        grab_focus ();
@@ -414,6 +415,7 @@ AudioClock::end_edit (bool modify)
 
        } else {
                editing = false;
 
        } else {
                editing = false;
+               _layout->set_attributes (normal_attributes);
                _layout->set_text (pre_edit_string);
        }
 
                _layout->set_text (pre_edit_string);
        }
 
@@ -434,6 +436,89 @@ AudioClock::end_edit (bool modify)
        }
 }
 
        }
 }
 
+framecnt_t 
+AudioClock::parse_as_frames_distance (const std::string& str)
+{
+       framecnt_t f;
+
+       if (sscanf (str.c_str(), "%" PRId64, &f) == 1) {
+               return f;
+       }
+
+       return 0;
+}
+
+framecnt_t 
+AudioClock::parse_as_minsec_distance (const std::string& str)
+{
+       return 0;
+}
+
+framecnt_t 
+AudioClock::parse_as_timecode_distance (const std::string& str)
+{
+       return 0;
+}
+
+framecnt_t 
+AudioClock::parse_as_bbt_distance (const std::string& str)
+{
+       return 0;
+}
+
+framecnt_t 
+AudioClock::parse_as_distance (const std::string& str)
+{
+       switch (_mode) {
+       case Timecode:
+               return parse_as_timecode_distance (str);
+               break;
+       case Frames:
+               return parse_as_frames_distance (str);
+               break;
+       case BBT:
+               return parse_as_bbt_distance (str);
+               break;
+       case MinSec:
+               return parse_as_minsec_distance (str);
+               break;
+       }
+       return 0;
+}
+
+void
+AudioClock::end_edit_relative (bool add)
+{
+       framecnt_t frames = parse_as_distance (input_string);
+
+       editing = false;
+
+       if (frames != 0) {
+               if (add) {
+                       set (current_time() + frames, true);
+               } else {
+                       framepos_t c = current_time();
+
+                       if (c > frames) {
+                               set (c - frames, true);
+                       } else {
+                               set (0, true);
+                       }
+               }
+       }
+
+       /* move focus back to the default widget in the top level window */
+       
+       Keyboard::magic_widget_drop_focus ();
+       
+       Widget* top = get_toplevel();
+       
+       if (top->is_toplevel ()) {
+               Window* win = dynamic_cast<Window*> (top);
+               win->grab_focus ();
+       }
+}
+
 void
 AudioClock::session_configuration_changed (std::string p)
 {
 void
 AudioClock::session_configuration_changed (std::string p)
 {
@@ -824,6 +909,16 @@ AudioClock::on_key_release_event (GdkEventKey *ev)
                new_char = '9';
                break;
 
                new_char = '9';
                break;
 
+       case GDK_minus:
+       case GDK_KP_Subtract:
+               end_edit_relative (false);
+               break;
+
+       case GDK_plus:
+       case GDK_KP_Add:
+               end_edit_relative (true);
+               break;
+
        case GDK_Tab:
        case GDK_Return:
        case GDK_KP_Enter:
        case GDK_Tab:
        case GDK_Return:
        case GDK_KP_Enter:
@@ -1012,6 +1107,16 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
        return false;
 }
 
        return false;
 }
 
+bool
+AudioClock::on_focus_out_event (GdkEventFocus* ev)
+{
+       bool ret = CairoWidget::on_focus_out_event (ev);
+
+       end_edit (false);
+
+       return ret;
+}
+
 bool
 AudioClock::on_scroll_event (GdkEventScroll *ev)
 {
 bool
 AudioClock::on_scroll_event (GdkEventScroll *ev)
 {
@@ -1501,376 +1606,3 @@ AudioClock::set_draw_background (bool yn)
        _need_bg = yn;
 }
 
        _need_bg = yn;
 }
 
-void
-AudioClock::timecode_tester ()
-{
-#if 0
-#define Timecode_SAMPLE_TEST_1
-#define Timecode_SAMPLE_TEST_2
-#define Timecode_SAMPLE_TEST_3
-#define Timecode_SAMPLE_TEST_4
-#define Timecode_SAMPLE_TEST_5
-#define Timecode_SAMPLE_TEST_6
-#define Timecode_SAMPLE_TEST_7
-
-       // Testcode for timecode<->sample conversions (P.S.)
-       Timecode::Time timecode1;
-       framepos_t sample1;
-       framepos_t oldsample = 0;
-       Timecode::Time timecode2;
-       framecnt_t sample_increment;
-
-       sample_increment = (framecnt_t)rint(_session->frame_rate() / _session->timecode_frames_per_second);
-
-#ifdef Timecode_SAMPLE_TEST_1
-       // Test 1: use_offset = false, use_subframes = false
-       cout << "use_offset = false, use_subframes = false" << endl;
-       for (int i = 0; i < 108003; i++) {
-               _session->timecode_to_sample( timecode1, sample1, false /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, false /* use_offset */, false /* use_subframes */ );
-
-               if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-                       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-                       cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_increment( timecode1 );
-       }
-
-       cout << "sample_increment: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_2
-       // Test 2: use_offset = true, use_subframes = false
-       cout << "use_offset = true, use_subframes = false" << endl;
-
-       timecode1.hours = 0;
-       timecode1.minutes = 0;
-       timecode1.seconds = 0;
-       timecode1.frames = 0;
-       timecode1.subframes = 0;
-       sample1 = oldsample = 0;
-
-       _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-       cout << "Starting at sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-       for (int i = 0; i < 108003; i++) {
-               _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-               if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-                       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-                       cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_increment( timecode1 );
-       }
-
-       cout << "sample_increment: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_3
-       // Test 3: use_offset = true, use_subframes = false, decrement
-       cout << "use_offset = true, use_subframes = false, decrement" << endl;
-
-       _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-       cout << "Starting at sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-       for (int i = 0; i < 108003; i++) {
-               _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-               if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
-                       cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
-                       cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_decrement( timecode1 );
-       }
-
-       cout << "sample_decrement: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_4
-       // Test 4: use_offset = true, use_subframes = true
-       cout << "use_offset = true, use_subframes = true" << endl;
-
-       for (long sub = 5; sub < 80; sub += 5) {
-               timecode1.hours = 0;
-               timecode1.minutes = 0;
-               timecode1.seconds = 0;
-               timecode1.frames = 0;
-               timecode1.subframes = 0;
-               sample1 = oldsample = (sample_increment * sub) / 80;
-
-               _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, true /* use_subframes */ );
-
-               cout << "starting at sample: " << sample1 << " -> ";
-               cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-               for (int i = 0; i < 108003; i++) {
-                       _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
-                       _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
-                       if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-                               cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-                               cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                               cout << "sample: " << sample1 << endl;
-                               cout << "sample: " << sample1 << " -> ";
-                               cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                               //break;
-                       }
-
-                       if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
-                               cout << "ERROR: timecode2 not equal timecode1" << endl;
-                               cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                               cout << "sample: " << sample1 << endl;
-                               cout << "sample: " << sample1 << " -> ";
-                               cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                               break;
-                       }
-                       oldsample = sample1;
-                       _session->timecode_increment( timecode1 );
-               }
-
-               cout << "sample_increment: " << sample_increment << endl;
-               cout << "sample: " << sample1 << " -> ";
-               cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-               for (int i = 0; i < 108003; i++) {
-                       _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
-                       _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
-                       if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
-                               cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
-                               cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                               cout << "sample: " << sample1 << endl;
-                               cout << "sample: " << sample1 << " -> ";
-                               cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                               //break;
-                       }
-
-                       if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
-                               cout << "ERROR: timecode2 not equal timecode1" << endl;
-                               cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                               cout << "sample: " << sample1 << endl;
-                               cout << "sample: " << sample1 << " -> ";
-                               cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                               break;
-                       }
-                       oldsample = sample1;
-                       _session->timecode_decrement( timecode1 );
-               }
-
-               cout << "sample_decrement: " << sample_increment << endl;
-               cout << "sample: " << sample1 << " -> ";
-               cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-       }
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_5
-       // Test 5: use_offset = true, use_subframes = false, increment seconds
-       cout << "use_offset = true, use_subframes = false, increment seconds" << endl;
-
-       timecode1.hours = 0;
-       timecode1.minutes = 0;
-       timecode1.seconds = 0;
-       timecode1.frames = 0;
-       timecode1.subframes = 0;
-       sample1 = oldsample = 0;
-       sample_increment = _session->frame_rate();
-
-       _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-       cout << "Starting at sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-       for (int i = 0; i < 3600; i++) {
-               _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_increment_seconds( timecode1 );
-       }
-
-       cout << "sample_increment: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_6
-       // Test 6: use_offset = true, use_subframes = false, increment minutes
-       cout << "use_offset = true, use_subframes = false, increment minutes" << endl;
-
-       timecode1.hours = 0;
-       timecode1.minutes = 0;
-       timecode1.seconds = 0;
-       timecode1.frames = 0;
-       timecode1.subframes = 0;
-       sample1 = oldsample = 0;
-       sample_increment = _session->frame_rate() * 60;
-
-       _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-       cout << "Starting at sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-       for (int i = 0; i < 60; i++) {
-               _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_increment_minutes( timecode1 );
-       }
-
-       cout << "sample_increment: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_7
-       // Test 7: use_offset = true, use_subframes = false, increment hours
-       cout << "use_offset = true, use_subframes = false, increment hours" << endl;
-
-       timecode1.hours = 0;
-       timecode1.minutes = 0;
-       timecode1.seconds = 0;
-       timecode1.frames = 0;
-       timecode1.subframes = 0;
-       sample1 = oldsample = 0;
-       sample_increment = _session->frame_rate() * 60 * 60;
-
-       _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-       cout << "Starting at sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-       for (int i = 0; i < 10; i++) {
-               _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-               _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-               if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-                       cout << "ERROR: timecode2 not equal timecode1" << endl;
-                       cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-                       cout << "sample: " << sample1 << endl;
-                       cout << "sample: " << sample1 << " -> ";
-                       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-                       break;
-               }
-               oldsample = sample1;
-               _session->timecode_increment_hours( timecode1 );
-       }
-
-       cout << "sample_increment: " << sample_increment << endl;
-       cout << "sample: " << sample1 << " -> ";
-       cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#endif
-}
index 3771cb763d41e64ed8391e3e511c03859f719c89..061e790735272d9efaa797763d4edd2b0e60b8d2 100644 (file)
@@ -169,6 +169,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
        void on_size_request (Gtk::Requisition* req);
        bool on_motion_notify_event (GdkEventMotion *ev);
        void on_size_allocate (Gtk::Allocation&);
        void on_size_request (Gtk::Requisition* req);
        bool on_motion_notify_event (GdkEventMotion *ev);
        void on_size_allocate (Gtk::Allocation&);
+       bool on_focus_out_event (GdkEventFocus*);
 
        void set_timecode (framepos_t, bool);
        void set_bbt (framepos_t, bool);
 
        void set_timecode (framepos_t, bool);
        void set_bbt (framepos_t, bool);
@@ -194,8 +195,15 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 
        void start_edit ();
        void end_edit (bool);
 
        void start_edit ();
        void end_edit (bool);
+       void end_edit_relative (bool);
        void edit_next_field ();
        void edit_next_field ();
+       ARDOUR::framecnt_t parse_as_distance (const std::string&);
 
 
+       ARDOUR::framecnt_t parse_as_timecode_distance (const std::string&);
+       ARDOUR::framecnt_t parse_as_minsec_distance (const std::string&);
+       ARDOUR::framecnt_t parse_as_bbt_distance (const std::string&);
+       ARDOUR::framecnt_t parse_as_frames_distance (const std::string&);
+       
        void set_font ();
        void set_colors ();
        void show_edit_status (int length);
        void set_font ();
        void set_colors ();
        void show_edit_status (int length);