Remove unused variable and the accessor methods for it from ARDOUR_UI
[ardour.git] / gtk2_ardour / audio_clock.cc
index 87a6257fee1f59abe99a93b770ade76b79a0b527..8c24f429984e87ee89a637d9518fccb4cb2f8d70 100644 (file)
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cstdio> // for sprintf
 #include <cmath>
 
 #include <pbd/convert.h>
+#include <pbd/enumwriter.h>
 
 #include <gtkmm2ext/utils.h>
 
@@ -40,10 +40,14 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace sigc;
 using namespace Gtk;
+using namespace std;
 
 using PBD::atoi;
 using PBD::atof;
 
+sigc::signal<void> AudioClock::ModeChanged;
+vector<AudioClock*> AudioClock::clocks;
+
 const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = {
        2,   /* SMPTE_Hours */
        2,   /* SMPTE_Minutes */
@@ -58,8 +62,10 @@ const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = {
        10   /* Audio Frame */
 };
 
-AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool with_info) 
-       : is_duration (duration),
+AudioClock::AudioClock (std::string clock_name, bool transient, std::string widget_name, bool allow_edit, bool duration, bool with_info) 
+       : _name (clock_name),
+         is_transient (transient),
+         is_duration (duration),
          editable (allow_edit),
          colon1 (":"),
          colon2 (":"),
@@ -71,6 +77,8 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w
 {
        session = 0;
        last_when = 0;
+       last_pdelta = 0;
+       last_sdelta = 0;
        key_entry_state = 0;
        ops_menu = 0;
        dragging = false;
@@ -90,6 +98,9 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w
                bbt_upper_info_label->set_name ("AudioClockBBTUpperInfo");
                bbt_lower_info_label->set_name ("AudioClockBBTLowerInfo");
 
+               Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0);
+               Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0);
+
                frames_info_box.pack_start (*frames_upper_info_label, true, true);
                frames_info_box.pack_start (*frames_lower_info_label, true, true);
                smpte_info_box.pack_start (*smpte_upper_info_label, true, true);
@@ -174,7 +185,7 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w
 
        clock_frame.add (clock_base);
 
-       set_name (name);
+       set_widget_name (widget_name);
 
        _mode = BBT; /* lie to force mode switch */
        set_mode (SMPTE);
@@ -202,10 +213,14 @@ AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool w
        }
 
        set (last_when, true);
+
+       if (!is_transient) {
+               clocks.push_back (this);
+       }
 }
 
 void
-AudioClock::set_name (string name)
+AudioClock::set_widget_name (string name)
 {
        Widget::set_name (name);
 
@@ -370,17 +385,40 @@ AudioClock::on_realize ()
 }
 
 void
