X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Flocation_ui.cc;h=2079d0dc7a722de5c966964a2cb0607272768987;hb=39b2e2b572e4f2aa1f74668892bfc09f01da863e;hp=d10f43cd307bc4a1d48c67ad401f0258dc71ded9;hpb=5a52d8fee4c9abac7ffb1f1e6464785d979acd68;p=ardour.git diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc index d10f43cd30..2079d0dc7a 100644 --- a/gtk2_ardour/location_ui.cc +++ b/gtk2_ardour/location_ui.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -23,10 +22,12 @@ #include #include +#include #include #include #include +#include #include "ardour_ui.h" #include "prompter.h" @@ -38,6 +39,7 @@ #include "i18n.h" using namespace ARDOUR; +using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; @@ -46,11 +48,11 @@ LocationEditRow::LocationEditRow(Session * sess, Location * loc, int32_t num) item_table (1, 7, false), start_set_button (_("Set")), start_go_button (_("Go")), - start_clock (X_("LocationEditRowClock"), true), + start_clock (X_("locationstart"), true, X_("LocationEditRowClock"), true), end_set_button (_("Set")), end_go_button (_("Go")), - end_clock (X_("LocationEditRowClock"), true), - length_clock (X_("LocationEditRowClock"), true, true), + end_clock (X_("locationend"), true, X_("LocationEditRowClock"), true), + length_clock (X_("locationlength"), true, X_("LocationEditRowClock"), true, true), cd_check_button (_("CD")), hide_check_button (_("Hidden")), remove_button (_("Remove")), @@ -108,17 +110,8 @@ LocationEditRow::LocationEditRow(Session * sess, Location * loc, int32_t num) cd_track_details_hbox.pack_start (composer_entry, true, true); isrc_entry.signal_changed().connect (mem_fun(*this, &LocationEditRow::isrc_entry_changed)); - isrc_entry.signal_focus_in_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - isrc_entry.signal_focus_out_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - performer_entry.signal_changed().connect (mem_fun(*this, &LocationEditRow::performer_entry_changed)); - performer_entry.signal_focus_in_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - performer_entry.signal_focus_out_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - composer_entry.signal_changed().connect (mem_fun(*this, &LocationEditRow::composer_entry_changed)); - composer_entry.signal_focus_in_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - composer_entry.signal_focus_out_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - scms_check_button.signal_toggled().connect(mem_fun(*this, &LocationEditRow::scms_toggled)); preemph_check_button.signal_toggled().connect(mem_fun(*this, &LocationEditRow::preemph_toggled)); @@ -198,7 +191,7 @@ LocationEditRow::set_number (int num) number = num; if (number >= 0 ) { - number_label.set_text (compose ("%1", number)); + number_label.set_text (string_compose ("%1", number)); } } @@ -222,14 +215,14 @@ LocationEditRow::set_location (Location *loc) } hide_check_button.set_active (location->is_hidden()); - if (location->is_auto_loop() || location->is_auto_punch()) { + if (location->is_auto_loop() || location-> is_auto_punch()) { // use label instead of entry name_label.set_text (location->name()); name_label.set_size_request (80, -1); if (!name_label.get_parent()) { - item_table.attach (name_label, 1, 2, 0, 1, FILL, Gtk::FILL, 4, 0); + item_table.attach (name_label, 1, 2, 0, 1, FILL, FILL, 4, 0); } name_label.show(); @@ -240,8 +233,6 @@ LocationEditRow::set_location (Location *loc) name_entry.set_size_request (100, -1); name_entry.set_editable (true); name_entry.signal_changed().connect (mem_fun(*this, &LocationEditRow::name_entry_changed)); - name_entry.signal_focus_in_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); - name_entry.signal_focus_out_event().connect (mem_fun(*this, &LocationEditRow::entry_focus_event)); if (!name_entry.get_parent()) { item_table.attach (name_entry, 1, 2, 0, 1, FILL | EXPAND, FILL, 4, 0); @@ -249,27 +240,34 @@ LocationEditRow::set_location (Location *loc) name_entry.show(); if (!cd_check_button.get_parent()) { - item_table.attach (cd_check_button, 5, 6, 0, 1, FILL, Gtk::FILL, 4, 0); + item_table.attach (cd_check_button, 5, 6, 0, 1, FILL, FILL, 4, 0); } if (!remove_button.get_parent()) { - item_table.attach (remove_button, 7, 8, 0, 1, FILL, Gtk::FILL, 4, 0); + item_table.attach (remove_button, 7, 8, 0, 1, FILL, FILL, 4, 0); } /* XXX i can't find a way to hide the button without messing up the row spacing, so make it insensitive (paul). */ - if (location->is_end()) { + if (location->is_end() || location->is_start()) { remove_button.set_sensitive (false); } cd_check_button.set_active (location->is_cd_marker()); cd_check_button.show(); + + if (location->start() == session->current_start_frame()) { + cd_check_button.set_sensitive (false); + } else { + cd_check_button.set_sensitive (true); + } + hide_check_button.show(); } start_clock.set (location->start(), true); - + if (!location->is_mark()) { if (!end_hbox.get_parent()) { @@ -286,34 +284,27 @@ LocationEditRow::set_location (Location *loc) end_go_button.show(); end_clock.show(); length_clock.show(); - } - else { + + } else { + end_set_button.hide(); end_go_button.hide(); end_clock.hide(); length_clock.hide(); + } + start_clock.set_sensitive (!location->locked()); + end_clock.set_sensitive (!location->locked()); + length_clock.set_sensitive (!location->locked()); + start_changed_connection = location->start_changed.connect (mem_fun(*this, &LocationEditRow::start_changed)); end_changed_connection = location->end_changed.connect (mem_fun(*this, &LocationEditRow::end_changed)); name_changed_connection = location->name_changed.connect (mem_fun(*this, &LocationEditRow::name_changed)); changed_connection = location->changed.connect (mem_fun(*this, &LocationEditRow::location_changed)); flags_changed_connection = location->FlagsChanged.connect (mem_fun(*this, &LocationEditRow::flags_changed)); - -} - -gint -LocationEditRow::entry_focus_event (GdkEventFocus* ev) -{ - if (ev->in) { - ARDOUR_UI::instance()->allow_focus (true); - } else { - ARDOUR_UI::instance()->allow_focus (false); - } - return TRUE; } - void LocationEditRow::name_entry_changed () { @@ -426,44 +417,56 @@ LocationEditRow::clock_changed (LocationPart part) void LocationEditRow::cd_toggled () { + if (i_am_the_modifier || !location) { + return; + } + + //if (cd_check_button.get_active() == location->is_cd_marker()) { + // return; + //} + + if (cd_check_button.get_active()) { + if (location->start() <= session->current_start_frame()) { + error << _("You cannot put a CD marker at the start of the session") << endmsg; + cd_check_button.set_active (false); + return; + } + } - if (i_am_the_modifier || !location) return; location->set_cd (cd_check_button.get_active(), this); if (location->is_cd_marker() && !(location->is_mark())) { - if (location->cd_info.find("isrc") != location->cd_info.end()) { - isrc_entry.set_text(location->cd_info["isrc"]); - } - if (location->cd_info.find("performer") != location->cd_info.end()) { - performer_entry.set_text(location->cd_info["performer"]); - } - if (location->cd_info.find("composer") != location->cd_info.end()) { - composer_entry.set_text(location->cd_info["composer"]); - } - if (location->cd_info.find("scms") != location->cd_info.end()) { - scms_check_button.set_active(true); - } - if (location->cd_info.find("preemph") != location->cd_info.end()) { - preemph_check_button.set_active(true); - } - - if(!cd_track_details_hbox.get_parent()) { - item_table.attach (cd_track_details_hbox, 1, 8, 1, 2, FILL | EXPAND, FILL, 4, 0); - } - // item_table.resize(2, 7); - cd_track_details_hbox.show_all(); - + if (location->cd_info.find("isrc") != location->cd_info.end()) { + isrc_entry.set_text(location->cd_info["isrc"]); + } + if (location->cd_info.find("performer") != location->cd_info.end()) { + performer_entry.set_text(location->cd_info["performer"]); + } + if (location->cd_info.find("composer") != location->cd_info.end()) { + composer_entry.set_text(location->cd_info["composer"]); + } + if (location->cd_info.find("scms") != location->cd_info.end()) { + scms_check_button.set_active(true); + } + if (location->cd_info.find("preemph") != location->cd_info.end()) { + preemph_check_button.set_active(true); + } + + if (!cd_track_details_hbox.get_parent()) { + item_table.attach (cd_track_details_hbox, 1, 8, 1, 2, FILL | EXPAND, FILL, 4, 0); + } + // item_table.resize(2, 7); + cd_track_details_hbox.show_all(); + } else if (cd_track_details_hbox.get_parent()){ - - item_table.remove (cd_track_details_hbox); - // item_table.resize(1, 7); - redraw_ranges(); /* EMIT_SIGNAL */ + + item_table.remove (cd_track_details_hbox); + // item_table.resize(1, 7); + redraw_ranges(); /* EMIT_SIGNAL */ } - } - void LocationEditRow::hide_toggled () { @@ -527,13 +530,19 @@ void LocationEditRow::start_changed (ARDOUR::Location *loc) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &LocationEditRow::start_changed), loc)); - + if (!location) return; // update end and length i_am_the_modifier++; start_clock.set (location->start()); + + if (location->start() == session->current_start_frame()) { + cd_check_button.set_sensitive (false); + } else { + cd_check_button.set_sensitive (true); + } i_am_the_modifier--; } @@ -568,6 +577,10 @@ LocationEditRow::location_changed (ARDOUR::Location *loc) end_clock.set (location->end()); length_clock.set (location->length()); + start_clock.set_sensitive (!location->locked()); + end_clock.set_sensitive (!location->locked()); + length_clock.set_sensitive (!location->locked()); + i_am_the_modifier--; } @@ -588,30 +601,30 @@ LocationEditRow::flags_changed (ARDOUR::Location *loc, void *src) } LocationUI::LocationUI () - : ArdourDialog ("location dialog"), + : ArdourDialog ("locations dialog"), add_location_button (_("Add New Location")), add_range_button (_("Add New Range")) { i_am_the_modifier = 0; + + WindowTitle title(Glib::get_application_name()); + title += _("Locations"); - set_title(_("ardour: locations")); - set_wmclass(_("ardour_locations"), "Ardour"); + set_title(title.get_string()); + set_wmclass(X_("ardour_locations"), "Ardour"); set_name ("LocationWindow"); - signal_delete_event().connect (bind (ptr_fun (just_hide_it), static_cast(this))); - - add (location_hpacker); + get_vbox()->pack_start (location_hpacker); location_vpacker.set_border_width (10); location_vpacker.set_spacing (5); - location_vpacker.pack_start (loop_edit_row, false, false); location_vpacker.pack_start (punch_edit_row, false, false); location_rows.set_name("LocationLocRows"); - location_rows_scroller.add_with_viewport (location_rows); + location_rows_scroller.add (location_rows); location_rows_scroller.set_name ("LocationLocRowsScroller"); location_rows_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); location_rows_scroller.set_size_request (-1, 130); @@ -632,7 +645,7 @@ LocationUI::LocationUI () range_rows.set_name("LocationRangeRows"); - range_rows_scroller.add_with_viewport (range_rows); + range_rows_scroller.add (range_rows); range_rows_scroller.set_name ("LocationRangeRowsScroller"); range_rows_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); range_rows_scroller.set_size_request (-1, 130); @@ -665,6 +678,11 @@ LocationUI::~LocationUI() { } +void LocationUI::on_show() +{ + ArdourDialog::on_show(); + refresh_location_list(); +} gint LocationUI::do_location_remove (ARDOUR::Location *loc) @@ -679,9 +697,10 @@ gint LocationUI::do_location_remove (ARDOUR::Location *loc) } session->begin_reversible_command (_("remove marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->remove (loc); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); return FALSE; @@ -774,10 +793,12 @@ LocationUI::map_locations (Locations::LocationList& locations) else if (location->is_auto_punch()) { punch_edit_row.set_session (session); punch_edit_row.set_location (location); + punch_edit_row.show_all(); } else if (location->is_auto_loop()) { loop_edit_row.set_session (session); loop_edit_row.set_location (location); + loop_edit_row.show_all(); } else { erow = manage (new LocationEditRow(session, location)); @@ -793,13 +814,17 @@ LocationUI::map_locations (Locations::LocationList& locations) void LocationUI::add_new_location() { + string markername; + if (session) { - jack_nframes_t where = session->audible_frame(); - Location *location = new Location (where, where, "mark", Location::IsMark); + nframes_t where = session->audible_frame(); + session->locations()->next_available_name(markername,"mark"); + Location *location = new Location (where, where, markername, Location::IsMark); session->begin_reversible_command (_("add marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command (new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } @@ -808,13 +833,17 @@ LocationUI::add_new_location() void LocationUI::add_new_range() { + string rangename; + if (session) { - jack_nframes_t where = session->audible_frame(); - Location *location = new Location (where, where, "unnamed"); + nframes_t where = session->audible_frame(); + session->locations()->next_available_name(rangename,"unnamed"); + Location *location = new Location (where, where, rangename, Location::IsRangeMarker); session->begin_reversible_command (_("add range marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command (new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } } @@ -834,6 +863,9 @@ LocationUI::refresh_location_list () ENSURE_GUI_THREAD(mem_fun(*this, &LocationUI::refresh_location_list)); using namespace Box_Helpers; + // this is just too expensive to do when window is not shown + if (!is_visible()) return; + BoxList & loc_children = location_rows.children(); BoxList & range_children = range_rows.children(); @@ -856,7 +888,7 @@ LocationUI::set_session(ARDOUR::Session* sess) session->locations()->StateChanged.connect (mem_fun(*this, &LocationUI::refresh_location_list_s)); session->locations()->added.connect (mem_fun(*this, &LocationUI::location_added)); session->locations()->removed.connect (mem_fun(*this, &LocationUI::location_removed)); - session->going_away.connect (mem_fun(*this, &LocationUI::session_gone)); + session->GoingAway.connect (mem_fun(*this, &LocationUI::session_gone)); } refresh_location_list (); } @@ -880,7 +912,13 @@ LocationUI::session_gone() punch_edit_row.set_session (0); punch_edit_row.set_location (0); - - ArdourDialog::session_gone(); + + ArdourDialog::session_gone (); } +bool +LocationUI::on_delete_event (GdkEventAny* ev) +{ + hide (); + return true; +}