#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/grouped_buttons.h"
#include "gtkmm2ext/gtk_ui.h"
-#include "gtkmm2ext/tearoff.h"
+#include <gtkmm2ext/keyboard.h>
#include "gtkmm2ext/utils.h"
#include "gtkmm2ext/window_title.h"
#include "gtkmm2ext/choice.h"
#include "gtkmm2ext/cell_renderer_pixbuf_toggle.h"
+#include "ardour/analysis_graph.h"
#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/audioregion.h"
#include "editor_routes.h"
#include "editor_snapshots.h"
#include "editor_summary.h"
+#include "export_report.h"
#include "global_port_matrix.h"
#include "gui_object.h"
#include "gui_thread.h"
#include "keyboard.h"
+#include "keyeditor.h"
+#include "luainstance.h"
#include "marker.h"
#include "midi_region_view.h"
#include "midi_time_axis.h"
#include "rgb_macros.h"
#include "rhythm_ferret.h"
#include "selection.h"
+#include "simple_progress_dialog.h"
#include "sfdb_ui.h"
#include "tempo_lines.h"
#include "time_axis_view.h"
N_("Right"),
N_("Center"),
N_("Playhead"),
- N_("Mouse"),
- N_("Edit point"),
+ N_("Mouse"),
+ N_("Edit point"),
0
};
, track_edit_playlist_submenu (0)
, track_selection_edit_playlist_submenu (0)
, _popup_region_menu_item (0)
- , global_vpacker (key_bindings)
, _track_canvas (0)
, _track_canvas_viewport (0)
, within_track_canvas (false)
, _verbose_cursor (0)
- , logo_item (0)
, tempo_group (0)
, meter_group (0)
, marker_group (0)
, tempo_lines (0)
, global_rect_group (0)
, time_line_group (0)
- , tempo_or_meter_marker_menu (0)
+ , tempo_marker_menu (0)
+ , meter_marker_menu (0)
, marker_menu (0)
, range_marker_menu (0)
, transport_marker_menu (0)
, bbt_beat_subdivision (4)
, _visible_track_count (-1)
, toolbar_selection_clock_table (2,3)
- , _mouse_mode_tearoff (0)
, automation_mode_button (_("mode"))
- , _zoom_tearoff (0)
- , _tools_tearoff (0)
, _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
, selection (new Selection (this))
, cut_buffer (new Selection (this))
, show_gain_after_trim (false)
, selection_op_cmd_depth (0)
, selection_op_history_it (0)
+ , no_save_instant (false)
, current_timefx (0)
, current_mixer_strip (0)
, show_editor_mixer_when_tracks_arrive (false)
, _stepping_axis_view (0)
, quantize_dialog (0)
, _main_menu_disabler (0)
+ , myactions (X_("editor"))
{
/* we are a singleton */
build_snap_type_menu();
build_edit_point_menu();
- location_marker_color = ARDOUR_UI::config()->color ("location marker");
- location_range_color = ARDOUR_UI::config()->color ("location range");
- location_cd_marker_color = ARDOUR_UI::config()->color ("location cd marker");
- location_loop_color = ARDOUR_UI::config()->color ("location loop");
- location_punch_color = ARDOUR_UI::config()->color ("location punch");
+ location_marker_color = UIConfiguration::instance().color ("location marker");
+ location_range_color = UIConfiguration::instance().color ("location range");
+ location_cd_marker_color = UIConfiguration::instance().color ("location cd marker");
+ location_loop_color = UIConfiguration::instance().color ("location loop");
+ location_punch_color = UIConfiguration::instance().color ("location punch");
timebar_height = std::max(12., ceil (15. * ARDOUR_UI::ui_scale));
TimeAxisView::setup_sizes ();
ArdourMarker::setup_sizes (timebar_height);
+ TempoCurve::setup_sizes (timebar_height);
bbt_label.set_name ("EditorRulerLabel");
bbt_label.set_size_request (-1, (int)timebar_height);
global_vpacker.pack_start (*hbox, true, true);
global_hpacker.pack_start (global_vpacker, true, true);
+ /* need to show the "contents" widget so that notebook will show if tab is switched to
+ */
+
+ global_hpacker.show ();
+
/* register actions now so that set_state() can find them and set toggles/checks etc */
register_actions ();
- /* when we start using our own keybinding system for the editor, this
- * will be uncommented
- */
- // load_bindings ();
+ load_bindings ();
setup_toolbar ();
/* Button bindings */
- button_bindings = new Bindings;
+ button_bindings = new Bindings ("editor-mouse");
XMLNode* node = button_settings();
if (node) {
for (XMLNodeList::const_iterator i = node->children().begin(); i != node->children().end(); ++i) {
- button_bindings->load (**i);
+ button_bindings->load_operation (**i);
}
}
setup_fade_images ();
+ LuaInstance::instance(); // instantiate
+ LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &Editor::set_script_action_name));
+
instant_save ();
}
void
Editor::instant_save ()
{
- if (!constructed || !ARDOUR_UI::instance()->session_loaded) {
+ if (!constructed || !ARDOUR_UI::instance()->session_loaded || no_save_instant) {
return;
}
/* leaving window, so reset focus, thus ending any and
all text entry operations.
*/
- reset_focus();
+ reset_focus (&contents());
break;
}
break;
if (!own_window()) {
return;
}
-
+
if (_session) {
bool dirty = _session->dirty();
}
WindowTitle title(session_name);
+ title += S_("Window|Editor");
title += Glib::get_application_name();
own_window()->set_title (title.get_string());
} else {
_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_routes, this, _1), gui_context());
_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context());
_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this, _1), gui_context());
+ _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::marker_position_changed, this), gui_context());
_session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context());
_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context());
_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Editor::session_state_saved, this, _1), gui_context());
ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated));
+ LuaInstance::instance()->set_session(_session);
+
start_updating_meters ();
}
{
using namespace Menu_Helpers;
- MenuList& edit_items = track_context_menu.items();
+ MenuList& edit_items = track_context_menu.items();
edit_items.clear();
add_dstream_context_items (edit_items);
{
using namespace Menu_Helpers;
- MenuList& edit_items = track_context_menu.items();
+ MenuList& edit_items = track_context_menu.items();
edit_items.clear();
add_bus_context_items (edit_items);
}
void
-Editor::analyze_region_selection ()
+Editor::loudness_analyze_region_selection ()
+{
+ if (!_session) {
+ return;
+ }
+ Selection& s (PublicEditor::instance ().get_selection ());
+ RegionSelection ars = s.regions;
+ ARDOUR::AnalysisGraph ag (_session);
+ framecnt_t total_work = 0;
+
+ for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+ if (!arv) {
+ continue;
+ }
+ if (!boost::dynamic_pointer_cast<AudioRegion> (arv->region ())) {
+ continue;
+ }
+ assert (dynamic_cast<RouteTimeAxisView *> (&arv->get_time_axis_view ()));
+ total_work += arv->region ()->length ();
+ }
+
+ SimpleProgressDialog spd (_("Region Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+ ScopedConnection c;
+ ag.set_total_frames (total_work);
+ ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+ spd.show();
+
+ for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+ if (!arv) {
+ continue;
+ }
+ boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (arv->region ());
+ if (!ar) {
+ continue;
+ }
+ ag.analyze_region (ar);
+ }
+ spd.hide();
+ if (!ag.canceled ()) {
+ ExportReport er (_("Audio Report/Analysis"), ag.results ());
+ er.run();
+ }
+}
+
+void
+Editor::loudness_analyze_range_selection ()
+{
+ if (!_session) {
+ return;
+ }
+ Selection& s (PublicEditor::instance ().get_selection ());
+ TimeSelection ts = s.time;
+ ARDOUR::AnalysisGraph ag (_session);
+ framecnt_t total_work = 0;
+
+ for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+ boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+ if (!pl) {
+ continue;
+ }
+ RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+ if (!pl || !rui) {
+ continue;
+ }
+ for (std::list<AudioRange>::iterator j = ts.begin (); j != ts.end (); ++j) {
+ total_work += j->length ();
+ }
+ }
+
+ SimpleProgressDialog spd (_("Range Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+ ScopedConnection c;
+ ag.set_total_frames (total_work);
+ ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+ spd.show();
+
+ for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+ boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+ if (!pl) {
+ continue;
+ }
+ RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+ if (!pl || !rui) {
+ continue;
+ }
+ ag.analyze_range (rui->route (), pl, ts);
+ }
+ spd.hide();
+ if (!ag.canceled ()) {
+ ExportReport er (_("Audio Report/Analysis"), ag.results ());
+ er.run();
+ }
+}
+
+void
+Editor::spectral_analyze_region_selection ()
{
if (analysis_window == 0) {
analysis_window = new AnalysisWindow();
}
void
-Editor::analyze_range_selection()
+Editor::spectral_analyze_range_selection()
{
if (analysis_window == 0) {
analysis_window = new AnalysisWindow();
edit_items.push_back (MenuElem (_("Zoom to Range"), sigc::bind (sigc::mem_fun(*this, &Editor::temporal_zoom_selection), false)));
edit_items.push_back (SeparatorElem());
- edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::analyze_range_selection)));
+ edit_items.push_back (MenuElem (_("Loudness Analysis"), sigc::mem_fun(*this, &Editor::loudness_analyze_range_selection)));
+ edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::spectral_analyze_range_selection)));
edit_items.push_back (SeparatorElem());
return _snap_type;
}
+bool
+Editor::snap_musical() const
+{
+ switch (_snap_type) {
+ case SnapToBeatDiv128:
+ case SnapToBeatDiv64:
+ case SnapToBeatDiv32:
+ case SnapToBeatDiv28:
+ case SnapToBeatDiv24:
+ case SnapToBeatDiv20:
+ case SnapToBeatDiv16:
+ case SnapToBeatDiv14:
+ case SnapToBeatDiv12:
+ case SnapToBeatDiv10:
+ case SnapToBeatDiv8:
+ case SnapToBeatDiv7:
+ case SnapToBeatDiv6:
+ case SnapToBeatDiv5:
+ case SnapToBeatDiv4:
+ case SnapToBeatDiv3:
+ case SnapToBeatDiv2:
+ case SnapToBeat:
+ case SnapToBar:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
SnapMode
Editor::snap_mode() const
{
case SnapToBeatDiv4:
case SnapToBeatDiv3:
case SnapToBeatDiv2: {
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ update_tempo_based_rulers (grid);
break;
}
int
Editor::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
-
+ XMLProperty const * prop;
set_id (node);
+ PBD::Unwinder<bool> nsi (no_save_instant, true);
Tabbable::set_state (node, version);
-
+
if (_session && (prop = node.property ("playhead"))) {
framepos_t pos;
sscanf (prop->value().c_str(), "%" PRIi64, &pos);
if ((prop = node.property ("snap-to"))) {
snap_type_selection_done ((SnapType) string_2_enum (prop->value(), _snap_type));
+ set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type));
}
if ((prop = node.property ("snap-mode"))) {
snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode));
+ /* set text of Dropdown. in case _snap_mode == SnapOff (default)
+ * snap_mode_selection_done() will only mark an already active item as active
+ * which does not trigger set_text().
+ */
+ set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode));
}
if ((prop = node.property ("internal-snap-to"))) {
}
}
- return 0;
+ return LuaInstance::instance()->set_state(node);
}
XMLNode&
Editor::get_state ()
{
- XMLNode& node (Tabbable::get_state());
+ XMLNode* node = new XMLNode (X_("Editor"));
char buf[32];
id().print (buf, sizeof (buf));
- node.add_property ("id", buf);
-
-#if 0
- // need to save this somehow
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
- geometry->add_property("edit-horizontal-pane-pos", string(buf));
- geometry->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&editor_summary_pane)->gobj()));
- geometry->add_property("edit-vertical-pane-pos", string(buf));
-#endif
-
- maybe_add_mixer_strip_width (node);
+ node->add_property ("id", buf);
+
+ node->add_child_nocopy (Tabbable::get_state());
+
+ snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (edit_pane, false));
+ node->add_property("edit-horizontal-pane-pos", string(buf));
+ node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
+ snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (editor_summary_pane, true));
+ node->add_property("edit-vertical-pane-pos", string(buf));
+
+ maybe_add_mixer_strip_width (*node);
- node.add_property ("zoom-focus", enum_2_string (zoom_focus));
+ node->add_property ("zoom-focus", enum_2_string (zoom_focus));
snprintf (buf, sizeof(buf), "%" PRId64, samples_per_pixel);
- node.add_property ("zoom", buf);
- node.add_property ("snap-to", enum_2_string (_snap_type));
- node.add_property ("snap-mode", enum_2_string (_snap_mode));
- node.add_property ("internal-snap-to", enum_2_string (internal_snap_type));
- node.add_property ("internal-snap-mode", enum_2_string (internal_snap_mode));
- node.add_property ("pre-internal-snap-to", enum_2_string (pre_internal_snap_type));
- node.add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode));
- node.add_property ("edit-point", enum_2_string (_edit_point));
+ node->add_property ("zoom", buf);
+ node->add_property ("snap-to", enum_2_string (_snap_type));
+ node->add_property ("snap-mode", enum_2_string (_snap_mode));
+ node->add_property ("internal-snap-to", enum_2_string (internal_snap_type));
+ node->add_property ("internal-snap-mode", enum_2_string (internal_snap_mode));
+ node->add_property ("pre-internal-snap-to", enum_2_string (pre_internal_snap_type));
+ node->add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode));
+ node->add_property ("edit-point", enum_2_string (_edit_point));
snprintf (buf, sizeof(buf), "%d", _visible_track_count);
- node.add_property ("visible-track-count", buf);
+ node->add_property ("visible-track-count", buf);
snprintf (buf, sizeof (buf), "%" PRIi64, playhead_cursor->current_frame ());
- node.add_property ("playhead", buf);
+ node->add_property ("playhead", buf);
snprintf (buf, sizeof (buf), "%" PRIi64, leftmost_frame);
- node.add_property ("left-frame", buf);
+ node->add_property ("left-frame", buf);
snprintf (buf, sizeof (buf), "%f", vertical_adjustment.get_value ());
- node.add_property ("y-origin", buf);
+ node->add_property ("y-origin", buf);
- node.add_property ("show-measures", _show_measures ? "yes" : "no");
- node.add_property ("maximised", _maximised ? "yes" : "no");
- node.add_property ("follow-playhead", _follow_playhead ? "yes" : "no");
- node.add_property ("stationary-playhead", _stationary_playhead ? "yes" : "no");
- node.add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ()));
- node.add_property ("mouse-mode", enum2str(mouse_mode));
- node.add_property ("join-object-range", smart_mode_action->get_active () ? "yes" : "no");
+ node->add_property ("show-measures", _show_measures ? "yes" : "no");
+ node->add_property ("maximised", _maximised ? "yes" : "no");
+ node->add_property ("follow-playhead", _follow_playhead ? "yes" : "no");
+ node->add_property ("stationary-playhead", _stationary_playhead ? "yes" : "no");
+ node->add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ()));
+ node->add_property ("mouse-mode", enum2str(mouse_mode));
+ node->add_property ("join-object-range", smart_mode_action->get_active () ? "yes" : "no");
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- node.add_property (X_("show-editor-mixer"), tact->get_active() ? "yes" : "no");
+ node->add_property (X_("show-editor-mixer"), tact->get_active() ? "yes" : "no");
}
act = ActionManager::get_action (X_("Editor"), X_("show-editor-list"));
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- node.add_property (X_("show-editor-list"), tact->get_active() ? "yes" : "no");
+ node->add_property (X_("show-editor-list"), tact->get_active() ? "yes" : "no");
}
snprintf (buf, sizeof (buf), "%d", _the_notebook.get_current_page ());
- node.add_property (X_("editor-list-page"), buf);
+ node->add_property (X_("editor-list-page"), buf);
if (button_bindings) {
XMLNode* bb = new XMLNode (X_("Buttons"));
button_bindings->save (*bb);
- node.add_child_nocopy (*bb);
+ node->add_child_nocopy (*bb);
}
- node.add_property (X_("show-marker-lines"), _show_marker_lines ? "yes" : "no");
+ node->add_property (X_("show-marker-lines"), _show_marker_lines ? "yes" : "no");
- node.add_child_nocopy (selection->get_state ());
- node.add_child_nocopy (_regions->get_state ());
+ node->add_child_nocopy (selection->get_state ());
+ node->add_child_nocopy (_regions->get_state ());
snprintf (buf, sizeof (buf), "%" PRId64, nudge_clock->current_duration());
- node.add_property ("nudge-clock-value", buf);
+ node->add_property ("nudge-clock-value", buf);
- return node;
+ node->add_child_nocopy (LuaInstance::instance()->get_action_state());
+ node->add_child_nocopy (LuaInstance::instance()->get_hook_state());
+
+ return *node;
}
/** if @param trackview_relative_offset is true, @param y y is an offset into the trackview area, in pixel units
if (!ARDOUR::Profile->get_trx()) {
mode_box->pack_start (edit_mode_selector, false, false);
}
- mode_box->pack_start (*mouse_mode_box, false, false);
- _mouse_mode_tearoff = manage (new TearOff (*mode_box));
- _mouse_mode_tearoff->set_name ("MouseModeBase");
- _mouse_mode_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_mouse_mode_tearoff->tearoff_window()), false);
-
- if (Profile->get_sae() || Profile->get_mixbus() ) {
- _mouse_mode_tearoff->set_can_be_torn_off (false);
- }
-
- _mouse_mode_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window()));
- _mouse_mode_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window(), 1));
- _mouse_mode_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window()));
- _mouse_mode_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window(), 1));
+ mode_box->pack_start (*mouse_mode_box, false, false);
/* Zoom */
_zoom_box.pack_start (tav_expand_button);
}
- if (!ARDOUR::Profile->get_trx()) {
- _zoom_tearoff = manage (new TearOff (_zoom_box));
-
- _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_zoom_tearoff->tearoff_window()));
- _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_zoom_tearoff->tearoff_window(), 0));
- _zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_zoom_tearoff->tearoff_window()));
- _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_zoom_tearoff->tearoff_window(), 0));
- }
-
- if (Profile->get_sae() || Profile->get_mixbus() ) {
- _zoom_tearoff->set_can_be_torn_off (false);
- }
-
snap_box.set_spacing (2);
snap_box.set_border_width (2);
HBox* hbox = manage (new HBox);
hbox->set_spacing(2);
- _tools_tearoff = manage (new TearOff (*hbox));
- _tools_tearoff->set_name ("MouseModeBase");
- _tools_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_tools_tearoff->tearoff_window()), false);
-
- if (Profile->get_sae() || Profile->get_mixbus()) {
- _tools_tearoff->set_can_be_torn_off (false);
- }
-
- _tools_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_tools_tearoff->tearoff_window()));
- _tools_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_tools_tearoff->tearoff_window(), 0));
- _tools_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_tools_tearoff->tearoff_window()));
- _tools_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_tools_tearoff->tearoff_window(), 0));
-
toolbar_hbox.set_spacing (2);
toolbar_hbox.set_border_width (1);
- toolbar_hbox.pack_start (*_mouse_mode_tearoff, false, false);
+ toolbar_hbox.pack_start (*mode_box, false, false);
if (!ARDOUR::Profile->get_trx()) {
- toolbar_hbox.pack_start (*_zoom_tearoff, false, false);
- toolbar_hbox.pack_start (*_tools_tearoff, false, false);
+ toolbar_hbox.pack_start (_zoom_box, false, false);
+ toolbar_hbox.pack_start (*hbox, false, false);
}
if (!ARDOUR::Profile->get_trx()) {
hbox->pack_start (snap_box, false, false);
hbox->pack_start (*nudge_box, false, false);
}
- hbox->pack_start (panic_box, false, false);
hbox->show_all ();
{
switch (Config->get_edit_mode()) {
case Slide:
- if (Profile->get_sae()) {
- Config->set_edit_mode (Lock);
- } else {
- Config->set_edit_mode (Ripple);
- }
+ Config->set_edit_mode (Ripple);
break;
case Splice:
case Ripple:
Editor::edit_controls_button_release (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
- ARDOUR_UI::instance()->add_route (current_toplevel());
+ ARDOUR_UI::instance()->add_route ();
} else if (ev->button == 1) {
selection->clear_tracks ();
}
{
/* recover or initialize pane positions. do this here rather than earlier because
we don't want the positions to change the child allocations, which they seem to do.
+
+ See comments in mixer_ui.cc about how this works.
*/
- int pos;
+ float pos;
XMLProperty* prop;
- char buf[32];
- XMLNode* node = ARDOUR_UI::instance()->editor_settings();
+ XMLNode* geometry = ARDOUR_UI::instance()->editor_settings();
enum Pane {
Horizontal = 0x1,
static Pane done;
- XMLNode* geometry = find_named_node (*node, "geometry");
-
if (which == static_cast<Paned*> (&edit_pane)) {
if (done & Horizontal) {
if (!geometry || (prop = geometry->property ("edit-horizontal-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());
+ pos = atof (prop->value());
}
- if (GTK_WIDGET(edit_pane.gobj())->allocation.width > pos) {
- edit_pane.set_position (pos);
+ if (pos > 1.0f) {
+ /* older versions of Ardour stored absolute position */
+ if (alloc.get_width() > pos) {
+ edit_pane.set_position (pos);
+ done = (Pane) (done | Horizontal);
+ }
+ } else {
+ if (alloc.get_width() > 1.0/pos) {
+ paned_set_position_as_fraction (edit_pane, pos, false);
+ done = (Pane) (done | Horizontal);
+ }
}
- done = (Pane) (done | Horizontal);
-
} else if (which == static_cast<Paned*> (&editor_summary_pane)) {
if (done & Vertical) {
if (!geometry || (prop = geometry->property ("edit-vertical-pane-pos")) == 0) {
/* initial allocation is 90% to canvas, 10% to summary */
pos = (int) floor (alloc.get_height() * 0.90f);
- snprintf (buf, sizeof(buf), "%d", pos);
} else {
- pos = atoi (prop->value());
+ pos = atof (prop->value());
}
- if (GTK_WIDGET(editor_summary_pane.gobj())->allocation.height > pos) {
- editor_summary_pane.set_position (pos);
+ if (pos > 1.0f) {
+ /* older versions of Ardour stored absolute position */
+ if (alloc.get_height() > pos) {
+ editor_summary_pane.set_position (pos);
+ done = (Pane) (done | Vertical);
+ }
+ } else {
+ if (alloc.get_height() > 1.0/pos) {
+ paned_set_position_as_fraction (editor_summary_pane, pos, true);
+ done = (Pane) (done | Vertical);
+ }
}
-
- done = (Pane) (done | Vertical);
- }
-}
-
-void
-Editor::detach_tearoff (Box* /*b*/, Window* /*w*/)
-{
- if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) &&
- (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) &&
- (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) {
- top_hbox.remove (toolbar_frame);
- }
-}
-
-void
-Editor::reattach_tearoff (Box* /*b*/, Window* /*w*/, int32_t /*n*/)
-{
- if (toolbar_frame.get_parent() == 0) {
- top_hbox.pack_end (toolbar_frame);
}
}
tempo_lines->show();
}
- ARDOUR::TempoMap::BBTPointList::const_iterator begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
- draw_measures (begin, end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ draw_measures (grid);
}
instant_save ();
return Evoral::Beats(1.0);
case SnapToBar:
if (_session) {
- return Evoral::Beats(_session->tempo_map().meter_at (position).divisions_per_bar());
+ return Evoral::Beats(_session->tempo_map().meter_at_frame (position).divisions_per_bar());
}
break;
default:
_snapshots->redisplay ();
}
-void
-Editor::update_tearoff_visibility()
-{
- bool visible = UIConfiguration::instance().get_keep_tearoffs();
- _mouse_mode_tearoff->set_visible (visible);
- _tools_tearoff->set_visible (visible);
- if (_zoom_tearoff) {
- _zoom_tearoff->set_visible (visible);
- }
-}
-
-void
-Editor::reattach_all_tearoffs ()
-{
- if (_mouse_mode_tearoff) _mouse_mode_tearoff->put_it_back ();
- if (_tools_tearoff) _tools_tearoff->put_it_back ();
- if (_zoom_tearoff) _zoom_tearoff->put_it_back ();
-}
-
void
Editor::maximise_editing_space ()
{
return;
}
- current_toplevel()->fullscreen ();
+ Gtk::Window* toplevel = current_toplevel();
- _maximised = true;
+ if (toplevel) {
+ toplevel->fullscreen ();
+ _maximised = true;
+ }
}
void
return;
}
- current_toplevel()->unfullscreen();
+ Gtk::Window* toplevel = current_toplevel();
- _maximised = false;
+ if (toplevel) {
+ toplevel->unfullscreen();
+ _maximised = false;
+ }
}
/**
compute_fixed_ruler_scale ();
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
- compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+ compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+ update_tempo_based_rulers (grid);
update_video_timeline();
}
*/
RegionSelection
-Editor::get_regions_from_selection_and_entered ()
+Editor::get_regions_from_selection_and_entered () const
{
RegionSelection regions = selection->regions;
if (track_views.size() > 1) {
Timers::TimerSuspender t;
dialog = new MessageDialog (
- *current_toplevel(),
string_compose (_("Please wait while %1 loads visual data."), PROGRAM_NAME),
true
);
stop_step_editing ();
if (own_window()) {
-
+
/* get rid of any existing editor mixer strip */
-
+
WindowTitle title(Glib::get_application_name());
title += _("Editor");
-
+
own_window()->set_title (title.get_string());
}
SessionHandlePtr::session_going_away ();
}
+void
+Editor::trigger_script (int i)
+{
+ LuaInstance::instance()-> call_action (i);
+}
+
+void
+Editor::set_script_action_name (int i, const std::string& n)
+{
+ string const a = string_compose (X_("script-action-%1"), i + 1);
+ Glib::RefPtr<Action> act = ActionManager::get_action(X_("Editor"), a.c_str());
+ assert (act);
+ if (n.empty ()) {
+ act->set_label (string_compose (_("Unset #%1"), i + 1));
+ act->set_tooltip (_("no action bound"));
+ act->set_sensitive (false);
+ } else {
+ act->set_label (n);
+ act->set_tooltip (n);
+ act->set_sensitive (true);
+ }
+ KeyEditor::UpdateBindings ();
+}
void
Editor::show_editor_list (bool yn)
}
Gtk::Window*
-Editor::use_own_window ()
+Editor::use_own_window (bool and_fill_it)
{
bool new_window = !own_window();
-
- Gtk::Window* win = Tabbable::use_own_window ();
+
+ Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
if (win && new_window) {
win->set_name ("EditorWindow");
ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Editor"), this);
// win->signal_realize().connect (*this, &Editor::on_realize);
+ win->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), win));
win->signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler));
-
+ win->set_data ("ardour-bindings", bindings);
+
update_title ();
}
DisplaySuspender ds;
contents().show_all ();
-
+
/* XXX: this is a bit unfortunate; it would probably
be nicer if we could just call show () above rather
than needing the show_all ()
*/
-
+
/* re-hide stuff if necessary */
editor_list_button_toggled ();
parameter_changed ("show-summary");
parameter_changed ("show-group-tabs");
parameter_changed ("show-zoom-tools");
-
+
/* now reset all audio_time_axis heights, because widgets might need
to be re-hidden
*/
-
+
TimeAxisView *tv;
-
+
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
tv = (static_cast<TimeAxisView*>(*i));
tv->reset_height ();
}
-
+
if (current_mixer_strip) {
current_mixer_strip->hide_things ();
current_mixer_strip->parameter_changed ("mixer-element-visibility");
}
-
+
return win;
}