diff options
author | Taybin Rutkin <taybin@taybin.com> | 2005-09-25 18:42:24 +0000 |
---|---|---|
committer | Taybin Rutkin <taybin@taybin.com> | 2005-09-25 18:42:24 +0000 |
commit | 209d967b1bb80a9735d690d8f4f0455ecb9970ca (patch) | |
tree | 9d76ddcd7c1ac9d91bb2b1a33d31b66ce4ded5de /gtk2_ardour/crossfade_edit.h | |
parent | e4b9aed743fc765219ac775905a221c017c88fba (diff) |
Initial import of gtk2_ardour.
git-svn-id: svn://localhost/trunk/ardour2@24 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/crossfade_edit.h')
-rw-r--r-- | gtk2_ardour/crossfade_edit.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/gtk2_ardour/crossfade_edit.h b/gtk2_ardour/crossfade_edit.h new file mode 100644 index 0000000000..dbe62dea66 --- /dev/null +++ b/gtk2_ardour/crossfade_edit.h @@ -0,0 +1,195 @@ +#ifndef __gtk_ardour_xfade_edit_h__ +#define __gtk_ardour_xfade_edit_h__ + +#include <list> + +#include <gtk--/box.h> +#include <gtk--/button.h> +#include <gtk--/radiobutton.h> +#include <gtk-canvas.h> + +#include <ardour/curve.h> +#include "ardour_dialog.h" + +namespace ARDOUR +{ + class Session; + class Curve; + class Crossfade; +} + +class CrossfadeEditor : public ArdourDialog +{ + public: + CrossfadeEditor (ARDOUR::Session&, ARDOUR::Crossfade&, double miny, double maxy); + ~CrossfadeEditor (); + + void apply (); + + static const double canvas_border; + + /* these are public so that a caller/subclass can make them do the right thing. + */ + + Gtk::Button cancel_button; + Gtk::Button ok_button; + + struct PresetPoint { + double x; + double y; + + PresetPoint (double a, double b) + : x (a), y (b) {} + }; + + struct Preset : public list<PresetPoint> { + const gchar** xpm; + + Preset (const gchar** x) + : xpm (x) {} + }; + + typedef list<Preset*> Presets; + + static Presets* fade_in_presets; + static Presets* fade_out_presets; + + private: + ARDOUR::Crossfade& xfade; + ARDOUR::Session& session; + + Gtk::VBox vpacker; + + struct Point { + ~Point(); + + GtkCanvasItem* box; + GtkCanvasItem* curve; + double x; + double y; + + static const int32_t size; + + void move_to (double x, double y, double xfract, double yfract); + }; + + struct PointSorter + { + bool operator() (const CrossfadeEditor::Point* a, const CrossfadeEditor::Point *b) { + return a->x < b->x; + } + }; + + GtkWidget* _canvas; + GtkCanvasItem* toplevel; + Gtk::Widget* canvas; + + struct Half { + GtkCanvasItem* line; + GtkCanvasItem* shading; + list<Point*> points; + ARDOUR::Curve normative_curve; /* 0 - 1.0, linear */ + ARDOUR::Curve gain_curve; /* 0 - 2.0, gain mapping */ + vector<GtkCanvasItem*> waves; + + Half(); + }; + + enum WhichFade { + In = 0, + Out = 1 + }; + + Half fade[2]; + WhichFade current; + + bool point_grabbed; + vector<Gtk::Button*> fade_out_buttons; + vector<Gtk::Button*> fade_in_buttons; + + Gtk::HBox action_box; + + Gtk::VBox vpacker2; + + Gtk::Button clear_button; + Gtk::Button revert_button; + + Gtk::ToggleButton audition_both_button; + Gtk::ToggleButton audition_left_dry_button; + Gtk::ToggleButton audition_left_button; + Gtk::ToggleButton audition_right_dry_button; + Gtk::ToggleButton audition_right_button; + + Gtk::ToggleButton preroll_button; + Gtk::ToggleButton postroll_button; + + Gtk::HBox roll_box; + + gint event_handler (GdkEvent*); + + static gint _canvas_event (GtkCanvasItem*, GdkEvent* event, gpointer data); + static gint _point_event (GtkCanvasItem*, GdkEvent* event, gpointer data); + static gint _curve_event (GtkCanvasItem*, GdkEvent* event, gpointer data); + + gint canvas_event (GtkCanvasItem*, GdkEvent* event); + gint point_event (GtkCanvasItem*, GdkEvent* event); + gint curve_event (GtkCanvasItem*, GdkEvent* event); + + void canvas_allocation (GtkAllocation*); + void add_control_point (double x, double y); + Point* make_point (); + void redraw (); + + double effective_width () const { return _canvas->allocation.width - (2.0 * canvas_border); } + double effective_height () const { return _canvas->allocation.height - (2.0 * canvas_border); } + + void clear (); + void reset (); + + double miny; + double maxy; + + Gtk::Table fade_in_table; + Gtk::Table fade_out_table; + + void build_presets (); + void apply_preset (Preset*); + + Gtk::RadioButton select_in_button; + Gtk::RadioButton select_out_button; + Gtk::HBox curve_button_box; + Gtk::HBox audition_box; + + void curve_select_clicked (WhichFade); + + double x_coordinate (double& xfract) const; + double y_coordinate (double& yfract) const; + + void set (const ARDOUR::Curve& alist, WhichFade); + + void make_waves (ARDOUR::AudioRegion&, WhichFade); + void peaks_ready (ARDOUR::AudioRegion* r, WhichFade); + + void _apply_to (ARDOUR::Crossfade* xf); + void setup (ARDOUR::Crossfade*); + void cancel_audition (); + void audition_state_changed (bool); + + void audition_toggled (); + void audition_right_toggled (); + void audition_right_dry_toggled (); + void audition_left_toggled (); + void audition_left_dry_toggled (); + + void audition_both (); + void audition_left_dry (); + void audition_left (); + void audition_right_dry (); + void audition_right (); + + void xfade_changed (ARDOUR::Change); + + void dump (); +}; + +#endif /* __gtk_ardour_xfade_edit_h__ */ |