diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index ae6b4055a1..698f134a2d 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -107,15 +107,15 @@ ARDOUR_UI::create_editor ()
_frame_rate_button->signal_clicked.connect(sigc::mem_fun (*this, &ARDOUR_UI::on_frame_rate_button));
_tracks_button->signal_clicked.connect(sigc::mem_fun (*this, &ARDOUR_UI::on_tracks_button));
- _sample_rate_dropdown->signal_menu_item_clicked.connect (mem_fun(*this, &ARDOUR_UI::on_sample_rate_dropdown_item_clicked ));
- _display_format_dropdown->signal_menu_item_clicked.connect (mem_fun(*this, &ARDOUR_UI::on_display_format_dropdown_item_clicked ));
- _timecode_source_dropdown->signal_menu_item_clicked.connect (mem_fun(*this, &ARDOUR_UI::on_timecode_source_dropdown_item_clicked ));
+ _sample_rate_dropdown->selected_item_changed.connect (mem_fun(*this, &ARDOUR_UI::on_sample_rate_dropdown_item_clicked ));
+ _display_format_dropdown->selected_item_changed.connect (mem_fun(*this, &ARDOUR_UI::on_display_format_dropdown_item_clicked ));
+ _timecode_source_dropdown->selected_item_changed.connect (mem_fun(*this, &ARDOUR_UI::on_timecode_source_dropdown_item_clicked ));
editor->Realized.connect (sigc::mem_fun (*this, &ARDOUR_UI::editor_realized));
editor->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), true));
- _midi_input_dropdown->signal_menu_item_clicked.connect (sigc::mem_fun (*this, &ARDOUR_UI::midi_input_chosen));
- _midi_output_dropdown->signal_menu_item_clicked.connect (sigc::mem_fun (*this, &ARDOUR_UI::midi_output_chosen));
+ _midi_input_dropdown->selected_item_changed.connect (sigc::mem_fun (*this, &ARDOUR_UI::midi_input_chosen));
+ _midi_output_dropdown->selected_item_changed.connect (sigc::mem_fun (*this, &ARDOUR_UI::midi_output_chosen));
populate_midi_inout_dropdowns ();
diff --git a/gtk2_ardour/ui/tracks_preferences.xml b/gtk2_ardour/ui/tracks_preferences.xml
index fa66eea342..99310b6c5c 100644
--- a/gtk2_ardour/ui/tracks_preferences.xml
+++ b/gtk2_ardour/ui/tracks_preferences.xml
@@ -1,8 +1,8 @@
diff --git a/gtk2_ardour/waves_dropdown.cc b/gtk2_ardour/waves_dropdown.cc
index fd2727aa4c..6672ea95e5 100644
--- a/gtk2_ardour/waves_dropdown.cc
+++ b/gtk2_ardour/waves_dropdown.cc
@@ -21,8 +21,9 @@
WavesDropdown::WavesDropdown (const std::string& title)
: WavesIconButton (title)
+ , _selected_item_number (-1)
{
- signal_button_press_event().connect (sigc::mem_fun(*this, &WavesDropdown::on_mouse_pressed));
+ signal_button_press_event().connect (sigc::mem_fun(*this, &WavesDropdown::_on_mouse_pressed));
_menu.signal_hide ().connect (sigc::bind (sigc::mem_fun (*this, &CairoWidget::set_active), false));
}
@@ -30,13 +31,25 @@ WavesDropdown::~WavesDropdown ()
{
}
-bool
-WavesDropdown::on_mouse_pressed (GdkEventButton*)
+void
+WavesDropdown::clear_items ()
{
- _menu.popup (sigc::mem_fun(this, &WavesDropdown::_on_popup_menu_position), 1, gtk_get_current_event_time());
- _hovering = _pushed = false;
- set_active (true);
- return true;
+ _menu.items().clear ();
+}
+
+void
+WavesDropdown::set_selected_item (int selected_item_number)
+{
+ Gtk::Menu_Helpers::MenuList& items = _menu.items ();
+
+ if ((selected_item_number < 0) || (selected_item_number >= items.size ())) {
+ return;
+ }
+
+ Gtk::Menu_Helpers::MenuList::iterator i = items.begin();
+ std::advance (i, _selected_item_number);
+
+ _on_menu_item (_selected_item_number, (*i).get_data ("waves_dropdown_item_cookie"));
}
Gtk::MenuItem&
@@ -53,6 +66,8 @@ WavesDropdown::add_menu_item (const std::string& item, void* cookie)
child->set_style (get_style());
}
+ menuitem.set_data ("waves_dropdown_item_cookie", cookie);
+
return menuitem;
}
@@ -70,6 +85,8 @@ WavesDropdown::add_radio_menu_item (const std::string& item, void* cookie)
child->set_style (get_style());
}
+ menuitem.set_data ("waves_dropdown_item_cookie", cookie);
+
return menuitem;
}
@@ -87,23 +104,21 @@ WavesDropdown::add_check_menu_item (const std::string& item, void* cookie)
child->set_style (get_style());
}
+ menuitem.set_data ("waves_dropdown_item_cookie", cookie);
+
return menuitem;
}
void
-WavesDropdown::clear_items ()
+WavesDropdown::_on_menu_item (int item_number, void* cookie)
{
- _menu.items().clear ();
-}
+ _selected_item_number = item_number;
-void
-WavesDropdown::_on_menu_item (size_t item_number, void* cookie)
-{
Gtk::Menu_Helpers::MenuList& items = _menu.items ();
Gtk::Menu_Helpers::MenuList::iterator i = items.begin();
- std::advance (i, item_number);
+ std::advance (i, _selected_item_number);
set_text ((*i).get_label());
- signal_menu_item_clicked (this, cookie);
+ selected_item_changed (this, cookie);
}
void
@@ -126,3 +141,12 @@ WavesDropdown::_on_popup_menu_position (int& x, int& y, bool& push_in)
y += yo;
}
}
+
+bool
+WavesDropdown::_on_mouse_pressed (GdkEventButton*)
+{
+ _menu.popup (sigc::mem_fun(this, &WavesDropdown::_on_popup_menu_position), 1, gtk_get_current_event_time());
+ _hovering = _pushed = false;
+ set_active (true);
+ return true;
+}
diff --git a/gtk2_ardour/waves_dropdown.h b/gtk2_ardour/waves_dropdown.h
index fffa9c2923..756990167e 100644
--- a/gtk2_ardour/waves_dropdown.h
+++ b/gtk2_ardour/waves_dropdown.h
@@ -31,22 +31,25 @@ class WavesDropdown : public WavesIconButton
WavesDropdown (const std::string& title = "");
virtual ~WavesDropdown ();
Gtk::Menu& get_menu () { return _menu; }
-
- bool on_mouse_pressed (GdkEventButton*);
-
- Gtk::MenuItem& add_menu_item (const std::string& item, void* cookie);
- Gtk::RadioMenuItem& add_radio_menu_item (const std::string& item, void* cookie);
- Gtk::CheckMenuItem& add_check_menu_item (const std::string& item, void* cookie);
-
void clear_items ();
+ int get_selected_item () { return _selected_item_number; }
+
+ void set_selected_item (int selected_item_number);
+
+ Gtk::MenuItem& add_menu_item (const std::string& item, void* cookie = 0);
+ Gtk::RadioMenuItem& add_radio_menu_item (const std::string& item, void* cookie = 0);
+ Gtk::CheckMenuItem& add_check_menu_item (const std::string& item, void* cookie = 0);
+
- sigc::signal2 signal_menu_item_clicked;
+ sigc::signal2 selected_item_changed;
private:
Gtk::Menu _menu;
+ int _selected_item_number;
Gtk::RadioMenuItem::Group _radio_menu_items_group;
- void _on_menu_item (size_t item_number, void* cookie);
+ void _on_menu_item (int item_number, void* cookie);
void _on_popup_menu_position (int& x, int& y, bool& push_in);
+ bool _on_mouse_pressed (GdkEventButton*);
};
#endif /* __gtk2_ardour_waves_dropdown_h__ */