From 92024697aa6b410e503b994ff093211b2da863f8 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 29 Jan 2022 02:57:25 +0100 Subject: [PATCH] Prepare clip-export DnD --- gtk2_ardour/trigger_clip_picker.cc | 52 ++++++++++++++++++++++++++++-- gtk2_ardour/trigger_clip_picker.h | 4 +++ gtk2_ardour/trigger_page.cc | 2 +- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/trigger_clip_picker.cc b/gtk2_ardour/trigger_clip_picker.cc index f1ce0055de..aa51853ebb 100644 --- a/gtk2_ardour/trigger_clip_picker.cc +++ b/gtk2_ardour/trigger_clip_picker.cc @@ -124,11 +124,10 @@ TriggerClipPicker::TriggerClipPicker () _view.set_reorderable (false); _view.get_selection ()->set_mode (SELECTION_MULTIPLE); - /* DnD */ + /* DnD source */ std::vector dnd; dnd.push_back (TargetEntry ("text/uri-list")); - _view.enable_model_drag_source (dnd, Gdk::MODIFIER_MASK, Gdk::ACTION_COPY); - + _view.drag_source_set (dnd, Gdk::MODIFIER_MASK, Gdk::ACTION_COPY); _view.get_selection ()->signal_changed ().connect (sigc::mem_fun (*this, &TriggerClipPicker::row_selected)); _view.signal_row_activated ().connect (sigc::mem_fun (*this, &TriggerClipPicker::row_activated)); _view.signal_test_expand_row ().connect (sigc::mem_fun (*this, &TriggerClipPicker::test_expand)); @@ -137,6 +136,14 @@ TriggerClipPicker::TriggerClipPicker () _view.signal_cursor_changed ().connect (sigc::mem_fun (*this, &TriggerClipPicker::cursor_changed)); _view.signal_drag_end ().connect (sigc::mem_fun (*this, &TriggerClipPicker::drag_end)); + /* DnD target */ + std::vector target_table; + target_table.push_back (Gtk::TargetEntry ("x-ardour/region.pbdid", Gtk::TARGET_SAME_APP)); + _view.drag_dest_set (target_table, DEST_DEFAULT_ALL, Gdk::ACTION_COPY); + _view.signal_drag_begin ().connect (sigc::mem_fun (*this, &TriggerClipPicker::drag_begin)); + _view.signal_drag_motion ().connect (sigc::mem_fun (*this, &TriggerClipPicker::drag_motion)); + _view.signal_drag_data_received ().connect (sigc::mem_fun (*this, &TriggerClipPicker::drag_data_received)); + Config->ParameterChanged.connect (_config_connection, invalidator (*this), boost::bind (&TriggerClipPicker::parameter_changed, this, _1), gui_context ()); /* show off */ @@ -317,6 +324,19 @@ TriggerClipPicker::maybe_add_dir (std::string const& dir) * Treeview Callbacks */ +void +TriggerClipPicker::drag_begin (Glib::RefPtr const& context) +{ + TreeView::Selection::ListHandle_Path rows = _view.get_selection ()->get_selected_rows (); + if (!rows.empty()) { + Glib::RefPtr< Gdk::Pixmap > pix = _view.create_row_drag_icon (*rows.begin ()); + + int w, h; + pix->get_size (w, h); + context->set_icon (pix->get_colormap (), pix, Glib::RefPtr (), 4, h / 2); + } +} + void TriggerClipPicker::drag_end (Glib::RefPtr const&) { @@ -427,6 +447,32 @@ TriggerClipPicker::drag_data_get (Glib::RefPtr const&, Selecti data.set_uris (uris); } +bool +TriggerClipPicker::drag_motion (Glib::RefPtr const& context, int, int y, guint time) +{ + //list_dir ("/tmp/"); + context->drag_status (Gdk::ACTION_COPY, time); + return true; +} + +void +TriggerClipPicker::drag_data_received (Glib::RefPtr const& context, int /*x*/, int y, Gtk::SelectionData const& data, guint /*info*/, guint time) +{ + if (data.get_target () != "x-ardour/region.pbdid") { + return; + } + PBD::ID rid (data.get_data_as_string ()); + boost::shared_ptr region = RegionFactory::region_by_id (rid); + if (boost::dynamic_pointer_cast (region)) { + //region->do_export ("/tmp/foo.flac"); + context->drag_finish (true, false, time); + } else if (boost::dynamic_pointer_cast (region)) { + //region->do_export ("/tmp/foo.mid"); + context->drag_finish (true, false, time); + } + context->drag_finish (true, false, time); +} + /* **************************************************************************** * Dir Listing */ diff --git a/gtk2_ardour/trigger_clip_picker.h b/gtk2_ardour/trigger_clip_picker.h index cf69fd856b..1182abe03a 100644 --- a/gtk2_ardour/trigger_clip_picker.h +++ b/gtk2_ardour/trigger_clip_picker.h @@ -31,6 +31,7 @@ #include #include +#include "ardour/types.h" #include "ardour/session_handle.h" #include "widgets/ardour_dropdown.h" @@ -56,7 +57,10 @@ private: bool test_expand (Gtk::TreeModel::iterator const&, Gtk::TreeModel::Path const&); void row_collapsed (Gtk::TreeModel::iterator const&, Gtk::TreeModel::Path const&); void drag_data_get (Glib::RefPtr const&, Gtk::SelectionData&, guint, guint); + void drag_begin (Glib::RefPtr const&); void drag_end (Glib::RefPtr const&); + bool drag_motion (Glib::RefPtr const&, int, int, guint); + void drag_data_received (Glib::RefPtr const&, int, int, Gtk::SelectionData const&, guint, guint); void maybe_add_dir (std::string const&); void audition_selected (); void audition (std::string const&); diff --git a/gtk2_ardour/trigger_page.cc b/gtk2_ardour/trigger_page.cc index 482b03619c..f58ea8b114 100644 --- a/gtk2_ardour/trigger_page.cc +++ b/gtk2_ardour/trigger_page.cc @@ -115,7 +115,7 @@ TriggerPage::TriggerPage () target_table.push_back (Gtk::TargetEntry ("text/uri-list")); target_table.push_back (Gtk::TargetEntry ("text/plain")); target_table.push_back (Gtk::TargetEntry ("application/x-rootwin-drop")); - _no_strips.drag_dest_set (target_table); + _no_strips.drag_dest_set (target_table, DEST_DEFAULT_ALL, Gdk::ACTION_COPY); _strip_group_box.pack_start (_cue_area_frame, false, false); _strip_group_box.pack_start (_strip_scroller, true, true);