PatchChange Dialog: update title & refresh midnam on change

This commit is contained in:
Robin Gareus
2017-09-08 19:37:48 +02:00
parent b7227415ad
commit c3e8cdb418
4 changed files with 45 additions and 7 deletions

View File

@@ -425,7 +425,7 @@ MidiTimeAxisView::update_patch_selector ()
boost::bind (&MidiTimeAxisView::drop_instrument_ref, this),
gui_context());
pi->plugin()->UpdateMidnam.connect (midnam_connection, invalidator (*this),
boost::bind (&Plugin::read_midnam, pi->plugin ()),
boost::bind (&MidiTimeAxisView::reread_midnam, this),
gui_context());
pluginprovided = true;
@@ -445,6 +445,17 @@ MidiTimeAxisView::update_patch_selector ()
}
}
void
MidiTimeAxisView::reread_midnam ()
{
boost::shared_ptr<Processor> the_instrument (_route->the_instrument());
boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(the_instrument);
pi->plugin ()->read_midnam();
if (_patch_change_dialog) {
_patch_change_dialog->refresh ();
}
}
void
MidiTimeAxisView::model_changed(const std::string& model)
{
@@ -486,6 +497,10 @@ MidiTimeAxisView::model_changed(const std::string& model)
delete controller_menu;
controller_menu = 0;
build_automation_action_menu(false);
if (_patch_change_dialog) {
_patch_change_dialog->refresh ();
}
}
void
@@ -1093,7 +1108,7 @@ MidiTimeAxisView::send_patch_change ()
return;
}
PatchChangeGridDialog* d = new PatchChangeGridDialog (string_compose (_("Select Patch for '%1'"), _route->name ()), _route);
PatchChangeGridDialog* d = new PatchChangeGridDialog (_route);
_patch_change_dialog = d;
d->present ();
}

View File

@@ -122,6 +122,7 @@ private:
void setup_midnam_patches ();
void update_patch_selector ();
void drop_instrument_ref ();
void reread_midnam ();
PBD::ScopedConnectionList midnam_connection;
void start_scroomer_update ();

View File

@@ -19,7 +19,6 @@
#include <bitset>
#include <gtkmm/frame.h>
#include <boost/algorithm/string.hpp>
#include "pbd/unwind.h"
@@ -141,6 +140,14 @@ PatchChangeWidget::~PatchChangeWidget ()
delete _pianomm;
}
void
PatchChangeWidget::refresh ()
{
if (is_visible ()) {
on_show ();
}
}
void
PatchChangeWidget::on_show ()
{
@@ -237,7 +244,7 @@ PatchChangeWidget::refill_program_list ()
if (_current_patch_bank) {
const MIDI::Name::PatchNameList& patches = _current_patch_bank->patch_name_list ();
for (MIDI::Name::PatchNameList::const_iterator i = patches.begin(); i != patches.end(); ++i) {
std::string n = (*i)->name ();
const std::string n = (*i)->name ();
MIDI::Name::PatchPrimaryKey const& key = (*i)->patch_primary_key ();
const uint8_t pgm = key.program();
@@ -477,10 +484,20 @@ PatchChangeWidget::program (uint8_t chn) const
/* ***************************************************************************/
PatchChangeGridDialog::PatchChangeGridDialog (std::string const& title, boost::shared_ptr<ARDOUR::Route> r)
: ArdourDialog (title, false, false)
PatchChangeGridDialog::PatchChangeGridDialog (boost::shared_ptr<ARDOUR::Route> r)
: ArdourDialog (string_compose (_("Select Patch for '%1"), r->name()), false, false)
, w (r)
{
r->PropertyChanged.connect (_route_connection, invalidator (*this), boost::bind (&PatchChangeGridDialog::route_property_changed, this, _1, boost::weak_ptr<Route>(r)), gui_context());
get_vbox()->add (w);
w.show ();
}
void
PatchChangeGridDialog::route_property_changed (const PBD::PropertyChange& what_changed, boost::weak_ptr<Route> wr)
{
boost::shared_ptr<ARDOUR::Route> r = wr.lock ();
if (r && what_changed.contains (ARDOUR::Properties::name)) {
set_title (string_compose (_("Select Patch for '%1"), r->name()));
}
}

View File

@@ -39,6 +39,8 @@ public:
PatchChangeWidget (boost::shared_ptr<ARDOUR::Route>);
~PatchChangeWidget ();
void refresh ();
protected:
int bank (uint8_t) const;
uint8_t program (uint8_t) const;
@@ -105,11 +107,14 @@ private:
class PatchChangeGridDialog : public ArdourDialog
{
public:
PatchChangeGridDialog (std::string const&, boost::shared_ptr<ARDOUR::Route>);
PatchChangeGridDialog (boost::shared_ptr<ARDOUR::Route>);
void on_hide () { w.hide (); ArdourDialog::on_hide (); }
void on_show () { w.show (); ArdourDialog::on_show (); }
void refresh () { w.refresh (); }
private:
void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route>);
PBD::ScopedConnection _route_connection;
PatchChangeWidget w;
};