Remove now-deprecated non-zero page size in Adjustments used for SpinButtons;
[ardour.git] / gtk2_ardour / canvas-program-change.cc
1 #include <iostream>
2
3 #include <glibmm/regex.h>
4
5 #include "ardour/midi_patch_manager.h"
6 #include "ardour_ui.h"
7 #include "midi_region_view.h"
8 #include "canvas-program-change.h"
9
10 using namespace Gnome::Canvas;
11 using namespace MIDI::Name;
12 using namespace std;
13
14 CanvasProgramChange::CanvasProgramChange(
15                 MidiRegionView&                       region,
16                 Group&                                parent,
17                 string&                               text,
18                 double                                height,
19                 double                                x,
20                 double                                y,
21                 string&                               model_name,
22                 string&                               custom_device_mode,
23                 nframes_t                             event_time,
24                 uint8_t                               channel,
25                 uint8_t                               program
26                 )
27         : CanvasFlag(
28                         region, 
29                         parent, 
30                         height, 
31                         ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get(), 
32                         ARDOUR_UI::config()->canvasvar_MidiProgramChangeFill.get(),
33                         x,
34                         y
35                 )
36          , _model_name(model_name)
37          , _custom_device_mode(custom_device_mode)
38          , _event_time(event_time)
39          , _channel(channel)
40          , _program(program)
41          , _popup_initialized(false)
42 {
43         set_text(text);
44 }
45
46 CanvasProgramChange::~CanvasProgramChange()
47 {
48 }
49
50 void 
51 CanvasProgramChange::initialize_popup_menus()
52 {
53         boost::shared_ptr<ChannelNameSet> channel_name_set = 
54                 MidiPatchManager::instance()
55                         .find_channel_name_set(_model_name, _custom_device_mode, _channel);
56
57         if (!channel_name_set) {
58                 return;
59         }
60         
61         const ChannelNameSet::PatchBanks& patch_banks = channel_name_set->patch_banks();
62         
63         // fill popup menu:
64         Gtk::Menu::MenuList& patch_bank_menus = _popup.items();
65         
66         for (ChannelNameSet::PatchBanks::const_iterator bank = patch_banks.begin();
67              bank != patch_banks.end();
68              ++bank) {
69                 Glib::RefPtr<Glib::Regex> underscores = Glib::Regex::create("_");
70                 Glib::ustring replacement(" ");
71                 
72                 Gtk::Menu& patch_bank_menu = *manage(new Gtk::Menu());
73                 
74                 const PatchBank::PatchNameList& patches = (*bank)->patch_name_list();
75                 Gtk::Menu::MenuList& patch_menus = patch_bank_menu.items();
76                 
77                 for (PatchBank::PatchNameList::const_iterator patch = patches.begin();
78                      patch != patches.end();
79                      ++patch) {
80                         Glib::ustring name = underscores->replace((*patch)->name().c_str(), -1, 0, replacement);
81                     
82                         patch_menus.push_back(
83                                 Gtk::Menu_Helpers::MenuElem(
84                                         name, 
85                                         sigc::bind(
86                                                 sigc::mem_fun(*this, &CanvasProgramChange::on_patch_menu_selected), 
87                                                 (*patch)->patch_primary_key())) );              
88                 }
89
90
91                 Glib::ustring name = underscores->replace((*bank)->name().c_str(), -1, 0, replacement);
92                 
93                 patch_bank_menus.push_back( 
94                         Gtk::Menu_Helpers::MenuElem(
95                                 name, 
96                                 patch_bank_menu) );             
97         }
98 }
99
100 void 
101 CanvasProgramChange::on_patch_menu_selected(const PatchPrimaryKey& key)
102 {
103         cerr << " got patch program number " << key.program_number << endl;
104         _region.program_selected(*this, key);
105 }
106
107 bool
108 CanvasProgramChange::on_event(GdkEvent* ev)
109 {
110         switch (ev->type) {
111         case GDK_BUTTON_PRESS:
112                 if (ev->button.button == 3) {
113                         // lazy init
114                         if (!_popup_initialized) {
115                                 initialize_popup_menus();
116                                 _popup_initialized = true;
117                         }
118                     _popup.popup(ev->button.button, ev->button.time);
119                         return true;
120                 }
121                 break;
122                 
123         case GDK_SCROLL:
124                 if (ev->scroll.direction == GDK_SCROLL_UP) {
125                         _region.previous_program(*this);
126                         return true;
127                 } else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
128                         _region.next_program(*this);
129                         return true;
130                 } 
131                 break;
132                 
133         default:
134                 break;
135         }
136         
137         return false;
138 }