#include "ardour/location.h"
#include "ardour_ui.h"
+#include "global_signals.h"
#include "gui_thread.h"
#include "public_editor.h"
#include "time_axis_view.h"
PBD::Signal1<void,TimeAxisView*> TimeAxisView::CatchDeletion;
TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
- : AxisView (sess),
- controls_table (2, 8),
- _y_position (0),
- _editor (ed),
- _order (0)
+ : AxisView (sess)
+ , controls_table (2, 8)
+ , _controls_padding_table (3, 3)
+ , _size_menu (0)
+ , _y_position (0)
+ , _editor (ed)
+ , _order (0)
{
if (extra_height == 0) {
compute_heights ();
name_hbox.show ();
controls_table.set_size_request (200);
- controls_table.set_border_width (2);
controls_table.set_row_spacings (0);
controls_table.set_col_spacings (0);
controls_table.set_homogeneous (true);
HSeparator* separator = manage (new HSeparator());
- controls_vbox.pack_start (controls_table, false, false);
+ /* Use a rather hacky extra table so that we can control the space above/below and
+ * left/right of the controls_table separately. This in turn is so that we can
+ * shrink the vertical space when the track is at its minimum height.
+ */
+ _controls_padding_table.set_row_spacings (2);
+ _controls_padding_table.set_col_spacings (0);
+ _controls_padding_table.attach (controls_table, 1, 2, 1, 2);
+ _controls_padding_table.show ();
+
+ controls_vbox.pack_start (_controls_padding_table, false, false);
controls_vbox.pack_end (resizer_box, false, false);
controls_vbox.show ();
delete display_menu;
display_menu = 0;
+
+ delete _size_menu;
}
/** Display this TimeAxisView as the nth component of the parent box, at y.
switch (ev->direction) {
case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
- step_height (true);
+ step_height (false);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
_editor.scroll_tracks_up_line();
case GDK_SCROLL_DOWN:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
- step_height (false);
+ step_height (true);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
_editor.scroll_tracks_down_line();
}
/* if its hidden, it cannot be selected */
-
_editor.get_selection().remove (this);
+ /* and neither can its regions */
+ _editor.get_selection().remove_regions (this);
Hiding ();
}
+/** Steps through the defined heights for this TrackView.
+ * @param coarser true if stepping should decrease in size, otherwise false.
+ */
void
-TimeAxisView::step_height (bool bigger)
+TimeAxisView::step_height (bool coarser)
{
static const uint32_t step = 25;
- if (bigger) {
- if (height == preset_height(HeightSmall)) {
- set_height (preset_height(HeightSmaller));
- }
- else if (height == preset_height(HeightSmaller)) {
- set_height (preset_height(HeightNormal));
- }
- else {
- set_height (height + step);
- }
-
- } else {
- if ( height == preset_height(HeightSmall)){
+ if (coarser) {
+
+ if (height == preset_height (HeightSmall)) {
return;
}
if (height <= preset_height (HeightSmaller) && height > preset_height (HeightSmall)) {
- set_height (preset_height(HeightSmall));
+ set_height_enum (HeightSmall);
+ } else if (height <= preset_height (HeightNormal) && height > preset_height (HeightSmaller)) {
+ set_height_enum (HeightSmaller);
+ } else {
+ set_height (height - step);
}
- else if ( height <= preset_height (HeightNormal) && height > preset_height (HeightSmaller)){
- set_height (preset_height(HeightSmaller));
+
+ } else {
+
+ if (height == preset_height(HeightSmall)) {
+ set_height_enum (HeightSmaller);
+ } else if (height == preset_height(HeightSmaller)) {
+ set_height_enum (HeightNormal);
+ } else {
+ set_height (height + step);
}
- else {
- set_height (height - step);
- }
+
}
}
}
void
-TimeAxisView::set_height (Height h)
+TimeAxisView::set_height_enum (Height h, bool apply_to_selection)
{
- set_height (preset_height (h));
+ if (apply_to_selection) {
+ _editor.get_selection().tracks.foreach_time_axis (boost::bind (&TimeAxisView::set_height_enum, _1, h, false));
+ } else {
+ set_height (preset_height (h));
+ }
}
void
/* resize to show editable name display */
if ((*i)->current_height() <= preset_height (HeightSmaller)) {
- (*i)->set_height (HeightSmaller);
+ (*i)->set_height_enum (HeightSmaller);
}
(*i)->name_entry.grab_focus();
void
TimeAxisView::popup_display_menu (guint32 when)
{
- if (display_menu == 0) {
- build_display_menu ();
- }
-
conditionally_add_to_selection ();
+
+ build_display_menu ();
display_menu->popup (1, when);
}
}
void
-TimeAxisView::show_timestretch (nframes_t start, nframes_t end)
+TimeAxisView::show_timestretch (framepos_t start, framepos_t end)
{
for (Children::iterator i = children.begin(); i != children.end(); ++i) {
(*i)->show_timestretch (start, end);
selection_group->raise_to_top();
for (list<AudioRange>::iterator i = ts.begin(); i != ts.end(); ++i) {
- nframes_t start, end, cnt;
+ framepos_t start, end;
+ framecnt_t cnt;
start = (*i).start;
end = (*i).end;
{
GhostRegion* gr = rv->add_ghost (*this);
- if(gr) {
+ if (gr) {
ghosts.push_back(gr);
}
}
if ((prop = node.property ("track-height")) != 0) {
if (prop->value() == "largest") {
- set_height (HeightLargest);
+ set_height_enum (HeightLargest);
} else if (prop->value() == "large") {
- set_height (HeightLarge);
+ set_height_enum (HeightLarge);
} else if (prop->value() == "larger") {
- set_height (HeightLarger);
+ set_height_enum (HeightLarger);
} else if (prop->value() == "normal") {
- set_height (HeightNormal);
+ set_height_enum (HeightNormal);
} else if (prop->value() == "smaller") {
- set_height (HeightSmaller);
+ set_height_enum (HeightSmaller);
} else if (prop->value() == "small") {
- set_height (HeightSmall);
+ set_height_enum (HeightSmall);
} else {
error << string_compose(_("unknown track height name \"%1\" in XML GUI information"), prop->value()) << endmsg;
- set_height (HeightNormal);
+ set_height_enum (HeightNormal);
}
} else if ((prop = node.property ("height")) != 0) {
} else {
- set_height (HeightNormal);
+ set_height_enum (HeightNormal);
}
return 0;
}
void
-TimeAxisView::reset_height()
+TimeAxisView::reset_height ()
{
set_height (height);
void
TimeAxisView::color_handler ()
{
- for (list<GhostRegion*>::iterator i=ghosts.begin(); i != ghosts.end(); i++ ) {
+ for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); i++) {
(*i)->set_colors();
}
TimeAxisView::covers_y_position (double y)
{
if (hidden()) {
- return std::make_pair ( (TimeAxisView *) 0, 0);
+ return std::make_pair ((TimeAxisView *) 0, 0);
}
if (_y_position <= y && y < (_y_position + height)) {
}
}
- return std::make_pair ( (TimeAxisView *) 0, 0);
+ return std::make_pair ((TimeAxisView *) 0, 0);
}
bool
{
if (_resize_drag_start >= 0) {
/* (ab)use the DragManager to do autoscrolling; adjust the event coordinates
- into the trackview space that DragManager::motion_handler is expecting,
+ into the world coordinate space that DragManager::motion_handler is expecting,
and then fake a DragManager motion event so that when maybe_autoscroll
asks DragManager for the current pointer position it will get the correct
answers.
*/
int tx, ty;
resizer.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty);
- ev->y = ty + _editor.get_canvas_timebars_vsize ();
+ ev->y = ty - _editor.get_trackview_group_vertical_offset();
_editor.drags()->motion_handler ((GdkEvent *) ev, false);
_editor.maybe_autoscroll (false, true);
return c;
}
+void
+TimeAxisView::build_size_menu ()
+{
+ if (_size_menu && _size_menu->gobj ()) {
+ return;
+ }
+
+ delete _size_menu;
+
+ using namespace Menu_Helpers;
+ _size_menu = new Menu;
+ _size_menu->set_name ("ArdourContextMenu");
+ MenuList& items = _size_menu->items();
+
+ items.push_back (MenuElem (_("Largest"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightLargest, true)));
+ items.push_back (MenuElem (_("Larger"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightLarger, true)));
+ items.push_back (MenuElem (_("Large"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightLarge, true)));
+ items.push_back (MenuElem (_("Normal"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightNormal, true)));
+ items.push_back (MenuElem (_("Smaller"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightSmaller, true)));
+ items.push_back (MenuElem (_("Small"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_height_enum), HeightSmall, true)));
+}