-AudioClock::set (nframes_t when, bool force)
+AudioClock::set (nframes_t when, bool force, nframes_t offset, char which)
 {
 
        if ((!force && !is_visible()) || session == 0) {
                return;
        }
        
-       if (when == last_when && !force) {
+       if (when == last_when && !offset && !force) {
                return;
        }
 
+       bool pdelta = Config->get_primary_clock_delta_edit_cursor();
+       bool sdelta = Config->get_secondary_clock_delta_edit_cursor();
+
+       if (offset && which == 'p' && pdelta) {
+               when = (when > offset) ? when - offset : offset - when;
+       } else if (offset && which == 's' && sdelta) {
+               when = (when > offset) ? when - offset : offset - when;
+       }
+
+       if (which == 'p' && pdelta && !last_pdelta) {
+               set_widget_name("TransportClockDisplayDelta");
+               last_pdelta = true;
+       } else if (which == 'p' && !pdelta && last_pdelta) {
+               set_widget_name("TransportClockDisplay");
+               last_pdelta = false;
+       } else if (which == 's'  && sdelta && !last_sdelta) {
+               set_widget_name("SecondaryClockDisplayDelta");
+               last_sdelta = true;
+       } else if (which == 's' && !sdelta && last_sdelta) {
+               set_widget_name("SecondaryClockDisplay");
+               last_sdelta = false;
+       }
+
        switch (_mode) {
        case SMPTE:
                set_smpte (when, force);
@@ -530,17 +568,17 @@ AudioClock::set_smpte (nframes_t when, bool force)
        }
        
        if (smpte_upper_info_label) {
-               float smpte_frames = Config->get_smpte_frames_per_second();
+               double smpte_frames = session->smpte_frames_per_second();
                
                if ( fmod(smpte_frames, 1.0) == 0.0) {
-                       sprintf (buf, "%u", int (smpte_frames));
+                       sprintf (buf, "%u", int (smpte_frames)); 
                } else {
                        sprintf (buf, "%.2f", smpte_frames);
                }
                
                smpte_upper_info_label->set_text (buf);
                
-               if (Config->get_smpte_drop_frames()) {
+               if (session->smpte_drop_frames()) {
                        sprintf (buf, "DF");
                } else {
                        sprintf (buf, "NDF");
@@ -579,6 +617,18 @@ AudioClock::set_session (Session *s)
        session = s;
 
        if (s) {
+
+               XMLProperty* prop;
+               XMLNode* node = session->extra_xml (X_("ClockModes"));
+               AudioClock::Mode amode;
+               
+               if (node) {
+                       if ((prop = node->property (_name)) != 0) {
+                               amode = AudioClock::Mode (string_2_enum (prop->value(), amode));
+                               set_mode (amode);
+                       }
+               }
+
                set (last_when, true);
        }
 }
@@ -742,6 +792,17 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field)
                                // Check SMPTE fields for sanity (may also adjust fields)
                                smpte_sanitize_display();
                                break;
+                       case Bars:
+                       case Beats:
+                       case Ticks:
+                               // Bars or beats should never be 0
+                               if (atoi(bars_label.get_text()) == 0) {
+                                       bars_label.set_text("001");
+                               }
+                               if (atoi(beats_label.get_text()) == 0) {
+                                       beats_label.set_text("01");
+                               }
+                               break;
                        default:
                                break;
                        }
@@ -1037,39 +1098,6 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
                return FALSE;
                break;
 
-       case 4:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
-                       frames = get_frames (field);
-                       if (frames != 0) {
-                               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
-                                       frames *= 10;
-                               }
-                               set (current_time() + frames, true);
-                                ValueChanged (); /* EMIT_SIGNAL */
-                       }
-               }
-               break;
-
-       case 5:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
-                       frames = get_frames (field);
-                       if (frames != 0) {
-                               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
-                                       frames *= 10;
-                               }
-
-                               if ((double)current_time() - (double)frames < 0.0) {
-                                       set (0, true);
-                               }
-                               else {
-                                       set (current_time() - frames, true);
-                               }
-                               
-                                ValueChanged (); /* EMIT_SIGNAL */
-                       }
-               }
-               break;
-
        default:
                return FALSE;
                break;
@@ -1194,7 +1222,7 @@ AudioClock::get_frames (Field field,nframes_t pos,int dir)
                frames = session->frame_rate();
                break;
        case SMPTE_Frames:
-               frames = (nframes_t) floor (session->frame_rate() / Config->get_smpte_frames_per_second());
+               frames = (nframes_t) floor (session->frame_rate() / session->smpte_frames_per_second());
                break;
 
        case AudioFrames:
@@ -1302,7 +1330,7 @@ AudioClock::smpte_sanitize_display()
                seconds_label.set_text("59");
        }
        
-       switch ((long)rint(Config->get_smpte_frames_per_second())) {
+       switch ((long)rint(session->smpte_frames_per_second())) {
        case 24:
                if (atoi(frames_label.get_text()) > 23) {
                        frames_label.set_text("23");
@@ -1322,7 +1350,7 @@ AudioClock::smpte_sanitize_display()
                break;
        }
        
-       if (Config->get_smpte_drop_frames()) {
+       if (session->smpte_drop_frames()) {
                if ((atoi(minutes_label.get_text()) % 10) && (atoi(seconds_label.get_text()) == 0) && (atoi(frames_label.get_text()) < 2)) {
                        frames_label.set_text("02");
                }
@@ -1343,6 +1371,8 @@ AudioClock::smpte_frame_from_display () const
        smpte.minutes = atoi (minutes_label.get_text());
        smpte.seconds = atoi (seconds_label.get_text());
        smpte.frames = atoi (frames_label.get_text());
+       smpte.rate = session->smpte_frames_per_second();
+       smpte.drop= session->smpte_drop_frames();
 
        session->smpte_to_sample( smpte, sample, false /* use_offset */, false /* use_subframes */ );
        
@@ -1856,6 +1886,10 @@ AudioClock::set_mode (Mode m)
        set (last_when, true);
        clock_base.show_all ();
        key_entry_state = 0;
+
+       if (!is_transient) {
+               ModeChanged (); /* EMIT SIGNAL */
+       }
 }
 
 void