#include <list>
#include <map>
#include <set>
+#include <stack>
#include <string>
#include <sys/time.h>
#include <cmath>
#include "ardour/types.h"
#include "canvas/fwd.h"
+#include "canvas/ruler.h"
-#include "gtk-custom-ruler.h"
#include "ardour_button.h"
#include "ardour_dialog.h"
#include "ardour_dropdown.h"
class PluginSelector;
class ProgressReporter;
class RhythmFerret;
+class RulerDialog;
class Selection;
class SoundFileOmega;
class StreamView;
Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; }
void set_canvas_cursor (Gdk::Cursor*, bool save=false);
+
+ void push_canvas_cursor (Gdk::Cursor*);
+ void pop_canvas_cursor ();
+
void set_current_trimmable (boost::shared_ptr<ARDOUR::Trimmable>);
void set_current_movable (boost::shared_ptr<ARDOUR::Movable>);
_stepping_axis_view = v;
}
- ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
- ArdourCanvas::Group* get_hscroll_group () const { return h_scroll_group; }
- ArdourCanvas::Group* get_vscroll_group () const { return v_scroll_group; }
- ArdourCanvas::Group* get_hvscroll_group () const { return hv_scroll_group; }
+ ArdourCanvas::Container* get_trackview_group () const { return _trackview_group; }
+ ArdourCanvas::Container* get_noscroll_group () const { return no_scroll_group; }
+ ArdourCanvas::ScrollGroup* get_hscroll_group () const { return h_scroll_group; }
+ ArdourCanvas::ScrollGroup* get_vscroll_group () const { return v_scroll_group; }
+ ArdourCanvas::ScrollGroup* get_hvscroll_group () const { return hv_scroll_group; }
ArdourCanvas::GtkCanvasViewport* get_track_canvas () const;
void override_visible_track_count ();
+ /* Ruler metrics methods */
+
+ void metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+ void metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+ void metric_get_samples (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+ void metric_get_minsec (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+
protected:
void map_transport_state ();
void map_position_change (framepos_t);
JoinObjectRangeState _join_object_range_state;
- void update_join_object_range_location (double, double);
+ void update_join_object_range_location (double);
boost::optional<int> pre_notebook_shrink_pane_width;
void refresh_location_display ();
void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
void add_new_location (ARDOUR::Location *);
- ArdourCanvas::Group* add_new_location_internal (ARDOUR::Location *);
+ ArdourCanvas::Container* add_new_location_internal (ARDOUR::Location *);
void location_gone (ARDOUR::Location *);
void remove_marker (ArdourCanvas::Item&, GdkEvent*);
gint really_remove_marker (ARDOUR::Location* loc);
LocationMarkerMap location_markers;
void update_marker_labels ();
- void update_marker_labels (ArdourCanvas::Group *);
+ void update_marker_labels (ArdourCanvas::Container *);
void check_marker_label (Marker *);
/** A set of lists of Markers that are in each of the canvas groups
* a marker has moved we can decide whether we need to update the labels
* for all markers or for just a few.
*/
- std::map<ArdourCanvas::Group *, std::list<Marker *> > _sorted_marker_lists;
+ std::map<ArdourCanvas::Container *, std::list<Marker *> > _sorted_marker_lists;
void remove_sorted_marker (Marker *);
void hide_marker (ArdourCanvas::Item*, GdkEvent*);
Gtk::VBox global_vpacker;
Gtk::VBox vpacker;
+ std::stack<Gdk::Cursor*> _cursor_stack;
Gdk::Cursor* current_canvas_cursor;
- Gdk::Cursor* which_grabber_cursor ();
- void set_canvas_cursor ();
+ Gdk::Cursor* which_grabber_cursor () const;
+ Gdk::Cursor* which_track_cursor () const;
+ Gdk::Cursor* which_mode_cursor () const;
+ Gdk::Cursor* which_trim_cursor (bool left_side) const;
+ bool reset_canvas_cursor ();
+ void choose_canvas_cursor_on_entry (GdkEventCrossing*, ItemType);
ArdourCanvas::GtkCanvas* _track_canvas;
ArdourCanvas::GtkCanvasViewport* _track_canvas_viewport;
VerboseCursor* _verbose_cursor;
void parameter_changed (std::string);
+ void ui_parameter_changed (std::string);
- bool track_canvas_motion (GdkEvent*);
-
- Gtk::EventBox time_canvas_event_box;
Gtk::EventBox time_bars_event_box;
- Gtk::EventBox ruler_label_event_box;
+ Gtk::VBox time_bars_vbox;
ArdourCanvas::Pixbuf *logo_item;
#if 0
/* these will be needed when we have canvas rulers */
- ArdourCanvas::Group *minsec_group;
- ArdourCanvas::Group *bbt_group;
- ArdourCanvas::Group *timecode_group;
- ArdourCanvas::Group *frame_group;
+ ArdourCanvas::Container *minsec_group;
+ ArdourCanvas::Container *bbt_group;
+ ArdourCanvas::Container *timecode_group;
+ ArdourCanvas::Container *frame_group;
#endif
- ArdourCanvas::Group *tempo_group;
- ArdourCanvas::Group *meter_group;
- ArdourCanvas::Group *marker_group;
- ArdourCanvas::Group *range_marker_group;
- ArdourCanvas::Group *transport_marker_group;
- ArdourCanvas::Group* cd_marker_group;
+ ArdourCanvas::Container *tempo_group;
+ ArdourCanvas::Container *meter_group;
+ ArdourCanvas::Container *marker_group;
+ ArdourCanvas::Container *range_marker_group;
+ ArdourCanvas::Container *transport_marker_group;
+ ArdourCanvas::Container* cd_marker_group;
/* parent for groups which themselves contain time markers */
- ArdourCanvas::Group* _time_markers_group;
+ ArdourCanvas::Container* _time_markers_group;
/* The group containing all other groups that are scrolled vertically
and horizontally.
*/
- ArdourCanvas::Group* hv_scroll_group;
+ ArdourCanvas::ScrollGroup* hv_scroll_group;
/* The group containing all other groups that are scrolled vertically ONLY
*/
- ArdourCanvas::Group* v_scroll_group;
+ ArdourCanvas::ScrollGroup* v_scroll_group;
/* The group containing all other groups that are scrolled horizontally ONLY
*/
- ArdourCanvas::Group* h_scroll_group;
+ ArdourCanvas::ScrollGroup* h_scroll_group;
+
+ /* The group containing all trackviews. */
+ ArdourCanvas::Container* no_scroll_group;
/* The group containing all trackviews. */
- ArdourCanvas::Group* _trackview_group;
+ ArdourCanvas::Container* _trackview_group;
- /* The group used for region motion. Sits on top of _trackview_group */
- ArdourCanvas::Group* _region_motion_group;
+ /* The group holding things (mostly regions) while dragging so they
+ * are on top of everything else
+ */
+ ArdourCanvas::Container* _drag_motion_group;
/* a rect that sits at the bottom of all tracks to act as a drag-no-drop/clickable
* target area.
*/
- ArdourCanvas::Rectangle* _canvas_bottom_rect;
- bool canvas_bottom_rect_event (GdkEvent* event);
+ ArdourCanvas::Rectangle* _canvas_drop_zone;
+ bool canvas_drop_zone_event (GdkEvent* event);
enum RulerType {
ruler_metric_timecode = 0,
ruler_video_timeline = 10,
};
- static GtkCustomMetric ruler_metrics[4];
Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_bbt_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_cd_marker_action;
bool no_ruler_shown_update;
- bool ruler_button_press (GdkEventButton*);
- bool ruler_button_release (GdkEventButton*);
- bool ruler_mouse_motion (GdkEventMotion*);
- bool ruler_scroll (GdkEventScroll* event);
-
Gtk::Widget * ruler_grabbed_widget;
+ RulerDialog* ruler_dialog;
+
void initialize_rulers ();
void update_just_timecode ();
void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
void store_ruler_visibility ();
void restore_ruler_visibility ();
- static gint _metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
- static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
- static gint _metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint);
- static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
-
enum MinsecRulerScale {
minsec_show_seconds,
minsec_show_minutes,
ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin,
ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end);
- gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
- gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
- gint metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint);
- gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
-
- Gtk::Widget *_ruler_separator;
- GtkWidget *_timecode_ruler;
- GtkWidget *_bbt_ruler;
- GtkWidget *_samples_ruler;
- GtkWidget *_minsec_ruler;
- Gtk::Widget *timecode_ruler;
- Gtk::Widget *bbt_ruler;
- Gtk::Widget *samples_ruler;
- Gtk::Widget *minsec_ruler;
- static Editor *ruler_editor;
+ ArdourCanvas::Ruler* timecode_ruler;
+ ArdourCanvas::Ruler* bbt_ruler;
+ ArdourCanvas::Ruler* samples_ruler;
+ ArdourCanvas::Ruler* minsec_ruler;
static const double timebar_height;
guint32 visible_timebars;
/* videtimline related actions */
Gtk::Label videotl_label;
- ArdourCanvas::Group* videotl_group;
+ ArdourCanvas::Container* videotl_group;
Glib::RefPtr<Gtk::ToggleAction> ruler_video_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_proc_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_ontop_action;
void export_video (bool range = false);
void toggle_region_video_lock ();
- Gtk::VBox time_bars_vbox;
-
friend class EditorCursor;
EditorCursor* playhead_cursor;
Gtk::Menu *edit_controls_left_menu;
Gtk::Menu *edit_controls_right_menu;
- Gtk::VBox ruler_label_vbox;
Gtk::VBox track_canvas_vbox;
- Gtk::VBox time_canvas_vbox;
Gtk::VBox edit_controls_vbox;
Gtk::HBox edit_controls_hbox;
/* track views */
TrackViewList track_views;
- std::pair<TimeAxisView*, double> trackview_by_y_position (double);
+ std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
RouteTimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
TrackViewList get_tracks_for_range_action () const;
void temporal_zoom_by_frame (framepos_t start, framepos_t end);
void temporal_zoom_to_frame (bool coarser, framepos_t frame);
- void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
void insert_region_list_selection (float times);
- void insert_route_list_drag (boost::shared_ptr<ARDOUR::Route>, int x, int y);
-
/* import & embed */
void add_external_audio_action (Editing::ImportMode);
DragManager* _drags;
void escape ();
+ void lock ();
+ void unlock ();
+ Gtk::Dialog* lock_dialog;
+
+ struct timeval last_event_time;
+ bool generic_event_handler (GdkEvent*);
+ bool lock_timeout_callback ();
+ void start_lock_event_timing ();
Gtk::Menu fade_context_menu;
/* Canvas event handlers */
+ bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas);
bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false);
bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
+ bool canvas_wave_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_frame_handle_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
+ bool canvas_ruler_event (GdkEvent* event, ArdourCanvas::Item *, ItemType);
bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
friend class EditorRouteGroups;
friend class EditorRegions;
- /** true if the mouse is over a place where region trim can happen */
- bool _over_region_trim_target;
-
/* non-public event handlers */
bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
bool track_canvas_scroll (GdkEventScroll* event);
- bool track_canvas_scroll_event (GdkEventScroll* event);
bool track_canvas_button_press_event (GdkEventButton* event);
bool track_canvas_button_release_event (GdkEventButton* event);
bool track_canvas_motion_notify_event (GdkEventMotion* event);
TempoLines* tempo_lines;
- ArdourCanvas::Group* global_rect_group;
- ArdourCanvas::Group* time_line_group;
+ ArdourCanvas::Container* global_rect_group;
+ ArdourCanvas::Container* time_line_group;
void hide_measures ();
void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
Gtk::MenuItem& action_menu_item (std::string const &);
void action_pre_activated (Glib::RefPtr<Gtk::Action> const &);
- void set_canvas_cursor_for_region_view (double, RegionView *);
-
MouseCursors* _cursors;
void follow_mixer_selection ();