replaced canonicalize_file_name with realpath, which is available.
[ardour.git] / gtk2_ardour / region_view.cc
index ebec4261ac77104084fc7b10f5c7a3b50c9cb1e1..7a8f9b5d6ae03904d88907a3eda72b3045bb79c8 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: regionview.cc 691 2006-07-23 12:03:19Z drobilla $
 */
 
 #include <cmath>
@@ -25,6 +24,7 @@
 #include <gtkmm.h>
 
 #include <gtkmm2ext/gtk_ui.h>
+#include <pbd/stacktrace.h>
 
 #include <ardour/playlist.h>
 #include <ardour/audioregion.h>
@@ -59,36 +59,47 @@ sigc::signal<void,RegionView*> RegionView::RegionViewGoingAway;
 
 RegionView::RegionView (ArdourCanvas::Group* parent, 
                         TimeAxisView&        tv,
-                        ARDOUR::Region&      r,
+                        boost::shared_ptr<ARDOUR::Region> r,
                         double               spu,
                         Gdk::Color&          basic_color)
-       : TimeAxisViewItem (r.name(), *parent, tv, spu, basic_color, r.position(), r.length(),
-                       TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowNameText|
-                                                     TimeAxisViewItem::ShowNameHighlight|
-                                                     TimeAxisViewItem::ShowFrame))
-       , _region (r)
-       , sync_mark(0)
-       , no_wave_msg(0)
-       , editor(0)
-       , current_visible_sync_position(0.0)
-       , valid(false)
-       , _pixel_width(1.0)
-       , _height(1.0)
-       , in_destructor(false)
-       , wait_for_data(false)
+       : TimeAxisViewItem (r->name(), *parent, tv, spu, basic_color, r->position(), r->length(),
+                           TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowNameText|
+                                                         TimeAxisViewItem::ShowNameHighlight|
+                                                         TimeAxisViewItem::ShowFrame))
+         , _region (r)
+         , sync_mark(0)
+         , editor(0)
+         , current_visible_sync_position(0.0)
+         , valid(false)
+         , _pixel_width(1.0)
+         , _height(1.0)
+         , in_destructor(false)
+         , wait_for_data(false)
+{
+}
+
+RegionView::RegionView (const RegionView& other)
+       : TimeAxisViewItem (other)
 {
+       /* derived concrete type will call init () */
+
+       _region = other._region;
+       editor = other.editor;
+       current_visible_sync_position = other.current_visible_sync_position;
+       valid = false;
+       _pixel_width = other._pixel_width;
+       _height = other._height;
 }
 
 RegionView::RegionView (ArdourCanvas::Group*         parent, 
                         TimeAxisView&                tv,
-                        ARDOUR::Region&              r,
+                        boost::shared_ptr<ARDOUR::Region> r,
                         double                       spu,
                         Gdk::Color&                  basic_color,
                         TimeAxisViewItem::Visibility visibility)
-       : TimeAxisViewItem (r.name(), *parent, tv, spu, basic_color, r.position(), r.length(), visibility)
+       : TimeAxisViewItem (r->name(), *parent, tv, spu, basic_color, r->position(), r->length(), visibility)
        , _region (r)
        , sync_mark(0)
-       , no_wave_msg(0)
        , editor(0)
        , current_visible_sync_position(0.0)
        , valid(false)
@@ -102,7 +113,6 @@ RegionView::RegionView (ArdourCanvas::Group*         parent,
 void
 RegionView::init (Gdk::Color& basic_color, bool wfd)
 {
-       editor        = 0;
        valid         = true;
        in_destructor = false;
        _height       = 0;
@@ -111,10 +121,14 @@ RegionView::init (Gdk::Color& basic_color, bool wfd)
        compute_colors (basic_color);
 
        name_highlight->set_data ("regionview", this);
-       name_text->set_data ("regionview", this);
+
+       if (name_text) {
+               name_text->set_data ("regionview", this);
+       }
 
        /* an equilateral triangle */
-    ArdourCanvas::Points shape;
+
+       ArdourCanvas::Points shape;
        shape.push_back (Gnome::Art::Point (-((sync_mark_width-1)/2), 1));
        shape.push_back (Gnome::Art::Point ((sync_mark_width - 1)/2, 1));
        shape.push_back (Gnome::Art::Point (0, sync_mark_width - 1));
@@ -125,16 +139,11 @@ RegionView::init (Gdk::Color& basic_color, bool wfd)
        sync_mark->property_fill_color_rgba() = fill_color;
        sync_mark->hide();
 
-       reset_width_dependent_items ((double) _region.length() / samples_per_unit);
+       reset_width_dependent_items ((double) _region->length() / samples_per_unit);
 
        set_height (trackview.height);
 
-       region_muted ();
-       region_sync_changed ();
-       region_resized (BoundsChanged);
-       region_locked ();
-
-       _region.StateChanged.connect (mem_fun(*this, &RegionView::region_changed));
+       _region->StateChanged.connect (mem_fun(*this, &RegionView::region_changed));
 
        group->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_event), group, this));
        name_highlight->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), name_highlight, this));
