Create new track by dragging an instrument from the favorites sidebar

This commit is contained in:
Robin Gareus 2016-05-06 16:04:05 +02:00
parent 70160db4be
commit baca1fd377
4 changed files with 57 additions and 13 deletions

View File

@ -1798,7 +1798,8 @@ ARDOUR_UI::session_add_mixed_track (
uint32_t how_many,
const string& name_template,
bool strict_io,
PluginInfoPtr instrument)
PluginInfoPtr instrument,
Plugin::PresetRecord* pset)
{
list<boost::shared_ptr<MidiTrack> > tracks;
@ -1833,7 +1834,8 @@ ARDOUR_UI::session_add_midi_bus (
uint32_t how_many,
const string& name_template,
bool strict_io,
PluginInfoPtr instrument)
PluginInfoPtr instrument,
Plugin::PresetRecord* pset)
{
RouteList routes;
@ -1843,7 +1845,7 @@ ARDOUR_UI::session_add_midi_bus (
}
try {
routes = _session->new_midi_route (route_group, how_many, name_template, instrument);
routes = _session->new_midi_route (route_group, how_many, name_template, instrument, pset);
if (routes.size() != how_many) {
error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
}
@ -1868,15 +1870,16 @@ ARDOUR_UI::session_add_midi_route (
uint32_t how_many,
const string& name_template,
bool strict_io,
PluginInfoPtr instrument)
PluginInfoPtr instrument,
Plugin::PresetRecord* pset)
{
ChanCount one_midi_channel;
one_midi_channel.set (DataType::MIDI, 1);
if (disk) {
session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument);
session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument, pset);
} else {
session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument);
session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument, pset);
}
}
@ -4017,13 +4020,13 @@ ARDOUR_UI::add_route ()
session_add_midi_track (route_group, count, name_template, strict_io, instrument);
break;
case AddRouteDialog::MixedTrack:
session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument);
session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument, 0);
break;
case AddRouteDialog::AudioBus:
session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io);
break;
case AddRouteDialog::MidiBus:
session_add_midi_bus (route_group, count, name_template, strict_io, instrument);
session_add_midi_bus (route_group, count, name_template, strict_io, instrument, 0);
break;
}
}

View File

@ -298,14 +298,15 @@ public:
uint32_t how_many,
std::string const & name_template,
bool strict_io,
ARDOUR::PluginInfoPtr instrument) {
session_add_midi_route (true, route_group, how_many, name_template, strict_io, instrument);
ARDOUR::PluginInfoPtr instrument,
ARDOUR::Plugin::PresetRecord* preset = NULL) {
session_add_midi_route (true, route_group, how_many, name_template, strict_io, instrument, preset);
}
void session_add_mixed_track (const ARDOUR::ChanCount&, const ARDOUR::ChanCount&, ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr);
void session_add_midi_bus (ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr);
void session_add_mixed_track (const ARDOUR::ChanCount&, const ARDOUR::ChanCount&, ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord*);
void session_add_midi_bus (ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord*);
void session_add_audio_route (bool, int32_t, int32_t, ARDOUR::TrackMode, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool);
void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr);
void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord*);
void display_insufficient_ports_message ();

View File

@ -117,6 +117,13 @@ Mixer_UI::Mixer_UI ()
scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
scroller_base.set_name ("MixerWindow");
scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
/* set up drag-n-drop */
vector<TargetEntry> target_table;
target_table.push_back (TargetEntry ("PluginFavoritePtr"));
scroller_base.drag_dest_set (target_table);
scroller_base.signal_drag_data_received().connect (sigc::mem_fun(*this, &Mixer_UI::scroller_drag_data_received));
// add as last item of strip packer
strip_packer.pack_end (scroller_base, true, true);
@ -1621,6 +1628,38 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
return false;
}
void
Mixer_UI::scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time)
{
printf ("Mixer_UI::scroller_drag_data_received\n");
if (data.get_target() != "PluginFavoritePtr") {
context->drag_finish (false, false, time);
return;
}
const void * d = data.get_data();
const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>* tv = reinterpret_cast<const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>*>(d);
PluginPresetList nfos;
TreeView* source;
tv->get_object_drag_data (nfos, &source);
Route::ProcessorList pl;
bool ok = false;
for (list<PluginPresetPtr>::const_iterator i = nfos.begin(); i != nfos.end(); ++i) {
PluginPresetPtr ppp = (*i);
PluginInfoPtr pip = ppp->_pip;
if (!pip->is_instrument ()) {
continue;
}
ARDOUR_UI::instance()->session_add_midi_track (NULL, 1, _("MIDI"), Config->get_strict_io (), pip, ppp->_preset.valid ? &ppp->_preset : 0);
ok = true;
}
context->drag_finish (ok, false, time);
}
void
Mixer_UI::set_strip_width (Width w, bool save)
{

View File

@ -158,6 +158,7 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p
std::list<MixerStrip *> strips;
void scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>&, int, int, const Gtk::SelectionData&, guint, guint);
bool strip_scroller_button_release (GdkEventButton*);
void scroll_left ();
void scroll_right ();