Tweak the text of 2 snap options.
[ardour.git] / gtk2_ardour / audio_clock.cc
index ea619793118a3501dd72b686089248e9e33a76f6..ae98f21de560d47b84adcf61441a468e7330aa68 100644 (file)
@@ -108,7 +108,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
 
        _mode = BBT; /* lie to force mode switch */
        set_mode (Timecode);
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 
        if (!is_transient) {
                clocks.push_back (this);
@@ -187,7 +187,7 @@ AudioClock::set_font (Pango::FontDescription font)
        tmp->get_pixel_size (em_width, ignore_height);
 
        /* force redraw of markup with new font-size */
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 }
 
 void
@@ -477,6 +477,10 @@ AudioClock::get_field (Field f)
        case Ticks:
                return edit_string.substr (8, 4);
                break;
+       case SS_Seconds:
+               return edit_string.substr (0, 8);
+       case SS_Deciseconds:
+               return edit_string.substr (9, 1);
        case S_Samples:
                return edit_string;
                break;
@@ -504,6 +508,8 @@ AudioClock::end_edit (bool modify)
                        ok = minsec_validate_edit (edit_string);
                        break;
 
+               case Seconds:
+                       // no break
                case Samples:
                        if (edit_string.length() < 1) {
                                edit_string = pre_edit_string;
@@ -539,12 +545,16 @@ AudioClock::end_edit (bool modify)
                                pos = samples_from_minsec_string (edit_string);
                                break;
 
+                       case Seconds:
+                               pos = samples_from_seconds_string (edit_string);
+                               break;
+
                        case Samples:
-                               pos = samples_from_audioframes_string (edit_string);
+                               pos = samples_from_audiosamples_string (edit_string);
                                break;
                        }
 
-                       set (pos, true);
+                       AudioClock::set (pos, true);
                        _layout->set_attributes (normal_attributes);
                        ValueChanged(); /* EMIT_SIGNAL */
                }
@@ -575,6 +585,18 @@ AudioClock::drop_focus ()
        }
 }
 
+samplecnt_t
+AudioClock::parse_as_seconds_distance (const std::string& str)
+{
+       float f;
+
+       if (sscanf (str.c_str(), "%f", &f) == 1) {
+               return f * _session->sample_rate();
+       }
+
+       return 0;
+}
+
 samplecnt_t
 AudioClock::parse_as_samples_distance (const std::string& str)
 {
@@ -708,6 +730,9 @@ AudioClock::parse_as_distance (const std::string& instr)
        case MinSec:
                return parse_as_minsec_distance (instr);
                break;
+       case Seconds:
+               return parse_as_seconds_distance (instr);
+               break;
        }
        return 0;
 }
@@ -730,6 +755,9 @@ AudioClock::end_edit_relative (bool add)
                ok = minsec_validate_edit (edit_string);
                break;
 
+       case Seconds:
+               break;
+
        case Samples:
                break;
        }
@@ -753,14 +781,14 @@ AudioClock::end_edit_relative (bool add)
 
        if (samples != 0) {
                if (add) {
-                       set (current_time() + samples, true);
+                       AudioClock::set (current_time() + samples, true);
                } else {
                        samplepos_t c = current_time();
 
                        if (c > samples || _negative_allowed) {
-                               set (c - samples, true);
+                               AudioClock::set (c - samples, true);
                        } else {
-                               set (0, true);
+                               AudioClock::set (0, true);
                        }
                }
                ValueChanged (); /* EMIT SIGNAL */
@@ -774,7 +802,7 @@ AudioClock::end_edit_relative (bool add)
 void
 AudioClock::session_property_changed (const PropertyChange&)
 {
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 }
 
 void
@@ -786,7 +814,7 @@ AudioClock::session_configuration_changed (std::string p)
        }
 
        if (p == "sync-source" || p == "external-sync") {
-               set (current_time(), true);
+               AudioClock::set (current_time(), true);
                return;
        }
 
@@ -803,7 +831,7 @@ AudioClock::session_configuration_changed (std::string p)
                } else {
                        current = current_time ();
                }
-               set (current, true);
+               AudioClock::set (current, true);
                break;
        default:
                break;
@@ -817,6 +845,7 @@ AudioClock::set (samplepos_t when, bool force, samplecnt_t offset)
                return;
        }
 
+       _offset = offset;
        if (is_duration) {
                when = when - offset;
        }
@@ -866,6 +895,10 @@ AudioClock::set (samplepos_t when, bool force, samplecnt_t offset)
                        set_minsec (when, force);
                        break;
 
+               case Seconds:
+                       set_seconds (when, force);
+                       break;
+
                case Samples:
                        set_samples (when, force);
                        break;
@@ -1019,6 +1052,32 @@ AudioClock::set_samples (samplepos_t when, bool /*force*/)
        }
 }
 
+void
+AudioClock::set_seconds (samplepos_t when, bool /*force*/)
+{
+       char buf[32];
+
+       if (_off) {
+               _layout->set_text (" ----------");
+               _left_btn.set_text ("", true);
+               _right_btn.set_text ("", true);
+               return;
+       }
+
+       if (when >= _limit_pos || when <= -_limit_pos) {
+               set_out_of_bounds (when < 0);
+       } else {
+               if (when < 0) {
+                       snprintf (buf, sizeof (buf), "%12.1f", when / (float)_session->sample_rate());
+               } else {
+                       snprintf (buf, sizeof (buf), " %11.1f", when / (float)_session->sample_rate());
+               }
+               _layout->set_text (buf);
+       }
+
+       set_slave_info();
+}
+
 void
 AudioClock::print_minsec (samplepos_t when, char* buf, size_t bufsize, float sample_rate)
 {
@@ -1254,7 +1313,7 @@ AudioClock::set_session (Session *s)
                        }
                }
 
