+ samplepos_t s, e;
+ Selection& selection (Editor::instance().get_selection());
+
+ region_property_connections.drop_connections();
+
+ switch (Editor::instance().current_mouse_mode()) {
+
+ case Editing::MouseContent:
+ /* displaying MIDI note selection is tricky */
+ selection_start->set_off (true);
+ selection_end->set_off (true);
+ selection_length->set_off (true);
+ break;
+
+ case Editing::MouseObject:
+ if (selection.regions.empty()) {
+ if (selection.points.empty()) {
+ Glib::RefPtr<Action> act = ActionManager::get_action ("MouseMode", "set-mouse-mode-object-range");
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+
+ if (tact && tact->get_active() && !selection.time.empty()) {
+ /* show selected range */
+ selection_start->set_off (false);
+ selection_end->set_off (false);
+ selection_length->set_off (false);
+ selection_start->set (selection.time.start());
+ selection_end->set (selection.time.end_sample());
+ selection_length->set (selection.time.end_sample(), false, selection.time.start());
+ } else {
+ selection_start->set_off (true);
+ selection_end->set_off (true);
+ selection_length->set_off (true);
+ }
+ } else {
+ s = max_samplepos;
+ e = 0;
+ for (PointSelection::iterator i = selection.points.begin(); i != selection.points.end(); ++i) {
+ samplepos_t const p = (*i)->line().session_position ((*i)->model ());
+ s = min (s, p);
+ e = max (e, p);
+ }
+ selection_start->set_off (false);
+ selection_end->set_off (false);
+ selection_length->set_off (false);
+ selection_start->set (s);
+ selection_end->set (e);
+ selection_length->set (e, false, s);
+ }
+ } else {
+ /* this is more efficient than tracking changes per region in large selections */
+ std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+ for (RegionSelection::iterator s = selection.regions.begin(); s != selection.regions.end(); ++s) {
+ boost::shared_ptr<Playlist> pl = (*s)->region()->playlist();
+ if (pl) {
+ playlists.insert (pl);
+ }
+ }
+ for (std::set<boost::shared_ptr<ARDOUR::Playlist> >::iterator ps = playlists.begin(); ps != playlists.end(); ++ps) {
+ (*ps)->ContentsChanged.connect (region_property_connections, invalidator (*this),
+ boost::bind (&TimeInfoBox::region_selection_changed, this), gui_context());
+ }
+ region_selection_changed ();
+ }
+ break;
+
+ case Editing::MouseRange:
+ if (selection.time.empty()) {
+ Glib::RefPtr<Action> act = ActionManager::get_action ("MouseMode", "set-mouse-mode-object-range");
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+
+ if (tact && tact->get_active() && !selection.regions.empty()) {
+ /* show selected regions */
+ s = selection.regions.start();
+ e = selection.regions.end_sample();
+ selection_start->set_off (false);
+ selection_end->set_off (false);
+ selection_length->set_off (false);
+ selection_start->set (s);
+ selection_end->set (e);
+ selection_length->set (e, false, s);
+ } else {
+ selection_start->set_off (true);
+ selection_end->set_off (true);
+ selection_length->set_off (true);
+ }
+ } else {
+ selection_start->set_off (false);
+ selection_end->set_off (false);
+ selection_length->set_off (false);
+ selection_start->set (selection.time.start());
+ selection_end->set (selection.time.end_sample());
+ selection_length->set (selection.time.end_sample(), false, selection.time.start());
+ }
+ break;
+
+ default:
+ selection_start->set_off (true);
+ selection_end->set_off (true);
+ selection_length->set_off (true);
+ break;
+ }