diff --git a/gtk2_ardour/mixer_snapshot_dialog.cc b/gtk2_ardour/mixer_snapshot_dialog.cc index 9dd5213983..dfca15070a 100644 --- a/gtk2_ardour/mixer_snapshot_dialog.cc +++ b/gtk2_ardour/mixer_snapshot_dialog.cc @@ -70,6 +70,15 @@ MixerSnapshotDialog::MixerSnapshotDialog(Session* s) add(top_level_view_box); + vector target_table; + target_table.push_back(TargetEntry("string")); + + global_display.drag_dest_set(target_table); + local_display.drag_dest_set(target_table); + + global_display.signal_drag_data_received().connect(sigc::bind(sigc::mem_fun(*this, &MixerSnapshotDialog::display_drag_data_received), true)); + local_display.signal_drag_data_received().connect(sigc::bind(sigc::mem_fun(*this, &MixerSnapshotDialog::display_drag_data_received), false)); + global_display.signal_button_press_event().connect(sigc::bind(sigc::mem_fun(*this, &MixerSnapshotDialog::button_press), true), false); local_display.signal_button_press_event().connect(sigc::bind(sigc::mem_fun(*this, &MixerSnapshotDialog::button_press), false), false); @@ -85,6 +94,37 @@ void MixerSnapshotDialog::set_session(Session* s) refill(); } +void MixerSnapshotDialog::display_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time, bool global) +{ + if (data.get_target() != "string") { + context->drag_finish(false, false, time); + return; + } + + const void* d = data.get_data(); + const Gtkmm2ext::DnDTreeView* tv = reinterpret_cast*>(d); + + bool ok = false; + if(tv) { + list paths; + TreeView* source; + tv->get_object_drag_data(paths, &source); + + for (list::const_iterator i = paths.begin(); i != paths.end(); i++) { + string new_path; + if(global) { + new_path = Glib::build_filename(user_config_directory(-1), "mixer_snapshots", basename((*i).c_str())); + } else { + new_path = Glib::build_filename(_session->session_directory().root_path(), "mixer_snapshots", basename((*i).c_str())); + } + ::g_rename((*i).c_str(), new_path.c_str()); + } + ok = true; + } + + context->drag_finish(ok, false, time); + refill(); +} bool MixerSnapshotDialog::button_press(GdkEventButton* ev, bool global) { @@ -194,7 +234,7 @@ bool MixerSnapshotDialog::bootstrap_display_and_model(Gtkmm2ext::DnDTreeView(display.get_column_cell_renderer(0)); diff --git a/gtk2_ardour/mixer_snapshot_dialog.h b/gtk2_ardour/mixer_snapshot_dialog.h index 6c071b2a4c..9fa72a69bc 100644 --- a/gtk2_ardour/mixer_snapshot_dialog.h +++ b/gtk2_ardour/mixer_snapshot_dialog.h @@ -48,6 +48,7 @@ class MixerSnapshotDialog : public ArdourWindow void refill(); private: + void display_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time, bool); void new_snapshot(bool); void new_snap_from_session(bool);