X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=2bb75773192127284952c5aca6aad22bc1170735;hb=3346c69f2dd15968e164561850b647cf51bea900;hp=75ea85391c73e6919a83dc05e7934aae2a746125;hpb=eee83c25a9e1e182d0ce1d90f5469b0a836f082c;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 75ea85391c..2bb7577319 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -83,7 +83,7 @@ #include "ardour/track.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; @@ -95,8 +95,7 @@ using namespace std; using std::list; RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas) - : AxisView(sess) - , RouteUI(sess) + : RouteUI(sess) , TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas) , _view (0) , parent_canvas (canvas) @@ -129,6 +128,14 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan parameter_changed ("editor-stereo-only-meters"); } +void +RouteTimeAxisView::route_property_changed (const PBD::PropertyChange& what_changed) +{ + if (what_changed.contains (ARDOUR::Properties::name)) { + label_view (); + } +} + void RouteTimeAxisView::set_route (boost::shared_ptr rt) { @@ -171,9 +178,9 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) playlist_button.set_name ("route button"); automation_button.set_name ("route button"); - route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); - playlist_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click)); - automation_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click)); + route_group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); + playlist_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click), false); + automation_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click), false); if (is_track()) { @@ -292,7 +299,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) _y_position = -1; _route->processors_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context()); - _route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context()); if (is_track()) { @@ -314,8 +320,8 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) PropertyList* plist = new PropertyList(); - plist->add (ARDOUR::Properties::mute, true); - plist->add (ARDOUR::Properties::solo, true); + plist->add (ARDOUR::Properties::group_mute, true); + plist->add (ARDOUR::Properties::group_solo, true); route_group_menu = new RouteGroupMenu (_session, plist); @@ -342,6 +348,15 @@ RouteTimeAxisView::~RouteTimeAxisView () CatchDeletion (this); } +string +RouteTimeAxisView::name() const +{ + if (_route) { + return _route->name(); + } + return string(); +} + void RouteTimeAxisView::post_construct () { @@ -364,7 +379,7 @@ RouteTimeAxisView::setup_processor_menu_and_curves () _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_existing_processor_automation_curves)); } -gint +bool RouteTimeAxisView::route_group_click (GdkEventButton *ev) { if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { @@ -378,9 +393,15 @@ RouteTimeAxisView::route_group_click (GdkEventButton *ev) r.push_back (route ()); route_group_menu->build (r); - route_group_menu->menu()->popup (ev->button, ev->time); + if (ev->button == 1) { + Gtkmm2ext::anchored_menu_popup(route_group_menu->menu(), + &route_group_button, + "", 1, ev->time); + } else { + route_group_menu->menu()->popup (ev->button, ev->time); + } - return false; + return true; } void @@ -449,14 +470,6 @@ RouteTimeAxisView::parameter_changed (string const & p) } } -void -RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed) -{ - if (what_changed.contains (ARDOUR::Properties::name)) { - label_view (); - } -} - void RouteTimeAxisView::take_name_changed (void *src) { @@ -465,20 +478,32 @@ RouteTimeAxisView::take_name_changed (void *src) } } -void -RouteTimeAxisView::playlist_click () +bool +RouteTimeAxisView::playlist_click (GdkEventButton *ev) { + if (ev->button != 1) { + return true; + } + build_playlist_menu (); conditionally_add_to_selection (); - playlist_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(playlist_action_menu, &playlist_button, + "", 1, ev->time); + return true; } -void -RouteTimeAxisView::automation_click () +bool +RouteTimeAxisView::automation_click (GdkEventButton *ev) { + if (ev->button != 1) { + return true; + } + conditionally_add_to_selection (); build_automation_action_menu (false); - automation_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(automation_action_menu, &automation_button, + "", 1, ev->time); + return true; } void @@ -501,13 +526,13 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) automation_action_menu->set_name ("ArdourContextMenu"); items.push_back (MenuElem (_("Show All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); items.push_back (MenuElem (_("Show Existing Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); items.push_back (MenuElem (_("Hide All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); /* Attach the plugin submenu. It may have previously been used elsewhere, so it was detached above @@ -552,7 +577,7 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &RouteTimeAxisView::update_pan_track_visibility))); pan_automation_item = dynamic_cast (&items.back ()); pan_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && - (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible")))); + (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible")))); set const & params = _route->pannable()->what_can_be_automated (); for (set::const_iterator p = params.begin(); p != params.end(); ++p) { @@ -590,11 +615,6 @@ RouteTimeAxisView::build_display_menu () } build_size_menu (); items.push_back (MenuElem (_("Height"), *_size_menu)); - - items.push_back (SeparatorElem()); - - items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog))); - items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1); items.push_back (SeparatorElem()); // Hook for derived classes to add type specific stuff @@ -752,6 +772,7 @@ RouteTimeAxisView::build_display_menu () /* show nothing */ } +#ifdef XXX_OLD_DESTRUCTIVE_API_XXX Menu* mode_menu = manage (new Menu); MenuList& mode_items = mode_menu->items (); mode_menu->set_name ("ArdourContextMenu"); @@ -800,6 +821,7 @@ RouteTimeAxisView::build_display_menu () i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0)); items.push_back (MenuElem (_("Record Mode"), *mode_menu)); +#endif items.push_back (SeparatorElem()); @@ -830,6 +852,17 @@ RouteTimeAxisView::build_display_menu () items.push_back (SeparatorElem()); + if (is_midi_track()) { + Menu* midi_menu = manage (new Menu); + MenuList& midi_items = midi_menu->items(); + midi_menu->set_name (X_("ArdourContextMenu")); + + midi_items.push_back (MenuElem (_("Channel Management"), sigc::mem_fun (*this, &RouteTimeAxisView::toggle_channel_selector))); + + items.push_back (MenuElem (_("MIDI"), *midi_menu)); + items.push_back (SeparatorElem()); + } + int active = 0; int inactive = 0; TrackSelection const & s = _editor.get_selection().tracks; @@ -868,6 +901,7 @@ RouteTimeAxisView::build_display_menu () items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks))); } +#ifdef XXX_OLD_DESTRUCTIVE_API_XXX void RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) { @@ -891,6 +925,7 @@ RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) track()->set_mode (mode); } } +#endif void RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layers, int layer) @@ -1104,20 +1139,25 @@ RouteTimeAxisView::rename_current_playlist () prompter.set_title (_("Rename Playlist")); prompter.set_prompt (_("New name for playlist:")); - prompter.set_initial_text (pl->name()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_initial_text (pl->name()); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + break; + } prompter.get_result (name); if (name.length()) { - pl->set_name (name); + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + pl->set_name (name); + break; + } } - break; - - default: - break; } } @@ -1157,7 +1197,7 @@ RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector } void -RouteTimeAxisView::use_copy_playlist (bool prompt, vector > const & playlists_before_op) +RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op, bool copy) { string name; @@ -1173,92 +1213,55 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vectorname(); - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name, playlists_before_op); + if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { + name = resolve_new_group_playlist_name(name,playlists_before_op); } while (_session->playlists->by_name(name)) { name = Playlist::bump_name (name, *_session); } - // TODO: The prompter "new" button should be de-activated if the user - // specifies a playlist name which already exists in the session. - if (prompt) { + // TODO: The prompter "new" button should be de-activated if the user + // specifies a playlist name which already exists in the session. ArdourPrompter prompter (true); - prompter.set_title (_("New Copy Playlist")); - prompter.set_prompt (_("Name for new playlist:")); + if (copy) { + prompter.set_title (_("New Copy Playlist")); + prompter.set_prompt (_("Name for playlist copy:")); + } else { + prompter.set_title (_("New Playlist")); + prompter.set_prompt (_("Name for new playlist:")); + } prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); prompter.show_all (); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + return; + } prompter.get_result (name); - break; - - default: - return; + if (name.length()) { + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + break; + } + } } } if (name.length()) { - tr->use_copy_playlist (); - tr->playlist()->set_name (name); - } -} - -void -RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op) -{ - string name; - - boost::shared_ptr tr = track (); - if (!tr || tr->destructive()) { - return; - } - - boost::shared_ptr pl = tr->playlist(); - if (!pl) { - return; - } - - name = pl->name(); - - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name,playlists_before_op); - } - - while (_session->playlists->by_name(name)) { - name = Playlist::bump_name (name, *_session); - } - - - if (prompt) { - - ArdourPrompter prompter (true); - - prompter.set_title (_("New Playlist")); - prompter.set_prompt (_("Name for new playlist:")); - prompter.set_initial_text (name); - prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); - - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - break; - - default: - return; + if (copy) { + tr->use_copy_playlist (); + } else { + tr->use_new_playlist (); } - } - - if (name.length()) { - tr->use_new_playlist (); tr->playlist()->set_name (name); } } @@ -1408,12 +1411,6 @@ RouteTimeAxisView::route_group () const return _route->route_group(); } -string -RouteTimeAxisView::name() const -{ - return _route->name(); -} - boost::shared_ptr RouteTimeAxisView::playlist () const { @@ -1434,7 +1431,7 @@ RouteTimeAxisView::name_entry_changed (string const& str) } string x = str; - + strip_whitespace_edges (x); if (x.empty()) { @@ -1589,7 +1586,7 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) } bool -RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx) +RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num) { if (!is_track()) { return false; @@ -1623,7 +1620,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte framecnt_t amount = extent.second - extent.first; pl->ripple(pos, amount * ctx.times, boost::shared_ptr()); } - pl->paste (*p, pos, ctx.times); + pl->paste (*p, pos, ctx.times, sub_num); vector cmds; pl->rdiff (cmds); @@ -1683,7 +1680,7 @@ RouteTimeAxisView::build_playlist_menu () playlist_items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist))); playlist_items.push_back (SeparatorElem()); - if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { + if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { playlist_items.push_back (MenuElem (_("New..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::new_playlists), this))); playlist_items.push_back (MenuElem (_("New Copy..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::copy_playlists), this))); @@ -1727,7 +1724,7 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr RouteGroup* rg = route_group(); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { std::string group_string = "." + rg->name() + "."; std::string take_name = pl->name(); @@ -1773,7 +1770,7 @@ void RouteTimeAxisView::update_playlist_tip () { RouteGroup* rg = route_group (); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { string group_string = "." + rg->name() + "."; string take_name = track()->playlist()->name(); @@ -2080,7 +2077,7 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection) for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { for (vector::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) { - if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) { + if ((*i)->processor->control((*ii)->what)->list()->size() > 0) { (*ii)->menu_item->set_active (true); } } @@ -2925,8 +2922,20 @@ RouteTimeAxisView::remove_child (boost::shared_ptr c) } } -PresentationInfo const & -RouteTimeAxisView::presentation_info () const +Gdk::Color +RouteTimeAxisView::color () const +{ + return route_color (); +} + +bool +RouteTimeAxisView::marked_for_display () const +{ + return !_route->presentation_info().hidden(); +} + +bool +RouteTimeAxisView::set_marked_for_display (bool yn) { - return _route->presentation_info(); + return RouteUI::mark_hidden (!yn); }