change to id based refs for plugins, save plugin on/off in edit drag/drop, fix transi...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / plugin.C
index 5890808b5617010cb93fff45858fb0e2765fcd86..4a34141c5cd837dd8826f0ee07118f88cc9f5581 100644 (file)
@@ -49,6 +49,7 @@ Plugin::Plugin(EDL *edl, Track *track, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -66,6 +67,7 @@ Plugin::Plugin(EDL *edl, PluginSet *plugin_set, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -130,13 +132,14 @@ void Plugin::copy_base(Edit *edit)
        this->startsource = edit->startsource;
        this->startproject = edit->startproject;
        this->length = edit->length;
-
+       this->orig_id = edit->orig_id;
 
        this->plugin_type = plugin->plugin_type;
        this->in = plugin->in;
        this->out = plugin->out;
        this->show = plugin->show;
        this->on = plugin->on;
+// dont copy gui_id, it will be a duplicate ref
 // Should reconfigure this based on where the first track is now.
        this->shared_location = plugin->shared_location;
        strcpy(this->title, plugin->title);
@@ -175,6 +178,7 @@ void Plugin::synchronize_params(Edit *edit)
        this->in = plugin->in;
        this->out = plugin->out;
        this->show = plugin->show;
+       this->gui_id = plugin->gui_id;
        this->on = plugin->on;
        strcpy(this->title, plugin->title);
        copy_keyframes(plugin);
@@ -213,56 +217,50 @@ void Plugin::equivalent_output(Edit *edit, int64_t *result)
        keyframes->equivalent_output(plugin->keyframes, startproject, result);
 }
 
-
-
-int Plugin::is_synthesis(int64_t position,
-               int direction)
+const char* Plugin::type_to_text(int type)
 {
-       switch(plugin_type)
-       {
-               case PLUGIN_STANDALONE:
-               {
-                       if(!track)
-                       {
-                               printf("Plugin::is_synthesis track not defined\n");
-                               return 0;
-                       }
-
+       switch( type ) {
+        case PLUGIN_STANDALONE:    return _("standalone");
+        case PLUGIN_SHAREDPLUGIN:  return _("shared plugin");
+        case PLUGIN_SHAREDMODULE:  return _("shared module");
+       }
+       return _("none");
+}
 
-                       PluginServer *plugin_server = MWindow::scan_plugindb(title,
-                               track->data_type);
-//printf("Plugin::is_synthesis %d %p %d\n", __LINE__, plugin_server, plugin_server->get_synthesis());
-//plugin_server->dump();
-                       return plugin_server->get_synthesis();
-                       break;
+int Plugin::is_synthesis(int64_t position, int direction, int depth)
+{
+       if( depth > 255 ) {
+               printf("Plugin::is_synthesis %d: depth range limit, type=%s, title=%s\n",
+                       __LINE__, type_to_text(plugin_type), title);
+               return 0;
+       }
+       switch( plugin_type ) {
+       case PLUGIN_STANDALONE: {
+               if( !track ) {
+                       printf("Plugin::is_synthesis track not defined\n");
+                       return 0;
                }
+               PluginServer *plugin_server = MWindow::scan_plugindb(title, track->data_type);
+               return plugin_server->get_synthesis(); }
 
 // Dereference real plugin and descend another level
-               case PLUGIN_SHAREDPLUGIN:
-               {
-                       int real_module_number = shared_location.module;
-                       int real_plugin_number = shared_location.plugin;
-                       Track *track = edl->tracks->number(real_module_number);
+       case PLUGIN_SHAREDPLUGIN: {
+               int real_module_number = shared_location.module;
+               int real_plugin_number = shared_location.plugin;
+               Track *track = edl->tracks->number(real_module_number);
 // Get shared plugin from master track
-                       Plugin *plugin = track->get_current_plugin(position,
-                               real_plugin_number,
-                               direction,
-                               0,
-                               0);
-
-                       if(plugin)
-                               return plugin->is_synthesis(position, direction);
-                       break;
-               }
+               Plugin *plugin = track->get_current_plugin(position,
+                       real_plugin_number, direction, 0, 0);
+
+               if(plugin)
+                       return plugin->is_synthesis(position, direction, depth+1);
+               break; }
 
 // Dereference the real track and descend
-               case PLUGIN_SHAREDMODULE:
-               {
-                       int real_module_number = shared_location.module;
-                       Track *track = edl->tracks->number(real_module_number);
-                       return track->is_synthesis(position, direction);
-                       break;
-               }
+       case PLUGIN_SHAREDMODULE: {
+               int real_module_number = shared_location.module;
+               Track *track = edl->tracks->number(real_module_number);
+               return track->is_synthesis(position, direction, depth+1); }
        }
        return 0;
 }
@@ -295,19 +293,6 @@ int Plugin::identical(Plugin *that)
                        ((KeyFrame*)that->keyframes->default_auto)));
 }
 
-int Plugin::identical_location(Plugin *that)
-{
-       if(!plugin_set || !plugin_set->track) return 0;
-       if(!that->plugin_set || !that->plugin_set->track) return 0;
-
-       if(plugin_set->track->number_of() == that->plugin_set->track->number_of() &&
-               plugin_set->get_number() == that->plugin_set->get_number() &&
-               startproject == that->startproject) return 1;
-
-       return 0;
-
-}
-
 int Plugin::keyframe_exists(KeyFrame *ptr)
 {
        for(KeyFrame *current = (KeyFrame*)keyframes->first;
@@ -594,8 +579,8 @@ void Plugin::shift(int64_t difference)
 
 void Plugin::dump(FILE *fp)
 {
-       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d\n",
-               plugin_type, title, on, shared_location.module, shared_location.plugin);
+       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d gui_id=%d\n",
+               plugin_type, title, on, shared_location.module, shared_location.plugin, gui_id);
        fprintf(fp,"    startproject %jd length %jd\n", startproject, length);
 
        keyframes->dump(fp);