3 #include <glibmm/regex.h>
5 #include "ardour/midi_patch_manager.h"
7 #include "midi_region_view.h"
8 #include "canvas-program-change.h"
10 using namespace Gnome::Canvas
;
11 using namespace MIDI::Name
;
14 CanvasProgramChange::CanvasProgramChange(
15 MidiRegionView
& region
,
22 string
& custom_device_mode
,
30 ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline
.get(),
31 ARDOUR_UI::config()->canvasvar_MidiProgramChangeFill
.get(),
34 , _model_name(model_name
)
35 , _custom_device_mode(custom_device_mode
)
36 , _event_time(event_time
)
39 , _popup_initialized(false)
44 CanvasProgramChange::~CanvasProgramChange()
49 CanvasProgramChange::initialize_popup_menus()
51 boost::shared_ptr
<ChannelNameSet
> channel_name_set
=
52 MidiPatchManager::instance()
53 .find_channel_name_set(_model_name
, _custom_device_mode
, _channel
);
55 if (!channel_name_set
) {
59 const ChannelNameSet::PatchBanks
& patch_banks
= channel_name_set
->patch_banks();
62 Gtk::Menu::MenuList
& patch_bank_menus
= _popup
.items();
64 for (ChannelNameSet::PatchBanks::const_iterator bank
= patch_banks
.begin();
65 bank
!= patch_banks
.end();
67 Glib::RefPtr
<Glib::Regex
> underscores
= Glib::Regex::create("_");
68 Glib::ustring
replacement(" ");
70 Gtk::Menu
& patch_bank_menu
= *manage(new Gtk::Menu());
72 const PatchBank::PatchNameList
& patches
= (*bank
)->patch_name_list();
73 Gtk::Menu::MenuList
& patch_menus
= patch_bank_menu
.items();
75 for (PatchBank::PatchNameList::const_iterator patch
= patches
.begin();
76 patch
!= patches
.end();
78 Glib::ustring name
= underscores
->replace((*patch
)->name().c_str(), -1, 0, replacement
);
80 patch_menus
.push_back(
81 Gtk::Menu_Helpers::MenuElem(
84 sigc::mem_fun(*this, &CanvasProgramChange::on_patch_menu_selected
),
85 (*patch
)->patch_primary_key())) );
89 Glib::ustring name
= underscores
->replace((*bank
)->name().c_str(), -1, 0, replacement
);
91 patch_bank_menus
.push_back(
92 Gtk::Menu_Helpers::MenuElem(
99 CanvasProgramChange::on_patch_menu_selected(const PatchPrimaryKey
& key
)
101 cerr
<< " got patch program number " << key
.program_number
<< endl
;
102 _region
.program_selected(*this, key
);
106 CanvasProgramChange::on_event(GdkEvent
* ev
)
109 case GDK_BUTTON_PRESS
:
110 if (ev
->button
.button
== 3) {
112 if (!_popup_initialized
) {
113 initialize_popup_menus();
114 _popup_initialized
= true;
116 _popup
.popup(ev
->button
.button
, ev
->button
.time
);
122 if (ev
->scroll
.direction
== GDK_SCROLL_UP
) {
123 _region
.previous_program(*this);
125 } else if (ev
->scroll
.direction
== GDK_SCROLL_DOWN
) {
126 _region
.next_program(*this);