From 1cb36f5a81d806132b366aeabd5c6da2bbbcf7e0 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 4 Nov 2010 20:37:46 +0000 Subject: [PATCH] Add column headings and length field to export timespan selector. Fixes #3518. git-svn-id: svn://localhost/ardour2/branches/3.0@7968 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/export_timespan_selector.cc | 83 ++++++++++++++++++------- gtk2_ardour/export_timespan_selector.h | 12 ++-- libs/ardour/ardour/bbt_time.h | 12 ++++ libs/ardour/ardour/session.h | 2 +- libs/ardour/session_time.cc | 2 +- 5 files changed, 80 insertions(+), 31 deletions(-) diff --git a/gtk2_ardour/export_timespan_selector.cc b/gtk2_ardour/export_timespan_selector.cc index 1153d3f487..32b252c97f 100644 --- a/gtk2_ardour/export_timespan_selector.cc +++ b/gtk2_ardour/export_timespan_selector.cc @@ -22,6 +22,7 @@ #include "ardour_ui.h" +#include "ardour/tempo.h" #include "ardour/location.h" #include "ardour/types.h" #include "ardour/session.h" @@ -90,7 +91,7 @@ ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, Profi range_list = Gtk::ListStore::create (range_cols); range_view.set_model (range_list); - range_view.set_headers_visible (false); + range_view.set_headers_visible (true); } ExportTimespanSelector::~ExportTimespanSelector () @@ -145,6 +146,7 @@ ExportTimespanSelector::change_time_format () for (Gtk::ListStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) { Location * location = it->get_value (range_cols.location); it->set_value (range_cols.label, construct_label (location)); + it->set_value (range_cols.length, construct_length (location)); } } @@ -155,8 +157,8 @@ ExportTimespanSelector::construct_label (ARDOUR::Location const * location) cons std::string start; std::string end; - nframes_t start_frame = location->start(); - nframes_t end_frame = location->end(); + framepos_t start_frame = location->start(); + framepos_t end_frame = location->end(); switch (state->time_format) { case AudioClock::BBT: @@ -198,9 +200,46 @@ ExportTimespanSelector::construct_label (ARDOUR::Location const * location) cons return label; } +std::string +ExportTimespanSelector::construct_length (ARDOUR::Location const * location) const +{ + if (location->length() == 0) { + return ""; + } + + std::stringstream s; + + switch (state->time_format) { + case AudioClock::BBT: + s << bbt_str (location->length ()); + break; + + case AudioClock::Timecode: + { + Timecode::Time tc; + _session->timecode_duration (location->length(), tc); + tc.print (s); + break; + } + + case AudioClock::MinSec: + s << ms_str (location->length ()); + break; + + case AudioClock::Frames: + s << location->length (); + break; + + case AudioClock::Off: + break; + } + + return s.str (); +} + std::string -ExportTimespanSelector::bbt_str (nframes_t frames) const +ExportTimespanSelector::bbt_str (framepos_t frames) const { if (!_session) { return "Error!"; @@ -208,22 +247,14 @@ ExportTimespanSelector::bbt_str (nframes_t frames) const std::ostringstream oss; BBT_Time time; - _session->bbt_time (frames, time); - oss << std::setfill('0') << std::right << - std::setw(3) << - time.bars << "|" << - std::setw(2) << - time.beats << "|" << - std::setw(4) << - time.ticks; - - return oss.str(); + print_padded (oss, time); + return oss.str (); } std::string -ExportTimespanSelector::timecode_str (nframes_t frames) const +ExportTimespanSelector::timecode_str (framecnt_t frames) const { if (!_session) { return "Error!"; @@ -248,14 +279,14 @@ ExportTimespanSelector::timecode_str (nframes_t frames) const } std::string -ExportTimespanSelector::ms_str (nframes_t frames) const +ExportTimespanSelector::ms_str (framecnt_t frames) const { if (!_session) { return "Error!"; } std::ostringstream oss; - nframes_t left; + framecnt_t left; int hrs; int mins; int secs; @@ -263,11 +294,11 @@ ExportTimespanSelector::ms_str (nframes_t frames) const left = frames; hrs = (int) floor (left / (_session->frame_rate() * 60.0f * 60.0f)); - left -= (nframes_t) floor (hrs * _session->frame_rate() * 60.0f * 60.0f); + left -= (framecnt_t) floor (hrs * _session->frame_rate() * 60.0f * 60.0f); mins = (int) floor (left / (_session->frame_rate() * 60.0f)); - left -= (nframes_t) floor (mins * _session->frame_rate() * 60.0f); + left -= (framecnt_t) floor (mins * _session->frame_rate() * 60.0f); secs = (int) floor (left / (float) _session->frame_rate()); - left -= (nframes_t) floor (secs * _session->frame_rate()); + left -= (framecnt_t) floor (secs * _session->frame_rate()); sec_promilles = (int) (left * 1000 / (float) _session->frame_rate() + 0.5); oss << std::setfill('0') << std::right << @@ -299,7 +330,7 @@ ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * se range_id (range_id) { range_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER); - range_view.append_column_editable ("", range_cols.name); + range_view.append_column_editable ("Range", range_cols.name); // Adjust selector height int x_offset, y_offset, width, height; @@ -312,10 +343,11 @@ ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * se } Gtk::CellRendererText * label_render = Gtk::manage (new Gtk::CellRendererText()); - Gtk::TreeView::Column * label_col = Gtk::manage (new Gtk::TreeView::Column ("", *label_render)); + Gtk::TreeView::Column * label_col = Gtk::manage (new Gtk::TreeView::Column ("Time Span", *label_render)); label_col->add_attribute (label_render->property_markup(), range_cols.label); range_view.append_column (*label_col); + range_view.append_column ("Length", range_cols.length); } void @@ -347,6 +379,7 @@ ExportTimespanSelectorSingle::fill_range_list () row[range_cols.selected] = true; row[range_cols.name] = (*it)->name(); row[range_cols.label] = construct_label (*it); + row[range_cols.length] = construct_length (*it); add_range_to_selection (*it); @@ -364,7 +397,7 @@ ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session { range_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); range_view.append_column_editable ("", range_cols.selected); - range_view.append_column_editable ("", range_cols.name); + range_view.append_column_editable ("Range", range_cols.name); if (Gtk::CellRendererToggle * renderer = dynamic_cast (range_view.get_column_cell_renderer (0))) { renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_selection))); @@ -374,10 +407,11 @@ ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session } Gtk::CellRendererText * label_render = Gtk::manage (new Gtk::CellRendererText()); - Gtk::TreeView::Column * label_col = Gtk::manage (new Gtk::TreeView::Column ("", *label_render)); + Gtk::TreeView::Column * label_col = Gtk::manage (new Gtk::TreeView::Column ("Time Span", *label_render)); label_col->add_attribute (label_render->property_markup(), range_cols.label); range_view.append_column (*label_col); + range_view.append_column ("Length", range_cols.length); } void @@ -398,6 +432,7 @@ ExportTimespanSelectorMultiple::fill_range_list () row[range_cols.selected] = false; row[range_cols.name] = (*it)->name(); row[range_cols.label] = construct_label (*it); + row[range_cols.length] = construct_length (*it); } set_selection_from_state (); diff --git a/gtk2_ardour/export_timespan_selector.h b/gtk2_ardour/export_timespan_selector.h index d855df4d89..688971554d 100644 --- a/gtk2_ardour/export_timespan_selector.h +++ b/gtk2_ardour/export_timespan_selector.h @@ -77,9 +77,10 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr void change_time_format (); std::string construct_label (ARDOUR::Location const * location) const; - std::string bbt_str (nframes_t frames) const; - std::string timecode_str (nframes_t frames) const; - std::string ms_str (nframes_t frames) const; + std::string construct_length (ARDOUR::Location const * location) const; + std::string bbt_str (framepos_t frames) const; + std::string timecode_str (framecnt_t frames) const; + std::string ms_str (framecnt_t frames) const; void update_range_name (std::string const & path, std::string const & new_text); @@ -111,10 +112,11 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr public: Gtk::TreeModelColumn location; Gtk::TreeModelColumn label; - Gtk::TreeModelColumn selected; + Gtk::TreeModelColumn selected; Gtk::TreeModelColumn name; + Gtk::TreeModelColumn length; - RangeCols () { add (location); add(label); add(selected); add(name); } + RangeCols () { add (location); add(label); add(selected); add(name); add(length); } }; RangeCols range_cols; diff --git a/libs/ardour/ardour/bbt_time.h b/libs/ardour/ardour/bbt_time.h index 76e91d5752..2157e794a2 100644 --- a/libs/ardour/ardour/bbt_time.h +++ b/libs/ardour/ardour/bbt_time.h @@ -22,6 +22,7 @@ #include #include +#include namespace ARDOUR { @@ -59,4 +60,15 @@ operator<< (std::ostream& o, const ARDOUR::BBT_Time& bbt) return o; } +inline std::ostream& +print_padded (std::ostream& o, const ARDOUR::BBT_Time& bbt) +{ + o << std::setfill ('0') << std::right + << std::setw (3) << bbt.bars << "|" + << std::setw (2) << bbt.beats << "|" + << std::setw (4) << bbt.ticks; + + return o; +} + #endif /* __ardour_bbt_time_h__ */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 82b5d1360d..7c7ff820e9 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -453,7 +453,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void timecode_time (nframes_t when, Timecode::Time&); void timecode_time_subframes (nframes_t when, Timecode::Time&); - void timecode_duration (nframes_t, Timecode::Time&) const; + void timecode_duration (framecnt_t, Timecode::Time&) const; void timecode_duration_string (char *, framecnt_t) const; void set_timecode_offset (nframes_t); diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc index f7511b398d..b39c9399b3 100644 --- a/libs/ardour/session_time.cc +++ b/libs/ardour/session_time.cc @@ -424,7 +424,7 @@ Session::timecode_time_subframes (nframes_t when, Timecode::Time& timecode) } void -Session::timecode_duration (nframes_t when, Timecode::Time& timecode) const +Session::timecode_duration (framecnt_t when, Timecode::Time& timecode) const { sample_to_timecode( when, timecode, false /* use_offset */, true /* use_subframes */ ); }