X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fstreamview.cc;h=c0917d7e57119a905da4d4b8d0e39c44d2a6ffbd;hb=352c824fa3999244ef1ebf002d57d4b2dea5ae3c;hp=5d2b58a5cd4ed3b8775383fbc28b6b71c2dbe708;hpb=795451a697c82e8537eb710b659375777aa4c831;p=ardour.git diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 5d2b58a5cd..c0917d7e57 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -34,18 +34,18 @@ #include "canvas/debug.h" #include "streamview.h" -#include "global_signals.h" #include "region_view.h" #include "route_time_axis.h" #include "region_selection.h" #include "selection.h" #include "public_editor.h" -#include "ardour_ui.h" +#include "timers.h" #include "rgb_macros.h" #include "gui_thread.h" +#include "ui_config.h" #include "utils.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -63,30 +63,28 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Container* canvas_g , _layers (1) , _layer_display (Overlaid) , height (tv.height) - , last_rec_data_frame(0) + , last_rec_data_sample(0) { CANVAS_DEBUG_NAME (_canvas_group, string_compose ("SV canvas group %1", _trackview.name())); - + /* set_position() will position the group */ canvas_rect = new ArdourCanvas::Rectangle (_canvas_group); CANVAS_DEBUG_NAME (canvas_rect, string_compose ("SV canvas rectangle %1", _trackview.name())); - canvas_rect->set (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, tv.current_height () -1)); - canvas_rect->set_outline_what (ArdourCanvas::Rectangle::BOTTOM); // bottom separator - canvas_rect->set_outline_color (RGBA_TO_UINT (0, 0, 0, 255)); + canvas_rect->set (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, tv.current_height ())); + canvas_rect->set_outline (false); canvas_rect->set_fill (true); canvas_rect->Event.connect (sigc::bind (sigc::mem_fun (_trackview.editor(), &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview)); if (_trackview.is_track()) { - _trackview.track()->DiskstreamChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::diskstream_changed, this), gui_context()); - _trackview.track()->RecordEnableChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context()); + _trackview.track()->rec_enable_control()->Changed.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context()); _trackview.session()->TransportStateChange.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_changed, this), gui_context()); _trackview.session()->TransportLooped.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_looped, this), gui_context()); _trackview.session()->RecordStateChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::sess_rec_enable_changed, this), gui_context()); } - ColorsChanged.connect (sigc::mem_fun (*this, &StreamView::color_handler)); + UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &StreamView::color_handler)); } StreamView::~StreamView () @@ -115,16 +113,17 @@ int StreamView::set_height (double h) { /* limit the values to something sane-ish */ + if (h < 10.0 || h > 1000.0) { return -1; } - if (canvas_rect->y1() == h /* -1 */) { + if (height == h) { return 0; } height = h; - canvas_rect->set_y1 (height /* -1 */); // share the separator with outline + canvas_rect->set_y1 (height); update_contents_height (); return 0; @@ -139,6 +138,10 @@ StreamView::set_samples_per_pixel (double fpp) return -1; } + if (fpp == _samples_per_pixel) { + return 0; + } + _samples_per_pixel = fpp; for (i = region_views.begin(); i != region_views.end(); ++i) { @@ -155,7 +158,7 @@ StreamView::set_samples_per_pixel (double fpp) recbox.rectangle->set_x1 (xend); } - update_coverage_frames (); + update_coverage_samples (); return 0; } @@ -292,7 +295,8 @@ StreamView::playlist_layered (boost::weak_ptr wtr) if (_layer_display == Stacked) { update_contents_height (); - update_coverage_frames (); + /* tricky. playlist_changed() does this as well, and its really inefficient. */ + update_coverage_samples (); } else { /* layering has probably been modified. reflect this in the canvas. */ layer_regions(); @@ -311,23 +315,23 @@ StreamView::playlist_switched (boost::weak_ptr wtr) /* disconnect from old playlist */ playlist_connections.drop_connections (); - undisplay_track (); + //undisplay_track (); /* draw it */ - + tr->playlist()->freeze(); redisplay_track (); - + tr->playlist()->thaw(); /* update layers count and the y positions and heights of our regions */ _layers = tr->playlist()->top_layer() + 1; update_contents_height (); - update_coverage_frames (); + update_coverage_samples (); /* catch changes */ tr->playlist()->LayeringChanged.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::playlist_layered, this, boost::weak_ptr (tr)), gui_context()); tr->playlist()->RegionAdded.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::add_region_view, this, _1), gui_context()); tr->playlist()->RegionRemoved.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::remove_region_view, this, _1), gui_context()); - tr->playlist()->ContentsChanged.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::update_coverage_frames, this), gui_context()); + tr->playlist()->ContentsChanged.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::update_coverage_samples, this), gui_context()); } @@ -404,13 +408,49 @@ StreamView::transport_looped() Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&StreamView::setup_rec_box, this)); } +void +StreamView::create_rec_box(samplepos_t sample_pos, double width) +{ + const double xstart = _trackview.editor().sample_to_pixel(sample_pos); + const double xend = xstart + width; + const uint32_t fill_color = UIConfiguration::instance().color_mod("recording rect", "recording_rect"); + + ArdourCanvas::Rectangle* rec_rect = new ArdourCanvas::Rectangle(_canvas_group); + rec_rect->set_x0(xstart); + rec_rect->set_y0(0); + rec_rect->set_x1(xend); + rec_rect->set_y1(child_height ()); + rec_rect->set_outline_what(ArdourCanvas::Rectangle::What(0)); + rec_rect->set_outline_color(UIConfiguration::instance().color("recording rect")); + rec_rect->set_fill_color(fill_color); + rec_rect->lower_to_bottom(); + + RecBoxInfo recbox; + recbox.rectangle = rec_rect; + recbox.length = 0; + + if (rec_rects.empty()) { + recbox.start = _trackview.session()->record_location (); + } else { + recbox.start = _trackview.session()->transport_sample (); + } + + rec_rects.push_back (recbox); + + screen_update_connection.disconnect(); + screen_update_connection = Timers::rapid_connect (sigc::mem_fun(*this, &StreamView::update_rec_box)); + + rec_updating = true; + rec_active = true; +} + void StreamView::update_rec_box () { if (rec_active && rec_rects.size() > 0) { /* only update the last box */ RecBoxInfo & rect = rec_rects.back(); - framepos_t const at = _trackview.track()->current_capture_end (); + samplepos_t const at = _trackview.track()->current_capture_end (); double xstart; double xend; @@ -431,7 +471,7 @@ StreamView::update_rec_box () default: fatal << string_compose (_("programming error: %1"), "illegal track mode") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -458,7 +498,7 @@ StreamView::num_selected_regionviews () const uint32_t cnt = 0; for (list::const_iterator i = region_views.begin(); i != region_views.end(); ++i) { - if ((*i)->get_selected()) { + if ((*i)->selected()) { ++cnt; } } @@ -477,7 +517,7 @@ void StreamView::foreach_selected_regionview (sigc::slot slot) { for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - if ((*i)->get_selected()) { + if ((*i)->selected()) { slot (*i); } } @@ -503,18 +543,20 @@ StreamView::set_selected_regionviews (RegionSelection& regions) } } - /** Get selectable things within a given range. - * @param start Start time in session frames. - * @param end End time in session frames. + * @param start Start time in session samples. + * @param end End time in session samples. * @param top Top y range, in trackview coordinates (ie 0 is the top of the track view) * @param bot Bottom y range, in trackview coordinates (ie 0 is the top of the track view) * @param result Filled in with selectable things. */ - void -StreamView::get_selectables (framepos_t start, framepos_t end, double top, double bottom, list& results) +StreamView::get_selectables (samplepos_t start, samplepos_t end, double top, double bottom, list& results, bool within) { + if (_trackview.editor().internal_editing()) { + return; // Don't select regions with an internal tool + } + layer_t min_layer = 0; layer_t max_layer = 0; @@ -546,9 +588,16 @@ StreamView::get_selectables (framepos_t start, framepos_t end, double top, doubl layer_ok = (min_layer <= l && l <= max_layer); } - if ((*i)->region()->coverage (start, end) != Evoral::OverlapNone && layer_ok) { - results.push_back (*i); + if (within) { + if ((*i)->region()->coverage (start, end) == Evoral::OverlapExternal && layer_ok) { + results.push_back (*i); + } + } else { + if ((*i)->region()->coverage (start, end) != Evoral::OverlapNone && layer_ok) { + results.push_back (*i); + } } + } } @@ -574,8 +623,8 @@ StreamView::child_height () const case Expanded: return height / (_layers * 2 + 1); } - - /* NOTREACHED */ + + abort(); /* NOTREACHED */ return height; } @@ -625,21 +674,21 @@ StreamView::set_layer_display (LayerDisplay d) if (_layer_display == Overlaid) { layer_regions (); } - + update_contents_height (); - update_coverage_frames (); + update_coverage_samples (); } void -StreamView::update_coverage_frames () +StreamView::update_coverage_samples () { for (RegionViewList::iterator i = region_views.begin (); i != region_views.end (); ++i) { - (*i)->update_coverage_frames (_layer_display); + (*i)->update_coverage_samples (_layer_display); } } void -StreamView::check_record_layers (boost::shared_ptr region, framepos_t to) +StreamView::check_record_layers (boost::shared_ptr region, samplepos_t to) { if (_new_rec_layer_time < to) { /* The region being recorded has overlapped the start of a top-layered region, so @@ -649,7 +698,7 @@ StreamView::check_record_layers (boost::shared_ptr region, framepos_t to */ /* Stop this happening again */ - _new_rec_layer_time = max_framepos; + _new_rec_layer_time = max_samplepos; /* Make space in the view for the new layer */ ++_layers; @@ -672,22 +721,6 @@ StreamView::setup_new_rec_layer_time (boost::shared_ptr region) if (_layer_display == Stacked) { _new_rec_layer_time = _trackview.track()->playlist()->find_next_top_layer_position (region->start()); } else { - _new_rec_layer_time = max_framepos; + _new_rec_layer_time = max_samplepos; } } - -void -StreamView::enter_internal_edit_mode () -{ - for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - (*i)->hide_rect (); - } -} - -void -StreamView::leave_internal_edit_mode () -{ - for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - (*i)->show_rect (); - } -}