diff options
Diffstat (limited to 'gtk2_ardour/time_axis_view.cc')
-rw-r--r-- | gtk2_ardour/time_axis_view.cc | 178 |
1 files changed, 76 insertions, 102 deletions
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 2cc2adf761..fa181476cf 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -23,9 +23,6 @@ #include <string> #include <list> -#include <libgnomecanvasmm.h> -#include <libgnomecanvasmm/canvas.h> -#include <libgnomecanvasmm/item.h> #include "pbd/error.h" #include "pbd/convert.h" @@ -34,6 +31,10 @@ #include <gtkmm2ext/utils.h> #include <gtkmm2ext/selector.h> +#include "canvas/canvas.h" +#include "canvas/rectangle.h" +#include "canvas/debug.h" + #include "ardour_ui.h" #include "ardour_dialog.h" #include "global_signals.h" @@ -42,8 +43,6 @@ #include "time_axis_view.h" #include "region_view.h" #include "ghostregion.h" -#include "simplerect.h" -#include "simpleline.h" #include "selection.h" #include "keyboard.h" #include "rgb_macros.h" @@ -97,15 +96,14 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie compute_heights (); } - _canvas_background = new Group (*ed.get_background_group (), 0.0, 0.0); - _canvas_display = new Group (*ed.get_trackview_group (), 0.0, 0.0); + _canvas_display = new Group (ed.get_trackview_group (), ArdourCanvas::Duple (0.0, 0.0)); _canvas_display->hide(); // reveal as needed - selection_group = new Group (*_canvas_display); + selection_group = new Group (_canvas_display); selection_group->set_data (X_("timeselection"), (void *) 1); selection_group->hide(); - _ghost_group = new Group (*_canvas_display); + _ghost_group = new Group (_canvas_display); _ghost_group->lower_to_bottom(); _ghost_group->show(); @@ -180,7 +178,7 @@ TimeAxisView::~TimeAxisView() } for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) { - delete (*i)->rect; + delete (*i)->rect; delete (*i)->start_trim; delete (*i)->end_trim; @@ -195,9 +193,6 @@ TimeAxisView::~TimeAxisView() delete selection_group; selection_group = 0; - delete _canvas_background; - _canvas_background = 0; - delete _canvas_display; _canvas_display = 0; @@ -215,7 +210,6 @@ TimeAxisView::hide () } _canvas_display->hide (); - _canvas_background->hide (); if (control_parent) { control_parent->remove (time_axis_vbox); @@ -260,19 +254,12 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent) _order = nth; if (_y_position != y) { - _canvas_display->property_y () = y; - _canvas_background->property_y () = y; - /* silly canvas */ - _canvas_display->move (0.0, 0.0); - _canvas_background->move (0.0, 0.0); + _canvas_display->set_y_position (y); _y_position = y; } - _canvas_background->raise_to_top (); _canvas_display->raise_to_top (); - - _canvas_background->show (); _canvas_display->show (); _hidden = false; @@ -293,21 +280,6 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent) return _effective_height; } -void -TimeAxisView::clip_to_viewport () -{ - if (marked_for_display()) { - if (_y_position + _effective_height < _editor.get_trackview_group_vertical_offset () || _y_position > _editor.get_trackview_group_vertical_offset () + _canvas_display->get_canvas()->get_height()) { - _canvas_background->hide (); - _canvas_display->hide (); - return; - } - _canvas_background->show (); - _canvas_display->show (); - } - return; -} - bool TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) { @@ -389,15 +361,33 @@ bool TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) { if (_resize_drag_start >= 0) { - /* (ab)use the DragManager to do autoscrolling; adjust the event coordinates - into the world coordinate space that DragManager::motion_handler is expecting, - and then fake a DragManager motion event so that when maybe_autoscroll - asks DragManager for the current pointer position it will get the correct - answers. + + /* (ab)use the DragManager to do autoscrolling - basically we + * are pretending that the drag is taking place over the canvas + * (which perhaps in the glorious future, when track headers + * and the canvas are unified, will actually be true.) + * + * First, translate the event coordinates into the canvas + * coordinate space that DragManager::motion_handler is + * expecting (this requires translation into the *window* + * coordinates for the track canvas window, and then conversion + * from window to canvas coordinate spaces). + * + * Then fake a DragManager motion event so that when + * maybe_autoscroll asks DragManager for the current pointer + * position it will get the correct answers. */ + int tx, ty; - controls_ebox.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty); - ev->y = ty - _editor.get_trackview_group_vertical_offset(); + controls_ebox.translate_coordinates (*_editor.get_track_canvas(), ev->x, ev->y, tx, ty); + + /* x-axis of track headers is not shared with the canvas, but + the y-axis is, so we we can get a valid translation here. + */ + + Duple canvas_coord = _editor.get_track_canvas()->canvas()->window_to_canvas (Duple (tx, ty)); + ev->y = (int) floor (canvas_coord.y); + _editor.drags()->motion_handler ((GdkEvent *) ev, false); _editor.maybe_autoscroll (false, true, false, ev->y_root < _resize_drag_start); @@ -547,7 +537,7 @@ TimeAxisView::set_height (uint32_t h) (*i)->set_height (); } - if (canvas_item_visible (selection_group)) { + if (selection_group->visible ()) { /* resize the selection rect */ show_selection (_editor.get_selection().time); } @@ -809,14 +799,11 @@ TimeAxisView::build_display_menu () } void -TimeAxisView::set_samples_per_unit (double spu) +TimeAxisView::set_samples_per_pixel (double fpp) { for (Children::iterator i = children.begin(); i != children.end(); ++i) { - (*i)->set_samples_per_unit (spu); + (*i)->set_samples_per_pixel (fpp); } - - AnalysisFeatureList::const_iterator i; - list<ArdourCanvas::SimpleLine*>::iterator l; } void @@ -847,7 +834,7 @@ TimeAxisView::show_selection (TimeSelection& ts) (*i)->show_selection (ts); } - if (canvas_item_visible (selection_group)) { + if (selection_group->visible ()) { while (!used_selection_rects.empty()) { free_selection_rects.push_front (used_selection_rects.front()); used_selection_rects.pop_front(); @@ -871,27 +858,17 @@ TimeAxisView::show_selection (TimeSelection& ts) rect = get_selection_rect ((*i).id); - x1 = _editor.frame_to_unit (start); - x2 = _editor.frame_to_unit (start + cnt - 1); + x1 = _editor.sample_to_pixel (start); + x2 = _editor.sample_to_pixel (start + cnt - 1); y2 = current_height(); - rect->rect->property_x1() = x1; - rect->rect->property_y1() = 1.0; - rect->rect->property_x2() = x2; - rect->rect->property_y2() = y2; + rect->rect->set (ArdourCanvas::Rect (x1, 1, x2, y2)); // trim boxes are at the top for selections if (x2 > x1) { - rect->start_trim->property_x1() = x1; - rect->start_trim->property_y1() = 1.0; - rect->start_trim->property_x2() = x1 + trim_handle_size; - rect->start_trim->property_y2() = y2; - - rect->end_trim->property_x1() = x2 - trim_handle_size; - rect->end_trim->property_y1() = 1.0; - rect->end_trim->property_x2() = x2; - rect->end_trim->property_y2() = y2; + rect->start_trim->set (ArdourCanvas::Rect (x1, 1, x1 + trim_handle_size, y2)); + rect->end_trim->set (ArdourCanvas::Rect (x2 - trim_handle_size, 1, x2, y2)); rect->start_trim->show(); rect->end_trim->show(); @@ -918,7 +895,7 @@ TimeAxisView::reshow_selection (TimeSelection& ts) void TimeAxisView::hide_selection () { - if (canvas_item_visible (selection_group)) { + if (selection_group->visible ()) { while (!used_selection_rects.empty()) { free_selection_rects.push_front (used_selection_rects.front()); used_selection_rects.pop_front(); @@ -986,29 +963,26 @@ TimeAxisView::get_selection_rect (uint32_t id) rect = new SelectionRect; - rect->rect = new SimpleRect (*selection_group); - rect->rect->property_outline_what() = 0x0; - rect->rect->property_x1() = 0.0; - rect->rect->property_y1() = 0.0; - rect->rect->property_x2() = 0.0; - rect->rect->property_y2() = 0.0; - rect->rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectionRect.get(); + rect->rect = new ArdourCanvas::Rectangle (selection_group); + CANVAS_DEBUG_NAME (rect->rect, "selection rect"); + rect->rect->set_outline (false); + rect->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect()); - rect->start_trim = new SimpleRect (*selection_group); - rect->start_trim->property_outline_what() = 0x0; - rect->start_trim->property_x1() = 0.0; - rect->start_trim->property_x2() = 0.0; + rect->start_trim = new ArdourCanvas::Rectangle (selection_group); + CANVAS_DEBUG_NAME (rect->rect, "selection rect start trim"); + rect->start_trim->set_outline (false); + rect->start_trim->set_fill (false); - rect->end_trim = new SimpleRect (*selection_group); - rect->end_trim->property_outline_what() = 0x0; - rect->end_trim->property_x1() = 0.0; - rect->end_trim->property_x2() = 0.0; + rect->end_trim = new ArdourCanvas::Rectangle (selection_group); + CANVAS_DEBUG_NAME (rect->rect, "selection rect end trim"); + rect->end_trim->set_outline (false); + rect->end_trim->set_fill (false); free_selection_rects.push_front (rect); - rect->rect->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_rect_event), rect->rect, rect)); - rect->start_trim->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_start_trim_event), rect->rect, rect)); - rect->end_trim->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_end_trim_event), rect->rect, rect)); + rect->rect->Event.connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_rect_event), rect->rect, rect)); + rect->start_trim->Event.connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_start_trim_event), rect->rect, rect)); + rect->end_trim->Event.connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_end_trim_event), rect->rect, rect)); } rect = free_selection_rects.front(); @@ -1168,26 +1142,26 @@ TimeAxisView::color_handler () for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) { - (*i)->rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectionRect.get(); - (*i)->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - - (*i)->start_trim->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - (*i)->start_trim->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); + (*i)->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect()); + (*i)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); - (*i)->end_trim->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - (*i)->end_trim->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); + (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + + (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); } - + for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) { - - (*i)->rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectionRect.get(); - (*i)->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - - (*i)->start_trim->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - (*i)->start_trim->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - - (*i)->end_trim->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); - (*i)->end_trim->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_Selection.get(); + + (*i)->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect()); + (*i)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + + (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + + (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection()); + (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection()); } } |