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
This commit is contained in:
@@ -7,6 +7,7 @@ import shutil
|
||||
import glob
|
||||
import errno
|
||||
import time
|
||||
import platform
|
||||
from sets import Set
|
||||
import SCons.Node.FS
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
break;
|
||||
name = Playlist::bump_name (pl->name(), _session);
|
||||
|
||||
default:
|
||||
break;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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)));
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
49
gtk2_ardour/draginfo.h
Normal file
49
gtk2_ardour/draginfo.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#ifndef __gtk2_ardour_drag_info_h_
|
||||
#define __gtk2_ardour_drag_info_h_
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "canvas.h"
|
||||
#include <ardour/types.h>
|
||||
|
||||
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_ */
|
||||
|
||||
@@ -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<void,AudioTimeAxisView&> sl)
|
||||
Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&,uint32_t> sl)
|
||||
{
|
||||
set<AudioTimeAxisView*> relevant_tracks;
|
||||
|
||||
@@ -3060,7 +3061,7 @@ Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&> sl)
|
||||
|
||||
for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) {
|
||||
|
||||
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(&clicked_regionview->get_time_axis_view());
|
||||
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(*ti);
|
||||
|
||||
if (!atv) {
|
||||
continue;
|
||||
@@ -3094,14 +3095,17 @@ Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&> sl)
|
||||
}
|
||||
|
||||
/* step two: apply operation to each track */
|
||||
|
||||
uint32_t sz = relevant_tracks.size();
|
||||
|
||||
for (set<AudioTimeAxisView*>::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<AudioRegionView*>* all_equivs)
|
||||
Editor::mapped_set_selected_regionview_from_click (AudioTimeAxisView& atv, uint32_t ignored,
|
||||
AudioRegionView* basis, vector<AudioRegionView*>* all_equivs)
|
||||
{
|
||||
AudioPlaylist* pl;
|
||||
vector<AudioRegion*> 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<AudioRegionView*> 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 ();
|
||||
}
|
||||
|
||||
@@ -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<void,AudioTimeAxisView&> sl);
|
||||
void mapover_audio_tracks (sigc::slot<void,AudioTimeAxisView&,uint32_t> 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<AudioRegionView*>*);
|
||||
void mapped_set_selected_regionview_from_click (AudioTimeAxisView&, uint32_t, AudioRegionView*, vector<AudioRegionView*>*);
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
/* <CMT Additions> */
|
||||
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 ;
|
||||
/* </CMT Additions> */
|
||||
|
||||
@@ -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<AutomationTimeAxisView*>(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<ControlPoint*>(item->get_data ("control_point"));
|
||||
cp = static_cast<ControlPoint*>(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<ControlPoint*>(item->get_data ("control_point"));
|
||||
cp = static_cast<ControlPoint*>(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) */
|
||||
|
||||
|
||||
vector<AudioRegionView*> new_regionviews;
|
||||
|
||||
|
||||
set<Playlist*> affected_playlists;
|
||||
pair<set<Playlist*>::iterator,bool> insert_result;
|
||||
|
||||
for (list<AudioRegionView*>::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<AudioTimeAxisView*>(&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);
|
||||
|
||||
drag_info.item = new_regionviews.front()->get_canvas_group ();
|
||||
drag_info.copy = true;
|
||||
|
||||
/* 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.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<set<Playlist*>::iterator,bool> insert_result;
|
||||
const list<AudioRegionView*>& layered_regions = selection->audio_regions.by_layer();
|
||||
|
||||
for (list<AudioRegionView*>::const_iterator i = selection->audio_regions.by_layer().begin(); i != selection->audio_regions.by_layer().end(); ++i) {
|
||||
for (list<AudioRegionView*>::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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ();
|
||||
} else {
|
||||
playlists.erase (i);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Selection::toggle (const list<Playlist*>& pllist)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (list<Playlist*>::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 ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Selection::toggle (const list<TimeAxisView*>& track_list)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (list<TimeAxisView*>::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()) {
|
||||
AudioRegionSelection::iterator i;
|
||||
|
||||
cerr << "about to toggle a regionview\n";
|
||||
|
||||
if ((i = find (audio_regions.begin(), audio_regions.end(), r)) == audio_regions.end()) {
|
||||
audio_regions.add (r);
|
||||
RegionsChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Selection::toggle (vector<AudioRegionView*>& v)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (vector<AudioRegionView*>::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;
|
||||
}
|
||||
cerr << "\tadded\n";
|
||||
} else {
|
||||
audio_regions.erase (i);
|
||||
cerr << "\tremoved\n";
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
RegionsChanged ();
|
||||
}
|
||||
RegionsChanged ();
|
||||
cerr << "done\n";
|
||||
}
|
||||
|
||||
long
|
||||
|
||||
@@ -535,6 +535,7 @@ StreamView::set_selected_regionviews (AudioRegionSelection& regions)
|
||||
{
|
||||
bool selected;
|
||||
|
||||
cerr << _trackview.name() << " (selected = " << regions.size() << ")" << endl;
|
||||
for (list<AudioRegionView*>::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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class StateManager : public sigc::trackable
|
||||
|
||||
protected:
|
||||
static bool _allow_save;
|
||||
static std::set<StateManager*> deferred;
|
||||
static sigc::signal<void,const char*> SaveAllowed;
|
||||
|
||||
StateMap states;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ using namespace ARDOUR;
|
||||
using namespace std;
|
||||
|
||||
bool StateManager::_allow_save = true;
|
||||
set<StateManager*> StateManager::deferred;
|
||||
sigc::signal<void,const char*> StateManager::SaveAllowed;
|
||||
|
||||
StateManager::StateManager ()
|
||||
{
|
||||
@@ -29,11 +29,9 @@ StateManager::allow_save (const char* why, bool do_save)
|
||||
{
|
||||
_allow_save = true;
|
||||
if (do_save) {
|
||||
for (set<StateManager*>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
|
||||
(*x)->save_state (why);
|
||||
}
|
||||
SaveAllowed (why);
|
||||
SaveAllowed.slots().erase (SaveAllowed.slots().begin(), SaveAllowed.slots().end());
|
||||
}
|
||||
deferred.clear ();
|
||||
}
|
||||
|
||||
void
|
||||
@@ -74,7 +72,7 @@ void
|
||||
StateManager::save_state (std::string why)
|
||||
{
|
||||
if (!_allow_save) {
|
||||
deferred.insert (this);
|
||||
SaveAllowed.connect (mem_fun (*this, &StateManager::save_state));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user