StreamView::StreamView (RouteTimeAxisView& tv)
: _trackview (tv)
+ , canvas_group(new ArdourCanvas::Group(*_trackview.canvas_display))
+ , canvas_rect(new ArdourCanvas::SimpleRect (*canvas_group))
+ , _samples_per_unit(_trackview.editor.get_current_zoom())
+ , rec_updating(false)
+ , rec_active(false)
+ , use_rec_regions(tv.editor.show_waveforms_recording())
+ , region_color(_trackview.color())
+ , stream_base_color(0xFFFFFFFF)
{
- region_color = _trackview.color();
-
/* set_position() will position the group */
- canvas_group = new ArdourCanvas::Group(*_trackview.canvas_display);
-
canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group);
canvas_rect->property_x1() = 0.0;
canvas_rect->property_y1() = 0.0;
- canvas_rect->property_x2() = 1000000.0;
+ canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames);
canvas_rect->property_y2() = (double) tv.height;
canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom
- canvas_rect->property_fill_color_rgba() = stream_base_color;
+ // (Fill/Outline colours set in derived classes)
canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
- _samples_per_unit = _trackview.editor.get_current_zoom();
-
if (_trackview.is_track()) {
_trackview.track()->DiskstreamChanged.connect (mem_fun (*this, &StreamView::diskstream_changed));
_trackview.session().TransportStateChange.connect (mem_fun (*this, &StreamView::transport_changed));
_trackview.session().RecordStateChanged.connect (mem_fun (*this, &StreamView::sess_rec_enable_changed));
}
- rec_updating = false;
- rec_active = false;
- use_rec_regions = tv.editor.show_waveforms_recording ();
-
ColorChanged.connect (mem_fun (*this, &StreamView::color_handler));
}
}
void
-StreamView::add_region_view (Region *r)
+StreamView::add_region_view (boost::shared_ptr<Region> r)
{
add_region_view_internal (r, true);
}
void
-StreamView::remove_region_view (Region *r)
+StreamView::remove_region_view (boost::weak_ptr<Region> weak_r)
{
- ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::remove_region_view), r));
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::remove_region_view), weak_r));
+
+ boost::shared_ptr<Region> r (weak_r.lock());
+
+ if (!r) {
+ return;
+ }
for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- if (&((*i)->region()) == r) {
+ if (((*i)->region()) == r) {
delete *i;
region_views.erase (i);
break;
}
}
-void
-StreamView::remove_rec_region (Region *r)
-{
- ENSURE_GUI_THREAD(bind (mem_fun (*this, &StreamView::remove_rec_region), r));
-
- if (!Gtkmm2ext::UI::instance()->caller_is_ui_thread()) {
- fatal << "region deleted from non-GUI thread!" << endmsg;
- /*NOTREACHED*/
- }
-
- for (list<Region *>::iterator i = rec_regions.begin(); i != rec_regions.end(); ++i) {
- if (*i == r) {
- rec_regions.erase (i);
- break;
- }
- }
-}
-
void
StreamView::undisplay_diskstream ()
{
}
void
-StreamView::display_diskstream (Diskstream *ds)
+StreamView::display_diskstream (boost::shared_ptr<Diskstream> ds)
{
playlist_change_connection.disconnect();
playlist_changed (ds);
{
ENSURE_GUI_THREAD (mem_fun (*this, &StreamView::playlist_modified));
- for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- region_layered (*i);
- }
+ redisplay_diskstream ();
}
void
-StreamView::playlist_changed (Diskstream *ds)
+StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
{
ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_changed), ds));
/* catch changes */
- playlist_connections.push_back (ds->playlist()->RegionAdded.connect (mem_fun (*this, &StreamView::add_region_view)));
- playlist_connections.push_back (ds->playlist()->RegionRemoved.connect (mem_fun (*this, &StreamView::remove_region_view)));
- playlist_connections.push_back (ds->playlist()->StateChanged.connect (mem_fun (*this, &StreamView::playlist_state_changed)));
playlist_connections.push_back (ds->playlist()->Modified.connect (mem_fun (*this, &StreamView::playlist_modified)));
}
-void
-StreamView::playlist_state_changed (Change ignored)
-{
- ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_state_changed), ignored));
-
- redisplay_diskstream ();
-}
-
void
StreamView::diskstream_changed ()
{
Track *t;
if ((t = _trackview.track()) != 0) {
- Diskstream& ds = t->diskstream();
- /* XXX grrr: when will SigC++ allow me to bind references? */
- Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun (*this, &StreamView::display_diskstream), &ds));
+ Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun (*this, &StreamView::display_diskstream), t->diskstream()));
} else {
Gtkmm2ext::UI::instance()->call_slot (mem_fun (*this, &StreamView::undisplay_diskstream));
}
for (i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_color (region_color);
}
- // stream_base_color = RGBA_TO_UINT (color.red/256, color.green/256, color.blue/256, 255);
- // gnome_canvas_item_set (canvas_rect, "fill_color_rgba", stream_base_color, NULL);
break;
case StreamBaseColor:
- // stream_base_color = RGBA_TO_UINT (color.red/256, color.green/256, color.blue/256, 255);
- // gnome_canvas_item_set (canvas_rect, "fill_color_rgba", stream_base_color, NULL);
+ stream_base_color = RGBA_TO_UINT (
+ color.get_red_p(), color.get_green_p(), color.get_blue_p(), 255);
+ canvas_rect->property_fill_color_rgba() = stream_base_color;
break;
}
}
get events - the parent group does instead ...
*/
- rv->get_canvas_group()->raise (rv->region().layer() + 1);
+ /* this used to be + 1, but regions to the left ended up below
+ ..something.. and couldn't receive events. why? good question.
+ */
+ rv->get_canvas_group()->raise (rv->region()->layer() + 2);
}
void
if (rec_active && rec_rects.size() > 0) {
/* only update the last box */
RecBoxInfo & rect = rec_rects.back();
- jack_nframes_t at = _trackview.get_diskstream()->current_capture_end();
+ nframes_t at = _trackview.get_diskstream()->current_capture_end();
double xstart;
double xend;
}
RegionView*
-StreamView::find_view (const Region& region)
+StreamView::find_view (boost::shared_ptr<const Region> region)
{
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- if (&(*i)->region() == ®ion) {
+ if ((*i)->region() == region) {
return *i;
}
}
}
void
-StreamView::get_selectables (jack_nframes_t start, jack_nframes_t end, list<Selectable*>& results)
+StreamView::get_selectables (nframes_t start, nframes_t end, list<Selectable*>& results)
{
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- if ((*i)->region().coverage(start, end) != OverlapNone) {
+ if ((*i)->region()->coverage(start, end) != OverlapNone) {
results.push_back (*i);
}
}