X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.cc;h=7aaeb466780db1e8e1b5b671f85a4496796427fc;hb=e7c85706e5553181636e7052f2fe10469b57fd85;hp=8978a4993a88e6530afda12873be0c3517a8f6d4;hpb=45622aff48f315e125628b19b8b07e61f78d7021;p=ardour.git diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 8978a4993a..7aaeb46678 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -112,7 +112,6 @@ #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" @@ -393,6 +392,7 @@ Editor::Editor () , _all_region_actions_sensitized (false) , _ignore_region_action (false) , _last_region_menu_was_main (false) + , _track_selection_change_without_scroll (false) , cd_marker_bar_drag_rect (0) , range_bar_drag_rect (0) , transport_bar_drag_rect (0) @@ -578,7 +578,6 @@ Editor::Editor () _summary = new EditorSummary (this); selection->TimeChanged.connect (sigc::mem_fun(*this, &Editor::time_selection_changed)); - selection->TracksChanged.connect (sigc::mem_fun(*this, &Editor::track_selection_changed)); editor_regions_selection_changed_connection = selection->RegionsChanged.connect (sigc::mem_fun(*this, &Editor::region_selection_changed)); @@ -757,6 +756,8 @@ Editor::Editor () global_vpacker.set_spacing (2); global_vpacker.set_border_width (0); + //the next three EventBoxes provide the ability for their child widgets to have a background color. That is all. + Gtk::EventBox* ebox = manage (new Gtk::EventBox); //a themeable box ebox->set_name("EditorWindow"); ebox->add (toolbar_hbox); @@ -865,9 +866,6 @@ Editor::Editor () setup_fade_images (); - LuaInstance::instance(); // instantiate - LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &Editor::set_script_action_name)); - instant_save (); } @@ -888,10 +886,21 @@ Editor::~Editor() delete _locations; delete _playlist_selector; delete _time_info_box; + delete selection; + delete cut_buffer; + delete _cursors; + + LuaInstance::destroy_instance (); for (list::iterator i = selection_op_history.begin(); i != selection_op_history.end(); ++i) { delete *i; } + for (std::map::const_iterator i = _xfade_in_images.begin(); i != _xfade_in_images.end (); ++i) { + delete i->second; + } + for (std::map::const_iterator i = _xfade_out_images.begin(); i != _xfade_out_images.end (); ++i) { + delete i->second; + } } XMLNode* @@ -1382,7 +1391,7 @@ Editor::set_session (Session *t) _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->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempometric_position_changed, this, _1), 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()); @@ -1444,30 +1453,11 @@ Editor::set_session (Session *t) _session->register_with_memento_command_factory(id(), this); _session->register_with_memento_command_factory(_selection_memento->id(), _selection_memento); - ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated)); - LuaInstance::instance()->set_session(_session); start_updating_meters (); } -void -Editor::action_pre_activated (Glib::RefPtr const & a) -{ - if (a->get_name() == "RegionMenu") { - /* When the main menu's region menu is opened, we setup the actions so that they look right - in the menu. I can't find a way of getting a signal when this menu is subsequently closed, - so we resensitize all region actions when the entered regionview or the region selection - changes. HOWEVER we can't always resensitize on entered_regionview change because that - happens after the region context menu is opened. So we set a flag here, too. - - What a carry on :( - */ - sensitize_the_right_region_actions (); - _last_region_menu_was_main = true; - } -} - void Editor::fill_xfade_menu (Menu_Helpers::MenuList& items, bool start) { @@ -1695,7 +1685,7 @@ Editor::popup_track_context_menu (int button, int32_t time, ItemType item_type, /* When the region menu is opened, we setup the actions so that they look right in the menu. */ - sensitize_the_right_region_actions (); + sensitize_the_right_region_actions (false); _last_region_menu_was_main = false; menu->signal_hide().connect (sigc::bind (sigc::mem_fun (*this, &Editor::sensitize_all_region_actions), true)); @@ -1932,7 +1922,7 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items, boost::sha _popup_region_menu_item->set_label (menu_item_name); } - /* No latering allowed in later is higher layering model */ + /* No layering allowed in later is higher layering model */ RefPtr act = ActionManager::get_action (X_("EditorMenu"), X_("RegionMenuLayering")); if (act && Config->get_layer_model() == LaterHigher) { act->set_sensitive (false); @@ -2343,6 +2333,7 @@ Editor::set_edit_point_preference (EditPoint ep, bool force) } reset_canvas_action_sensitivity (in_track_canvas); + sensitize_the_right_region_actions (false); instant_save (); } @@ -2530,6 +2521,7 @@ Editor::set_state (const XMLNode& node, int version) for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { selection->set_state (**i, Stateful::current_state_version); _regions->set_state (**i); + _locations->set_state (**i); } if ((prop = node.property ("maximised"))) { @@ -2671,6 +2663,7 @@ Editor::get_state () node->add_child_nocopy (LuaInstance::instance()->get_action_state()); node->add_child_nocopy (LuaInstance::instance()->get_hook_state()); + node->add_child_nocopy (_locations->get_state ()); return *node; } @@ -2712,7 +2705,7 @@ Editor::trackview_by_y_position (double y, bool trackview_relative_offset) const * @param event Event to get current key modifier information from, or 0. */ void -Editor::snap_to_with_modifier (framepos_t& start, GdkEvent const * event, RoundMode direction, bool for_mark) +Editor::snap_to_with_modifier (MusicFrame& start, GdkEvent const * event, RoundMode direction, bool for_mark) { if (!_session || !event) { return; @@ -2721,6 +2714,8 @@ Editor::snap_to_with_modifier (framepos_t& start, GdkEvent const * event, RoundM if (ArdourKeyboard::indicates_snap (event->button.state)) { if (_snap_mode == SnapOff) { snap_to_internal (start, direction, for_mark); + } else { + start.set (start.frame, 0); } } else { if (_snap_mode != SnapOff) { @@ -2728,14 +2723,17 @@ Editor::snap_to_with_modifier (framepos_t& start, GdkEvent const * event, RoundM } else if (ArdourKeyboard::indicates_snap_delta (event->button.state)) { /* SnapOff, but we pressed the snap_delta modifier */ snap_to_internal (start, direction, for_mark); + } else { + start.set (start.frame, 0); } } } void -Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark, bool ensure_snap) +Editor::snap_to (MusicFrame& start, RoundMode direction, bool for_mark, bool ensure_snap) { if (!_session || (_snap_mode == SnapOff && !ensure_snap)) { + start.set (start.frame, 0); return; } @@ -2743,8 +2741,9 @@ Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark, bool ens } void -Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool /*for_mark*/) +Editor::timecode_snap_to_internal (MusicFrame& pos, RoundMode direction, bool /*for_mark*/) { + framepos_t start = pos.frame; const framepos_t one_timecode_second = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame()); framepos_t one_timecode_minute = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame() * 60); @@ -2806,14 +2805,16 @@ Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool fatal << "Editor::smpte_snap_to_internal() called with non-timecode snap type!" << endmsg; abort(); /*NOTREACHED*/ } + + pos.set (start, 0); } void -Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, bool ensure_snap) +Editor::snap_to_internal (MusicFrame& start, RoundMode direction, bool for_mark, bool ensure_snap) { const framepos_t one_second = _session->frame_rate(); const framepos_t one_minute = _session->frame_rate() * 60; - framepos_t presnap = start; + framepos_t presnap = start.frame; framepos_t before; framepos_t after; @@ -2825,95 +2826,104 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, case SnapToCDFrame: if ((direction == RoundUpMaybe || direction == RoundDownMaybe) && - start % (one_second/75) == 0) { + start.frame % (one_second/75) == 0) { /* start is already on a whole CD frame, do nothing */ - } else if (((direction == 0) && (start % (one_second/75) > (one_second/75) / 2)) || (direction > 0)) { - start = (framepos_t) ceil ((double) start / (one_second / 75)) * (one_second / 75); + } else if (((direction == 0) && (start.frame % (one_second/75) > (one_second/75) / 2)) || (direction > 0)) { + start.frame = (framepos_t) ceil ((double) start.frame / (one_second / 75)) * (one_second / 75); } else { - start = (framepos_t) floor ((double) start / (one_second / 75)) * (one_second / 75); + start.frame = (framepos_t) floor ((double) start.frame / (one_second / 75)) * (one_second / 75); } + + start.set (start.frame, 0); + break; case SnapToSeconds: if ((direction == RoundUpMaybe || direction == RoundDownMaybe) && - start % one_second == 0) { + start.frame % one_second == 0) { /* start is already on a whole second, do nothing */ - } else if (((direction == 0) && (start % one_second > one_second / 2)) || (direction > 0)) { - start = (framepos_t) ceil ((double) start / one_second) * one_second; + } else if (((direction == 0) && (start.frame % one_second > one_second / 2)) || (direction > 0)) { + start.frame = (framepos_t) ceil ((double) start.frame / one_second) * one_second; } else { - start = (framepos_t) floor ((double) start / one_second) * one_second; + start.frame = (framepos_t) floor ((double) start.frame / one_second) * one_second; } + + start.set (start.frame, 0); + break; case SnapToMinutes: if ((direction == RoundUpMaybe || direction == RoundDownMaybe) && - start % one_minute == 0) { + start.frame % one_minute == 0) { /* start is already on a whole minute, do nothing */ - } else if (((direction == 0) && (start % one_minute > one_minute / 2)) || (direction > 0)) { - start = (framepos_t) ceil ((double) start / one_minute) * one_minute; + } else if (((direction == 0) && (start.frame % one_minute > one_minute / 2)) || (direction > 0)) { + start.frame = (framepos_t) ceil ((double) start.frame / one_minute) * one_minute; } else { - start = (framepos_t) floor ((double) start / one_minute) * one_minute; + start.frame = (framepos_t) floor ((double) start.frame / one_minute) * one_minute; } + + start.set (start.frame, 0); + break; case SnapToBar: - start = _session->tempo_map().round_to_bar (start, direction); + start = _session->tempo_map().round_to_bar (start.frame, direction); break; case SnapToBeat: - start = _session->tempo_map().round_to_beat (start, direction); + start = _session->tempo_map().round_to_beat (start.frame, direction); break; case SnapToBeatDiv128: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 128, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 128, direction); break; case SnapToBeatDiv64: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 64, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 64, direction); break; case SnapToBeatDiv32: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 32, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 32, direction); break; case SnapToBeatDiv28: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 28, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 28, direction); break; case SnapToBeatDiv24: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 24, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 24, direction); break; case SnapToBeatDiv20: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 20, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 20, direction); break; case SnapToBeatDiv16: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 16, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 16, direction); break; case SnapToBeatDiv14: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 14, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 14, direction); break; case SnapToBeatDiv12: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 12, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 12, direction); break; case SnapToBeatDiv10: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 10, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 10, direction); break; case SnapToBeatDiv8: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 8, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 8, direction); break; case SnapToBeatDiv7: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 7, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 7, direction); break; case SnapToBeatDiv6: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 6, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 6, direction); break; case SnapToBeatDiv5: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 5, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 5, direction); break; case SnapToBeatDiv4: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 4, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 4, direction); break; case SnapToBeatDiv3: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 3, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 3, direction); break; case SnapToBeatDiv2: - start = _session->tempo_map().round_to_quarter_note_subdivision (start, 2, direction); + start = _session->tempo_map().round_to_quarter_note_subdivision (start.frame, 2, direction); break; case SnapToMark: @@ -2921,29 +2931,31 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, return; } - _session->locations()->marks_either_side (start, before, after); + _session->locations()->marks_either_side (start.frame, before, after); if (before == max_framepos && after == max_framepos) { /* No marks to snap to, so just don't snap */ return; } else if (before == max_framepos) { - start = after; + start.frame = after; } else if (after == max_framepos) { - start = before; + start.frame = before; } else if (before != max_framepos && after != max_framepos) { if ((direction == RoundUpMaybe || direction == RoundUpAlways)) - start = after; + start.frame = after; else if ((direction == RoundDownMaybe || direction == RoundDownAlways)) - start = before; + start.frame = before; else if (direction == 0 ) { - if ((start - before) < (after - start)) { - start = before; + if ((start.frame - before) < (after - start.frame)) { + start.frame = before; } else { - start = after; + start.frame = after; } } } + start.set (start.frame, 0); + break; case SnapToRegionStart: @@ -2956,9 +2968,9 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, vector::iterator next = region_boundary_cache.end (); if (direction > 0) { - next = std::upper_bound (region_boundary_cache.begin(), region_boundary_cache.end(), start); + next = std::upper_bound (region_boundary_cache.begin(), region_boundary_cache.end(), start.frame); } else { - next = std::lower_bound (region_boundary_cache.begin(), region_boundary_cache.end(), start); + next = std::lower_bound (region_boundary_cache.begin(), region_boundary_cache.end(), start.frame); } if (next != region_boundary_cache.begin ()) { @@ -2969,12 +2981,15 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, framepos_t const p = (prev == region_boundary_cache.end()) ? region_boundary_cache.front () : *prev; framepos_t const n = (next == region_boundary_cache.end()) ? region_boundary_cache.back () : *next; - if (start > (p + n) / 2) { - start = n; + if (start.frame > (p + n) / 2) { + start.frame = n; } else { - start = p; + start.frame = p; } } + + start.set (start.frame, 0); + break; } @@ -2988,21 +3003,20 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, return; } - if (presnap > start) { - if (presnap > (start + pixel_to_sample(snap_threshold))) { - start = presnap; + if (presnap > start.frame) { + if (presnap > (start.frame + pixel_to_sample(snap_threshold))) { + start.set (presnap, 0); } - } else if (presnap < start) { - if (presnap < (start - pixel_to_sample(snap_threshold))) { - start = presnap; + } else if (presnap < start.frame) { + if (presnap < (start.frame - pixel_to_sample(snap_threshold))) { + start.set (presnap, 0); } } default: /* handled at entry */ return; - } } @@ -4045,9 +4059,9 @@ Editor::get_paste_offset (framepos_t pos, unsigned paste_count, framecnt_t durat framecnt_t offset = paste_count * duration; /* snap offset so pos + offset is aligned to the grid */ - framepos_t offset_pos = pos + offset; + MusicFrame offset_pos (pos + offset, 0); snap_to(offset_pos, RoundUpMaybe); - offset = offset_pos - pos; + offset = offset_pos.frame - pos; return offset; } @@ -4702,7 +4716,7 @@ Editor::get_preferred_edit_position (EditIgnoreOption ignore, bool from_context_ if (from_outside_canvas && (ep == EditAtMouse)) { ep = EditAtPlayhead; } else if (from_context_menu && (ep == EditAtMouse)) { - return canvas_event_sample (&context_click_event, 0, 0); + return canvas_event_sample (&context_click_event, 0, 0); } if (entered_marker) { @@ -4718,6 +4732,8 @@ Editor::get_preferred_edit_position (EditIgnoreOption ignore, bool from_context_ ep = EditAtPlayhead; } + MusicFrame snap_mf (0, 0); + switch (ep) { case EditAtPlayhead: if (_dragging_playhead) { @@ -4750,7 +4766,9 @@ Editor::get_preferred_edit_position (EditIgnoreOption ignore, bool from_context_ /* XXX not right but what can we do ? */ return 0; } - snap_to (where); + snap_mf.frame = where; + snap_to (snap_mf); + where = snap_mf.frame; DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("GPEP: use mouse @ %1\n", where)); break; } @@ -4900,7 +4918,7 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie */ RegionSelection -Editor::get_regions_from_selection_and_edit_point () +Editor::get_regions_from_selection_and_edit_point (EditIgnoreOption ignore, bool from_context_menu, bool from_outside_canvas) { RegionSelection regions; @@ -4917,7 +4935,7 @@ Editor::get_regions_from_selection_and_edit_point () /* no region selected or entered, but some selected tracks: * act on all regions on the selected tracks at the edit point */ - framepos_t const where = get_preferred_edit_position (); + framepos_t const where = get_preferred_edit_position (ignore, from_context_menu, from_outside_canvas); get_regions_at(regions, where, tracks); } } @@ -5059,6 +5077,38 @@ Editor::get_regions_corresponding_to (boost::shared_ptr region, vector region) const +{ + for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* tatv; + if ((tatv = dynamic_cast (*i)) != 0) { + if (!tatv->track()) { + continue; + } + RegionView* marv = tatv->view()->find_view (region); + if (marv) { + return marv; + } + } + } + return NULL; +} + +RouteTimeAxisView* +Editor::rtav_from_route (boost::shared_ptr route) const +{ + for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* rtav; + if ((rtav = dynamic_cast (*i)) != 0) { + if (rtav->route() == route) { + return rtav; + } + } + } + return NULL; +} + void Editor::show_rhythm_ferret () { @@ -5438,6 +5488,9 @@ Editor::timeaxisview_deleted (TimeAxisView *tv) void Editor::hide_track_in_display (TimeAxisView* tv, bool apply_to_selection) { + if (!tv) { + return; + } if (apply_to_selection) { for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ) { @@ -5460,6 +5513,18 @@ Editor::hide_track_in_display (TimeAxisView* tv, bool apply_to_selection) } } +void +Editor::show_track_in_display (TimeAxisView* tv, bool move_into_view) +{ + if (!tv) { + return; + } + _routes->show_track_in_display (*tv); + if (move_into_view) { + ensure_time_axis_view_is_visible (*tv, false); + } +} + bool Editor::sync_track_view_list_and_routes () { @@ -5845,24 +5910,6 @@ 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 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) { @@ -5916,18 +5963,6 @@ Editor::update_region_layering_order_editor () void Editor::setup_fade_images () { - _fade_in_images[FadeLinear] = new Gtk::Image (get_icon_path (X_("fadein-linear"))); - _fade_in_images[FadeSymmetric] = new Gtk::Image (get_icon_path (X_("fadein-symmetric"))); - _fade_in_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadein-fast-cut"))); - _fade_in_images[FadeSlow] = new Gtk::Image (get_icon_path (X_("fadein-slow-cut"))); - _fade_in_images[FadeConstantPower] = new Gtk::Image (get_icon_path (X_("fadein-constant-power"))); - - _fade_out_images[FadeLinear] = new Gtk::Image (get_icon_path (X_("fadeout-linear"))); - _fade_out_images[FadeSymmetric] = new Gtk::Image (get_icon_path (X_("fadeout-symmetric"))); - _fade_out_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadeout-fast-cut"))); - _fade_out_images[FadeSlow] = new Gtk::Image (get_icon_path (X_("fadeout-slow-cut"))); - _fade_out_images[FadeConstantPower] = new Gtk::Image (get_icon_path (X_("fadeout-constant-power"))); - _xfade_in_images[FadeLinear] = new Gtk::Image (get_icon_path (X_("fadein-linear"))); _xfade_in_images[FadeSymmetric] = new Gtk::Image (get_icon_path (X_("fadein-symmetric"))); _xfade_in_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadein-fast-cut")));