ardour
streamview.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2001, 2006 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18 
19 #include <cmath>
20 
21 #include <gtkmm.h>
22 
23 #include <gtkmm2ext/gtk_ui.h>
24 #include <gtkmm2ext/utils.h>
25 
26 #include "ardour/playlist.h"
27 #include "ardour/region.h"
28 #include "ardour/track.h"
29 #include "ardour/session.h"
30 
31 #include "pbd/compose.h"
32 
33 #include "canvas/rectangle.h"
34 #include "canvas/debug.h"
35 
36 #include "streamview.h"
37 #include "global_signals.h"
38 #include "region_view.h"
39 #include "route_time_axis.h"
40 #include "region_selection.h"
41 #include "selection.h"
42 #include "public_editor.h"
43 #include "ardour_ui.h"
44 #include "timers.h"
45 #include "rgb_macros.h"
46 #include "gui_thread.h"
47 #include "utils.h"
48 
49 #include "i18n.h"
50 
51 using namespace std;
52 using namespace ARDOUR;
53 using namespace ARDOUR_UI_UTILS;
54 using namespace PBD;
55 using namespace Editing;
56 
57 StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Container* canvas_group)
58  : _trackview (tv)
59  , _canvas_group (canvas_group ? canvas_group : new ArdourCanvas::Container (_trackview.canvas_display()))
60  , _samples_per_pixel (_trackview.editor().get_current_zoom ())
61  , rec_updating(false)
62  , rec_active(false)
63  , stream_base_color(0xFFFFFFFF)
64  , _layers (1)
65  , _layer_display (Overlaid)
66  , height (tv.height)
67  , last_rec_data_frame(0)
68 {
69  CANVAS_DEBUG_NAME (_canvas_group, string_compose ("SV canvas group %1", _trackview.name()));
70 
71  /* set_position() will position the group */
72 
73  canvas_rect = new ArdourCanvas::Rectangle (_canvas_group);
74  CANVAS_DEBUG_NAME (canvas_rect, string_compose ("SV canvas rectangle %1", _trackview.name()));
75  canvas_rect->set (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, tv.current_height ()));
76  canvas_rect->set_outline (false);
77  canvas_rect->set_fill (true);
78  canvas_rect->Event.connect (sigc::bind (sigc::mem_fun (_trackview.editor(), &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
79 
80  if (_trackview.is_track()) {
81  _trackview.track()->DiskstreamChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::diskstream_changed, this), gui_context());
82  _trackview.track()->RecordEnableChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context());
83 
84  _trackview.session()->TransportStateChange.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_changed, this), gui_context());
85  _trackview.session()->TransportLooped.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_looped, this), gui_context());
86  _trackview.session()->RecordStateChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::sess_rec_enable_changed, this), gui_context());
87  }
88 
89  ColorsChanged.connect (sigc::mem_fun (*this, &StreamView::color_handler));
90 }
91 
93 {
94  undisplay_track ();
95 
96  delete canvas_rect;
97 }
98 
99 void
101 {
102  if (_trackview.is_track()) {
104  }
105 }
106 
107 int
108 StreamView::set_position (gdouble x, gdouble y)
109 {
110  _canvas_group->set_position (ArdourCanvas::Duple (x, y));
111  return 0;
112 }
113 
114 int
116 {
117  /* limit the values to something sane-ish */
118 
119  if (h < 10.0 || h > 1000.0) {
120  return -1;
121  }
122 
123  if (canvas_rect->y1() == h) {
124  return 0;
125  }
126 
127  height = h;
128  canvas_rect->set_y1 (height);
130 
131  return 0;
132 }
133 
134 int
136 {
137  RegionViewList::iterator i;
138 
139  if (fpp < 1.0) {
140  return -1;
141  }
142 
143  _samples_per_pixel = fpp;
144 
145  for (i = region_views.begin(); i != region_views.end(); ++i) {
146  (*i)->set_samples_per_pixel (fpp);
147  }
148 
149  for (vector<RecBoxInfo>::iterator xi = rec_rects.begin(); xi != rec_rects.end(); ++xi) {
150  RecBoxInfo &recbox = (*xi);
151 
152  ArdourCanvas::Coord const xstart = _trackview.editor().sample_to_pixel (recbox.start);
153  ArdourCanvas::Coord const xend = _trackview.editor().sample_to_pixel (recbox.start + recbox.length);
154 
155  recbox.rectangle->set_x0 (xstart);
156  recbox.rectangle->set_x1 (xend);
157  }
158 
160 
161  return 0;
162 }
163 
164 void
166 {
167  boost::shared_ptr<Region> r (wr.lock());
168  if (!r) {
169  return;
170  }
171 
172  add_region_view_internal (r, true);
173 
176  }
177 }
178 
179 void
181 {
183 
184  boost::shared_ptr<Region> r (weak_r.lock());
185 
186  if (!r) {
187  return;
188  }
189 
190  for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
191  if (((*i)->region()) == r) {
192  RegionView* rv = *i;
193  region_views.erase (i);
194  delete rv;
195  break;
196  }
197  }
198 
199  RegionViewRemoved (); /* EMIT SIGNAL */
200 }
201 
202 void
204 {
205  for (RegionViewList::iterator i = region_views.begin(); i != region_views.end() ; ) {
206  RegionViewList::iterator next = i;
207  ++next;
208  delete *i;
209  i = next;
210  }
211 
212  region_views.clear();
213 }
214 
215 void
217 {
219  playlist_switched (tr);
221 }
222 
223 void
225 {
226  // In one traversal of the region view list:
227  // - Build a list of region views sorted by layer
228  // - Remove invalid views from the actual region view list
229  RegionViewList copy;
230  list<RegionView*>::iterator i, tmp;
231  for (i = region_views.begin(); i != region_views.end(); ) {
232  tmp = i;
233  tmp++;
234 
235  if (!(*i)->is_valid()) {
236  delete *i;
237  region_views.erase (i);
238  i = tmp;
239  continue;
240  } else {
241  (*i)->enable_display(true);
242  }
243 
244  if (copy.size() == 0) {
245  copy.push_front((*i));
246  i = tmp;
247  continue;
248  }
249 
250  RegionViewList::iterator k = copy.begin();
251  RegionViewList::iterator l = copy.end();
252  l--;
253 
254  if ((*i)->region()->layer() <= (*k)->region()->layer()) {
255  copy.push_front((*i));
256  i = tmp;
257  continue;
258  } else if ((*i)->region()->layer() >= (*l)->region()->layer()) {
259  copy.push_back((*i));
260  i = tmp;
261  continue;
262  }
263 
264  for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
265  if ((*j)->region()->layer() >= (*i)->region()->layer()) {
266  copy.insert(j, (*i));
267  break;
268  }
269  }
270 
271  i = tmp;
272  }
273 
274  // Fix canvas layering by raising each to the top in the sorted order.
275  for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) {
276  (*i)->get_canvas_group()->raise_to_top ();
277  }
278 }
279 
280 void
282 {
283  boost::shared_ptr<Track> tr (wtr.lock());
284 
285  if (!tr) {
286  return;
287  }
288 
289  /* update layers count and the y positions and heights of our regions */
290  if (tr->playlist()) {
291  _layers = tr->playlist()->top_layer() + 1;
292  }
293 
294  if (_layer_display == Stacked) {
297  } else {
298  /* layering has probably been modified. reflect this in the canvas. */
299  layer_regions();
300  }
301 }
302 
303 void
305 {
306  boost::shared_ptr<Track> tr (wtr.lock());
307 
308  if (!tr) {
309  return;
310  }
311 
312  /* disconnect from old playlist */
313 
315  undisplay_track ();
316 
317  /* draw it */
318 
319  redisplay_track ();
320 
321  /* update layers count and the y positions and heights of our regions */
322  _layers = tr->playlist()->top_layer() + 1;
325 
326  /* catch changes */
327 
328  tr->playlist()->LayeringChanged.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::playlist_layered, this, boost::weak_ptr<Track> (tr)), gui_context());
329  tr->playlist()->RegionAdded.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::add_region_view, this, _1), gui_context());
330  tr->playlist()->RegionRemoved.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::remove_region_view, this, _1), gui_context());
331  tr->playlist()->ContentsChanged.connect (playlist_connections, invalidator (*this), boost::bind (&StreamView::update_coverage_frames, this), gui_context());
332 }
333 
334 
335 void
337 {
339 
340  if ((t = _trackview.track()) != 0) {
341  Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&StreamView::display_track, this, t));
342  } else {
344  }
345 }
346 
347 void
348 StreamView::apply_color (Gdk::Color const& c, ColorTarget target)
349 {
350  return apply_color (gdk_color_to_rgba (c), target);
351 }
352 
353 void
355 {
356  list<RegionView *>::iterator i;
357 
358  switch (target) {
359  case RegionColor:
361  for (i = region_views.begin(); i != region_views.end(); ++i) {
362  (*i)->set_color (region_color);
363  }
364  break;
365 
366  case StreamBaseColor:
368  canvas_rect->set_fill_color (stream_base_color);
369  break;
370  }
371 }
372 
373 void
375 {
376  /* don't ever leave it at the bottom, since then it doesn't
377  get events - the parent group does instead ...
378  */
379  rv->get_canvas_group()->raise (rv->region()->layer());
380 }
381 
382 void
384 {
385  setup_rec_box ();
386 }
387 
388 void
390 {
391  setup_rec_box ();
392 }
393 
394 void
396 {
397  setup_rec_box ();
398 }
399 
400 void
402 {
403  // to force a new rec region
404  rec_active = false;
405  Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&StreamView::setup_rec_box, this));
406 }
407 
408 void
409 StreamView::create_rec_box(framepos_t frame_pos, double width)
410 {
411  const double xstart = _trackview.editor().sample_to_pixel(frame_pos);
412  const double xend = xstart + width;
413  const uint32_t fill_color = ARDOUR_UI::config()->color_mod("recording rect", "recording_rect");
414 
415  ArdourCanvas::Rectangle* rec_rect = new ArdourCanvas::Rectangle(_canvas_group);
416  rec_rect->set_x0(xstart);
417  rec_rect->set_y0(0);
418  rec_rect->set_x1(xend);
419  rec_rect->set_y1(child_height ());
420  rec_rect->set_outline_what(ArdourCanvas::Rectangle::What(0));
421  rec_rect->set_outline_color(ARDOUR_UI::config()->color("recording rect"));
422  rec_rect->set_fill_color(fill_color);
423  rec_rect->lower_to_bottom();
424 
425  RecBoxInfo recbox;
426  recbox.rectangle = rec_rect;
427  recbox.length = 0;
428 
429  if (rec_rects.empty()) {
430  recbox.start = _trackview.session()->record_location ();
431  } else {
432  recbox.start = _trackview.session()->transport_frame ();
433  }
434 
435  rec_rects.push_back (recbox);
436 
437  screen_update_connection.disconnect();
439 
440  rec_updating = true;
441  rec_active = true;
442 }
443 
444 void
446 {
447  if (rec_active && rec_rects.size() > 0) {
448  /* only update the last box */
449  RecBoxInfo & rect = rec_rects.back();
451  double xstart;
452  double xend;
453 
454  switch (_trackview.track()->mode()) {
455 
456  case NonLayered:
457  case Normal:
458  rect.length = at - rect.start;
459  xstart = _trackview.editor().sample_to_pixel (rect.start);
460  xend = _trackview.editor().sample_to_pixel (at);
461  break;
462 
463  case Destructive:
464  rect.length = 2;
466  xend = _trackview.editor().sample_to_pixel (at);
467  break;
468 
469  default:
470  fatal << string_compose (_("programming error: %1"), "illegal track mode") << endmsg;
471  abort(); /*NOTREACHED*/
472  return;
473  }
474 
475  rect.rectangle->set_x0 (xstart);
476  rect.rectangle->set_x1 (xend);
477  }
478 }
479 
480 RegionView*
482 {
483  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
484 
485  if ((*i)->region() == region) {
486  return *i;
487  }
488  }
489  return 0;
490 }
491 
492 uint32_t
494 {
495  uint32_t cnt = 0;
496 
497  for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
498  if ((*i)->get_selected()) {
499  ++cnt;
500  }
501  }
502  return cnt;
503 }
504 
505 void
506 StreamView::foreach_regionview (sigc::slot<void,RegionView*> slot)
507 {
508  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
509  slot (*i);
510  }
511 }
512 
513 void
514 StreamView::foreach_selected_regionview (sigc::slot<void,RegionView*> slot)
515 {
516  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
517  if ((*i)->get_selected()) {
518  slot (*i);
519  }
520  }
521 }
522 
523 void
525 {
526  bool selected;
527 
528  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
529 
530  selected = false;
531 
532  for (RegionSelection::iterator ii = regions.begin(); ii != regions.end(); ++ii) {
533  if (*i == *ii) {
534  selected = true;
535  break;
536  }
537  }
538 
539  (*i)->set_selected (selected);
540  }
541 }
542 
550 void
551 StreamView::get_selectables (framepos_t start, framepos_t end, double top, double bottom, list<Selectable*>& results, bool within)
552 {
554  return; // Don't select regions with an internal tool
555  }
556 
557  layer_t min_layer = 0;
558  layer_t max_layer = 0;
559 
560  if (_layer_display == Stacked) {
561  double const c = child_height ();
562 
563  int const mi = _layers - ((bottom - _trackview.y_position()) / c);
564  if (mi < 0) {
565  min_layer = 0;
566  } else {
567  min_layer = mi;
568  }
569 
570  int const ma = _layers - ((top - _trackview.y_position()) / c);
571  if (ma > (int) _layers) {
572  max_layer = _layers - 1;
573  } else {
574  max_layer = ma;
575  }
576 
577  }
578 
579  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
580 
581  bool layer_ok = true;
582 
583  if (_layer_display == Stacked) {
584  layer_t const l = (*i)->region()->layer ();
585  layer_ok = (min_layer <= l && l <= max_layer);
586  }
587 
588  if (within) {
589  if ((*i)->region()->coverage (start, end) == Evoral::OverlapExternal && layer_ok) {
590  results.push_back (*i);
591  }
592  } else {
593  if ((*i)->region()->coverage (start, end) != Evoral::OverlapNone && layer_ok) {
594  results.push_back (*i);
595  }
596  }
597 
598  }
599 }
600 
601 void
602 StreamView::get_inverted_selectables (Selection& sel, list<Selectable*>& results)
603 {
604  for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
605  if (!sel.regions.contains (*i)) {
606  results.push_back (*i);
607  }
608  }
609 }
610 
612 double
614 {
615  switch (_layer_display) {
616  case Overlaid:
617  return height;
618  case Stacked:
619  return height / _layers;
620  case Expanded:
621  return height / (_layers * 2 + 1);
622  }
623 
624  abort(); /* NOTREACHED */
625  return height;
626 }
627 
628 void
630 {
631  const double h = child_height ();
632 
633  for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
634  switch (_layer_display) {
635  case Overlaid:
636  (*i)->set_y (0);
637  break;
638  case Stacked:
639  (*i)->set_y (height - ((*i)->region()->layer() + 1) * h);
640  break;
641  case Expanded:
642  (*i)->set_y (height - ((*i)->region()->layer() + 1) * 2 * h);
643  break;
644  }
645 
646  (*i)->set_height (h);
647  }
648 
649  for (vector<RecBoxInfo>::iterator i = rec_rects.begin(); i != rec_rects.end(); ++i) {
650  switch (_layer_display) {
651  case Overlaid:
652  i->rectangle->set_y1 (height);
653  break;
654  case Stacked:
655  case Expanded:
656  /* In stacked displays, the recregion is always at the top */
657  i->rectangle->set_y0 (0);
658  i->rectangle->set_y1 (h);
659  break;
660  }
661  }
662 
663  ContentsHeightChanged (); /* EMIT SIGNAL */
664 }
665 
666 void
668 {
669  _layer_display = d;
670 
671  if (_layer_display == Overlaid) {
672  layer_regions ();
673  }
674 
677 }
678 
679 void
681 {
682  for (RegionViewList::iterator i = region_views.begin (); i != region_views.end (); ++i) {
683  (*i)->update_coverage_frames (_layer_display);
684  }
685 }
686 
687 void
689 {
690  if (_new_rec_layer_time < to) {
691  /* The region being recorded has overlapped the start of a top-layered region, so
692  `fake' a new visual layer for the recording. This is only a visual thing for now,
693  as the proper layering will get sorted out when the recorded region is added to
694  its playlist.
695  */
696 
697  /* Stop this happening again */
699 
700  /* Make space in the view for the new layer */
701  ++_layers;
702 
703  /* Set the temporary region to the correct layer so that it gets drawn correctly */
704  region->set_layer (_layers - 1);
705 
706  /* and reset the view */
708  }
709 }
710 
711 void
713 {
714  /* If we are in Stacked mode, we may need to (visually) create a new layer to put the
715  recorded region in. To work out where this needs to happen, find the start of the next
716  top-layered region after the start of the region we are recording and make a note of it.
717  */
718  if (_layer_display == Stacked) {
720  } else {
722  }
723 }
RegionView * find_view(boost::shared_ptr< const ARDOUR::Region >)
Definition: streamview.cc:481
void transport_changed()
Definition: streamview.cc:395
void transport_looped()
Definition: streamview.cc:401
virtual void color_handler()=0
ArdourCanvas::Item * get_canvas_group()
LIBPBD_API Transmitter fatal
int set_position(gdouble x, gdouble y)
Definition: streamview.cc:108
void diskstream_changed()
Definition: streamview.cc:336
virtual void update_contents_height()
Definition: streamview.cc:629
void rec_enable_changed()
Definition: streamview.cc:383
bool rec_updating
Definition: streamview.h:163
PBD::Signal0< void > TransportStateChange
Definition: session.h:308
void layer_regions()
Definition: streamview.cc:224
PublicEditor & editor() const
void setup_new_rec_layer_time(boost::shared_ptr< ARDOUR::Region >)
Definition: streamview.cc:712
framepos_t record_location() const
Definition: session.h:552
PBD::Signal0< void > DiskstreamChanged
Definition: track.h:163
std::string name() const
uint32_t num_selected_regionviews() const
Definition: streamview.cc:493
virtual bool canvas_stream_view_event(GdkEvent *event, ArdourCanvas::Item *, RouteTimeAxisView *)=0
void set_layer_display(LayerDisplay)
Definition: streamview.cc:667
double _samples_per_pixel
Definition: streamview.h:158
virtual void redisplay_track()=0
PBD::ScopedConnectionList playlist_connections
Definition: streamview.h:169
ArdourCanvas::Container * _canvas_group
Definition: streamview.h:152
virtual RegionView * add_region_view_internal(boost::shared_ptr< ARDOUR::Region >, bool wait_for_waves, bool recording=false)=0
virtual int set_height(double)
Definition: streamview.cc:115
void sess_rec_enable_changed()
Definition: streamview.cc:389
virtual void undisplay_track()
Definition: streamview.cc:203
Lists of selected things.
Definition: selection.h:66
void display_track(boost::shared_ptr< ARDOUR::Track >)
Definition: streamview.cc:216
PBD::Signal0< void > TransportLooped
Definition: session.h:312
framepos_t current_capture_end() const
Definition: track.cc:807
void get_selectables(ARDOUR::framepos_t, ARDOUR::framepos_t, double, double, std::list< Selectable * > &, bool within=false)
Definition: streamview.cc:551
Definition: Beats.hpp:239
virtual double sample_to_pixel(framepos_t frame) const =0
framepos_t start
Definition: streamview.h:50
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
virtual void remove_region_view(boost::weak_ptr< ARDOUR::Region >)
Definition: streamview.cc:180
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
uint32_t current_height() const
double y_position() const
#define ENSURE_GUI_THREAD(obj, method,...)
Definition: gui_thread.h:34
std::vector< RecBoxInfo > rec_rects
Definition: streamview.h:161
#define invalidator(x)
Definition: gui_thread.h:40
void set_selected_regionviews(RegionSelection &)
Definition: streamview.cc:524
static UI * instance()
Definition: gtk_ui.h:119
virtual void playlist_layered(boost::weak_ptr< ARDOUR::Track >)
Definition: streamview.cc:281
std::list< RegionView * > RegionViewList
Definition: streamview.h:155
#define _(Text)
Definition: i18n.h:11
framepos_t _new_rec_layer_time
Definition: streamview.h:183
PBD::ScopedConnection playlist_switched_connection
Definition: streamview.h:170
void foreach_selected_regionview(sigc::slot< void, RegionView * > slot)
Definition: streamview.cc:514
bool contains(RegionView *) const
void foreach_regionview(sigc::slot< void, RegionView * > slot)
Definition: streamview.cc:506
uint32_t gdk_color_to_rgba(Gdk::Color const &)
Definition: utils.cc:285
void set_layer(layer_t l)
Definition: region.cc:1130
boost::shared_ptr< ARDOUR::Region > region() const
Definition: region_view.h:66
Definition: enums.h:35
StreamView(RouteTimeAxisView &, ArdourCanvas::Container *canvas_group=0)
Definition: streamview.cc:57
void attach()
Definition: streamview.cc:100
virtual void update_rec_box()
Definition: streamview.cc:445
void check_record_layers(boost::shared_ptr< ARDOUR::Region >, ARDOUR::framepos_t)
Definition: streamview.cc:688
virtual void setup_rec_box()=0
framepos_t transport_frame() const
Definition: session.h:551
Definition: amp.h:29
ARDOUR::Session * session() const
Definition: axis_view.h:52
ArdourCanvas::Rectangle * rectangle
Definition: streamview.h:49
boost::shared_ptr< ARDOUR::Track > track() const
Definition: route_ui.cc:1738
#define gui_context()
Definition: gui_thread.h:36
Definition: enums.h:36
sigc::signal< void > ContentsHeightChanged
Definition: streamview.h:125
boost::shared_ptr< Playlist > playlist()
Definition: track.cc:590
uint32_t layer_t
Definition: types.h:59
RegionSelection regions
Definition: selection.h:82
int64_t framepos_t
Definition: types.h:66
uint32_t stream_base_color
Background color.
Definition: streamview.h:167
RouteTimeAxisView & _trackview
Definition: streamview.h:151
virtual int set_samples_per_pixel(double)
Definition: streamview.cc:135
void create_rec_box(framepos_t frame_pos, double width)
Definition: streamview.cc:409
layer_t layer() const
Definition: region.h:115
LIBARDOUR_API PBD::PropertyDescriptor< bool > regions
Definition: playlist.cc:51
PBD::Signal0< void > RecordStateChanged
Definition: session.h:297
RegionViewList region_views
Definition: streamview.h:156
bool is_track() const
Definition: route_ui.cc:1732
PBD::Signal0< void > PlaylistChanged
Definition: track.h:166
void call_slot(EventLoop::InvalidationRecord *, const boost::function< void()> &)
Definition: abstract_ui.cc:368
sigc::connection screen_update_connection
Definition: streamview.h:160
void get_inverted_selectables(Selection &, std::list< Selectable * > &results)
Definition: streamview.cc:602
ArdourCanvas::Rectangle * canvas_rect
Definition: streamview.h:153
virtual ~StreamView()
Definition: streamview.cc:92
virtual bool internal_editing() const =0
bool rec_active
Definition: streamview.h:164
void update_coverage_frames()
Definition: streamview.cc:680
void playlist_switched(boost::weak_ptr< ARDOUR::Track >)
Definition: streamview.cc:304
double child_height() const
Definition: streamview.cc:613
ArdourCanvas::Color color_mod(std::string const &color, std::string const &modifier) const
Definition: ui_config.cc:555
static UIConfiguration * config()
Definition: ardour_ui.h:188
void add_region_view(boost::weak_ptr< ARDOUR::Region >)
Definition: streamview.cc:165
sigc::signal< void > ColorsChanged
Definition: debug.h:30
framepos_t find_next_top_layer_position(framepos_t) const
Definition: playlist.cc:2879
PBD::Signal0< void > RecordEnableChanged
Definition: track.h:167
TrackMode mode() const
Definition: track.h:49
LayerDisplay
Definition: enums.h:34
static const framepos_t max_framepos
Definition: types.h:78
framepos_t start() const
Definition: region.h:113
ARDOUR::layer_t _layers
Definition: streamview.h:172
void apply_color(uint32_t, ColorTarget t)
Definition: streamview.cc:354
LayerDisplay _layer_display
Definition: streamview.h:173
sigc::connection rapid_connect(const sigc::slot< void > &slot)
Definition: timers.cc:183
Definition: enums.h:37
uint32_t region_color
Contained region color.
Definition: streamview.h:166
void region_layered(RegionView *)
Definition: streamview.cc:374
ARDOUR::framecnt_t length
Definition: streamview.h:51
framepos_t current_capture_start() const
Definition: track.cc:801
double height
Definition: streamview.h:175
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208
static const layer_t max_layer
Definition: types.h:80
sigc::signal< void > RegionViewRemoved
Definition: streamview.h:123
LIBARDOUR_API PBD::PropertyDescriptor< bool > color
Definition: route_group.cc:50