fix up details of time axis view item drawing.

* remove top and bottom edges - rely on track edges for that.
* move right edge of time axis view items 1 pixel right to get a much
   nicer effect when splitting regions. the end line and start line
   of two adjacent regions are now on the same pixel.
* adjust audio region view components to be properly placed.

still need to do ghost regions and MIDI regions
This commit is contained in:
Paul Davis 2014-02-13 18:16:10 -05:00
parent 08b86fda5c
commit e9e08f59ce
3 changed files with 63 additions and 46 deletions

View File

@ -567,9 +567,9 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, f
audio_region()->fade_in()->curve().get_vector (0, audio_region()->fade_in()->back()->when, &curve[0], npoints);
if (_height >= NAME_HIGHLIGHT_THRESH) {
effective_height = _height - NAME_HIGHLIGHT_SIZE - 1;
effective_height = _height - NAME_HIGHLIGHT_SIZE;
} else {
effective_height = _height - 2;
effective_height = _height;
}
Points points;
@ -583,7 +583,7 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, f
for (pi = 0, pc = 0; pc < npoints; ++pc) {
points[pi].x = 1.0 + (pc * xdelta);
points[pi++].y = effective_height - (curve[pc] * effective_height);
points[pi++].y = 1.0 + effective_height - (curve[pc] * effective_height);
}
/* draw the line */
@ -645,9 +645,9 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar,
audio_region()->fade_out()->curve().get_vector (0, audio_region()->fade_out()->back()->when, &curve[0], npoints);
if (_height >= NAME_HIGHLIGHT_THRESH) {
effective_height = _height - (NAME_HIGHLIGHT_SIZE + 1); /* skip the top pixel that shows the frame of this regionview */
effective_height = _height - NAME_HIGHLIGHT_SIZE;
} else {
effective_height = _height - 2; /* skip the top and bottom pixel that are the frame of this regionview */
effective_height = _height;
}
/* points *MUST* be in anti-clockwise order */
@ -661,12 +661,12 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar,
for (pi = 0, pc = 0; pc < npoints; ++pc, ++pi) {
points[pi].x = 1.0 + _pixel_width - pwidth + (pc * xdelta);
points[pi].y = effective_height - (curve[pc] * effective_height);
points[pi].y = 1.0 + effective_height - (curve[pc] * effective_height);
}
/* draw the line */
redraw_end_xfade_to (ar, width, points, effective_height, handle_right, pwidth-2);
redraw_end_xfade_to (ar, width, points, effective_height, handle_right, pwidth-1);
// fade_out_shape->set (points);
@ -736,7 +736,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, frame
start_xfade_rect->set_data ("regionview", this);
}
start_xfade_rect->set (ArdourCanvas::Rect (1.0, 0.0, rect_width, effective_height));
start_xfade_rect->set (ArdourCanvas::Rect (1.0, 1.0, rect_width, effective_height));
start_xfade_rect->show ();
start_xfade_in->set (points);
@ -758,7 +758,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, frame
ArdourCanvas::Duple &p (ipoints[pci]);
p.x = 1.0 + i;
/* invert with respect to y-axis */
p.y = effective_height - points[pci].y;
p.y = 1.0 + effective_height - points[pci].y;
}
} else {
@ -769,7 +769,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, frame
for (Points::size_type i = 0, pci = 0; i < npoints; ++i, ++pci) {
ArdourCanvas::Duple &p (ipoints[pci]);
p.x = 1.0 + i;
p.y = effective_height - (effective_height * vec[i]);
p.y = 1.0 + effective_height - (effective_height * vec[i]);
}
}
@ -826,7 +826,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecn
end_xfade_rect->set_data ("regionview", this);
}
end_xfade_rect->set (ArdourCanvas::Rect (rect_edge, 1.0, rect_edge + rect_width, effective_height));
end_xfade_rect->set (ArdourCanvas::Rect (rect_edge, 1.0, rect_edge + rect_width + TimeAxisViewItem::RIGHT_EDGE_SHIFT, effective_height));
end_xfade_rect->show ();
end_xfade_in->set (points);
@ -848,7 +848,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecn
for (Points::size_type i = 0, pci = 0; i < npoints; ++i, ++pci) {
ArdourCanvas::Duple &p (ipoints[pci]);
p.x = 1.0 + rend + i;
p.y = effective_height - points[pci].y;
p.y = 1.0 + effective_height - points[pci].y;
}
} else {
@ -863,7 +863,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecn
for (Points::size_type i = 0, pci = 0; i < npoints; ++i) {
ArdourCanvas::Duple& p (ipoints[pci++]);
p.x = 1.0 + rend + i;
p.y = effective_height - (effective_height * vp[i]);
p.y = 1.0 + effective_height - (effective_height * vp[i]);
}
}

