From 0d2c8771a7b0f70fe4cf21cfdcfca709470787c2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 8 Mar 2006 02:50:53 +0000 Subject: fix for deferred saves by StateManager-derivatives; changes to new/copy/clear playlist ops (not finished), TRUE/FALSE -> true/false in editor_mouse.cc git-svn-id: svn://localhost/trunk/ardour2@358 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_time_axis.cc | 93 +++++++++++++---------- gtk2_ardour/audio_time_axis.h | 9 ++- gtk2_ardour/draginfo.h | 49 ++++++++++++ gtk2_ardour/editor.cc | 73 +++++++++++++++--- gtk2_ardour/editor.h | 44 +++-------- gtk2_ardour/editor_mouse.cc | 167 +++++++++++++++++++++-------------------- gtk2_ardour/public_editor.h | 3 + gtk2_ardour/selection.cc | 89 ++++++++-------------- gtk2_ardour/streamview.cc | 2 + 9 files changed, 302 insertions(+), 227 deletions(-) create mode 100644 gtk2_ardour/draginfo.h (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 88a0f5eb57..4ec1e3da2a 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -858,7 +858,7 @@ AudioTimeAxisView::rename_current_playlist () } void -AudioTimeAxisView::use_copy_playlist () +AudioTimeAxisView::use_copy_playlist (bool prompt) { AudioPlaylist *pl; DiskStream *ds; @@ -873,64 +873,74 @@ AudioTimeAxisView::use_copy_playlist () return; } - ArdourPrompter prompter (true); - string new_name = Playlist::bump_name (pl->name(), _session); - - prompter.set_prompt (_("Name for playlist")); - prompter.set_initial_text (new_name); - prompter.show_all (); + name = Playlist::bump_name (pl->name(), _session); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - if (name.length()) { - ds->use_copy_playlist (); - pl = ds->playlist(); - pl->set_name (name); + if (prompt) { + + ArdourPrompter prompter (true); + + prompter.set_prompt (_("Name for playlist")); + prompter.set_initial_text (name); + prompter.show_all (); + + switch (prompter.run ()) { + case Gtk::RESPONSE_ACCEPT: + prompter.get_result (name); + break; + + default: + return; } - break; + } - default: - break; + if (name.length()) { + ds->use_copy_playlist (); + pl = ds->playlist(); + pl->set_name (name); } } void -AudioTimeAxisView::use_new_playlist () +AudioTimeAxisView::use_new_playlist (bool prompt) { AudioPlaylist *pl; DiskStream *ds; string name; - + /* neither conditions are supposed to be true at this time, but to leave the design flexible, allow them to be in the future without causing crashes */ - + if (((ds = get_diskstream()) == 0) || ((pl = ds->playlist()) == 0)) { return; } - - ArdourPrompter prompter (true); - string new_name = Playlist::bump_name (pl->name(), _session); - - prompter.set_prompt (_("Name for playlist")); - prompter.set_initial_text (new_name); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - if (name.length()) { - ds->use_new_playlist (); - pl = ds->playlist(); - pl->set_name (name); + name = Playlist::bump_name (pl->name(), _session); + + if (prompt) { + + ArdourPrompter prompter (true); + + prompter.set_prompt (_("Name for playlist")); + prompter.set_initial_text (name); + + switch (prompter.run ()) { + case Gtk::RESPONSE_ACCEPT: + prompter.get_result (name); + break; + + default: + return; } - break; + } - default: - break; + if (name.length()) { + ds->use_new_playlist (); + pl = ds->playlist(); + pl->set_name (name); } -} +} void AudioTimeAxisView::clear_playlist () @@ -1010,7 +1020,8 @@ AudioTimeAxisView::selection_click (GdkEventButton* ev) switch (Keyboard::selection_type (ev->state)) { case Selection::Toggle: - editor.get_selection().toggle (*tracks); + /* XXX this is not right */ + editor.get_selection().add (*tracks); break; case Selection::Set: @@ -1855,10 +1866,10 @@ AudioTimeAxisView::build_playlist_menu (Gtk::Menu * menu) playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &AudioTimeAxisView::rename_current_playlist))); playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem (_("New"), mem_fun(*this, &AudioTimeAxisView::use_new_playlist))); - playlist_items.push_back (MenuElem (_("New Copy"), mem_fun(*this, &AudioTimeAxisView::use_copy_playlist))); + playlist_items.push_back (MenuElem (_("New"), mem_fun(editor, &PublicEditor::new_playlists))); + playlist_items.push_back (MenuElem (_("New Copy"), mem_fun(editor, &PublicEditor::copy_playlists))); playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(*this, &AudioTimeAxisView::clear_playlist))); + playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(editor, &PublicEditor::clear_playlists))); playlist_items.push_back (SeparatorElem()); playlist_items.push_back (MenuElem(_("Select"), mem_fun(*this, &AudioTimeAxisView::show_playlist_selector))); diff --git a/gtk2_ardour/audio_time_axis.h b/gtk2_ardour/audio_time_axis.h index c481c54ed5..0272e0fa0e 100644 --- a/gtk2_ardour/audio_time_axis.h +++ b/gtk2_ardour/audio_time_axis.h @@ -126,6 +126,12 @@ class AudioTimeAxisView : public RouteUI, public TimeAxisView void set_state (const XMLNode&); XMLNode* get_child_xml_node (const string & childname); + /* the editor calls these when mapping an operation across multiple tracks */ + + void use_new_playlist (bool prompt); + void use_copy_playlist (bool prompt); + void clear_playlist (); + private: friend class StreamView; friend class AudioRegionView; @@ -227,9 +233,6 @@ class AudioTimeAxisView : public RouteUI, public TimeAxisView void playlist_modified (); void add_playlist_to_playlist_menu (ARDOUR::Playlist*); - void use_new_playlist (); - void use_copy_playlist (); - void clear_playlist (); void rename_current_playlist (); /* automation stuff */ diff --git a/gtk2_ardour/draginfo.h b/gtk2_ardour/draginfo.h new file mode 100644 index 0000000000..8b9213ea40 --- /dev/null +++ b/gtk2_ardour/draginfo.h @@ -0,0 +1,49 @@ +#ifndef __gtk2_ardour_drag_info_h_ +#define __gtk2_ardour_drag_info_h_ + +#include +#include + +#include "canvas.h" +#include + +namespace ARDOUR { + class Location; +} + +class Editor; +class TimeAxisView; + +struct DragInfo { + ArdourCanvas::Item* item; + void* data; + jack_nframes_t last_frame_position; + int32_t pointer_frame_offset; + jack_nframes_t grab_frame; + jack_nframes_t last_pointer_frame; + jack_nframes_t current_pointer_frame; + double grab_x, grab_y; + double cumulative_x_drag; + double cumulative_y_drag; + double current_pointer_x; + double current_pointer_y; + void (Editor::*motion_callback)(ArdourCanvas::Item*, GdkEvent*); + void (Editor::*finished_callback)(ArdourCanvas::Item*, GdkEvent*); + TimeAxisView* last_trackview; + bool x_constrained; + bool copy; + bool was_rolling; + bool first_move; + bool move_threshold_passsed; + bool want_move_threshold; + bool brushing; + ARDOUR::Location* copied_location; +}; + +struct LineDragInfo { + uint32_t before; + uint32_t after; +}; + +#endif /* __gtk2_ardour_drag_info_h_ */ + diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 9d788f1566..dae80439b1 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2964,7 +2964,8 @@ Editor::restore_state (State *state) *selection = *state->selection; time_selection_changed (); - region_selection_changed (); + cerr << "RS: RSC\n"; + region_selection_changed (); /* XXX other selection change handlers? */ } @@ -3052,7 +3053,7 @@ Editor::set_selected_control_point_from_click (Selection::Operation op, bool wit } void -Editor::mapover_audio_tracks (slot sl) +Editor::mapover_audio_tracks (slot sl) { set relevant_tracks; @@ -3060,7 +3061,7 @@ Editor::mapover_audio_tracks (slot sl) for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) { - AudioTimeAxisView* atv = dynamic_cast(&clicked_regionview->get_time_axis_view()); + AudioTimeAxisView* atv = dynamic_cast(*ti); if (!atv) { continue; @@ -3094,14 +3095,17 @@ Editor::mapover_audio_tracks (slot sl) } /* step two: apply operation to each track */ + + uint32_t sz = relevant_tracks.size(); for (set::iterator ati = relevant_tracks.begin(); ati != relevant_tracks.end(); ++ati) { - sl (**ati); + sl (**ati, sz); } } void -Editor::track_set_selected_regionview_from_click (AudioTimeAxisView& atv, AudioRegionView* basis, vector* all_equivs) +Editor::mapped_set_selected_regionview_from_click (AudioTimeAxisView& atv, uint32_t ignored, + AudioRegionView* basis, vector* all_equivs) { AudioPlaylist* pl; vector results; @@ -3127,19 +3131,26 @@ Editor::track_set_selected_regionview_from_click (AudioTimeAxisView& atv, AudioR void Editor::set_selected_regionview_from_click (Selection::Operation op, bool no_track_remove) { + cerr << "In SSRfC\n"; + vector all_equivalent_regions; if (!clicked_regionview) { return; } - mapover_audio_tracks (bind (mem_fun (*this, &Editor::track_set_selected_regionview_from_click), + mapover_audio_tracks (bind (mem_fun (*this, &Editor::mapped_set_selected_regionview_from_click), clicked_regionview, &all_equivalent_regions)); + + cerr << "mapover done\n"; + begin_reversible_command (_("set selected regionview")); switch (op) { case Selection::Toggle: + selection->toggle (clicked_regionview); +#if 0 if (clicked_regionview->get_selected()) { if (/* group && group->is_active() && */ selection->audio_regions.size() > 1) { /* reduce selection down to just the one clicked */ @@ -3148,9 +3159,9 @@ Editor::set_selected_regionview_from_click (Selection::Operation op, bool no_tra selection->remove (clicked_regionview); } } else { - selection->toggle (all_equivalent_regions); + selection->add (all_equivalent_regions); } - +#endif set_selected_track_from_click (op, false, no_track_remove); break; @@ -3178,6 +3189,7 @@ Editor::set_selected_regionview_from_click (Selection::Operation op, bool no_tra /* not defined yet */ break; } + cerr << "case done\n"; commit_reversible_command () ; } @@ -3225,7 +3237,8 @@ Editor::set_selected_regionview_from_region_list (Region& r, Selection::Operatio switch (op) { case Selection::Toggle: - selection->toggle (all_equivalent_regions); + /* XXX this is not correct */ + selection->add (all_equivalent_regions); break; case Selection::Set: selection->set (all_equivalent_regions); @@ -4060,3 +4073,45 @@ Editor::restore_editing_space () unfullscreen(); } + +void +Editor::new_playlists () +{ + begin_reversible_command (_("new playlists")); + mapover_audio_tracks (mem_fun (*this, &Editor::mapped_use_new_playlist)); + commit_reversible_command (); +} + +void +Editor::copy_playlists () +{ + begin_reversible_command (_("copy playlists")); + mapover_audio_tracks (mem_fun (*this, &Editor::mapped_use_copy_playlist)); + commit_reversible_command (); +} + +void +Editor::clear_playlists () +{ + begin_reversible_command (_("clear playlists")); + mapover_audio_tracks (mem_fun (*this, &Editor::mapped_clear_playlist)); + commit_reversible_command (); +} + +void +Editor::mapped_use_new_playlist (AudioTimeAxisView& atv, uint32_t sz) +{ + atv.use_new_playlist (sz > 1 ? false : true); +} + +void +Editor::mapped_use_copy_playlist (AudioTimeAxisView& atv, uint32_t sz) +{ + atv.use_copy_playlist (sz > 1 ? false : true); +} + +void +Editor::mapped_clear_playlist (AudioTimeAxisView& atv, uint32_t sz) +{ + atv.clear_playlist (); +} diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 57574d82ba..06d9b6035f 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -56,6 +56,7 @@ #include "enums.h" #include "region_selection.h" #include "canvas.h" +#include "draginfo.h" namespace Gtkmm2ext { class TearOff; @@ -254,6 +255,10 @@ class Editor : public PublicEditor jack_nframes_t leftmost_frame; void clear_playlist (ARDOUR::Playlist&); + void new_playlists (); + void copy_playlists (); + void clear_playlists (); + TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0); Width editor_mixer_strip_width; @@ -442,11 +447,14 @@ class Editor : public PublicEditor CrossfadeView* clicked_crossfadeview; ControlPoint* clicked_control_point; - void mapover_audio_tracks (sigc::slot sl); + void mapover_audio_tracks (sigc::slot sl); /* functions to be passed to mapover_audio_tracks(), possibly with sigc::bind()-supplied arguments */ - void track_set_selected_regionview_from_click (AudioTimeAxisView&, AudioRegionView*, vector*); + void mapped_set_selected_regionview_from_click (AudioTimeAxisView&, uint32_t, AudioRegionView*, vector*); + void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t); + void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t); + void mapped_clear_playlist (AudioTimeAxisView&, uint32_t); /* end */ @@ -1051,37 +1059,7 @@ class Editor : public PublicEditor void hide_all_tracks (bool with_select); - struct DragInfo { - ArdourCanvas::Item* item; - void* data; - jack_nframes_t last_frame_position; - int32_t pointer_frame_offset; - jack_nframes_t grab_frame; - jack_nframes_t last_pointer_frame; - jack_nframes_t current_pointer_frame; - double grab_x, grab_y; - double cumulative_x_drag; - double cumulative_y_drag; - double current_pointer_x; - double current_pointer_y; - void (Editor::*motion_callback)(ArdourCanvas::Item*, GdkEvent*); - void (Editor::*finished_callback)(ArdourCanvas::Item*, GdkEvent*); - TimeAxisView* last_trackview; - bool x_constrained; - bool copy; - bool was_rolling; - bool first_move; - bool move_threshold_passsed; - bool want_move_threshold; - bool brushing; - ARDOUR::Location* copied_location; - } drag_info; - - struct LineDragInfo { - uint32_t before; - uint32_t after; - }; - + DragInfo drag_info; LineDragInfo current_line_drag_info; void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 023c500c83..7ec47fe532 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -292,7 +292,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp track_canvas.grab_focus(); if (session && session->actively_recording()) { - return TRUE; + return true; } /* in object/audition/timefx mode, any button press sets @@ -375,7 +375,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp Keyboard::is_edit_event (&event->button))) { /* handled by button release */ - return TRUE; + return true; } switch (event->button.button) { @@ -397,7 +397,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp case EditCursorItem: case PlayheadCursorItem: start_cursor_grab (item, event); - return TRUE; + return true; case MarkerItem: if (Keyboard::modifier_state_equals (event->button.state, @@ -406,7 +406,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } else { start_marker_grab (item, event); } - return TRUE; + return true; case TempoMarkerItem: if (Keyboard::modifier_state_contains (event->button.state, Keyboard::Control)) { @@ -414,7 +414,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } else { start_tempo_marker_grab (item, event); } - return TRUE; + return true; case MeterMarkerItem: if (Keyboard::modifier_state_contains (event->button.state, Keyboard::Control)) { @@ -422,21 +422,21 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } else { start_meter_marker_grab (item, event); } - return TRUE; + return true; case TempoBarItem: - return TRUE; + return true; case MeterBarItem: - return TRUE; + return true; case RangeMarkerBarItem: start_range_markerbar_op (item, event, CreateRangeMarker); - return TRUE; + return true; break; case TransportMarkerBarItem: start_range_markerbar_op (item, event, CreateTransportMarker); - return TRUE; + return true; break; default: @@ -474,7 +474,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp default: start_selection_op (item, event, CreateSelection); } - return TRUE; + return true; break; case MouseObject: @@ -489,11 +489,11 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp switch (item_type) { case FadeInHandleItem: start_fade_in_grab (item, event); - return TRUE; + return true; case FadeOutHandleItem: start_fade_out_grab (item, event); - return TRUE; + return true; case RegionItem: if (Keyboard::modifier_state_contains (event->button.state, Keyboard::Control)) { @@ -507,27 +507,27 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp case AudioRegionViewNameHighlight: start_trim (item, event); - return TRUE; + return true; break; case AudioRegionViewName: /* rename happens on edit clicks */ start_trim (clicked_regionview->get_name_highlight(), event); - return TRUE; + return true; break; case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: start_control_point_grab (item, event); - return TRUE; + return true; break; case GainAutomationLineItem: case PanAutomationLineItem: case RedirectAutomationLineItem: start_line_grab_from_line (item, event); - return TRUE; + return true; break; case StreamItem: @@ -538,19 +538,19 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp /* */ case ImageFrameHandleStartItem: imageframe_start_handle_op(item, event) ; - return(TRUE) ; + return(true) ; break ; case ImageFrameHandleEndItem: imageframe_end_handle_op(item, event) ; - return(TRUE) ; + return(true) ; break ; case MarkerViewHandleStartItem: markerview_item_start_handle_op(item, event) ; - return(TRUE) ; + return(true) ; break ; case MarkerViewHandleEndItem: markerview_item_end_handle_op(item, event) ; - return(TRUE) ; + return(true) ; break ; /* */ @@ -567,7 +567,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp break; } } - return TRUE; + return true; break; case MouseGain: @@ -578,23 +578,23 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp case GainControlPointItem: start_control_point_grab (item, event); - return TRUE; + return true; case GainLineItem: start_line_grab_from_line (item, event); - return TRUE; + return true; case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: start_control_point_grab (item, event); - return TRUE; + return true; break; default: break; } - return TRUE; + return true; break; switch (item_type) { @@ -619,7 +619,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp default: break; } - return TRUE; + return true; break; case MouseZoom: @@ -627,7 +627,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp start_mouse_zoom (item, event); } - return TRUE; + return true; break; case MouseTimeFX: @@ -662,7 +662,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: start_control_point_grab (item, event); - return TRUE; + return true; break; default: @@ -674,12 +674,12 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp switch (item_type) { case AudioRegionViewNameHighlight: start_trim (item, event); - return TRUE; + return true; break; case AudioRegionViewName: start_trim (clicked_regionview->get_name_highlight(), event); - return TRUE; + return true; break; default: @@ -692,7 +692,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp if (event->type == GDK_BUTTON_PRESS) { /* relax till release */ } - return TRUE; + return true; break; @@ -702,7 +702,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } else { temporal_zoom_to_frame (true, event_frame(event)); } - return TRUE; + return true; break; default: @@ -789,7 +789,8 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp break; } - return FALSE; + + return false; } bool @@ -800,7 +801,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT /* no action if we're recording */ if (session && session->actively_recording()) { - return TRUE; + return true; } /* first, see if we're finishing a drag ... */ @@ -808,7 +809,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT if (drag_info.item) { if (end_grab (item, event)) { /* grab dragged, so do nothing else */ - return TRUE; + return true; } } @@ -837,7 +838,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } - return TRUE; + return true; } /* context menu events get handled here */ @@ -920,7 +921,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; } - return TRUE; + return true; } } @@ -964,7 +965,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } - return TRUE; + return true; } switch (event->button.button) { @@ -981,25 +982,25 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case RedirectAutomationLineItem: case StartSelectionTrimItem: case EndSelectionTrimItem: - return TRUE; + return true; case MarkerBarItem: if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { snap_to (where, 0, true); } mouse_add_new_marker (where); - return TRUE; + return true; case TempoBarItem: if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { snap_to (where); } mouse_add_new_tempo_event (where); - return TRUE; + return true; case MeterBarItem: mouse_add_new_meter_event (pixel_to_frame (event->button.x)); - return TRUE; + return true; break; default: @@ -1015,7 +1016,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT event, where, event->button.y); - return TRUE; + return true; break; default: @@ -1027,13 +1028,13 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT switch (item_type) { case RegionItem: clicked_regionview->add_gain_point_event (item, event); - return TRUE; + return true; break; case AutomationTrackItem: dynamic_cast(clicked_trackview)-> add_automation_event (item, event, where, event->button.y); - return TRUE; + return true; break; default: break; @@ -1055,7 +1056,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } - return TRUE; + return true; break; @@ -1072,7 +1073,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } else { // Button2 click is unused } - return TRUE; + return true; break; @@ -1084,7 +1085,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case MouseRange: // x_style_paste (where, 1.0); - return TRUE; + return true; break; default: @@ -1099,7 +1100,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } - return FALSE; + return false; } void @@ -1137,7 +1138,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ switch (item_type) { case GainControlPointItem: if (mouse_mode == MouseGain) { - cp = reinterpret_cast(item->get_data ("control_point")); + cp = static_cast(item->get_data ("control_point")); cp->set_visible (true); double at_x, at_y; @@ -1161,7 +1162,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: - cp = reinterpret_cast(item->get_data ("control_point")); + cp = static_cast(item->get_data ("control_point")); cp->set_visible (true); double at_x, at_y; @@ -1331,7 +1332,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; } - return FALSE; + return false; } bool @@ -1453,7 +1454,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; } - return FALSE; + return false; } gint @@ -1463,7 +1464,7 @@ Editor::left_automation_track () set_entered_track (0); clear_entered_track = false; } - return FALSE; + return false; } bool @@ -1490,7 +1491,7 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item if (session && session->actively_recording()) { /* Sorry. no dragging stuff around while we record */ - return TRUE; + return true; } drag_info.current_pointer_frame = event_frame (event, &drag_info.current_pointer_x, @@ -1500,10 +1501,9 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item /* item != 0 is the best test i can think of for dragging. */ - if (!drag_info.move_threshold_passsed) - { + if (!drag_info.move_threshold_passsed) { drag_info.move_threshold_passsed = (abs ((int) (drag_info.current_pointer_x - drag_info.grab_x)) > 4); - + // and change the initial grab loc/frame if this drag info wants us to if (drag_info.want_move_threshold && drag_info.move_threshold_passsed) { drag_info.grab_frame = drag_info.current_pointer_frame; @@ -1573,10 +1573,10 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item handled: track_canvas_motion (event); - return TRUE; + return true; not_handled: - return FALSE; + return false; } void @@ -2631,40 +2631,40 @@ Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event) /* this is committed in the grab finished callback. */ begin_reversible_command (_("Drag region copy")); - - /* duplicate the region(s) */ + /* duplicate the region(s) */ + vector new_regionviews; - + set affected_playlists; pair::iterator,bool> insert_result; for (list::const_iterator i = selection->audio_regions.by_layer().begin(); i != selection->audio_regions.by_layer().end(); ++i) { AudioRegionView* rv; - + rv = (*i); - + Playlist* to_playlist = rv->region.playlist(); AudioTimeAxisView* atv = dynamic_cast(&rv->get_time_axis_view()); - + insert_result = affected_playlists.insert (to_playlist); if (insert_result.second) { session->add_undo (to_playlist->get_memento ()); } latest_regionview = 0; - + sigc::connection c = atv->view->AudioRegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view)); /* create a new region with the same name. */ - + AudioRegion* newregion = new AudioRegion (rv->region); - + /* if the original region was locked, we don't care */ - + newregion->set_locked (false); - + to_playlist->add_region (*newregion, (jack_nframes_t) (rv->region.position() * atv->get_diskstream()->speed())); c.disconnect (); @@ -2672,20 +2672,22 @@ Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event) if (latest_regionview) { new_regionviews.push_back (latest_regionview); } - } - + if (new_regionviews.empty()) { return; } - + /* reset selection to new regionviews */ - + selection->set (new_regionviews); - + + /* reset drag_info data to reflect the fact that we are dragging the copies */ + + drag_info.data = new_regionviews.front(); drag_info.item = new_regionviews.front()->get_canvas_group (); + drag_info.copy = true; - drag_info.data = new_regionviews.front(); drag_info.motion_callback = &Editor::region_drag_motion_callback; drag_info.finished_callback = &Editor::region_drag_finished_callback; @@ -3036,8 +3038,9 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) ************************************************************/ pair::iterator,bool> insert_result; + const list& layered_regions = selection->audio_regions.by_layer(); - for (list::const_iterator i = selection->audio_regions.by_layer().begin(); i != selection->audio_regions.by_layer().end(); ++i) { + for (list::const_iterator i = layered_regions.begin(); i != layered_regions.end(); ++i) { AudioRegionView* rv; rv = (*i); @@ -4598,7 +4601,7 @@ Editor::mouse_rename_region (ArdourCanvas::Item* item, GdkEvent* event) } break; } - return TRUE; + return true; } void @@ -4712,7 +4715,7 @@ Editor::track_height_step_timeout () if (delta.tv_sec * 1000000 + delta.tv_usec > 250000) { /* milliseconds */ current_stepping_trackview = 0; - return FALSE; + return false; } - return TRUE; + return true; } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index a5d0df530d..38a73ee9ee 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -103,6 +103,9 @@ class PublicEditor : public Gtk::Window, public Stateful { virtual PlaylistSelector& playlist_selector() const = 0; virtual void route_name_changed (TimeAxisView *) = 0; virtual void clear_playlist (ARDOUR::Playlist&) = 0; + virtual void new_playlists () = 0; + virtual void copy_playlists () = 0; + virtual void clear_playlists () = 0; virtual void set_selected_mixer_strip (TimeAxisView&) = 0; virtual void hide_track_in_display (TimeAxisView& tv) = 0; virtual void set_follow_playhead (bool yn) = 0; diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index d6efce7264..82e8bbb682 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -152,94 +152,65 @@ Selection::clear_lines () void Selection::toggle (Redirect* r) { - if (find (redirects.begin(), redirects.end(), r) == redirects.end()) { + RedirectSelection::iterator i; + + if ((i = find (redirects.begin(), redirects.end(), r)) == redirects.end()) { redirects.push_back (r); - RedirectsChanged(); + } else { + redirects.erase (i); } + RedirectsChanged(); + } void Selection::toggle (Playlist* pl) { - if (find (playlists.begin(), playlists.end(), pl) == playlists.end()) { + PlaylistSelection::iterator i; + + if ((i = find (playlists.begin(), playlists.end(), pl)) == playlists.end()) { pl->ref (); playlists.push_back(pl); - PlaylistsChanged (); - } -} - -void -Selection::toggle (const list& pllist) -{ - bool changed = false; - - for (list::const_iterator i = pllist.begin(); i != pllist.end(); ++i) { - if (find (playlists.begin(), playlists.end(), (*i)) == playlists.end()) { - (*i)->ref (); - playlists.push_back (*i); - changed = true; - } - } - - if (changed) { - PlaylistsChanged (); + } else { + playlists.erase (i); } -} - -void -Selection::toggle (const list& track_list) -{ - bool changed = false; - for (list::const_iterator i = track_list.begin(); i != track_list.end(); ++i) { - if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) { - void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; - (*i)->GoingAway.connect (sigc::bind (mem_fun (*this, pmf), (*i))); - tracks.push_back (*i); - changed = true; - } - } - - if (changed) { - TracksChanged (); - } + PlaylistsChanged (); } void Selection::toggle (TimeAxisView* track) { - if (find (tracks.begin(), tracks.end(), track) == tracks.end()) { + TrackSelection::iterator i; + + if ((i = find (tracks.begin(), tracks.end(), track)) == tracks.end()) { void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; track->GoingAway.connect (sigc::bind (mem_fun (*this, pmf), track)); tracks.push_back (track); - TracksChanged(); + } else { + tracks.erase (i); } + + TracksChanged(); } void Selection::toggle (AudioRegionView* r) { - if (find (audio_regions.begin(), audio_regions.end(), r) == audio_regions.end()) { - audio_regions.add (r); - RegionsChanged (); - } -} + AudioRegionSelection::iterator i; -void -Selection::toggle (vector& v) -{ - bool changed = false; + cerr << "about to toggle a regionview\n"; - for (vector::iterator i = v.begin(); i != v.end(); ++i) { - if (find (audio_regions.begin(), audio_regions.end(), (*i)) == audio_regions.end()) { - audio_regions.add ((*i)); - changed = true; - } + if ((i = find (audio_regions.begin(), audio_regions.end(), r)) == audio_regions.end()) { + audio_regions.add (r); + cerr << "\tadded\n"; + } else { + audio_regions.erase (i); + cerr << "\tremoved\n"; } - if (changed) { - RegionsChanged (); - } + RegionsChanged (); + cerr << "done\n"; } long diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index f6426836f1..a4ee1c9c5e 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -535,6 +535,7 @@ StreamView::set_selected_regionviews (AudioRegionSelection& regions) { bool selected; + cerr << _trackview.name() << " (selected = " << regions.size() << ")" << endl; for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { selected = false; @@ -545,6 +546,7 @@ StreamView::set_selected_regionviews (AudioRegionSelection& regions) } } + cerr << "\tregion " << (*i)->region.name() << " selected = " << selected << endl; (*i)->set_selected (selected, this); } } -- cgit v1.2.3