#include "simpleline.h"
#include "rhythm_ferret.h"
#include "actions.h"
+#include "tempo_lines.h"
#ifdef FFT_ANALYSIS
#include "analysis_window.h"
cerr << "size of " << what << " = " << r->width << " x " << r->height << endl;
}
+void
+DragInfo::clear_copied_locations ()
+{
+ for (list<Location*>::iterator i = copied_locations.begin(); i != copied_locations.end(); ++i) {
+ delete *i;
+ }
+ copied_locations.clear ();
+}
+
Editor::Editor ()
:
/* time display buttons */
automation_mode_button (_("mode")),
global_automation_button (_("automation")),
+ midi_panic_button (_("Panic")),
+ midi_tools_tearoff (0),
+
#ifdef WITH_CMT
image_socket_listener(0),
#endif
clicked_control_point = 0;
last_update_frame = 0;
drag_info.item = 0;
- drag_info.copied_location = 0;
current_mixer_strip = 0;
current_bbt_points = 0;
+ tempo_lines = 0;
snap_type_strings = I18N (_snap_type_strings);
snap_mode_strings = I18N (_snap_mode_strings);
_show_waveforms = true;
_show_waveforms_recording = true;
first_action_message = 0;
- export_dialog = 0;
- export_range_markers_dialog = 0;
show_gain_after_trim = false;
ignore_route_list_reorder = false;
no_route_list_redisplay = false;
last_canvas_frame = 0;
playhead_cursor = 0;
button_release_can_deselect = true;
- canvas_idle_queued = false;
_dragging_playhead = false;
_dragging_edit_point = false;
_dragging_hscrollbar = false;
range_marker_drag_rect = 0;
marker_drag_line = 0;
- tempo_map_change_idle_handler_id = -1;
set_midi_edit_mode (MidiEditPencil, true);
set_mouse_mode (MouseObject, true);
controls_layout.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
controls_layout.signal_button_release_event().connect (mem_fun(*this, &Editor::edit_controls_button_release));
- controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
+ controls_layout_size_request_connection = controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
edit_vscrollbar.set_adjustment (vertical_adjustment);
edit_hscrollbar.set_adjustment (horizontal_adjustment);
edit_packer.set_homogeneous (false);
edit_packer.set_border_width (0);
edit_packer.set_name ("EditorWindow");
+
+#ifndef THE_OLD_WAY
+
+ edit_packer.attach (ruler_label_event_box, 0, 1, 0, 1, FILL, SHRINK, 0, 0);
+
+ edit_packer.attach (time_button_event_box, 0, 1, 1, 2, FILL, SHRINK, 0, 0);
+ edit_packer.attach (time_canvas_event_box, 1, 2, 0, 1, FILL|EXPAND, FILL, 0, 0);
+
+ edit_packer.attach (controls_layout, 0, 1, 2, 3, FILL, FILL|EXPAND, 0, 0);
+ edit_packer.attach (track_canvas_event_box, 1, 2, 1, 3, FILL|EXPAND, FILL|EXPAND, 0, 0);
+
+ edit_packer.attach (zoom_box, 0, 1, 3, 4, FILL, FILL, 0, 0);
+ edit_packer.attach (edit_hscrollbar, 1, 2, 3, 4, FILL|EXPAND, FILL, 0, 0);
+
+ edit_packer.attach (edit_vscrollbar, 3, 4, 2, 3, FILL, FILL|EXPAND, 0, 0);
+
+#else
edit_packer.attach (edit_vscrollbar, 0, 1, 0, 4, FILL, FILL|EXPAND, 0, 0);
- edit_packer.attach (ruler_label_event_box, 1, 2, 0, 1, FILL, SHRINK, 0, 0);
- edit_packer.attach (time_button_event_box, 1, 2, 1, 2, FILL, SHRINK, 0, 0);
+
+ edit_packer.attach (ruler_label_event_box, 1, 2, 0, 1, FILL, SHRINK, 0, 0);
+ edit_packer.attach (time_button_event_box, 1, 2, 1, 2, FILL, SHRINK, 0, 0);
edit_packer.attach (time_canvas_event_box, 2, 3, 0, 1, FILL|EXPAND, FILL, 0, 0);
edit_packer.attach (controls_layout, 1, 2, 2, 3, FILL, FILL|EXPAND, 0, 0);
edit_packer.attach (zoom_box, 1, 2, 3, 4, FILL, FILL, 0, 0);
edit_packer.attach (edit_hscrollbar, 2, 3, 3, 4, FILL|EXPAND, FILL, 0, 0);
+#endif
bottom_hbox.set_border_width (2);
bottom_hbox.set_spacing (3);
region_list_display.set_model (region_list_model);
region_list_display.append_column (_("Regions"), region_list_columns.name);
- region_list_display.set_headers_visible (false);
-
+ region_list_display.append_column (_("Start"), region_list_columns.start);
+ region_list_display.append_column (_("End"), region_list_columns.end);
+ region_list_display.append_column (_("Length"), region_list_columns.length);
+ region_list_display.append_column (_("Sync"), region_list_columns.sync);
+ region_list_display.append_column (_("Fade In"), region_list_columns.fadein);
+ region_list_display.append_column (_("Fade Out"), region_list_columns.fadeout);
+ region_list_display.append_column (_("L"), region_list_columns.locked);
+ region_list_display.append_column (_("G"), region_list_columns.glued);
+ region_list_display.append_column (_("M"), region_list_columns.muted);
+ region_list_display.append_column (_("O"), region_list_columns.opaque);
+ region_list_display.append_column (_("Used"), region_list_columns.used);
+ region_list_display.append_column (_("Path"), region_list_columns.path);
+ region_list_display.set_headers_visible (true);
+ region_list_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH);
+
CellRendererText* region_name_cell = dynamic_cast<CellRendererText*>(region_list_display.get_column_cell_renderer (0));
region_name_cell->property_editable() = true;
region_name_cell->signal_edited().connect (mem_fun (*this, &Editor::region_name_edit));
region_list_display.get_selection()->set_mode (SELECTION_MULTIPLE);
region_list_display.add_object_drag (region_list_columns.region.index(), "regions");
-
+
/* setup DnD handling */
list<TargetEntry> region_list_target_table;
region_list_display.signal_drag_data_received().connect (mem_fun(*this, &Editor::region_list_display_drag_data_received));
region_list_scroller.add (region_list_display);
- region_list_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
-
+ region_list_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
+
region_list_display.signal_key_press_event().connect (mem_fun(*this, &Editor::region_list_display_key_press));
region_list_display.signal_key_release_event().connect (mem_fun(*this, &Editor::region_list_display_key_release));
region_list_display.signal_button_press_event().connect (mem_fun(*this, &Editor::region_list_display_button_press), false);
region_list_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::region_list_selection_changed));
// region_list_display.signal_popup_menu().connect (bind (mem_fun (*this, &Editor::show_region_list_display_context_menu), 1, 0));
+ //ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (mem_fun(*this, &Editor::redisplay_regions));
+ ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (mem_fun(*this, &Editor::update_all_region_rows));
+ ARDOUR::Region::RegionPropertyChanged.connect (mem_fun(*this, &Editor::update_region_row));
+
named_selection_scroller.add (named_selection_display);
named_selection_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
the_notebook.set_scrollable (true);
the_notebook.popup_enable ();
the_notebook.set_tab_pos (Gtk::POS_RIGHT);
+ the_notebook.show_all ();
post_maximal_editor_width = 0;
post_maximal_pane_position = 0;
Editor::~Editor()
{
#ifdef WITH_CMT
- if(image_socket_listener)
- {
+ if(image_socket_listener) {
if(image_socket_listener->is_connected())
{
image_socket_listener->close_connection() ;
delete track_canvas;
track_canvas = 0;
}
-
- if (track_canvas) {
- delete track_canvas;
- track_canvas = 0;
- }
}
void
nudge_clock.set_session (session);
nudge_clock.set (session->frame_rate() * 5); // default of 5 seconds
+ playhead_cursor->canvas_item.show ();
+
if (rhythm_ferret) {
rhythm_ferret->set_session (session);
}
items.push_back (SeparatorElem());
sigc::connection fooc;
+ boost::shared_ptr<Region> region_to_check;
if (region) {
- items.push_back (CheckMenuElem (_("Lock")));
- CheckMenuItem* region_lock_item = static_cast<CheckMenuItem*>(&items.back());
- if (region->locked()) {
- region_lock_item->set_active();
- }
- region_lock_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_lock));
-
- items.push_back (CheckMenuElem (_("Glue to Bars&Beats")));
- CheckMenuItem* bbt_glue_item = static_cast<CheckMenuItem*>(&items.back());
-
- switch (region->positional_lock_style()) {
- case Region::MusicTime:
- bbt_glue_item->set_active (true);
- break;
- default:
- bbt_glue_item->set_active (false);
- break;
- }
-
- bbt_glue_item->signal_activate().connect (bind (mem_fun (*this, &Editor::set_region_lock_style), Region::MusicTime));
+ region_to_check = region;
+ } else {
+ region_to_check = selection->regions.front()->region();
+ }
- items.push_back (CheckMenuElem (_("Mute")));
- CheckMenuItem* region_mute_item = static_cast<CheckMenuItem*>(&items.back());
- fooc = region_mute_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_mute));
- if (region->muted()) {
- fooc.block (true);
- region_mute_item->set_active();
- fooc.block (false);
- }
+ items.push_back (CheckMenuElem (_("Lock")));
+ CheckMenuItem* region_lock_item = static_cast<CheckMenuItem*>(&items.back());
+ if (region_to_check->locked()) {
+ region_lock_item->set_active();
+ }
+ region_lock_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_lock));
- if (!Profile->get_sae()) {
- items.push_back (CheckMenuElem (_("Opaque")));
- CheckMenuItem* region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
- fooc = region_opaque_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_opaque));
- if (region->opaque()) {
- fooc.block (true);
- region_opaque_item->set_active();
- fooc.block (false);
- }
- }
- } else {
- // multiple regions selected
- // how should these act?
- // here they toggle the property of all selected regions
+ items.push_back (CheckMenuElem (_("Glue to Bars&Beats")));
+ CheckMenuItem* bbt_glue_item = static_cast<CheckMenuItem*>(&items.back());
- items.push_back (MenuElem (_("Lock"), mem_fun(*this, &Editor::toggle_region_lock)));
- items.push_back (MenuElem (_("Mute"), mem_fun(*this, &Editor::toggle_region_mute)));
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Opaque"), mem_fun(*this, &Editor::toggle_region_opaque)));
+ switch (region_to_check->positional_lock_style()) {
+ case Region::MusicTime:
+ bbt_glue_item->set_active (true);
+ break;
+ default:
+ bbt_glue_item->set_active (false);
+ break;
+ }
+
+ bbt_glue_item->signal_activate().connect (bind (mem_fun (*this, &Editor::set_region_lock_style), Region::MusicTime));
+
+ items.push_back (CheckMenuElem (_("Mute")));
+ CheckMenuItem* region_mute_item = static_cast<CheckMenuItem*>(&items.back());
+ fooc = region_mute_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_mute));
+ if (region_to_check->muted()) {
+ fooc.block (true);
+ region_mute_item->set_active();
+ fooc.block (false);
+ }
+
+ if (!Profile->get_sae()) {
+ items.push_back (CheckMenuElem (_("Opaque")));
+ CheckMenuItem* region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
+ fooc = region_opaque_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_opaque));
+ if (region_to_check->opaque()) {
+ fooc.block (true);
+ region_opaque_item->set_active();
+ fooc.block (false);
}
}
-
+
items.push_back (CheckMenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize)));
- if (region && region->at_natural_position()) {
+ if (region_to_check->at_natural_position()) {
items.back().set_sensitive (false);
}
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Consolidate range"), bind (mem_fun(*this, &Editor::bounce_range_selection), true)));
items.push_back (MenuElem (_("Bounce range to region list"), bind (mem_fun(*this, &Editor::bounce_range_selection), false)));
- items.push_back (MenuElem (_("Export range"), mem_fun(*this, &Editor::export_selection)));
+ items.push_back (MenuElem (_("Export range"), mem_fun(*this, &Editor::export_range)));
}
break;
}
- const char* action;
+ const char* action=NULL;
switch (_edit_point) {
case EditAtPlayhead:
} else {
- g.base_width = atoi(geometry->property("x_size")->value());
- g.base_height = atoi(geometry->property("y_size")->value());
- x = atoi(geometry->property("x_pos")->value());
- y = atoi(geometry->property("y_pos")->value());
- xoff = atoi(geometry->property("x_off")->value());
- yoff = atoi(geometry->property("y_off")->value());
+ g.base_width = atoi(geometry->property("x-size")->value());
+ g.base_height = atoi(geometry->property("y-size")->value());
+ x = atoi(geometry->property("x-pos")->value());
+ y = atoi(geometry->property("y-pos")->value());
+ xoff = atoi(geometry->property("x-off")->value());
+ yoff = atoi(geometry->property("y-off")->value());
}
set_default_size (g.base_width, g.base_height);
XMLNode* geometry = new XMLNode ("geometry");
snprintf(buf, sizeof(buf), "%d", width);
- geometry->add_property("x_size", string(buf));
+ geometry->add_property("x-size", string(buf));
snprintf(buf, sizeof(buf), "%d", height);
- geometry->add_property("y_size", string(buf));
+ geometry->add_property("y-size", string(buf));
snprintf(buf, sizeof(buf), "%d", x);
- geometry->add_property("x_pos", string(buf));
+ geometry->add_property("x-pos", string(buf));
snprintf(buf, sizeof(buf), "%d", y);
- geometry->add_property("y_pos", string(buf));
+ geometry->add_property("y-pos", string(buf));
snprintf(buf, sizeof(buf), "%d", xoff);
- geometry->add_property("x_off", string(buf));
+ geometry->add_property("x-off", string(buf));
snprintf(buf, sizeof(buf), "%d", yoff);
- geometry->add_property("y_off", string(buf));
+ geometry->add_property("y-off", string(buf));
snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
geometry->add_property("edit_pane_pos", string(buf));
toolbar_frame.add (toolbar_base);
}
+void
+Editor::midi_panic_toggle ()
+{
+ if (session) {
+ session->midi_panic();
+ midi_panic_button.set_active (false);
+ midi_panic_button.set_state (STATE_NORMAL);
+ }
+}
void
Editor::setup_midi_toolbar ()
&Editor::midi_edit_mode_toggled), Editing::MidiEditResize));
midi_tool_erase_button.signal_toggled().connect (bind (mem_fun(*this,
&Editor::midi_edit_mode_toggled), Editing::MidiEditErase));
+
+ /* Panic */
+
+ VBox* panic_box = manage (new VBox);
+ midi_panic_button.set_name("MidiPanicButton");
+ midi_panic_button.signal_pressed().connect (
+ mem_fun(this, &Editor::midi_panic_toggle));
+ panic_box->pack_start (midi_panic_button, true, true);
/* Pack everything in... */
midi_toolbar_hbox.set_border_width (1);
midi_toolbar_hbox.pack_start (*midi_tools_tearoff, false, true);
+
+ midi_toolbar_hbox.pack_start(*panic_box, false, true, 4);
midi_tool_button_box.show_all ();
midi_toolbar_hbox.show_all();
width = default_width;
height = default_height;
} else {
- width = atoi(geometry->property("x_size")->value());
- height = atoi(geometry->property("y_size")->value());
+ width = atoi(geometry->property("x-size")->value());
+ height = atoi(geometry->property("y-size")->value());
}
if (which == static_cast<Paned*> (&edit_pane)) {
return;
}
- if (!geometry || (prop = geometry->property ("edit_pane_pos")) == 0) {
+ if (!geometry || (prop = geometry->property ("edit-pane-pos")) == 0) {
/* initial allocation is 90% to canvas, 10% to notebook */
pos = (int) floor (alloc.get_width() * 0.90f);
snprintf (buf, sizeof(buf), "%d", pos);
} else {
pos = atoi (prop->value());
}
-
+
if ((done = GTK_WIDGET(edit_pane.gobj())->allocation.width > pos)) {
edit_pane.set_position (pos);
pre_maximal_pane_position = pos;
hide_measures ();
if ((_show_measures = yn) == true) {
+ if (tempo_lines)
+ tempo_lines->show();
draw_measures ();
}
instant_save ();
void
Editor::maximise_editing_space ()
{
- initial_ruler_update_required = true;
-
mouse_mode_tearoff->set_visible (false);
tools_tearoff->set_visible (false);
void
Editor::restore_editing_space ()
{
- initial_ruler_update_required = true;
-
// user changed width of pane during fullscreen
+
if(post_maximal_pane_position != edit_pane.get_position()) {
post_maximal_pane_position = edit_pane.get_position();
}
tools_tearoff->set_visible (true);
post_maximal_editor_width = this->get_width();
-
- edit_pane.set_position (
- pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width)
- );
+ edit_pane.set_position (pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width));
}
/**
Editor::new_playlists (TimeAxisView* v)
{
begin_reversible_command (_("new playlists"));
- mapover_tracks (mem_fun (*this, &Editor::mapped_use_new_playlist), v);
+ vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+ session->get_playlists(playlists);
+ mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v );
commit_reversible_command ();
}
Editor::copy_playlists (TimeAxisView* v)
{
begin_reversible_command (_("copy playlists"));
- mapover_tracks (mem_fun (*this, &Editor::mapped_use_copy_playlist), v);
+ vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+ session->get_playlists(playlists);
+ mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v );
commit_reversible_command ();
}
Editor::clear_playlists (TimeAxisView* v)
{
begin_reversible_command (_("clear playlists"));
- mapover_tracks (mem_fun (*this, &Editor::mapped_clear_playlist), v);
+ vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+ session->get_playlists(playlists);
+ mapover_tracks ( mem_fun (*this, &Editor::mapped_clear_playlist), v );
commit_reversible_command ();
}
void
-Editor::mapped_use_new_playlist (RouteTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_new_playlist (RouteTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
{
- atv.use_new_playlist (sz > 1 ? false : true);
+ atv.use_new_playlist (sz > 1 ? false : true, playlists);
}
void
-Editor::mapped_use_copy_playlist (RouteTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_copy_playlist (RouteTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
{
- atv.use_copy_playlist (sz > 1 ? false : true);
+ atv.use_copy_playlist (sz > 1 ? false : true, playlists);
}
void
if (max_frames / fpu < 800.0) {
return;
}
+
+ if (tempo_lines)
+ tempo_lines->tempo_map_changed();
frames_per_unit = fpu;
post_zoom ();
}
if (p & VisualChange::TimeOrigin) {
- nframes64_t csf, cef;
+ nframes64_t csf=0, cef=0;
nframes64_t current_time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
if (session) {
/* if we seek beyond the current end of the canvas, move the end */
if (current_time_origin != pending_visual_change.time_origin) {
- //if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) {
last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames();
horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit);
- //}
horizontal_adjustment.set_value (pending_visual_change.time_origin / frames_per_unit);
} else {
update_fixed_rulers();