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
This commit is contained in:
Carl Hetherington 2010-11-04 20:37:46 +00:00
parent 844b7d0f68
commit 1cb36f5a81
5 changed files with 80 additions and 31 deletions

View file

@ -22,6 +22,7 @@
#include "ardour_ui.h" #include "ardour_ui.h"
#include "ardour/tempo.h"
#include "ardour/location.h" #include "ardour/location.h"
#include "ardour/types.h" #include "ardour/types.h"
#include "ardour/session.h" #include "ardour/session.h"
@ -90,7 +91,7 @@ ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, Profi
range_list = Gtk::ListStore::create (range_cols); range_list = Gtk::ListStore::create (range_cols);
range_view.set_model (range_list); range_view.set_model (range_list);
range_view.set_headers_visible (false); range_view.set_headers_visible (true);
} }
ExportTimespanSelector::~ExportTimespanSelector () 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) { for (Gtk::ListStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
Location * location = it->get_value (range_cols.location); Location * location = it->get_value (range_cols.location);
it->set_value (range_cols.label, construct_label (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 start;
std::string end; std::string end;
nframes_t start_frame = location->start(); framepos_t start_frame = location->start();
nframes_t end_frame = location->end(); framepos_t end_frame = location->end();
switch (state->time_format) { switch (state->time_format) {
case AudioClock::BBT: case AudioClock::BBT:
@ -198,9 +200,46 @@ ExportTimespanSelector::construct_label (ARDOUR::Location const * location) cons
return label; 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 std::string
ExportTimespanSelector::bbt_str (nframes_t frames) const ExportTimespanSelector::bbt_str (framepos_t frames) const
{ {
if (!_session) { if (!_session) {
return "Error!"; return "Error!";
@ -208,22 +247,14 @@ ExportTimespanSelector::bbt_str (nframes_t frames) const
std::ostringstream oss; std::ostringstream oss;
BBT_Time time; BBT_Time time;
_session->bbt_time (frames, time); _session->bbt_time (frames, time);
oss << std::setfill('0') << std::right << print_padded (oss, time);
std::setw(3) << return oss.str ();
time.bars << "|" <<
std::setw(2) <<
time.beats << "|" <<
std::setw(4) <<
time.ticks;
return oss.str();
} }
std::string std::string
ExportTimespanSelector::timecode_str (nframes_t frames) const ExportTimespanSelector::timecode_str (framecnt_t frames) const
{ {
if (!_session) { if (!_session) {
return "Error!"; return "Error!";
@ -248,14 +279,14 @@ ExportTimespanSelector::timecode_str (nframes_t frames) const
} }
std::string std::string
ExportTimespanSelector::ms_str (nframes_t frames) const ExportTimespanSelector::ms_str (framecnt_t frames) const
{ {
if (!_session) { if (!_session) {
return "Error!"; return "Error!";
} }
std::ostringstream oss; std::ostringstream oss;
nframes_t left; framecnt_t left;
int hrs; int hrs;
int mins; int mins;
int secs; int secs;
@ -263,11 +294,11 @@ ExportTimespanSelector::ms_str (nframes_t frames) const
left = frames; left = frames;
hrs = (int) floor (left / (_session->frame_rate() * 60.0f * 60.0f)); 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)); 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()); 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); sec_promilles = (int) (left * 1000 / (float) _session->frame_rate() + 0.5);
oss << std::setfill('0') << std::right << oss << std::setfill('0') << std::right <<
@ -299,7 +330,7 @@ ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * se
range_id (range_id) range_id (range_id)
{ {
range_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER); 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 // Adjust selector height
int x_offset, y_offset, width, 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::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); label_col->add_attribute (label_render->property_markup(), range_cols.label);
range_view.append_column (*label_col); range_view.append_column (*label_col);
range_view.append_column ("Length", range_cols.length);
} }
void void
@ -347,6 +379,7 @@ ExportTimespanSelectorSingle::fill_range_list ()
row[range_cols.selected] = true; row[range_cols.selected] = true;
row[range_cols.name] = (*it)->name(); row[range_cols.name] = (*it)->name();
row[range_cols.label] = construct_label (*it); row[range_cols.label] = construct_label (*it);
row[range_cols.length] = construct_length (*it);
add_range_to_selection (*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_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
range_view.append_column_editable ("", range_cols.selected); 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))) { 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))); 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::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); label_col->add_attribute (label_render->property_markup(), range_cols.label);
range_view.append_column (*label_col); range_view.append_column (*label_col);
range_view.append_column ("Length", range_cols.length);
} }
void void
@ -398,6 +432,7 @@ ExportTimespanSelectorMultiple::fill_range_list ()
row[range_cols.selected] = false; row[range_cols.selected] = false;
row[range_cols.name] = (*it)->name(); row[range_cols.name] = (*it)->name();
row[range_cols.label] = construct_label (*it); row[range_cols.label] = construct_label (*it);
row[range_cols.length] = construct_length (*it);
} }
set_selection_from_state (); set_selection_from_state ();

View file

@ -77,9 +77,10 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
void change_time_format (); void change_time_format ();
std::string construct_label (ARDOUR::Location const * location) const; std::string construct_label (ARDOUR::Location const * location) const;
std::string bbt_str (nframes_t frames) const; std::string construct_length (ARDOUR::Location const * location) const;
std::string timecode_str (nframes_t frames) const; std::string bbt_str (framepos_t frames) const;
std::string ms_str (nframes_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); 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: public:
Gtk::TreeModelColumn<ARDOUR::Location *> location; Gtk::TreeModelColumn<ARDOUR::Location *> location;
Gtk::TreeModelColumn<std::string> label; Gtk::TreeModelColumn<std::string> label;
Gtk::TreeModelColumn<bool> selected; Gtk::TreeModelColumn<bool> selected;
Gtk::TreeModelColumn<std::string> name; 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; RangeCols range_cols;

View file

@ -22,6 +22,7 @@
#include <ostream> #include <ostream>
#include <stdint.h> #include <stdint.h>
#include <iomanip>
namespace ARDOUR { namespace ARDOUR {
@ -59,4 +60,15 @@ operator<< (std::ostream& o, const ARDOUR::BBT_Time& bbt)
return o; 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__ */ #endif /* __ardour_bbt_time_h__ */

View file

@ -453,7 +453,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void timecode_time (nframes_t when, Timecode::Time&); void timecode_time (nframes_t when, Timecode::Time&);
void timecode_time_subframes (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 timecode_duration_string (char *, framecnt_t) const;
void set_timecode_offset (nframes_t); void set_timecode_offset (nframes_t);

View file

@ -424,7 +424,7 @@ Session::timecode_time_subframes (nframes_t when, Timecode::Time& timecode)
} }
void 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 */ ); sample_to_timecode( when, timecode, false /* use_offset */, true /* use_subframes */ );
} }