Merge with 2.0-ongoing R2943.
[ardour.git] / gtk2_ardour / editor_ops.cc
index 9f5cb638dd2c1245244783066a2a97eb52266137..33a0e6920c1334bed219f436850083174774abd0 100644 (file)
@@ -49,6 +49,7 @@
 #include <ardour/region_factory.h>
 #include <ardour/playlist_factory.h>
 #include <ardour/reverse.h>
+#include <ardour/dB.h>
 #include <ardour/quantize.h>
 
 #include "ardour_ui.h"
@@ -65,6 +66,8 @@
 #include "editing.h"
 #include "gtk-custom-hruler.h"
 #include "gui_thread.h"
+#include "keyboard.h"
+#include "utils.h"
 
 #include "i18n.h"
 
@@ -330,16 +333,38 @@ Editor::extend_selection_to_start_of_region (bool previous)
        commit_reversible_command ();
 }
 
+bool
+Editor::nudge_forward_release (GdkEventButton* ev)
+{
+       if (ev->state & Keyboard::PrimaryModifier) {
+               nudge_forward (false, true);
+       } else {
+               nudge_forward (false, false);
+       }
+       return false;
+}
+
+bool
+Editor::nudge_backward_release (GdkEventButton* ev)
+{
+       if (ev->state & Keyboard::PrimaryModifier) {
+               nudge_backward (false, true);
+       } else {
+               nudge_backward (false, false);
+       }
+       return false;
+}
+
 
 void
-Editor::nudge_forward (bool next)
+Editor::nudge_forward (bool next, bool force_playhead)
 {
        nframes_t distance;
        nframes_t next_distance;
 
        if (!session) return;
        
-       if (!selection->regions.empty()) {
+       if (!force_playhead && !selection->regions.empty()) {
 
                begin_reversible_command (_("nudge regions forward"));
 
@@ -361,7 +386,7 @@ Editor::nudge_forward (bool next)
                commit_reversible_command ();
 
                
-       } else if (!selection->markers.empty()) {
+       } else if (!force_playhead && !selection->markers.empty()) {
 
                bool is_start;
                Location* loc = find_location_from_marker (selection->markers.front(), is_start);
@@ -405,14 +430,14 @@ Editor::nudge_forward (bool next)
 }
                
 void
-Editor::nudge_backward (bool next)
+Editor::nudge_backward (bool next, bool force_playhead)
 {
        nframes_t distance;
        nframes_t next_distance;
 
        if (!session) return;
        
-       if (!selection->regions.empty()) {
+       if (!force_playhead && !selection->regions.empty()) {
 
                begin_reversible_command (_("nudge regions backward"));
 
@@ -438,7 +463,7 @@ Editor::nudge_backward (bool next)
 
                commit_reversible_command ();
 
-       } else if (!selection->markers.empty()) {
+       } else if (!force_playhead && !selection->markers.empty()) {
 
                bool is_start;
                Location* loc = find_location_from_marker (selection->markers.front(), is_start);
@@ -4096,6 +4121,8 @@ Editor::denormalize_region ()
                return;
        }
 
+       ExclusiveRegionSelection (*this, entered_regionview);
+
        if (selection->regions.empty()) {
                return;
        }
@@ -4114,6 +4141,62 @@ Editor::denormalize_region ()
        commit_reversible_command ();
 }
 
+void
+Editor::adjust_region_scale_amplitude (bool up)
+{
+       if (!session) {
+               return;
+       }
+
+       ExclusiveRegionSelection (*this, entered_regionview);
+
+       if (selection->regions.empty()) {
+               return;
+       }
+
+       begin_reversible_command ("denormalize");
+
+       for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
+               if (!arv)
+                       continue;
+               XMLNode &before = arv->region()->get_state();
+               
+               double fraction = gain_to_slider_position (arv->audio_region()->scale_amplitude ());
+               
+               cerr << "slider pos for " << arv->audio_region()->scale_amplitude ()
+                    << " = " << fraction
+                    << endl;
+
+               if (up) {
+                       fraction += 0.05;
+                       fraction = min (fraction, 1.0);
+               } else {
+                       fraction -= 0.05;
+                       fraction = max (fraction, 0.0);
+               }
+
+               if (!up && fraction <= 0) {
+                       continue;
+               }
+
+               if (up && fraction >= 1.0) {
+                       continue;
+               }
+
+               fraction = slider_position_to_gain (fraction);
+               fraction = coefficient_to_dB (fraction);
+               fraction = dB_to_coefficient (fraction);
+               
+               cerr << "set scale amp for " << arv->audio_region()->name() << " to " << fraction << endl;
+
+               arv->audio_region()->set_scale_amplitude (fraction);
+               session->add_command (new MementoCommand<Region>(*(arv->region().get()), &before, &arv->region()->get_state()));
+       }
+
+       commit_reversible_command ();
+}
+
 
 void
 Editor::reverse_region ()