rationalize, consolidate and make work dbl-click editing for regions and markers, as part of the Drag model rather than discretely

This commit is contained in:
Paul Davis 2014-01-27 10:09:58 -05:00
parent 2c79f74e49
commit d23c2499bf
4 changed files with 104 additions and 115 deletions

View File

@ -1482,8 +1482,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void edit_tempo_section (ARDOUR::TempoSection*);
void edit_meter_section (ARDOUR::MeterSection*);
void edit_tempo_marker (ArdourCanvas::Item*);
void edit_meter_marker (ArdourCanvas::Item*);
void edit_tempo_marker (TempoMarker&);
void edit_meter_marker (MeterMarker&);
void edit_control_point (ArdourCanvas::Item*);
void edit_notes (TimeAxisViewItem&);

View File

@ -872,7 +872,15 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
RegionMotionDrag::finished (ev, movement_occurred);
if (!movement_occurred) {
/* just a click */
if (was_double_click() && !_views.empty()) {
DraggingView dv = _views.front();
dv.view->show_region_editor ();
}
return;
}
@ -2146,6 +2154,10 @@ MeterMarkerDrag::setup_pointer_frame_offset ()
void
MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
{
if (!_marker->meter().movable()) {
return;
}
if (first_move) {
// create a dummy marker for visual representation of moving the
@ -2191,6 +2203,13 @@ void
MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{
if (!movement_occurred) {
if (was_double_click()) {
_editor->edit_meter_marker (*_marker);
}
return;
}
if (!_marker->meter().movable()) {
return;
}
@ -2266,6 +2285,10 @@ TempoMarkerDrag::setup_pointer_frame_offset ()
void
TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
{
if (!_marker->tempo().movable()) {
return;
}
if (first_move) {
// create a dummy marker for visual representation of moving the
@ -2310,6 +2333,13 @@ void
TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{
if (!movement_occurred) {
if (was_double_click()) {
_editor->edit_tempo_marker (*_marker);
}
return;
}
if (!_marker->tempo().movable()) {
return;
}
@ -3001,7 +3031,8 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
if (!movement_occurred) {
if (was_double_click()) {
cerr << "End of marker double click\n";
_editor->rename_marker (_marker);
return;
}
/* just a click, do nothing but finish
@ -4128,10 +4159,24 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
_editor->new_transport_marker_context_menu (&event->button, _item);
break;
}
} else {
/* just a click, no pointer movement. remember that context menu stuff was handled elsewhere */
if (Keyboard::no_modifier_keys_pressed (&event->button) && _operation != CreateCDMarker) {
if (_operation == CreateTransportMarker) {
/* didn't drag, so just locate */
_editor->session()->request_locate (grab_frame(), _editor->session()->transport_rolling());
} else if (_operation == CreateCDMarker) {
/* didn't drag, but mark is already created so do
* nothing */
} else { /* operation == CreateRangeMarker */
framepos_t start;
framepos_t end;

View File

@ -723,38 +723,30 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
{
TempoMarker* m = reinterpret_cast<TempoMarker*> (item->get_data ("marker"));
assert (m);
if (m->tempo().movable ()) {
_drags->set (
new TempoMarkerDrag (
this,
item,
Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
),
event
);
return true;
} else {
return false;
}
_drags->set (
new TempoMarkerDrag (
this,
item,
Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
),
event
);
return true;
}
case MeterMarkerItem:
{
MeterMarker* m = reinterpret_cast<MeterMarker*> (item->get_data ("marker"));
assert (m);
if (m->meter().movable ()) {
_drags->set (
new MeterMarkerDrag (
this,
item,
Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
),
event
);
return true;
} else {
return false;
}
_drags->set (
new MeterMarkerDrag (
this,
item,
Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
),
event
);
return true;
}
case VideoBarItem:
@ -1295,14 +1287,11 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
{
if (event->type == GDK_2BUTTON_PRESS) {
_drags->mark_double_click ();
return false;
gdk_pointer_ungrab (GDK_CURRENT_TIME);
return true;
}
if (event->type != GDK_BUTTON_PRESS) {
if (event->type == GDK_2BUTTON_PRESS) {
gdk_pointer_ungrab (GDK_CURRENT_TIME);
return button_double_click_handler (item, event, item_type);
}
return false;
}
@ -1426,52 +1415,6 @@ Editor::button_release_dispatch (GdkEventButton* ev)
return button_bindings->activate (b, Gtkmm2ext::Bindings::Release);
}
bool
Editor::button_double_click_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) {
if (event->button.button != 1) {
return false;
}
switch (item_type) {
case RegionItem:
RegionView *rv;
rv = clicked_regionview;
rv->show_region_editor ();
return true;
case NoteItem:
case PlayheadCursorItem:
break;
case MarkerItem:
case RangeMarkerBarItem:
case CdMarkerBarItem:
Marker* marker;
if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
break;
}
rename_marker (marker);
return true;
case TempoMarkerItem:
edit_tempo_marker (item);
return true;
case MeterMarkerItem:
edit_meter_marker (item);
return true;
case MarkerBarItem:
case TempoBarItem:
case MeterBarItem:
case TransportMarkerBarItem:
case StreamItem:
break;
default:
break;
}
return false;
}
bool
Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
@ -1512,13 +1455,40 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
show_region_properties ();
break;
case TempoMarkerItem:
edit_tempo_marker (item);
case TempoMarkerItem: {
Marker* marker;
TempoMarker* tempo_marker;
if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg;
/*NOTREACHED*/
}
edit_tempo_marker (*tempo_marker);
break;
}
case MeterMarkerItem:
edit_meter_marker (item);
case MeterMarkerItem: {
Marker* marker;
MeterMarker* meter_marker;
if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
fatal << _("programming error: marker for meter is not a meter marker!") << endmsg;
/*NOTREACHED*/
}
edit_meter_marker (*meter_marker);
break;
}
case RegionViewName:
if (clicked_regionview->name_active()) {

View File

@ -343,41 +343,15 @@ Editor::edit_tempo_section (TempoSection* section)
}
void
Editor::edit_tempo_marker (ArdourCanvas::Item *item)
Editor::edit_tempo_marker (TempoMarker& tm)
{
Marker* marker;
TempoMarker* tempo_marker;
if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg;
/*NOTREACHED*/
}
edit_tempo_section (&tempo_marker->tempo());
edit_tempo_section (&tm.tempo());
}
void
Editor::edit_meter_marker (ArdourCanvas::Item *item)
Editor::edit_meter_marker (MeterMarker& mm)
{
Marker* marker;
MeterMarker* meter_marker;
if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
fatal << _("programming error: marker for meter is not a meter marker!") << endmsg;
/*NOTREACHED*/
}
edit_meter_section (&meter_marker->meter());
edit_meter_section (&mm.meter());
}
gint