add left/right side trim cursors and use them for region trimming, as appropriate

git-svn-id: svn://localhost/ardour2/branches/3.0@7268 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis
2010-06-17 12:45:51 +00:00
parent 6abb75797f
commit 7e3ebe1267
7 changed files with 59 additions and 11 deletions

View File

@@ -209,6 +209,8 @@ static const gchar *_rb_opt_strings[] = {
Gdk::Cursor* Editor::cross_hair_cursor = 0;
Gdk::Cursor* Editor::selector_cursor = 0;
Gdk::Cursor* Editor::trimmer_cursor = 0;
Gdk::Cursor* Editor::left_side_trim_cursor = 0;
Gdk::Cursor* Editor::right_side_trim_cursor = 0;
Gdk::Cursor* Editor::grabber_cursor = 0;
Gdk::Cursor* Editor::grabber_edit_point_cursor = 0;
Gdk::Cursor* Editor::zoom_cursor = 0;
@@ -1240,6 +1242,8 @@ Editor::build_cursors ()
cross_hair_cursor = new Gdk::Cursor (CROSSHAIR);
trimmer_cursor = new Gdk::Cursor (SB_H_DOUBLE_ARROW);
left_side_trim_cursor = new Gdk::Cursor (SB_LEFT_ARROW);
right_side_trim_cursor = new Gdk::Cursor (SB_RIGHT_ARROW);
selector_cursor = new Gdk::Cursor (XTERM);
time_fx_cursor = new Gdk::Cursor (SIZING);
wait_cursor = new Gdk::Cursor (WATCH);
@@ -1334,6 +1338,8 @@ Editor::popup_track_context_menu (int button, int32_t time, ItemType item_type,
case RegionItem:
case RegionViewName:
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
if (with_selection) {
build_menu_function = &Editor::build_track_selection_context_menu;
} else {
@@ -1375,6 +1381,8 @@ Editor::popup_track_context_menu (int button, int32_t time, ItemType item_type,
case RegionItem:
case RegionViewName:
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
if (!with_selection) {
if (region_edit_menu_split_item) {
if (clicked_regionview && clicked_regionview->region()->covers (get_preferred_edit_position())) {

View File

@@ -988,6 +988,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
static Gdk::Cursor* cross_hair_cursor;
static Gdk::Cursor* trimmer_cursor;
static Gdk::Cursor* right_side_trim_cursor;
static Gdk::Cursor* left_side_trim_cursor;
static Gdk::Cursor* selector_cursor;
static Gdk::Cursor* grabber_cursor;
static Gdk::Cursor* grabber_edit_point_cursor;

View File

@@ -768,6 +768,14 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re
perspective. XXX change this ??
*/
ItemType type;
if (item->get_data ("isleft")) {
type = LeftFrameHandle;
} else {
type = RightFrameHandle;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
@@ -776,20 +784,20 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re
clicked_control_point = 0;
clicked_axisview = &clicked_regionview->get_time_axis_view();
clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
ret = button_press_handler (item, event, RegionViewNameHighlight);
ret = button_press_handler (item, event, type);
break;
case GDK_BUTTON_RELEASE:
ret = button_release_handler (item, event, RegionViewNameHighlight);
ret = button_release_handler (item, event, type);
break;
case GDK_MOTION_NOTIFY:
ret = motion_handler (item, event);
break;
case GDK_ENTER_NOTIFY:
ret = enter_handler (item, event, RegionViewNameHighlight);
ret = enter_handler (item, event, type);
break;
case GDK_LEAVE_NOTIFY:
ret = leave_handler (item, event, RegionViewNameHighlight);
ret = leave_handler (item, event, type);
break;
default:

View File

@@ -215,8 +215,8 @@ Drag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
_last_pointer_y = _grab_y;
_item->grab (Gdk::POINTER_MOTION_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK,
*cursor,
event->button.time);
*cursor,
event->button.time);
if (_editor->session() && _editor->session()->transport_rolling()) {
_was_rolling = true;
@@ -1703,21 +1703,23 @@ TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
nframes64_t region_end = (nframes64_t) (_primary->region()->last_frame() / speed);
nframes64_t region_length = (nframes64_t) (_primary->region()->length() / speed);
Drag::start_grab (event, _editor->trimmer_cursor);
nframes64_t const pf = adjusted_current_frame (event);
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
_operation = ContentsTrim;
Drag::start_grab (event, _editor->trimmer_cursor);
} else {
/* These will get overridden for a point trim.*/
if (pf < (region_start + region_length/2)) {
/* closer to start */
_operation = StartTrim;
} else if (pf > (region_end - region_length/2)) {
Drag::start_grab (event, _editor->left_side_trim_cursor);
} else {
/* closer to end */
_operation = EndTrim;
}
Drag::start_grab (event, _editor->right_side_trim_cursor);
}
}
switch (_operation) {
@@ -3164,7 +3166,7 @@ SelectionDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
if (_editor->clicked_axisview) {
_editor->clicked_axisview->order_selection_trims (_item, true);
}
Drag::start_grab (event, _editor->trimmer_cursor);
Drag::start_grab (event, _editor->left_side_trim_cursor);
start = _editor->selection->time[_editor->clicked_selection].start;
_pointer_frame_offset = grab_frame() - start;
break;
@@ -3173,7 +3175,7 @@ SelectionDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
if (_editor->clicked_axisview) {
_editor->clicked_axisview->order_selection_trims (_item, false);
}
Drag::start_grab (event, _editor->trimmer_cursor);
Drag::start_grab (event, _editor->right_side_trim_cursor);
end = _editor->selection->time[_editor->clicked_selection].end;
_pointer_frame_offset = grab_frame() - end;
break;

View File

@@ -47,6 +47,8 @@ enum ItemType {
FadeOutItem,
FadeOutHandleItem,
NoteItem,
LeftFrameHandle,
RightFrameHandle,
#ifdef WITH_CMT
MarkerViewItem,

View File

@@ -472,6 +472,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case RegionViewNameHighlight:
case RegionViewName:
case LeftFrameHandle:
case RightFrameHandle:
if (mouse_mode != MouseRange || internal_editing() || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
@@ -669,6 +671,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
{
RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
_drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
@@ -736,6 +740,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
{
RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
_drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
@@ -962,6 +968,8 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
switch (item_type) {
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
_drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
return true;
break;
@@ -1144,6 +1152,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case RegionItem:
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
case RegionViewName:
popup_track_context_menu (1, event->button.time, item_type, false, where);
break;
@@ -1474,6 +1484,18 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
}
break;
case LeftFrameHandle:
if (is_drawable() && (mouse_mode == MouseObject || (internal_editing() && mouse_mode == MouseRange))) {
track_canvas->get_window()->set_cursor (*left_side_trim_cursor);
}
break;
case RightFrameHandle:
if (is_drawable() && (mouse_mode == MouseObject || (internal_editing() && mouse_mode == MouseRange))) {
track_canvas->get_window()->set_cursor (*right_side_trim_cursor);
}
break;
case StartSelectionTrimItem:
case EndSelectionTrimItem:
@@ -1630,6 +1652,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
break;
case RegionViewNameHighlight:
case LeftFrameHandle:
case RightFrameHandle:
case StartSelectionTrimItem:
case EndSelectionTrimItem:
case PlayheadCursorItem:

View File

@@ -158,9 +158,11 @@ RegionView::init (Gdk::Color const & basic_color, bool wfd)
name_highlight->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), name_highlight, this));
frame_handle_start->set_data ("regionview", this);
frame_handle_start->set_data ("isleft", (void*) 1);
frame_handle_start->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_frame_handle_event), frame_handle_start, this));
frame_handle_end->set_data ("regionview", this);
frame_handle_end->set_data ("isleft", (void*) 0);
frame_handle_end->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_frame_handle_event), frame_handle_end, this));
frame_handle_start->raise_to_top();