Prepare clip-export DnD

This commit is contained in:
Robin Gareus 2022-01-29 02:57:25 +01:00
parent c6a31250ba
commit 92024697aa
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
3 changed files with 54 additions and 4 deletions

View File

@ -124,11 +124,10 @@ TriggerClipPicker::TriggerClipPicker ()
_view.set_reorderable (false);
_view.get_selection ()->set_mode (SELECTION_MULTIPLE);
/* DnD */
/* DnD source */
std::vector<TargetEntry> 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<Gtk::TargetEntry> 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<Gdk::DragContext> 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<Gdk::Bitmap> (), 4, h / 2);
}
}
void
TriggerClipPicker::drag_end (Glib::RefPtr<Gdk::DragContext> const&)
{
@ -427,6 +447,32 @@ TriggerClipPicker::drag_data_get (Glib::RefPtr<Gdk::DragContext> const&, Selecti
data.set_uris (uris);
}
bool
TriggerClipPicker::drag_motion (Glib::RefPtr<Gdk::DragContext> 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<Gdk::DragContext> 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> region = RegionFactory::region_by_id (rid);
if (boost::dynamic_pointer_cast<AudioRegion> (region)) {
//region->do_export ("/tmp/foo.flac");
context->drag_finish (true, false, time);
} else if (boost::dynamic_pointer_cast<MidiRegion> (region)) {
//region->do_export ("/tmp/foo.mid");
context->drag_finish (true, false, time);
}
context->drag_finish (true, false, time);
}
/* ****************************************************************************
* Dir Listing
*/

View File

@ -31,6 +31,7 @@
#include <gtkmm/treestore.h>
#include <gtkmm/treeview.h>
#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<Gdk::DragContext> const&, Gtk::SelectionData&, guint, guint);
void drag_begin (Glib::RefPtr<Gdk::DragContext> const&);
void drag_end (Glib::RefPtr<Gdk::DragContext> const&);
bool drag_motion (Glib::RefPtr<Gdk::DragContext> const&, int, int, guint);
void drag_data_received (Glib::RefPtr<Gdk::DragContext> const&, int, int, Gtk::SelectionData const&, guint, guint);
void maybe_add_dir (std::string const&);
void audition_selected ();
void audition (std::string const&);

View File

@ -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);