mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 23:05:04 +01:00
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:
parent
844b7d0f68
commit
1cb36f5a81
5 changed files with 80 additions and 31 deletions
|
|
@ -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 ();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__ */
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 */ );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue