summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_region_list.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor_region_list.cc')
-rw-r--r--gtk2_ardour/editor_region_list.cc297
1 files changed, 276 insertions, 21 deletions
diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc
index 121550f86f..c37540e2b1 100644
--- a/gtk2_ardour/editor_region_list.cc
+++ b/gtk2_ardour/editor_region_list.cc
@@ -30,6 +30,7 @@
#include <ardour/silentfilesource.h>
#include <ardour/session_region.h>
+
#include <gtkmm2ext/stop_signal.h>
#include "editor.h"
@@ -41,6 +42,7 @@
#include "region_view.h"
#include "utils.h"
+
#include "i18n.h"
using namespace sigc;
@@ -89,10 +91,18 @@ void
Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
{
string str;
+ char start_str[16];
+ char end_str[16];
+ char length_str[16];
+ char used_str[8];
+ int used;
TreeModel::Row row;
Gdk::Color c;
bool missing_source;
+ BBT_Time bbt; // FIXME Why do these have to be declared here ?
+ SMPTE::Time smpte; // FIXME I would like them declared in the case statment where they are used.
+
missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source());
if (!show_automatic_regions_in_region_list && region->automatic()) {
@@ -100,12 +110,10 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
}
if (region->hidden()) {
-
TreeModel::iterator iter = region_list_model->get_iter ("0");
TreeModel::Row parent;
TreeModel::Row child;
-
if (!iter) {
parent = *(region_list_model->append());
@@ -113,21 +121,16 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
parent[region_list_columns.name] = _("Hidden");
boost::shared_ptr<Region> proxy = parent[region_list_columns.region];
proxy.reset ();
-
} else {
-
if ((*iter)[region_list_columns.name] != _("Hidden")) {
-
parent = *(region_list_model->insert(iter));
parent[region_list_columns.name] = _("Hidden");
boost::shared_ptr<Region> proxy = parent[region_list_columns.region];
proxy.reset ();
-
} else {
parent = *iter;
}
-
}
row = *(region_list_model->append (parent.children()));
@@ -149,17 +152,16 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
row = *(region_list_model->append());
if (missing_source) {
c.set_rgb(65535,0,0); // FIXME: error color from style
+ } else if (region->automatic()){
+ c.set_rgb(0,65535,0); // FIXME: error color from style
} else {
set_color(c, rgba_from_style ("RegionListWholeFile", 0xff, 0, 0, 0, "fg", Gtk::STATE_NORMAL, false ));
}
row[region_list_columns.color_] = c;
if (region->source()->name()[0] == '/') { // external file
-
if (region->whole_file()) {
-
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(region->source());
-
str = ".../";
if (afs) {
@@ -173,9 +175,7 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
}
} else {
-
str = region->name();
-
}
if (region->n_channels() > 1) {
@@ -186,14 +186,16 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
str += ']';
}
- if (missing_source) {
- str += _(" (MISSING)");
- }
+ //if (missing_source) {
+ // str += _(" (MISSING)");
+ //}
row[region_list_columns.name] = str;
row[region_list_columns.region] = region;
- return;
+ if (region->automatic()) {
+ return;
+ }
} else {
@@ -204,7 +206,6 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
bool found_parent = false;
for (i = rows.begin(); i != rows.end(); ++i) {
-
boost::shared_ptr<Region> rr = (*i)[region_list_columns.region];
boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion>(rr);
@@ -228,21 +229,101 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
}
}
}
-
if (!found_parent) {
row = *(region_list_model->append());
- }
-
+ }
+ }
+
+ used = get_regionview_count_from_region_list(region);
+ sprintf (used_str, "%4d" , used);
+
+ switch (ARDOUR_UI::instance()->secondary_clock.mode ()) {
+ case AudioClock::SMPTE:
+ case AudioClock::Off: /* If the secondary clock is off, default to SMPTE */
+ session->smpte_time (region->position(), smpte);
+ sprintf (start_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+
+ session->smpte_time (region->position() + region->length() - 1, smpte);
+ sprintf (end_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+
+ session->smpte_time (region->length(), smpte);
+ sprintf (length_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+ break;
+
+ case AudioClock::BBT:
+ session->tempo_map().bbt_time (region->position(), bbt);
+ sprintf (start_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ session->tempo_map().bbt_time (region->position() + region->length() - 1, bbt);
+ sprintf (end_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ session->tempo_map().bbt_time (region->length(), bbt);
+ sprintf (length_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ break;
+
+ case AudioClock::MinSec:
+ nframes_t left;
+ int hrs;
+ int mins;
+ float secs;
+
+ left = region->position();
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (start_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+
+ left = region->position() + region->length() - 1;
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (end_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+
+ left = region->length();
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (length_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+ break;
+ case AudioClock::Frames:
+ snprintf (start_str, sizeof (start_str), "%u", region->position());
+ snprintf (end_str, sizeof (end_str), "%u", (region->position() + region->length() - 1));
+ snprintf (length_str, sizeof (length_str), "%u", region->length());
+ break;
+
+ default:
+ break;
}
row[region_list_columns.region] = region;
+ if (used > 1) {
+ row[region_list_columns.start] = "Multiple";
+ row[region_list_columns.end] = "Multiple";
+ } else {
+ row[region_list_columns.start] = start_str;
+ row[region_list_columns.end] = end_str;
+ }
+
+ row[region_list_columns.length] = length_str;
+ row[region_list_columns.used] = used_str;
+
+ if (missing_source) {
+ row[region_list_columns.path] = _("(MISSING) ") + region->source()->name();
+ } else {
+ row[region_list_columns.path] = region->source()->name();
+ }
+
if (region->n_channels() > 1) {
row[region_list_columns.name] = string_compose("%1 [%2]", region->name(), region->n_channels());
} else {
row[region_list_columns.name] = region->name();
- }
+ }
}
@@ -356,6 +437,180 @@ Editor::redisplay_regions ()
}
}
+
+void
+Editor::update_region_row (boost::shared_ptr<Region> region)
+{
+ if (!region || !session) {
+ return;
+ }
+
+ char start_str[16];
+ char end_str[16];
+ char length_str[16];
+ char used_str[8];
+ int used;
+ bool missing_source;
+ bool matched_region = false;
+ BBT_Time bbt;
+ SMPTE::Time smpte;
+
+ missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source());
+
+ TreeModel::iterator found_region;
+
+ if (show_automatic_regions_in_region_list) {
+
+ TreeModel::iterator i;
+ TreeModel::iterator ii;
+ TreeModel::Children rows = region_list_model->children();
+
+ for (i = rows.begin(); i != rows.end(); ++i) {
+
+ cerr << "Parent " << (*i)[region_list_columns.name] << "\n";
+
+ TreeModel::Children subrows = (*i).children();
+
+ for (ii = subrows.begin(); ii != subrows.end(); ++ii) {
+
+ cerr << "Compare " << region->name() << " with child " << (*ii)[region_list_columns.name] << "\n";
+
+ boost::shared_ptr<Region> compared_region = (*ii)[region_list_columns.region];
+
+ if (region == compared_region) {
+ cerr << "Matched\n";
+ matched_region = true;
+ found_region = ii;
+ break;
+ }
+ }
+
+ if (matched_region) {
+ break;
+ }
+ }
+
+ } else {
+
+ TreeModel::iterator i;
+ TreeModel::Children rows = region_list_model->children();
+
+ for (i = rows.begin(); i != rows.end(); ++i) {
+
+ cerr << "Compare " << region->name() << " with " << (*i)[region_list_columns.name] << "\n";
+
+ boost::shared_ptr<Region> compared_region = (*i)[region_list_columns.region];
+
+ if (region == compared_region) {
+ cerr << "Matched\n";
+ matched_region = true;
+ found_region = i;
+ break;
+ }
+
+ }
+ }
+
+ if (!matched_region) {
+ cerr << "Returning - No match\n\n";
+ return;
+ }
+
+ used = get_regionview_count_from_region_list(region);
+ sprintf (used_str, "%4d" , used);
+
+ switch (ARDOUR_UI::instance()->secondary_clock.mode ()) {
+ case AudioClock::SMPTE:
+ case AudioClock::Off: // If the secondary clock is off, default to SMPTE
+ session->smpte_time (region->position(), smpte);
+ sprintf (start_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+
+ session->smpte_time (region->position() + region->length() - 1, smpte);
+ sprintf (end_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+
+ session->smpte_time (region->length(), smpte);
+ sprintf (length_str, "%02d:%02d:%02d:%02d", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+ break;
+
+ case AudioClock::BBT:
+ session->tempo_map().bbt_time (region->position(), bbt);
+ sprintf (start_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ session->tempo_map().bbt_time (region->position() + region->length() - 1, bbt);
+ sprintf (end_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ session->tempo_map().bbt_time (region->length(), bbt);
+ sprintf (length_str, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ break;
+
+ case AudioClock::MinSec:
+ nframes_t left;
+ int hrs;
+ int mins;
+ float secs;
+
+ left = region->position();
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (start_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+
+ left = region->position() + region->length() - 1;
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (end_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+
+ left = region->length();
+ hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (nframes_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);
+ secs = left / (float) session->frame_rate();
+ sprintf (length_str, "%02d:%02d:%06.3f", hrs, mins, secs);
+ break;
+
+ case AudioClock::Frames:
+ snprintf (start_str, sizeof (start_str), "%u", region->position());
+ snprintf (end_str, sizeof (end_str), "%u", (region->position() + region->length() - 1));
+ snprintf (length_str, sizeof (length_str), "%u", region->length());
+ break;
+
+ default:
+ break;
+ }
+
+ cerr << "Updating " << (*found_region)[region_list_columns.name] << "\n";
+
+ if (used > 1) {
+ (*found_region)[region_list_columns.start] = "Multiple";
+ (*found_region)[region_list_columns.end] = "Multiple";
+ } else {
+ (*found_region)[region_list_columns.start] = start_str;
+ (*found_region)[region_list_columns.end] = end_str;
+ }
+
+ (*found_region)[region_list_columns.length] = length_str;
+ (*found_region)[region_list_columns.used] = used_str;
+
+ if (missing_source) {
+ (*found_region)[region_list_columns.path] = _("(MISSING) ") + region->source()->name();
+ } else {
+ (*found_region)[region_list_columns.path] = region->source()->name();
+ }
+
+ if (region->n_channels() > 1) {
+ (*found_region)[region_list_columns.name] = string_compose("%1 [%2]", region->name(), region->n_channels());
+ } else {
+ (*found_region)[region_list_columns.name] = region->name();
+ }
+
+ cerr << "Returning after updating\n\n";
+ //return;
+}
+
void
Editor::build_region_list_menu ()
{