X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fstreamview.cc;h=bcab05b9c81095eb3c1041f42274fef5669c4bb8;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=404b934562b60cf0d53d50db33247b8c24f843b4;hpb=2ba58dfe65bb0c5ba7d5eb18a1566fa79eeb6993;p=ardour.git diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 404b934562..bcab05b9c8 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -34,27 +34,28 @@ #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; +using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Editing; -StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* canvas_group) +StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Container* canvas_group) : _trackview (tv) - , _canvas_group (canvas_group ? canvas_group : new ArdourCanvas::Group (_trackview.canvas_display())) + , _canvas_group (canvas_group ? canvas_group : new ArdourCanvas::Container (_trackview.canvas_display())) , _samples_per_pixel (_trackview.editor().get_current_zoom ()) , rec_updating(false) , rec_active(false) @@ -65,27 +66,26 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* canvas_group , last_rec_data_frame(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 ())); - canvas_rect->set_outline_what (ArdourCanvas::Rectangle::BOTTOM); - canvas_rect->set_outline_color (RGBA_TO_UINT (0, 0, 0, 255)); + 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 () @@ -114,11 +114,12 @@ 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) { + if (height == h) { return 0; } @@ -138,6 +139,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) { @@ -291,6 +296,7 @@ StreamView::playlist_layered (boost::weak_ptr wtr) if (_layer_display == Stacked) { update_contents_height (); + /* tricky. playlist_changed() does this as well, and its really inefficient. */ update_coverage_frames (); } else { /* layering has probably been modified. reflect this in the canvas. */ @@ -310,12 +316,12 @@ 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 (); @@ -343,7 +349,13 @@ StreamView::diskstream_changed () } void -StreamView::apply_color (Gdk::Color color, ColorTarget target) +StreamView::apply_color (Gdk::Color const& c, ColorTarget target) +{ + return apply_color (gdk_color_to_rgba (c), target); +} + +void +StreamView::apply_color (uint32_t color, ColorTarget target) { list::iterator i; @@ -356,7 +368,7 @@ StreamView::apply_color (Gdk::Color color, ColorTarget target) break; case StreamBaseColor: - stream_base_color = RGBA_TO_UINT (color.get_red_p(), color.get_green_p(), color.get_blue_p(), 255); + stream_base_color = color; canvas_rect->set_fill_color (stream_base_color); break; } @@ -397,6 +409,42 @@ StreamView::transport_looped() Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&StreamView::setup_rec_box, this)); } +void +StreamView::create_rec_box(framepos_t frame_pos, double width) +{ + const double xstart = _trackview.editor().sample_to_pixel(frame_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_frame (); + } + + 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 () { @@ -424,7 +472,7 @@ StreamView::update_rec_box () default: fatal << string_compose (_("programming error: %1"), "illegal track mode") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -451,7 +499,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; } } @@ -470,7 +518,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); } } @@ -496,7 +544,6 @@ 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. @@ -504,10 +551,13 @@ StreamView::set_selected_regionviews (RegionSelection& regions) * @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 (framepos_t start, framepos_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; @@ -539,9 +589,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); + } } + } } @@ -567,8 +624,8 @@ StreamView::child_height () const case Expanded: return height / (_layers * 2 + 1); } - - /* NOTREACHED */ + + abort(); /* NOTREACHED */ return height; } @@ -618,7 +675,7 @@ StreamView::set_layer_display (LayerDisplay d) if (_layer_display == Overlaid) { layer_regions (); } - + update_contents_height (); update_coverage_frames (); } @@ -668,19 +725,3 @@ StreamView::setup_new_rec_layer_time (boost::shared_ptr region) _new_rec_layer_time = max_framepos; } } - -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 (); - } -}