open un-writable sessions without complaining, and desensitize all/most actions that...
[ardour.git] / gtk2_ardour / audio_streamview.cc
index 279130ad381ee919573249401c945e751f199293..8d12fef2c230847543daf44a362a4c8b2968d989 100644 (file)
@@ -31,6 +31,7 @@
 #include <ardour/playlist_templates.h>
 #include <ardour/source.h>
 #include <ardour/region_factory.h>
+#include <ardour/profile.h>
 
 #include "audio_streamview.h"
 #include "audio_region_view.h"
@@ -46,7 +47,6 @@
 #include "rgb_macros.h"
 #include "gui_thread.h"
 #include "utils.h"
-#include "color.h"
 
 #include "i18n.h"
 
@@ -60,14 +60,8 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
        crossfades_visible = true;
        _waveform_scale = LinearWaveform;
        _waveform_shape = Traditional;
-       
-       if (tv.is_audio_track())
-               stream_base_color = color_map[cAudioTrackBase];
-       else
-               stream_base_color = color_map[cAudioBusBase];
-       
-       canvas_rect->property_fill_color_rgba() = stream_base_color;
-       canvas_rect->property_outline_color_rgba() = color_map[cAudioTrackOutline];
+
+       color_handler ();
 
        _amplitude_above_axis = 1.0;
 
@@ -130,7 +124,7 @@ AudioStreamView::set_amplitude_above_axis (gdouble app)
 }
 
 void
-AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves)
+AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves, bool recording)
 {
        AudioRegionView *region_view = 0;
 
@@ -162,8 +156,13 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
 
        switch (_trackview.audio_track()->mode()) {
        case Normal:
-               region_view = new AudioRegionView (canvas_group, _trackview, region, 
-                                                  _samples_per_unit, region_color);
+               if (recording) {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
+                                                  _samples_per_unit, region_color, recording, TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame | TimeAxisViewItem::HideFrameRight));
+               } else {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
+                                                          _samples_per_unit, region_color);
+               }
                break;
        case Destructive:
                region_view = new TapeAudioRegionView (canvas_group, _trackview, region, 
@@ -179,7 +178,6 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
        region_view->set_amplitude_above_axis(_amplitude_above_axis);
        region_views.push_front (region_view);
 
-       
        /* if its the special single-sample length that we use for rec-regions, make it 
           insensitive to events 
        */
@@ -279,9 +277,15 @@ AudioStreamView::playlist_modified ()
 }
 
 void
-AudioStreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
+AudioStreamView::playlist_changed (boost::weak_ptr<Diskstream> wptr)
 {
-       ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::playlist_changed), ds));
+       ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::playlist_changed), wptr));
+
+       boost::shared_ptr<Diskstream> ds  = wptr.lock();
+
+       if (!ds) {
+               return;
+       }
 
        StreamView::playlist_changed(ds);
 
@@ -429,8 +433,9 @@ AudioStreamView::set_show_waveforms (bool yn)
 {
        for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
-               if (arv)
+               if (arv) {
                        arv->set_waveform_visible (yn);
+               }
        }
 }
 
