+/*
+ Copyright (C) 2008-2012 Paul Davis
+ Author: Sakari Bergen
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
/* This file is not used at the moment. It includes code related to export a
* multiplication graph system that can be used together with the ExportMultiplicator
* class in the gtk2_ardour folder.
{
list<TimespanNodePtr>::iterator tsl_it; // timespan list node iterator
for (tsl_it = graph.timespans.begin(); tsl_it != graph.timespans.end(); ++tsl_it) {
- list<GraphNode *>::const_iterator cc_it; // channel config node iterator
- for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
- list<GraphNode *>::const_iterator f_it; // format node iterator
- for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
- list<GraphNode *>::const_iterator fn_it; // filename node iterator
- for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
- /* Finally loop through each timespan in the timespan list */
-
- TimespanNodePtr ts_node;
- if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
-
- TimespanListPtr ts_list = ts_node->data()->timespans;
- TimespanList::iterator ts_it;
- for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
-
- TimespanPtr timespan = *ts_it;
-
- ChannelConfigNode * cc_node;
- if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- ChannelConfigPtr channel_config = cc_node->data()->config;
-
- FormatNode * f_node;
- if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- FormatPtr format = f_node->data()->format;
-
- FilenameNode * fn_node;
- if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+ list<GraphNode *>::const_iterator cc_it; // channel config node iterator
+ for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
+ list<GraphNode *>::const_iterator f_it; // format node iterator
+ for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
+ list<GraphNode *>::const_iterator fn_it; // filename node iterator
+ for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
+ /* Finally loop through each timespan in the timespan list */
+
+ TimespanNodePtr ts_node;
+ if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
+ throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+ }
+
+ TimespanListPtr ts_list = ts_node->data()->timespans;
+ TimespanList::iterator ts_it;
+ for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
+
+ TimespanPtr timespan = *ts_it;
+
+ ChannelConfigNode * cc_node;
+ if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
+ throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+ }
+ ChannelConfigPtr channel_config = cc_node->data()->config;
+
+ FormatNode * f_node;
+ if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
+ throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+ }
+ FormatPtr format = f_node->data()->format;
+
+ FilenameNode * fn_node;
+ if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
+ throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+ }
+ FilenamePtr filename = fn_node->data()->filename;
+
+ handler->add_export_config (timespan, channel_config, format, filename);
+ }
+ }
}
- FilenamePtr filename = fn_node->data()->filename;
-
- handler->add_export_config (timespan, channel_config, format, filename);
}
- }
- }
- }
}
}
timespan->data()->timespans->push_back (handler->add_timespan());
ChannelConfigNodePtr channel_config = ChannelConfigNode::create (new ChannelConfigState(handler->add_channel_config()));
-
+
FormatNodePtr format;
load_formats ();
if (!format_list.empty()) {
} else {
format = FormatNode::create (new FormatState (handler->add_format ()));
}
-
+
FilenameNodePtr filename = FilenameNode::create (new FilenameState (handler->add_filename()));
-
+
/* Bring everything together */
-
+
timespan->add_child (channel_config.get(), 0);
channel_config->add_child (format.get(), 0);
format->add_child (filename.get(), 0);
-
+
graph.timespans.push_back (timespan);
graph.channel_configs.push_back (channel_config);
graph.formats.push_back (format);
while (!children.empty()) {
remove_child (children.front());
}
-
+
while (!parents.empty()) {
parents.front()->remove_child (this);
}
} else {
children.push_back (child);
}
-
+
child->add_parent (this);
}
return true;
}
}
-
+
return false;
}
return true;
}
}
-
+
return false;
}
ExportProfileManager::GraphNode::select (bool value)
{
if (_selected == value) { return; }
-
+
_selected = value;
SelectChanged (value);
}
break;
}
}
-
+
child->remove_parent (this);
}
split_timespan (ts_node->self_ptr(), position);
return;
}
-
+
ChannelConfigNode * cc_node;
if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
split_channel_config (cc_node->self_ptr(), position);
return;
}
-
+
FormatNode * f_node;
if ((f_node = dynamic_cast<FormatNode *> (node))) {
split_format (f_node->self_ptr(), position);
return;
}
-
+
FilenameNode * fn_node;
if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
split_filename (fn_node->self_ptr(), position);
remove_timespan (ts_node->self_ptr());
return;
}
-
+
ChannelConfigNode * cc_node;
if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
remove_channel_config (cc_node->self_ptr());
return;
}
-
+
FormatNode * f_node;
if ((f_node = dynamic_cast<FormatNode *> (node))) {
remove_format (f_node->self_ptr());
return;
}
-
+
FilenameNode * fn_node;
if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
remove_filename (fn_node->self_ptr());
graph.timespans.erase (tmp);
}
}
-
+
for (list<ChannelConfigNodePtr>::iterator it = graph.channel_configs.begin(); it != graph.channel_configs.end(); ) {
list<ChannelConfigNodePtr>::iterator tmp = it;
++it;
graph.channel_configs.erase (tmp);
}
}
-
+
for (list<FormatNodePtr>::iterator it = graph.formats.begin(); it != graph.formats.end(); ) {
list<FormatNodePtr>::iterator tmp = it;
++it;
graph.formats.erase (tmp);
}
}
-
+
for (list<FilenameNodePtr>::iterator it = graph.filenames.begin(); it != graph.filenames.end(); ) {
list<FilenameNodePtr>::iterator tmp = it;
++it;
graph.filenames.erase (tmp);
}
}
-
+
GraphChanged();
}
return;
}
}
-
+
std::cerr << "invalid position given to ExportProfileManager::insert_after (aborting)" << std::endl;
-
+
abort();
}
{
if ((*beginning)->get_children().size() != 1) { return beginning; }
GraphNode * child = (*beginning)->get_children().front();
-
+
list<GraphNode *>::const_iterator it = beginning;
while (it != the_list.end() && (*it)->get_children().size() == 1 && (*it)->get_children().front() == child) {
++it;
}
-
+
return --it;
}
list<GraphNode *> const & node_parents = old_node->get_parents();
uint32_t split_index = (int) (node_parents.size() * position + 0.5);
split_index = std::max ((uint32_t) 1, std::min (split_index, node_parents.size() - 1));
-
+
list<GraphNode *>::const_iterator it = node_parents.begin();
for (uint32_t index = 1; it != node_parents.end(); ++index) {
if (index > split_index) {
ExportProfileManager::split_timespan (TimespanNodePtr node, float)
{
TimespanNodePtr new_timespan = duplicate_timespan_node (node);
- insert_after (graph.timespans, node, new_timespan);
-
+ insert_after (graph.timespans, node, new_timespan);
+
/* Note: Since a timespan selector allows all combinations of ranges
* there is no reason for a channel configuration to have two parents
*/
-
+
duplicate_timespan_children (node->self_ptr(), new_timespan);
-
+
GraphChanged();
}
{
ChannelConfigNodePtr new_config = duplicate_channel_config_node (node);
insert_after (graph.channel_configs, node, new_config);
-
+
/* Channel configs have only one parent, see above! */
node->get_parents().front()->add_child (new_config.get(), node.get());
-
+
if (node->get_children().size() == 1) {
new_config->add_child (node->first_child(), 0);
} else {
duplicate_channel_config_children (node, new_config);
}
-
+
GraphChanged();
}
node->sort_parents (graph.channel_configs);
split_node_at_position (node.get(), new_format.get(), position);
}
-
+
if (node->get_children().size() == 1) {
new_format->add_child (node->first_child(), 0);
} else {
duplicate_format_children (node, new_format);
}
-
+
GraphChanged();
}
node->sort_parents (graph.formats);
split_node_at_position (node.get(), new_filename.get(), position);
}
-
+
GraphChanged();
}
throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
}
node_insertion_point = node_insertion_ptr->self_ptr();
-
+
/* Keep track of common children */
-
+
list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
GraphNode * common_child = 0;
-
+
for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
/* Duplicate node */
-
+
ChannelConfigNode * node;
ChannelConfigNodePtr new_node;
-
+
if (!(node = dynamic_cast<ChannelConfigNode *> (*it))) {
throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
}
-
+
new_node = duplicate_channel_config_node (node->self_ptr());
-
+
/* Insert in gaph's list and update insertion position */
-
+
insert_after (graph.channel_configs, node_insertion_point, new_node);
node_insertion_point = new_node;
-
+
/* Handle children */
-
+
target->add_child (new_node.get(), child_insertion_point);
child_insertion_point = new_node.get();
-
+
if (one_grandchild) {
new_node->add_child (node->first_child(), 0);
} else {
common_children_begin = it;
common_children_end = end_of_common_child_range (source_children, it);
}
-
+
if (it == common_children_begin) { // At beginning => do duplication
GraphNode * grand_child_ins_pt = common_child;
if (!grand_child_ins_pt) {
node_insertion_point = node_insertion_ptr->self_ptr();
/* Keep track of common children */
-
+
list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
GraphNode * common_child = 0;
for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
/* Duplicate node */
-
+
FormatNode * node;
FormatNodePtr new_node;
-
+
if (!(node = dynamic_cast<FormatNode *> (*it))) {
throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
}
-
+
new_node = duplicate_format_node (node->self_ptr());
-
+
/* Insert in gaph's list and update insertion position */
-
+
insert_after (graph.formats, node_insertion_point, new_node);
node_insertion_point = new_node;
-
+
/* Handle children */
-
+
target->add_child (new_node.get(), child_insertion_point);
child_insertion_point = new_node.get();
-
+
if (one_grandchild) {
new_node->add_child (node->first_child(), 0);
} else {
common_children_begin = it;
common_children_end = end_of_common_child_range (source_children, it);
}
-
+
if (it == common_children_begin) { // At beginning => do duplication
GraphNode * grand_child_ins_pt = common_child;
if (!grand_child_ins_pt) {
for (list<GraphNode *>::const_iterator it = source->get_children().begin(); it != source->get_children().end(); ++it) {
/* Duplicate node */
-
+
FilenameNode * node;
FilenameNodePtr new_node;
-
+
if (!(node = dynamic_cast<FilenameNode *> (*it))) {
throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
}
-
+
new_node = duplicate_filename_node (node->self_ptr());
-
+
/* Insert in gaph's list and update insertion position */
-
+
insert_after (graph.filenames, node_insertion_point, new_node);
node_insertion_point = new_node;
-
+
/* Handle children */
-
+
target->add_child (new_node.get(), child_insertion_point);
child_insertion_point = new_node.get();
}
TimespanStatePtr state = node->data();
TimespanStatePtr new_state (new TimespanState ());
TimespanNodePtr new_node = TimespanNode::create (new_state);
-
+
for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
new_state->timespans->push_back (handler->add_timespan_copy (*it));
}
-
+
new_state->time_format = state->time_format;
new_state->marker_format = state->marker_format;
-
+
return new_node;
}
ChannelConfigStatePtr state = node->data();
ChannelConfigStatePtr new_state (new ChannelConfigState (handler->add_channel_config_copy (state->config)));
ChannelConfigNodePtr new_node = ChannelConfigNode::create (new_state);
-
+
return new_node;
}
FormatStatePtr state = node->data();
FormatStatePtr new_state (new FormatState (handler->add_format_copy (state->format)));
FormatNodePtr new_node = FormatNode::create (new_state);
-
+
return new_node;
}
FilenameStatePtr state = node->data();
FilenameStatePtr new_state (new FilenameState (handler->add_filename_copy (state->filename)));
FilenameNodePtr new_node = FilenameNode::create (new_state);
-
+
return new_node;
}
{
remove_by_element (graph.filenames, node);
purge_graph ();
-}
\ No newline at end of file
+}