/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard. * * Ingen is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONTROLGROUPS_H #define CONTROLGROUPS_H #include #include #include #include #include "PortModel.h" #include "util/CountedPtr.h" namespace Ingen { namespace Client { class PortModel; } } using namespace Ingen::Client; namespace Ingenuity { class ControlPanel; /** A group of controls (for a single Port) in a NodeControlWindow. * * \ingroup Ingenuity */ class ControlGroup : public Gtk::VBox { public: ControlGroup(ControlPanel* panel, CountedPtr pm, bool separator); ~ControlGroup() { delete m_separator; } inline const CountedPtr port_model() const { return m_port_model; } void remove_separator() { assert(m_has_separator); remove(*m_separator); delete m_separator; } virtual void enable() {} virtual void disable() {} protected: virtual void set_name(const string& name) {} virtual void set_value(float val) = 0; virtual void set_min(float val) {} virtual void set_max(float val) {} virtual void metadata_update(const string& key, const Atom& value); ControlPanel* m_control_panel; CountedPtr m_port_model; bool m_has_separator; Gtk::HSeparator* m_separator; }; /** A slider for a continuous control. * * \ingroup Ingenuity */ class SliderControlGroup : public ControlGroup { public: SliderControlGroup(ControlPanel* panel, CountedPtr pm, bool separator); void enable(); void disable(); private: void set_name(const string& name); inline void set_value(const float val); void set_min(float val); void set_max(float val); void min_changed(); void max_changed(); void update_range(); void update_value_from_slider(); void update_value_from_spinner(); //void slider_grabbed(bool b); bool slider_pressed(GdkEvent* ev); bool m_enabled; bool m_enable_signal; Gtk::HBox m_header_box; Gtk::Label m_name_label; Gtk::HBox m_range_box; Gtk::Label m_range_label; Gtk::SpinButton m_min_spinner; Gtk::Label m_hyphen_label; Gtk::SpinButton m_max_spinner; Gtk::HBox m_slider_box; Gtk::SpinButton m_value_spinner; Gtk::HScale m_slider; }; inline void SliderControlGroup::set_value(const float val) { m_enable_signal = false; if (m_enabled) { m_slider.set_value(val); m_value_spinner.set_value(val); } m_enable_signal = true; } /** A spinbutton for integer controls. * * \ingroup Ingenuity */ class IntegerControlGroup : public ControlGroup { public: IntegerControlGroup(ControlPanel* panel, CountedPtr pm, bool separator); void enable(); void disable(); private: void set_name(const string& name); void set_value(float val); void update_value(); bool m_enable_signal; Gtk::Alignment m_alignment; Gtk::Label m_name_label; Gtk::SpinButton m_spinner; }; /** A radio button for toggle controls. * * \ingroup Ingenuity */ class ToggleControlGroup : public ControlGroup { public: ToggleControlGroup(ControlPanel* panel, CountedPtr pm, bool separator); void enable(); void disable(); private: void set_name(const string& name); void set_value(float val); void update_value(); bool m_enable_signal; Gtk::Alignment m_alignment; Gtk::Label m_name_label; Gtk::CheckButton m_checkbutton; }; } // namespace Ingenuity #endif // CONTROLGROUPS_H