View File

@ -61,6 +61,7 @@ Pango::FontDescription TimeAxisViewItem::NAME_FONT;
const double TimeAxisViewItem::NAME_X_OFFSET = 15.0;
const double TimeAxisViewItem::GRAB_HANDLE_TOP = 6;
const double TimeAxisViewItem::GRAB_HANDLE_WIDTH = 5;
const double TimeAxisViewItem::RIGHT_EDGE_SHIFT = 1.0;
int TimeAxisViewItem::NAME_HEIGHT;
double TimeAxisViewItem::NAME_Y_OFFSET;
@ -86,7 +87,7 @@ TimeAxisViewItem::set_constant_heights ()
layout = foo.create_pango_layout (X_("H")); /* just the ascender */
NAME_HEIGHT = height;
NAME_Y_OFFSET = height + 2;
NAME_Y_OFFSET = height + 1;
NAME_HIGHLIGHT_SIZE = height + 2;
NAME_HIGHLIGHT_THRESH = NAME_HIGHLIGHT_SIZE * 3;
}
@ -109,6 +110,7 @@ TimeAxisViewItem::TimeAxisViewItem(
framepos_t start, framecnt_t duration, bool recording, bool automation, Visibility vis
)
: trackview (tv)
, frame_position (-1)
, item_name (it_name)
, _height (1.0)
, _recregion (recording)
@ -124,6 +126,7 @@ TimeAxisViewItem::TimeAxisViewItem (const TimeAxisViewItem& other)
, Selectable (other)
, PBD::ScopedConnectionList()
, trackview (other.trackview)
, frame_position (-1)
, item_name (other.item_name)
, _height (1.0)
, _recregion (other._recregion)
@ -186,11 +189,13 @@ TimeAxisViewItem::init (ArdourCanvas::Group* parent, double fpp, Gdk::Color cons
if (visibility & ShowFrame) {
frame = new ArdourCanvas::Rectangle (group,
ArdourCanvas::Rect (0.0, 0.0,
trackview.editor().sample_to_pixel(duration),
trackview.current_height()));
ArdourCanvas::Rect (0.0, 1.0,
trackview.editor().sample_to_pixel(duration) + RIGHT_EDGE_SHIFT,
trackview.current_height() - 1.0));
CANVAS_DEBUG_NAME (frame, string_compose ("frame for %1", get_item_name()));
frame->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::LEFT|ArdourCanvas::Rectangle::RIGHT));
if (_recregion) {
frame->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RecordingRect());
@ -212,16 +217,16 @@ TimeAxisViewItem::init (ArdourCanvas::Group* parent, double fpp, Gdk::Color cons
if (visibility & FullWidthNameHighlight) {
start = 0.0;
width = trackview.editor().sample_to_pixel(item_duration);
width = trackview.editor().sample_to_pixel(item_duration) + RIGHT_EDGE_SHIFT;
} else {
start = 1.0;
width = trackview.editor().sample_to_pixel(item_duration) - 2.0;
width = trackview.editor().sample_to_pixel(item_duration) - 2.0 + RIGHT_EDGE_SHIFT;
}
name_highlight = new ArdourCanvas::Rectangle (group,
ArdourCanvas::Rect (start,
trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE,
width - 4,
width - 2.0 + RIGHT_EDGE_SHIFT,
trackview.current_height()));
CANVAS_DEBUG_NAME (name_highlight, string_compose ("name highlight for %1", get_item_name()));
name_highlight->set_data ("timeaxisviewitem", this);
@ -322,28 +327,21 @@ TimeAxisViewItem::set_position(framepos_t pos, void* src, double* delta)
frame_position = pos;
/* This sucks. The GnomeCanvas version I am using
doesn't correctly implement gnome_canvas_group_set_arg(),
so that simply setting the "x" arg of the group
fails to move the group. Instead, we have to
use gnome_canvas_item_move(), which does the right
thing. I see that in GNOME CVS, the current (Sept 2001)
version of GNOME Canvas rectifies this issue cleanly.
*/
double old_unit_pos;
double new_unit_pos = pos / samples_per_pixel;
old_unit_pos = group->position().x;
if (new_unit_pos != old_unit_pos) {
group->set_x_position (new_unit_pos);
}
double new_unit_pos = trackview.editor().sample_to_pixel (pos);
if (delta) {
(*delta) = new_unit_pos - old_unit_pos;
(*delta) = new_unit_pos - group->position().x;
if (*delta == 0.0) {
return true;
}
} else {
if (new_unit_pos == group->position().x) {
return true;
}
}
group->set_x_position (new_unit_pos);
PositionChanged (frame_position, src); /* EMIT_SIGNAL */
return true;
@ -583,7 +581,7 @@ TimeAxisViewItem::set_height (double height)
}
}
vestigial_frame->set_y1 (height - 1);
vestigial_frame->set_y1 (height - 1.0);
set_colors ();
}
@ -611,11 +609,16 @@ TimeAxisViewItem::manage_name_highlight ()
name_highlight->show();
name_highlight->set_y0 ((double) _height - 1 - NAME_HIGHLIGHT_SIZE);
name_highlight->set_y1 ((double) _height - 1);
name_highlight->set_y0 ((double) _height - NAME_HIGHLIGHT_SIZE);
name_highlight->set_y1 ((double) _height);
/* x0 is always zero */
name_highlight->set_x1 (_width-1.0);
if (visibility & FullWidthNameHighlight) {
/* x0 is always 0.0 */
name_highlight->set_x1 (_width+RIGHT_EDGE_SHIFT);
} else {
/* x0 is always 1.0 */
name_highlight->set_x1 (_width+RIGHT_EDGE_SHIFT);
}
} else {
name_highlight->hide();
@ -989,7 +992,7 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width)
if (frame) {
frame->show();
frame->set_x1 (pixel_width);
frame->set_x1 (pixel_width + RIGHT_EDGE_SHIFT);
}
if (frame_handle_start) {
@ -1004,8 +1007,8 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width)
frame_handle_end->hide();
} else {
frame_handle_start->show();
frame_handle_end->set_x0 (pixel_width - (TimeAxisViewItem::GRAB_HANDLE_WIDTH));
frame_handle_end->set_x1 (pixel_width);
frame_handle_end->set_x0 (pixel_width + RIGHT_EDGE_SHIFT - (TimeAxisViewItem::GRAB_HANDLE_WIDTH));
frame_handle_end->set_x1 (pixel_width + RIGHT_EDGE_SHIFT);
frame_handle_end->show();
}
}

View File

@ -114,6 +114,20 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
static double NAME_HIGHLIGHT_SIZE;
static double NAME_HIGHLIGHT_THRESH;
/* if this is 1.0, we move the right boundary
of the item frame so that it is 1 pixel
after the end of the item. This gives nice
effects when splitting items.
if this is zero, the right edge coincides
with the end of the item, and things don't
look so nice.
this exists to allow easy debugging of the
two scenarios.
*/
static const double RIGHT_EDGE_SHIFT;
/**
* Emitted when this Group has been removed.
* This is different to the CatchDeletion signal in that this signal