summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-05-06 16:04:05 +0200
committerRobin Gareus <robin@gareus.org>2016-05-06 16:04:05 +0200
commitbaca1fd37711e23d6100c7b8cc946aef13f88ab4 (patch)
tree6655de66f33a577ab93e70b79104d93d19c60388 /gtk2_ardour
parent70160db4bedc7f782d12125496ec354b1ca35569 (diff)
Create new track by dragging an instrument from the favorites sidebar
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_ui.cc19
-rw-r--r--gtk2_ardour/ardour_ui.h11
-rw-r--r--gtk2_ardour/mixer_ui.cc39
-rw-r--r--gtk2_ardour/mixer_ui.h1
4 files changed, 57 insertions, 13 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 159984fbb6..0dbca05a51 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -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;
}
}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 6d2cb636e3..5b608a6c9c 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -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 ();
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index b037055b63..8457738f1b 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -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);
@@ -1622,6 +1629,38 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
}
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)
{
_strip_width = w;
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 916ef5aa21..39bd39278a 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -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 ();