diff options
author | Robin Gareus <robin@gareus.org> | 2017-11-22 22:10:37 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-11-23 00:13:32 +0100 |
commit | 15150c57c1e10e8ec2182a667c8e93627f446b60 (patch) | |
tree | e08e140df12bbb4c5e5a839effb0e9ff22173caa /gtk2_ardour/main_clock.cc | |
parent | 1be2790caca1130d1b5957c9540b7f5070635c47 (diff) |
Implement clock delta modes
* use new config variable
* update GUI to select delta-modes
* delegate delta-calculation to MainClock
* save offset to calculate absolute-time
Diffstat (limited to 'gtk2_ardour/main_clock.cc')
-rw-r--r-- | gtk2_ardour/main_clock.cc | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index ff68e9e22c..94f7bab696 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -17,6 +17,7 @@ */ +#include "pbd/unwind.h" #include "ardour/tempo.h" #include "actions.h" @@ -27,6 +28,7 @@ #include "pbd/i18n.h" using namespace Gtk; +using namespace ARDOUR; MainClock::MainClock ( const std::string& clock_name, @@ -34,7 +36,8 @@ MainClock::MainClock ( bool primary ) : AudioClock (clock_name, false, widget_name, true, true, false, true) - , _primary (primary) + , _primary (primary) + , _suspend_delta_mode_signal (false) { } @@ -55,21 +58,33 @@ MainClock::build_ops_menu () MenuList& ops_items = ops_menu->items(); ops_items.push_back (SeparatorElem ()); - ops_items.push_back (CheckMenuElem (_("Display delta to edit cursor"), sigc::mem_fun (*this, &MainClock::display_delta_to_edit_cursor))); - Gtk::CheckMenuItem* c = dynamic_cast<Gtk::CheckMenuItem *> (&ops_items.back()); + RadioMenuItem::Group group; + PBD::Unwinder<bool> uw (_suspend_delta_mode_signal, true); + ClockDeltaMode mode; if (_primary) { - if (UIConfiguration::instance().get_primary_clock_delta_edit_cursor ()) { - UIConfiguration::instance().set_primary_clock_delta_edit_cursor (false); - c->set_active (true); - } + mode = UIConfiguration::instance().get_primary_clock_delta_mode (); } else { - if (UIConfiguration::instance().get_secondary_clock_delta_edit_cursor ()) { - UIConfiguration::instance().set_secondary_clock_delta_edit_cursor (false); - c->set_active (true); - } + mode = UIConfiguration::instance().get_secondary_clock_delta_mode (); + } + + ops_items.push_back (RadioMenuElem (group, _("Display absolute time"), sigc::bind (sigc::mem_fun (*this, &MainClock::set_display_delta_mode), NoDelta))); + if (mode == NoDelta) { + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&ops_items.back ()); + i->set_active (true); + } + ops_items.push_back (RadioMenuElem (group, _("Display delta to edit cursor"), sigc::bind (sigc::mem_fun (*this, &MainClock::set_display_delta_mode), DeltaEditPoint))); + if (mode == DeltaEditPoint) { + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&ops_items.back ()); + i->set_active (true); + } + ops_items.push_back (RadioMenuElem (group, _("Display delta to origin marker"), sigc::bind (sigc::mem_fun (*this, &MainClock::set_display_delta_mode), DeltaOriginMarker))); + if (mode == DeltaOriginMarker) { + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&ops_items.back ()); + i->set_active (true); } ops_items.push_back (SeparatorElem()); + ops_items.push_back (MenuElem (_("Edit Tempo"), sigc::mem_fun(*this, &MainClock::edit_current_tempo))); ops_items.push_back (MenuElem (_("Edit Meter"), sigc::mem_fun(*this, &MainClock::edit_current_meter))); ops_items.push_back (MenuElem (_("Insert Tempo Change"), sigc::mem_fun(*this, &MainClock::insert_new_tempo))); @@ -80,20 +95,51 @@ samplepos_t MainClock::absolute_time () const { if (get_is_duration ()) { - // delta to edit cursor - return current_time () + PublicEditor::instance().get_preferred_edit_position (Editing::EDIT_IGNORE_PHEAD); + return current_time () + offset (); } else { return current_time (); } } void -MainClock::display_delta_to_edit_cursor () +MainClock::set (samplepos_t when, bool force, ARDOUR::samplecnt_t /*offset*/) +{ + ClockDeltaMode mode; + if (_primary) { + mode = UIConfiguration::instance().get_primary_clock_delta_mode (); + } else { + mode = UIConfiguration::instance().get_secondary_clock_delta_mode (); + } + if (!PublicEditor::instance().session()) { + mode = NoDelta; + } + + switch (mode) { + case NoDelta: + AudioClock::set (when, force, 0); + break; + case DeltaEditPoint: + AudioClock::set (when, force, PublicEditor::instance().get_preferred_edit_position (Editing::EDIT_IGNORE_PHEAD)); + break; + case DeltaOriginMarker: + { + Location* loc = PublicEditor::instance().session()->locations()->clock_origin_location (); + AudioClock::set (when, force, loc ? loc->start() : 0); + } + break; + } +} + +void +MainClock::set_display_delta_mode (ClockDeltaMode m) { + if (_suspend_delta_mode_signal) { + return; + } if (_primary) { - UIConfiguration::instance().set_primary_clock_delta_edit_cursor (!UIConfiguration::instance().get_primary_clock_delta_edit_cursor ()); + UIConfiguration::instance().set_primary_clock_delta_mode (m); } else { - UIConfiguration::instance().set_secondary_clock_delta_edit_cursor (!UIConfiguration::instance().get_secondary_clock_delta_edit_cursor ()); + UIConfiguration::instance().set_secondary_clock_delta_mode (m); } } |