Add column headings and length field to export timespan selector. Fixes #3518.
authorCarl Hetherington <carl@carlh.net>
Thu, 4 Nov 2010 20:37:46 +0000 (20:37 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 4 Nov 2010 20:37:46 +0000 (20:37 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7968 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/export_timespan_selector.cc
gtk2_ardour/export_timespan_selector.h
libs/ardour/ardour/bbt_time.h
libs/ardour/ardour/session.h
libs/ardour/session_time.cc

index 1153d3f48734b83ce6e67e1ed8d4cf0e05f23eeb..32b252c97f35eeb18a72344b788a5442ffd8f8c4 100644 (file)
@@ -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<Gtk::CellRendererToggle *> (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 ();
index d855df4d89c2d1f59b30ca5d0a52b3714453e04d..688971554d134d68442782933b24627539f0b2db 100644 (file)
@@ -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<ARDOUR::Location *>  location;
                Gtk::TreeModelColumn<std::string>       label;
-               Gtk::TreeModelColumn<bool>                selected;
+               Gtk::TreeModelColumn<bool>              selected;
                Gtk::TreeModelColumn<std::string>       name;
+               Gtk::TreeModelColumn<std::string>       length;
 
-               RangeCols () { add (location); add(label); add(selected); add(name); }
+               RangeCols () { add (location); add(label); add(selected); add(name); add(length); }
        };
        RangeCols                    range_cols;
 
index 76e91d575207ca329cc3f4af897fa04fe979c20d..2157e794a245127b6f68b5ced823ed7f9ed9472b 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <ostream>
 #include <stdint.h>
+#include <iomanip>
 
 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__ */
index 82b5d1360dc1a141f4713e8c30b2fa8d7cc728e9..7c7ff820e9080a9751a343fdc141a263a246e5a3 100644 (file)
@@ -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);
index f7511b398d23dadb3ce2e2ec3546d38d4545eeb7..b39c9399b3253ed7b2b45ea56f0d99d4c17cdb68 100644 (file)
@@ -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 */ );
 }