X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fpanner2d.h;h=f3077187aba4b38c3431a1c1e3a36d467a3aba6b;hb=234b06a18cf3e8c07bc44fb4f8c1218e17fb65f1;hp=b16a2a1a2f869ff0af0f68baa5c9fd8a99786096;hpb=e493b2b7c4fbbbfc457f02babf9546289b430177;p=ardour.git diff --git a/gtk2_ardour/panner2d.h b/gtk2_ardour/panner2d.h index b16a2a1a2f..f3077187ab 100644 --- a/gtk2_ardour/panner2d.h +++ b/gtk2_ardour/panner2d.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_panner_2d_h__ @@ -23,93 +22,172 @@ #include #include -#include -#include +#include -using std::map; -using std::string; +#include +#include +#include +#include +#include +#include +#include + +#include "pbd/cartesian.h" + +#include "ardour_window.h" namespace ARDOUR { - class Panner; + class PannerShell; +} + +namespace Gtk { + class Menu; + class CheckMenuItem; +} + +namespace Pango { + class Container; } +class Panner2dWindow; + class Panner2d : public Gtk::DrawingArea { - public: - Panner2d (ARDOUR::Panner&, int32_t width, int32_t height); + public: + Panner2d (boost::shared_ptr, int32_t height); ~Panner2d (); - - int puck_position (int which_puck, float& x, float& y); - int target_position (int which_target, float& x, float& y); - void allow_x_motion(bool); - void allow_y_motion(bool); void allow_target_motion (bool); - void hide_puck (int which); - void show_puck (int which); - int add_target (float x, float y); - int add_puck (const char* text, float x, float y); - void hide_target (int); - void show_target (int); - void remove_target (int); - void drop_targets (); - void drop_pucks (); - void move_target (int, float x, float y); - void move_puck (int, float x, float y); + int add_speaker (const PBD::AngularVector&); + int add_signal (const char* text, const PBD::AngularVector&); + void move_signal (int which, const PBD::AngularVector&); void reset (uint32_t n_inputs); - - sigc::signal PuckMoved; - sigc::signal TargetMoved; - - protected: - gint expose_event_impl (GdkEventExpose *); - gint button_press_event_impl (GdkEventButton *); - gint button_release_event_impl (GdkEventButton *); - gint motion_notify_event_impl (GdkEventMotion *); - void size_allocate_impl (GtkAllocation* alloc); - - private: - struct Target { - float x; - float y; - bool visible; - char* text; - size_t textlen; - - Target (float xa, float ya, const char* txt = 0); - ~Target (); + void set_send_drawing_mode (bool); + + boost::shared_ptr get_panner_shell() const { return panner_shell; } + + void cart_to_gtk (PBD::CartesianVector&) const; + void gtk_to_cart (PBD::CartesianVector&) const; + + protected: + bool on_expose_event (GdkEventExpose *); + bool on_button_press_event (GdkEventButton *); + bool on_button_release_event (GdkEventButton *); + bool on_motion_notify_event (GdkEventMotion *); + bool on_scroll_event (GdkEventScroll *); + void on_size_allocate (Gtk::Allocation& alloc); + + private: + class Target { + public: + PBD::AngularVector position; + bool visible; + std::string text; + + Target (const PBD::AngularVector&, const char* txt = 0); + ~Target (); + + void set_text (const char*); + void set_selected (bool yn) { + _selected = yn; + } + bool selected() const { + return _selected; + } + + private: + bool _selected; }; - ARDOUR::Panner& panner; - Gtk::Menu* context_menu; - Gtk::CheckMenuItem* bypass_menu_item; + struct ColorScheme { + uint32_t background; + uint32_t crosshairs; + uint32_t signalcircle_border; + uint32_t signalcircle; + uint32_t diffusion; + uint32_t diffusion_inv; + uint32_t pos_outline; + uint32_t pos_fill; + uint32_t signal_outline; + uint32_t signal_fill; + uint32_t speaker_fill; + uint32_t text; + }; - typedef map Targets; - Targets targets; - Targets pucks; + static ColorScheme colors; + static void set_colors (); + static bool have_colors; + void color_handler (); - Target *drag_target; - int drag_index; - bool drag_is_puck; - bool allow_x; - bool allow_y; - bool allow_target; - int width; - int height; + boost::shared_ptr panner_shell; + Glib::RefPtr layout; - bool bypassflag; - - gint compute_x (float); - gint compute_y (float); + typedef std::vector Targets; + Targets speakers; + Targets signals; + Target position; - Target *find_closest_object (gdouble x, gdouble y, int& which, bool& is_puck) const; + Target *drag_target; + int width; + int height; + double radius; + double border; + double hoffset; + double voffset; + double last_width; + bool did_move; + bool have_elevation; + bool _send_mode; + + Target *find_closest_object (gdouble x, gdouble y, bool& is_signal); gint handle_motion (gint, gint, GdkModifierType); void toggle_bypass (); - void show_context_menu (); void handle_state_change (); + void handle_position_change (); + void label_signals (); + + PBD::ScopedConnectionList panshell_connections; + PBD::ScopedConnectionList panner_connections; + + /* cartesian coordinates in GTK units ; adjust to same but on a circle of radius 1.0 + and centered in the middle of our area + */ + void clamp_to_circle (double& x, double& y); + void sphere_project (double& x, double& y, double& z); +}; + +class Panner2dWindow : public ArdourWindow +{ + public: + Panner2dWindow (boost::shared_ptr, int32_t height, uint32_t inputs); + + void reset (uint32_t n_inputs); + + private: + Panner2d widget; + + Gtk::HBox hpacker; + Gtk::VBox button_box; + Gtk::ToggleButton bypass_button; + Gtk::VBox spinner_box; + Gtk::VBox left_side; + + Gtk::Adjustment width_adjustment; + Gtk::SpinButton width_spinner; + + PBD::ScopedConnectionList panshell_connections; + PBD::ScopedConnectionList panvalue_connections; + void set_bypassed(); + void set_width(); + + void pannable_handler (); + void bypass_toggled (); + void width_changed (); + bool on_key_press_event (GdkEventKey*); + bool on_key_release_event (GdkEventKey*); }; #endif /* __ardour_panner_2d_h__ */