@@ -150,8 +159,6 @@ RegionView::~RegionView ()
 {
        in_destructor = true;
 
-       RegionViewGoingAway (this); /* EMIT_SIGNAL */
-
        for (vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) {
                delete *g;
        }
@@ -178,7 +185,7 @@ RegionView::_lock_toggle (ArdourCanvas::Item* item, GdkEvent* ev, void* arg)
 void
 RegionView::lock_toggle ()
 {
-       _region.set_locked (!_region.locked());
+       _region->set_locked (!_region->locked());
 }
 
 void
@@ -223,16 +230,14 @@ RegionView::region_resized (Change what_changed)
        double unit_length;
 
        if (what_changed & ARDOUR::PositionChanged) {
-               set_position (_region.position(), 0);
+               set_position (_region->position(), 0);
        }
 
        if (what_changed & Change (StartChanged|LengthChanged)) {
 
-               set_duration (_region.length(), 0);
+               set_duration (_region->length(), 0);
 
-               unit_length = _region.length() / samples_per_unit;
-               
-               reset_width_dependent_items (unit_length);
+               unit_length = _region->length() / samples_per_unit;
                
                for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
 
@@ -273,29 +278,29 @@ RegionView::region_opacity ()
 void
 RegionView::raise ()
 {
-       _region.raise ();
+       _region->raise ();
 }
 
 void
 RegionView::raise_to_top ()
 {
-       _region.raise_to_top ();
+       _region->raise_to_top ();
 }
 
 void
 RegionView::lower ()
 {
-       _region.lower ();
+       _region->lower ();
 }
 
 void
 RegionView::lower_to_bottom ()
 {
-       _region.lower_to_bottom ();
+       _region->lower_to_bottom ();
 }
 
 bool
-RegionView::set_position (jack_nframes_t pos, void* src, double* ignored)
+RegionView::set_position (nframes_t pos, void* src, double* ignored)
 {
        double delta;
        bool ret;
@@ -324,21 +329,21 @@ RegionView::set_samples_per_unit (gdouble spu)
 
        for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
                (*i)->set_samples_per_unit (spu);
-               (*i)->set_duration (_region.length() / samples_per_unit);
+               (*i)->set_duration (_region->length() / samples_per_unit);
        }
 
        region_sync_changed ();
 }
 
 bool
-RegionView::set_duration (jack_nframes_t frames, void *src)
+RegionView::set_duration (nframes_t frames, void *src)
 {
        if (!TimeAxisViewItem::set_duration (frames, src)) {
                return false;
        }
        
        for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
-               (*i)->set_duration (_region.length() / samples_per_unit);
+               (*i)->set_duration (_region->length() / samples_per_unit);
        }
 
        return true;
@@ -363,15 +368,27 @@ RegionView::set_colors ()
 void
 RegionView::set_frame_color ()
 {
-       if (_region.opaque()) {
-               fill_opacity = 180;
+       if (_region->opaque()) {
+               fill_opacity = 130;
        } else {
-               fill_opacity = 100;
+               fill_opacity = 60;
        }
 
        TimeAxisViewItem::set_frame_color ();
 }
 
+void
+RegionView::fake_set_opaque (bool yn)
+{
+       if (yn) {
+               fill_opacity = 130;
+       } else {
+               fill_opacity = 60;
+       }
+
+       TimeAxisViewItem::set_frame_color ();
+}
+
 void
 RegionView::hide_region_editor()
 {
@@ -385,24 +402,25 @@ RegionView::region_renamed ()
 {
        string str;
 
-       if (_region.locked()) {
+       if (_region->locked()) {
                str += '>';
-               str += _region.name();
+               str += _region->name();
                str += '<';
        } else {
-               str = _region.name();
+               str = _region->name();
        }
 
-       if (_region.speed_mismatch (trackview.session().frame_rate())) {
+       if (_region->speed_mismatch (trackview.session().frame_rate())) {
                str = string ("*") + str;
        }
 
-       if (_region.muted()) {
+       if (_region->muted()) {
                str = string ("!") + str;
        }
 
        set_item_name (str, this);
        set_name_text (str);
+       reset_width_dependent_items (_pixel_width);
 }
 
 void
@@ -413,12 +431,12 @@ RegionView::region_sync_changed ()
        }
 
        int sync_dir;
-       jack_nframes_t sync_offset;
+       nframes_t sync_offset;
 
-       sync_offset = _region.sync_offset (sync_dir);
+       sync_offset = _region->sync_offset (sync_dir);
 
        /* this has to handle both a genuine change of position, a change of samples_per_unit,
-          and a change in the bounds of the _region.
+          and a change in the bounds of the _region->
         */
 
        if (sync_offset == 0) {
@@ -429,7 +447,7 @@ RegionView::region_sync_changed ()
 
        } else {
 
-               if ((sync_dir < 0) || ((sync_dir > 0) && (sync_offset > _region.length()))) { 
+               if ((sync_dir < 0) || ((sync_dir > 0) && (sync_offset > _region->length()))) { 
 
                        /* no sync mark - its out of the bounds of the region */
 
@@ -458,7 +476,7 @@ RegionView::region_sync_changed ()
 void
 RegionView::move (double x_delta, double y_delta)
 {
-       if (_region.locked() || (x_delta == 0 && y_delta == 0)) {
+       if (_region->locked() || (x_delta == 0 && y_delta == 0)) {
                return;
        }