@@ -459,7 +464,7 @@ AudioStreamView::set_waveform_scale (WaveformScale scale)
 void
 AudioStreamView::setup_rec_box ()
 {
-       // cerr << _trackview.name() << " streamview SRB\n";
+       //cerr << _trackview.name() << " streamview SRB region_views.size() = " << region_views.size() << endl;
 
        if (_trackview.session().transport_rolling()) {
 
@@ -468,7 +473,6 @@ AudioStreamView::setup_rec_box ()
                if (!rec_active && 
                    _trackview.session().record_status() == Session::Recording && 
                    _trackview.get_diskstream()->record_enabled()) {
-
                        if (_trackview.audio_track()->mode() == Normal && use_rec_regions && rec_regions.size() == rec_rects.size()) {
 
                                /* add a new region, but don't bother if they set use_rec_regions mid-record */
@@ -508,24 +512,22 @@ AudioStreamView::setup_rec_box ()
                        
                        /* start a new rec box */
 
-                       AudioTrack* at;
-
-                       at = _trackview.audio_track(); /* we know what it is already */
+                       boost::shared_ptr<AudioTrack> at = _trackview.audio_track ();
                        boost::shared_ptr<AudioDiskstream> ds = at->audio_diskstream();
                        nframes_t frame_pos = ds->current_capture_start ();
                        gdouble xstart = _trackview.editor.frame_to_pixel (frame_pos);
                        gdouble xend;
                        uint32_t fill_color;
 
-                       switch (_trackview.audio_track()->mode()) {
+                       switch (at->mode()) {
                        case Normal:
                                xend = xstart;
-                               fill_color = color_map[cRecordingRectFill];
+                               fill_color = ARDOUR_UI::config()->canvasvar_RecordingRect.get();
                                break;
 
                        case Destructive:
                                xend = xstart + 2;
-                               fill_color = color_map[cRecordingRectFill];
+                               fill_color = ARDOUR_UI::config()->canvasvar_RecordingRect.get();
                                /* make the recording rect translucent to allow
                                   the user to see the peak data coming in, etc.
                                */
@@ -537,8 +539,9 @@ AudioStreamView::setup_rec_box ()
                        rec_rect->property_x1() = xstart;
                        rec_rect->property_y1() = 1.0;
                        rec_rect->property_x2() = xend;
-                       rec_rect->property_y2() = (double) _trackview.height - 1;
-                       rec_rect->property_outline_color_rgba() = color_map[cRecordingRectOutline];
+                       rec_rect->property_y2() = (double) _trackview.current_height() - 1;
+                       rec_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeAxisFrame.get();
+                       rec_rect->property_outline_what() = 0x1 | 0x2 | 0x4 | 0x8;
                        rec_rect->property_fill_color_rgba() = fill_color;
                        
                        RecBoxInfo recbox;
@@ -556,11 +559,9 @@ AudioStreamView::setup_rec_box ()
                } else if (rec_active &&
                           (_trackview.session().record_status() != Session::Recording ||
                            !_trackview.get_diskstream()->record_enabled())) {
-
                        screen_update_connection.disconnect();
                        rec_active = false;
                        rec_updating = false;
-
                }
                
        } else {
@@ -647,7 +648,6 @@ void
 AudioStreamView::update_rec_regions ()
 {
        if (use_rec_regions) {
-
                uint32_t n = 0;
 
                for (list<boost::shared_ptr<Region> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) {
@@ -685,7 +685,7 @@ AudioStreamView::update_rec_regions ()
 
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
 
                                                /* also update rect */
@@ -710,7 +710,7 @@ AudioStreamView::update_rec_regions ()
                                                
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
                                                
                                                /* also hide rect */
@@ -726,6 +726,28 @@ AudioStreamView::update_rec_regions ()
        }
 }
 
+void
+AudioStreamView::show_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (true);
+               }
+       }
+}
+
+void
+AudioStreamView::hide_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (false);
+               }
+       }
+}
+
 void
 AudioStreamView::show_all_xfades ()
 {
@@ -761,25 +783,18 @@ AudioStreamView::reveal_xfades_involving (AudioRegionView& rv)
 }
 
 void
-AudioStreamView::color_handler (ColorID id, uint32_t val)
+AudioStreamView::color_handler ()
 {
-       switch (id) {
-       case cAudioTrackBase:
-               if (_trackview.is_track()) {
-                       canvas_rect->property_fill_color_rgba() = val;
-               } 
-               break;
-       case cAudioBusBase:
-               if (!_trackview.is_track()) {
-                       canvas_rect->property_fill_color_rgba() = val;
-               }
-               break;
-       case cAudioTrackOutline:
-               canvas_rect->property_outline_color_rgba() = val;
-               break;
+       if (_trackview.is_track()) {
+               canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioTrackBase.get();
+       }
 
-       default:
-               break;
+       if (!_trackview.is_track()) {
+               if (Profile->get_sae() && _trackview.route()->master()) {
+                       canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioMasterBusBase.get();
+               } else {
+                       canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioBusBase.get();
+               }
        }
 }