35 #include "canvas/canvas.h"
36 #include "canvas/rectangle.h"
37 #include "canvas/debug.h"
38 #include "canvas/utils.h"
39 #include "canvas/colors.h"
71 #define TOP_LEVEL_WIDGET controls_ebox
90 , controls_table (3, 3)
91 , controls_button_size_group (
Gtk::SizeGroup::create (
Gtk::SIZE_GROUP_BOTH))
92 , _name_editing (false)
99 , in_destructor (false)
101 , _canvas_display (0)
107 , _effective_height (0)
108 , _resize_drag_start (-1)
109 , _did_resize (false)
110 , _preresize_cursor (0)
111 , _have_preresize_cursor (false)
112 , _ebox_release_can_act (true)
130 _canvas_separator->set (ArdourCanvas::Duple(0.0, 0.0), ArdourCanvas::Duple(ArdourCanvas::COORD_MAX, 0.0));
131 _canvas_separator->set_outline_color(ArdourCanvas::rgba_to_color (0, 0, 0, 1.0));
151 an_entry->set_name (
"EditorTrackNameDisplay");
152 Gtk::Requisition req;
153 an_entry->size_request (req);
155 name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
186 Gdk::BUTTON_RELEASE_MASK|
187 Gdk::POINTER_MOTION_MASK|
188 Gdk::ENTER_NOTIFY_MASK|
189 Gdk::LEAVE_NOTIFY_MASK|
205 HSeparator* separator = manage (
new HSeparator());
206 separator->set_name(
"TrackSeparator");
207 separator->set_size_request(-1, 1);
232 for (list<GhostRegion*>::iterator i =
ghosts.begin(); i !=
ghosts.end(); ++i) {
237 delete (*i)->rect; (*i)->rect=0;
238 delete (*i)->start_trim; (*i)->start_trim = 0;
239 delete (*i)->end_trim; (*i)->end_trim = 0;
244 delete (*i)->rect; (*i)->rect = 0;
245 delete (*i)->start_trim; (*i)->start_trim = 0;
246 delete (*i)->end_trim; (*i)->end_trim = 0;
328 if ((*i)->marked_for_display()) {
348 switch (ev->direction) {
350 if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
361 case GDK_SCROLL_DOWN:
362 if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
391 if ((event->button == 1 && event->type == GDK_2BUTTON_PRESS) || Keyboard::is_edit_event (event)) {
397 Gtk::Allocation a =
name_label.get_allocation ();
398 if (nlx > 0 && nlx < a.get_width() && nly > 0 && nly < a.get_height()) {
446 gdk_event_request_motions(ev);
473 win->set_cursor (Gdk::Cursor(Gdk::SB_V_DOUBLE_ARROW));
510 switch (ev->button) {
537 static const uint32_t step = 25;
563 if (apply_to_selection) {
576 if ( !(*i)->hidden()) ++lanes;
589 snprintf (buf,
sizeof (buf),
"%u",
height);
592 for (list<GhostRegion*>::iterator i =
ghosts.begin(); i !=
ghosts.end(); ++i) {
615 switch (ev->keyval) {
617 case GDK_ISO_Left_Tab:
627 TrackViewList::iterator i;
629 switch (ev->keyval) {
638 case GDK_ISO_Left_Tab:
672 name_entry->set_name (
"EditorTrackNameDisplay");
700 bool edit_next =
false;
701 bool edit_prev =
false;
704 case RESPONSE_CANCEL:
709 case RESPONSE_ACCEPT:
734 TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(),
this);
736 if (i != allviews.end()) {
739 if (++i == allviews.end()) {
749 if (!(*i)->hidden()) {
756 if ((i != allviews.end()) && (*i !=
this) && !(*i)->hidden()) {
758 (*i)->begin_name_edit ();
761 }
else if (edit_prev) {
764 TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(),
this);
766 if (i != allviews.begin()) {
768 if (i == allviews.begin()) {
780 if (!(*i)->hidden()) {
787 if ((i != allviews.end()) && (*i !=
this) && !(*i)->hidden()) {
789 (*i)->begin_name_edit ();
810 if (!s.selected (
this)) {
858 (*i)->set_selected (
false);
869 using namespace Menu_Helpers;
883 (*i)->set_samples_per_pixel (fpp);
891 (*i)->show_timestretch (start, end, layers, layer);
899 (*i)->hide_timestretch ();
913 (*i)->show_selection (ts);
930 for (list<AudioRange>::iterator i = ts.begin(); i != ts.end(); ++i) {
936 cnt = end - start + 1;
944 rect->
rect->set (ArdourCanvas::Rect (x1, 0, x2, y2));
970 (*i)->show_selection (ts);
989 (*i)->hide_selection ();
1001 if ((*i)->start_trim == item || (*i)->end_trim == item) {
1007 (*i)->rect->raise_to_top ();
1008 (put_start_on_top ? (*i)->start_trim : (*i)->end_trim)->raise_to_top ();
1009 (put_start_on_top ? (*i)->end_trim : (*i)->start_trim)->raise_to_top ();
1024 if ((*i)->id ==
id) {
1032 if ((*i)->id ==
id) {
1046 CANVAS_DEBUG_NAME (rect->
rect,
"selection rect");
1047 rect->
rect->set_outline (
false);
1051 CANVAS_DEBUG_NAME (rect->
start_trim,
"selection rect start trim");
1056 CANVAS_DEBUG_NAME (rect->
end_trim,
"selection rect end trim");
1057 rect->
end_trim->set_outline (
false);
1090 Children::iterator i;
1139 for (list<GhostRegion*>::iterator i =
ghosts.begin(); i !=
ghosts.end(); ++i) {
1156 return ((_y_position <= bot && _y_position >= top) ||
1157 ((mybot <= bot) && (top < mybot)) ||
1173 (*i)->set_height ((*i)->height);
1181 Gtk::Window window (Gtk::WINDOW_TOPLEVEL);
1182 Gtk::Table one_row_table (1, 1);
1184 const int border_width = 2;
1185 const int frame_height = 2;
1188 window.add (one_row_table);
1189 test_button->set_name (
"mute button");
1193 one_row_table.set_border_width (border_width);
1194 one_row_table.set_row_spacings (2);
1195 one_row_table.set_col_spacings (2);
1197 one_row_table.attach (*test_button, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
1198 one_row_table.show_all ();
1200 Gtk::Requisition req(one_row_table.size_request ());
1207 for (list<GhostRegion*>::iterator i =
ghosts.begin(); i !=
ghosts.end(); i++) {
1213 (*i)->rect->set_fill_color (
ARDOUR_UI::config()->color_mod (
"selection rect",
"selection rect"));
1225 (*i)->rect->set_fill_color (
ARDOUR_UI::config()->color_mod (
"selection rect",
"selection rect"));
1246 std::pair<TimeAxisView*, double>
1266 if (l >=
view()->layers ()) {
1275 if (l >= (
view()->layers() - 0.5)) {
1282 return std::make_pair (const_cast<TimeAxisView*>(
this), l);
1285 for (Children::const_iterator i =
children.begin(); i !=
children.end(); ++i) {
1287 std::pair<TimeAxisView*, int>
const r = (*i)->covers_y_position (y);
1312 for (Children::const_iterator i =
children.begin(); i !=
children.end(); ++i) {
1313 if ((*i)->covered_by_y_range (y0, y1)) {
1348 if (!(*i)->hidden()) {
1365 using namespace Menu_Helpers;
1395 std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists;
1398 for (iterator i = begin(); i != end(); ++i) {
1406 if (playlists.insert (t->
playlist()).second) {
static PBD::Signal1< void, TimeAxisView * > CatchDeletion
double _resize_drag_start
bool _have_preresize_cursor
virtual bool can_edit_name() const
virtual void selection_click(GdkEventButton *)
virtual bool controls_ebox_button_press(GdkEventButton *)
virtual guint32 show_at(double y, int &nth, Gtk::VBox *parent)
int atoi(const string &s)
void remove_regions(TimeAxisView *)
void remove_ghost(RegionView *)
void remove_ghost_in(TimeAxisView &)
void conditionally_add_to_selection()
std::pair< TimeAxisView *, double > covers_y_position(double) const
SelectionRect * get_selection_rect(uint32_t id)
static void setup_sizes()
std::string gui_property(const std::string &property_name) const
LIBARDOUR_API PBD::PropertyDescriptor< layer_t > layer
static unsigned int name_width_px
void order_selection_trims(ArdourCanvas::Item *item, bool put_start_on_top)
bool touched(double top, double bot)
void remove(TimeAxisView *)
ARDOUR::layer_t layers() const
virtual void set_height(uint32_t h, TrackHeightMode m=OnlySelf)
virtual void hide_timestretch()
static ARDOUR_UI * instance()
virtual bool controls_ebox_button_release(GdkEventButton *)
bool _ebox_release_can_act
virtual bool controls_ebox_scroll(GdkEventScroll *)
bool name_entry_key_press(GdkEventKey *ev)
Lists of selected things.
std::vector< boost::shared_ptr< TimeAxisView > > Children
bool name_entry_focus_out(GdkEventFocus *ev)
virtual StreamView * view() const
Representation of the interface of the Editor class.
ArdourCanvas::Rectangle * start_trim
virtual bool controls_ebox_leave(GdkEventCrossing *)
Gtk::Table controls_table
virtual double sample_to_pixel(framepos_t frame) const =0
virtual void step_height(bool)
uint32_t _effective_height
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
void set_stepping_axis_view(TimeAxisView *v)
uint32_t current_height() const
Gtk::Frame time_axis_frame
bool name_entry_key_release(GdkEventKey *ev)
void operator()(void const *) const
virtual void name_entry_changed()
virtual GhostRegion * add_ghost(TimeAxisView &)=0
virtual void reshow_selection(TimeSelection &)
virtual void popup_display_menu(guint32 when)
virtual void build_display_menu()
virtual bool canvas_scroll_event(GdkEventScroll *event, bool from_canvas)=0
std::string controls_base_selected_name
ArdourCanvas::Container * _canvas_display
virtual void show_timestretch(framepos_t start, framepos_t end, int layers, int layer)
static Glib::RefPtr< Gtk::SizeGroup > controls_meters_size_group
LIBGTKMM2EXT_API uint64_t Keyboard
void idle_resize(int32_t)
virtual bool record_enabled() const
virtual TrackViewList const & get_track_views()=0
std::list< SelectionRect * > free_selection_rects
ArdourCanvas::Container * _ghost_group
virtual void maybe_autoscroll(bool, bool, bool from_headers)=0
void add_ghost(RegionView *)
Gtk::Fixed scroomer_placeholder
virtual void get_selectables(ARDOUR::framepos_t, ARDOUR::framepos_t, double, double, std::list< Selectable * > &, bool within=false)
virtual void show_selection(TimeSelection &)
bool is_child(TimeAxisView *)
boost::shared_ptr< ARDOUR::Track > track() const
virtual ArdourCanvas::Container * get_trackview_group() const =0
virtual bool canvas_selection_rect_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)=0
boost::shared_ptr< Playlist > playlist()
void set_height_enum(Height, bool apply_to_selection=false)
bool covered_by_y_range(double y0, double y1) const
ArdourCanvas::Rectangle * end_trim
virtual Selection & get_selection() const =0
TimeAxisView * stepping_axis_view()
TrackViewList filter_to_unique_playlists()
static int const _max_order
virtual void stop_canvas_autoscroll()=0
virtual void get_inverted_selectables(Selection &, std::list< Selectable * > &results)
LIBARDOUR_API RuntimeProfile * Profile
const double trim_handle_size
std::list< GhostRegion * > ghosts
void set_tip(Gtk::Widget &w, const gchar *tip)
virtual void reset_visual_state()
void set_parent(TimeAxisView &p)
std::list< SelectionRect * > used_selection_rects
virtual void ensure_time_axis_view_is_visible(TimeAxisView const &tav, bool at_top=false)=0
ArdourCanvas::Container * selection_group
virtual void set_selected_track(TimeAxisView &, Selection::Operation op=Selection::Set, bool no_remove=false)=0
virtual void override_visible_track_count()=0
virtual void set_samples_per_pixel(double)
GdkCursor * _preresize_cursor
static Selection::Operation selection_type(guint state)
ArdourCanvas::Rectangle * rect
void add_child(boost::shared_ptr< TimeAxisView >)
ArdourCanvas::Line * _canvas_separator
static UIConfiguration * config()
virtual bool controls_ebox_motion(GdkEventMotion *)
sigc::signal< void > ColorsChanged
virtual void hide_selection()
virtual bool canvas_selection_end_trim_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)=0
static uint32_t extra_height
virtual LayerDisplay layer_display() const
std::string controls_base_unselected_name
void set_gui_property(const std::string &property_name, const T &value)
virtual void add_to_idle_resize(TimeAxisView *, int32_t)=0
TimeAxisView(ARDOUR::Session *sess, PublicEditor &ed, TimeAxisView *parent, ArdourCanvas::Canvas &canvas)
static uint32_t preset_height(Height)
Gtk::VBox * control_parent
void foreach_time_axis(Function f)
virtual void set_selected(bool yn)
bool maybe_set_cursor(int y)
static PBD::Signal1< void, GhostRegion * > CatchDeletion
virtual void remove_child(boost::shared_ptr< TimeAxisView >)
static uint32_t button_height
Gtk::EventBox controls_ebox
boost::shared_ptr< ARDOUR::Route > route() const
static Glib::RefPtr< Gtk::SizeGroup > midi_scroomer_size_group
void erase_ghost(GhostRegion *)
virtual bool canvas_selection_start_trim_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)=0
sigc::signal< void > Hiding
Children get_child_list()