*/
#include <string>
-#include <climits>
#include <iostream>
-#include <midi++/controllable.h>
+#include "pbd/controllable.h"
-#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/bindable_button.h>
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/bindable_button.h"
+#include "gtkmm2ext/gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace std;
-
-BindableToggleButton::BindableToggleButton (MIDI::Controllable *mc)
- : ToggleButton (),
- prompter (Gtk::WIN_POS_MOUSE, 30000, false),
- midi_control (mc),
- bind_button (2),
- bind_statemask (Gdk::CONTROL_MASK)
-
-{
- init_events ();
-}
-
-BindableToggleButton::BindableToggleButton(MIDI::Controllable *mc, const string &label)
- : ToggleButton (label),
- prompter (Gtk::WIN_POS_MOUSE, 30000, false),
- midi_control (mc),
- bind_button (2),
- bind_statemask (Gdk::CONTROL_MASK)
-{
- init_events ();
-}
-
-
-void
-BindableToggleButton::init_events ()
-{
- signal_button_press_event().connect (mem_fun (*this, &BindableToggleButton::button_press));
-
- prompter.signal_unmap_event().connect (mem_fun (*this, &BindableToggleButton::prompter_hiding));
-
- prompting = false;
- unprompting = false;
-
- if (midi_control) {
- midi_control->learning_started.connect (mem_fun (*this, &BindableToggleButton::midicontrol_prompt));
- midi_control->learning_stopped.connect (mem_fun (*this, &BindableToggleButton::midicontrol_unprompt));
- }
-}
+using namespace PBD;
void
-BindableToggleButton::set_bind_button_state (guint button, guint statemask)
+BindableToggleButton::set_controllable (boost::shared_ptr<PBD::Controllable> c)
{
- bind_button = button;
- bind_statemask = statemask;
+ watch_connection.disconnect ();
+ binding_proxy.set_controllable (c);
}
void
-BindableToggleButton::get_bind_button_state (guint &button, guint &statemask)
+BindableToggleButton::watch ()
{
- button = bind_button;
- statemask = bind_statemask;
-}
+ boost::shared_ptr<Controllable> c (binding_proxy.get_controllable ());
-void
-BindableToggleButton::midi_learn()
-{
- if (midi_control) {
- prompting = true;
- midi_control->learn_about_external_control ();
- }
-}
-
-
-gint
-BindableToggleButton::button_press (GdkEventButton *ev)
-{
-
- if ((ev->state & bind_statemask) && ev->button == bind_button) {
- midi_learn ();
- return TRUE;
- }
+ if (!c) {
+ warning << _("button cannot watch state of non-existing Controllable\n") << endl;
+ return;
+ }
- return FALSE;
+ c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&BindableToggleButton::controllable_changed, this), gui_context());
}
-gint
-BindableToggleButton::prompter_hiding (GdkEventAny *ev)
-{
- if (unprompting) {
- if (midi_control) {
- midi_control->stop_learning();
- }
- unprompting = false;
- }
-
- return FALSE;
-}
-
-
void
-BindableToggleButton::midicontrol_set_tip ()
-
+BindableToggleButton::controllable_changed ()
{
- if (midi_control) {
- // Gtkmm2ext::UI::instance()->set_tip (evbox, midi_control->control_description());
- }
+ float val = binding_proxy.get_controllable()->get_value();
+ set_active (fabs (val) >= 0.5f);
}
-
-void
-BindableToggleButton::midicontrol_prompt ()
-
-{
- if (prompting) {
- string prompt = _("operate MIDI controller now");
- prompter.set_text (prompt);
- Gtkmm2ext::UI::instance()->touch_display (&prompter);
-
- unprompting = true;
- prompting = false;
- }
-}
-
-void
-BindableToggleButton::midicontrol_unprompt ()
-
-{
- if (unprompting) {
- Gtkmm2ext::UI::instance()->touch_display (&prompter);
- unprompting = false;
- }
-}
-
-