-               set (last_when, true);
+               AudioClock::set (last_when, true);
        }
 }
 
@@ -1510,6 +1569,13 @@ AudioClock::index_to_field (int index) const
                        return MS_Milliseconds;
                }
                break;
+       case Seconds:
+               if (index < 10) {
+                       return SS_Seconds;
+               } else {
+                       return SS_Deciseconds;
+               }
+               break;
        case Samples:
                return S_Samples;
                break;
@@ -1604,6 +1670,7 @@ AudioClock::on_button_release_event (GdkEventButton *ev)
                                                case Timecode_frames:
                                                case MS_Milliseconds:
                                                case Ticks:
+                                               case SS_Deciseconds:
                                                        f = Field (0);
                                                        break;
                                                default:
@@ -1678,7 +1745,7 @@ AudioClock::on_scroll_event (GdkEventScroll *ev)
                        if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
                                samples *= 10;
                        }
-                       set (current_time() + samples, true);
+                       AudioClock::set (current_time() + samples, true);
                        ValueChanged (); /* EMIT_SIGNAL */
                }
                break;
@@ -1691,9 +1758,9 @@ AudioClock::on_scroll_event (GdkEventScroll *ev)
                        }
 
                        if (!_negative_allowed && (double)current_time() - (double)samples < 0.0) {
-                               set (0, true);
+                               AudioClock::set (0, true);
                        } else {
-                               set (current_time() - samples, true);
+                               AudioClock::set (current_time() - samples, true);
                        }
 
                        ValueChanged (); /* EMIT_SIGNAL */
@@ -1743,9 +1810,9 @@ AudioClock::on_motion_notify_event (GdkEventMotion *ev)
                samples = get_sample_step (drag_field, pos, dir);
 
                if (samples  != 0 &&  samples * drag_accum < current_time()) {
-                       set ((samplepos_t) floor (pos - drag_accum * samples), false); // minus because up is negative in GTK
+                       AudioClock::set ((samplepos_t) floor (pos - drag_accum * samples), false); // minus because up is negative in GTK
                } else {
-                       set (0 , false);
+                       AudioClock::set (0 , false);
                }
 
                drag_accum= 0;
@@ -1778,6 +1845,13 @@ AudioClock::get_sample_step (Field field, samplepos_t pos, int dir)
                f = 1;
                break;
 
+       case SS_Seconds:
+               f = (samplecnt_t) _session->sample_rate();
+               break;
+       case SS_Deciseconds:
+               f = (samplecnt_t) _session->sample_rate() / 10.f;
+               break;
+
        case MS_Hours:
                f = (samplecnt_t) floor (3600.0 * _session->sample_rate());
                break;
@@ -1830,17 +1904,13 @@ AudioClock::current_duration (samplepos_t pos) const
        samplepos_t ret = 0;
 
        switch (_mode) {
-       case Timecode:
-               ret = last_when;
-               break;
        case BBT:
                ret = sample_duration_from_bbt_string (pos, _layout->get_text());
                break;
 
+       case Timecode:
        case MinSec:
-               ret = last_when;
-               break;
-
+       case Seconds:
        case Samples:
                ret = last_when;
                break;
@@ -2021,7 +2091,15 @@ AudioClock::sample_duration_from_bbt_string (samplepos_t pos, const string& str)
 }
 
 samplepos_t
-AudioClock::samples_from_audioframes_string (const string& str) const
+AudioClock::samples_from_seconds_string (const string& str) const
+{
+       float f;
+       sscanf (str.c_str(), "%f", &f);
+       return f * _session->sample_rate();
+}
+
+samplepos_t
+AudioClock::samples_from_audiosamples_string (const string& str) const
 {
        samplepos_t f;
        sscanf (str.c_str(), "%" PRId64, &f);
@@ -2057,6 +2135,7 @@ AudioClock::build_ops_menu ()
        ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode, false)));
        ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT, false)));
        ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec, false)));
+       ops_items.push_back (MenuElem (_("Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Seconds, false)));
        ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Samples, false)));
 
        if (editable && !_off && !is_duration && !_follows_playhead) {
@@ -2075,7 +2154,7 @@ AudioClock::set_from_playhead ()
                return;
        }
 
-       set (_session->transport_sample());
+       AudioClock::set (_session->transport_sample());
        ValueChanged ();
 }
 
@@ -2141,11 +2220,24 @@ AudioClock::set_mode (Mode m, bool noemit)
                insert_map.push_back (1);
                break;
 
+       case Seconds:
+               insert_map.push_back (11);
+               insert_map.push_back (9);
+               insert_map.push_back (8);
+               insert_map.push_back (7);
+               insert_map.push_back (6);
+               insert_map.push_back (5);
+               insert_map.push_back (4);
+               insert_map.push_back (3);
+               insert_map.push_back (2);
+               insert_map.push_back (1);
+               break;
+
        case Samples:
                break;
        }
 
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 
        if (!is_transient && !noemit) {
                ModeChanged (); /* EMIT SIGNAL (the static one)*/
@@ -2187,7 +2279,7 @@ AudioClock::set_is_duration (bool yn)
        }
 
        is_duration = yn;
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 }
 
 void
@@ -2203,7 +2295,7 @@ AudioClock::set_off (bool yn)
         * change
         */
 
-       set (last_when, true);
+       AudioClock::set (last_when, true);
 }
 
 void