add new boxblur plugin, mods to videoscope, fix segv for menu btns kfrm-tweak/kfrm...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindow.C
index c959af278e7dd832f0a173c6ba3b8df2fe8b2a50..bd7f556b2cf6aba1db1f59112d390a4b99b6268f 100644 (file)
@@ -2261,27 +2261,7 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
        if(got_indexes) mainindexes->start_build();
 
 // Open plugin GUIs
-       Track *track = edl->tracks->first;
-       while( track ) {
-               for( int j = 0; j < track->plugin_set.size(); j++ ) {
-                       PluginSet *plugins = track->plugin_set[j];
-                       Plugin *plugin = plugins->get_first_plugin();
-
-                       while(plugin) {
-                               if( load_mode == LOADMODE_REPLACE ||
-                                   load_mode == LOADMODE_REPLACE_CONCATENATE ) {
-                                       if( plugin->plugin_type == PLUGIN_STANDALONE &&
-                                           plugin->show ) {
-                                               show_plugin(plugin);
-                                       }
-                               }
-
-                               plugin = (Plugin*)plugin->next;
-                       }
-               }
-
-               track = track->next;
-       }
+       show_plugins();
 
        // opening new session
        if( ( load_mode == LOADMODE_REPLACE ||
@@ -3101,7 +3081,6 @@ void MWindow::set_auto_keyframes(int value)
        gui->mbuttons->edit_panel->keyframe->update(value);
        gui->flush();
        cwindow->gui->lock_window("MWindow::set_auto_keyframes");
-       cwindow->gui->edit_panel->keyframe->update(value);
        cwindow->gui->flush();
        cwindow->gui->unlock_window();
 }
@@ -3112,7 +3091,6 @@ void MWindow::set_span_keyframes(int value)
        gui->mbuttons->edit_panel->span_keyframe->update(value);
        gui->flush();
        cwindow->gui->lock_window("MWindow::set_span_keyframes");
-       cwindow->gui->edit_panel->span_keyframe->update(value);
        cwindow->gui->flush();
        cwindow->gui->unlock_window();
 }
@@ -3258,10 +3236,9 @@ void MWindow::show_keyframe_gui(Plugin *plugin)
 {
        keyframe_gui_lock->lock("MWindow::show_keyframe_gui");
 // Find existing thread
-       for(int i = 0; i < keyframe_threads->size(); i++)
-       {
-               if(keyframe_threads->get(i)->plugin == plugin)
-               {
+       for( int i=0; i<keyframe_threads->size(); ++i ) {
+               int plugin_id = keyframe_threads->get(i)->plugin_id;
+               if( plugin_id == plugin->orig_id ) {
                        keyframe_threads->get(i)->start_window(plugin, 0);
                        keyframe_gui_lock->unlock();
                        return;
@@ -3269,10 +3246,8 @@ void MWindow::show_keyframe_gui(Plugin *plugin)
        }
 
 // Find unused thread
-       for(int i = 0; i < keyframe_threads->size(); i++)
-       {
-               if(!keyframe_threads->get(i)->plugin)
-               {
+       for( int i=0; i<keyframe_threads->size(); ++i ) {
+               if( keyframe_threads->get(i)->plugin_id < 0 ) {
                        keyframe_threads->get(i)->start_window(plugin, 0);
                        keyframe_gui_lock->unlock();
                        return;
@@ -3283,7 +3258,6 @@ void MWindow::show_keyframe_gui(Plugin *plugin)
        KeyFrameThread *thread = new KeyFrameThread(this);
        keyframe_threads->append(thread);
        thread->start_window(plugin, 0);
-
        keyframe_gui_lock->unlock();
 }
 
@@ -3301,14 +3275,12 @@ SET_TRACE
 //printf("MWindow::show_plugin %d\n", __LINE__);
 SET_TRACE
 
-
        plugin_gui_lock->lock("MWindow::show_plugin");
-       for(int i = 0; i < plugin_guis->total; i++)
-       {
-// Pointer comparison
-               if(plugin_guis->get(i)->plugin == plugin)
-               {
-                       plugin_guis->get(i)->raise_window();
+       for( int i=0; i<plugin_guis->total; ++i ) {
+// Pointer/id comparison
+               PluginServer *plugin_gui = plugin_guis->get(i);
+               if( plugin_gui->plugin_id == plugin->orig_id ) {
+                       plugin_gui->raise_window();
                        done = 1;
                        break;
                }
@@ -3348,23 +3320,26 @@ SET_TRACE
 void MWindow::hide_plugin(Plugin *plugin, int lock)
 {
        plugin->show = 0;
+       return hide_plugin(plugin->orig_id, lock);
+}
+
+void MWindow::hide_plugin(int plugin_id, int lock)
+{
 // Update the toggle
        gui->lock_window("MWindow::hide_plugin");
        gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
        gui->unlock_window();
 
        if(lock) plugin_gui_lock->lock("MWindow::hide_plugin");
-       for(int i = 0; i < plugin_guis->total; i++)
-       {
-               if(plugin_guis->get(i)->plugin == plugin)
-               {
-                       PluginServer *ptr = plugin_guis->get(i);
-                       plugin_guis->remove(ptr);
+       for( int i=0; i<plugin_guis->total; ++i ) {
+               PluginServer *plugin_gui = plugin_guis->get(i);
+               if( plugin_gui->plugin_id == plugin_id ) {
+                       plugin_guis->remove(plugin_gui);
                        if(lock) plugin_gui_lock->unlock();
 // Last command executed in client side close
 // Schedule for deletion
-                       ptr->hide_gui();
-                       delete_plugin(ptr);
+                       plugin_gui->hide_gui();
+                       delete_plugin(plugin_gui);
 //sleep(1);
                        return;
                }
@@ -3413,11 +3388,10 @@ void MWindow::hide_keyframe_guis()
 void MWindow::hide_keyframe_gui(Plugin *plugin)
 {
        keyframe_gui_lock->lock("MWindow::hide_keyframe_gui");
-       for(int i = 0; i < keyframe_threads->size(); i++)
-       {
-               if(keyframe_threads->get(i)->plugin == plugin)
-               {
-                       keyframe_threads->get(i)->close_window();
+       for( int i = 0; i < keyframe_threads->size(); i++) {
+               KeyFrameThread *keyframe_gui = keyframe_threads->get(i);
+               if( keyframe_gui->plugin_id == plugin->orig_id ) {
+                       keyframe_gui->close_window();
                        break;
                }
        }
@@ -3491,15 +3465,13 @@ void MWindow::update_keyframe_guis()
 {
 // Send new configuration to keyframe GUI's
        keyframe_gui_lock->lock("MWindow::update_keyframe_guis");
-       for(int i = 0; i < keyframe_threads->size(); i++)
-       {
-               KeyFrameThread *ptr = keyframe_threads->get(i);
-               if(edl->tracks->plugin_exists(ptr->plugin))
-                       ptr->update_gui(1);
+       for( int i=0; i<keyframe_threads->size(); ++i ) {
+               KeyFrameThread *keyframe_gui = keyframe_threads->get(i);
+               Plugin *plugin = edl->tracks->plugin_exists(keyframe_gui->plugin_id);
+               if( plugin )
+                       keyframe_gui->update_gui(1);
                else
-               {
-                       ptr->close_window();
-               }
+                       keyframe_gui->close_window();
        }
        keyframe_gui_lock->unlock();
 }
@@ -3509,55 +3481,42 @@ void MWindow::update_plugin_guis(int do_keyframe_guis)
 // Send new configuration to plugin GUI's
        plugin_gui_lock->lock("MWindow::update_plugin_guis");
 
-       for(int i = 0; i < plugin_guis->size(); i++)
-       {
-               PluginServer *ptr = plugin_guis->get(i);
-               if(edl->tracks->plugin_exists(ptr->plugin))
-                       ptr->update_gui();
-               else
-               {
-// Schedule for deletion if no plugin
-                       plugin_guis->remove_number(i);
-                       i--;
-
-                       ptr->hide_gui();
-                       delete_plugin(ptr);
+       for( int i=0; i<plugin_guis->size(); ++i ) {
+               PluginServer *plugin_gui = plugin_guis->get(i);
+               Plugin *plugin = edl->tracks->plugin_exists(plugin_gui->plugin_id);
+               if( plugin && plugin->show )
+                       plugin_gui->update_gui();
+               else {
+// Schedule for deletion if no plugin or not shown
+                       plugin_guis->remove_number(i--);
+                       plugin_gui->hide_gui();
+                       delete_plugin(plugin_gui);
                }
        }
 
 
 // Change plugin variable if not visible
        Track *track = edl->tracks->first;
-       while(track)
-       {
-               for(int i = 0; i < track->plugin_set.size(); i++)
-               {
+       for( ; track; track=track->next ) {
+               for( int i=0; i < track->plugin_set.size(); ++i ) {
                        Plugin *plugin = (Plugin*)track->plugin_set[i]->first;
-                       while(plugin)
-                       {
+                       for( ; plugin; plugin = (Plugin*)plugin->next ) {
                                int got_it = 0;
-                               for(int i = 0; i < plugin_guis->size(); i++)
-                               {
+                               for( int i=0; i<plugin_guis->size(); ++i ) {
                                        PluginServer *server = plugin_guis->get(i);
-                                       if(server->plugin == plugin)
-                                       {
+                                       if( server->plugin_id == plugin->orig_id ) {
                                                got_it = 1;
                                                break;
                                        }
                                }
-
-                               if(!got_it) plugin->show = 0;
-                               plugin = (Plugin*)plugin->next;
+                               if( !got_it ) plugin->show = 0;
                        }
                }
-
-               track = track->next;
        }
 
        plugin_gui_lock->unlock();
-
-
-       if(do_keyframe_guis) update_keyframe_guis();
+       if( do_keyframe_guis )
+               update_keyframe_guis();
 }
 
 void MWindow::stop_plugin_guis()
@@ -3566,10 +3525,8 @@ void MWindow::stop_plugin_guis()
        plugin_gui_lock->lock("MWindow::stop_plugin_guis");
 
        for( int i=0; i<plugin_guis->size(); ++i ) {
-               PluginServer *ptr = plugin_guis->get(i);
-               if( edl->tracks->plugin_exists(ptr->plugin) ) {
-                       ptr->render_stop();
-               }
+               PluginServer *plugin_gui = plugin_guis->get(i);
+               plugin_gui->render_stop();
        }
        plugin_gui_lock->unlock(); 
 }
@@ -3643,39 +3600,15 @@ int MWindow::get_tracking_direction()
 void MWindow::update_plugin_states()
 {
        plugin_gui_lock->lock("MWindow::update_plugin_states");
-       for(int i = 0; i < plugin_guis->total; i++)
-       {
-               int result = 0;
+       for( int i=0; i<plugin_guis->total; ++i ) {
 // Get a plugin GUI
-               Plugin *src_plugin = plugin_guis->get(i)->plugin;
                PluginServer *src_plugingui = plugin_guis->get(i);
-
-// Search for plugin in EDL.  Only the master EDL shows plugin GUIs.
-               for(Track *track = edl->tracks->first;
-                       track && !result;
-                       track = track->next)
-               {
-                       for(int j = 0;
-                               j < track->plugin_set.total && !result;
-                               j++)
-                       {
-                               PluginSet *plugin_set = track->plugin_set[j];
-                               for(Plugin *plugin = (Plugin*)plugin_set->first;
-                                       plugin && !result;
-                                       plugin = (Plugin*)plugin->next)
-                               {
-                                       if(plugin == src_plugin &&
-                                               !strcmp(plugin->title, src_plugingui->title)) result = 1;
-                               }
-                       }
-               }
-
-
+               int plugin_id = src_plugingui->plugin_id;
+               Plugin *src_plugin = edl->tracks->plugin_exists(plugin_id);
 // Doesn't exist anymore
-               if(!result)
-               {
-                       hide_plugin(src_plugin, 0);
-                       i--;
+               if( !src_plugin ) {
+                       hide_plugin(plugin_id, 0);
+                       --i;
                }
        }
        plugin_gui_lock->unlock();
@@ -3684,10 +3617,8 @@ void MWindow::update_plugin_states()
 
 void MWindow::update_plugin_titles()
 {
-       for(int i = 0; i < plugin_guis->total; i++)
-       {
+       for( int i=0; i<plugin_guis->total; ++i )
                plugin_guis->get(i)->update_title();
-       }
 }
 
 int MWindow::asset_to_edl(EDL *new_edl,
@@ -3870,6 +3801,7 @@ void MWindow::stack_push(EDL *new_edl, Indexable *idxbl)
        gui->lock_window("MWindow::stack_push");
        if( stack.size() < 9 ) {
                save_backup();
+               hide_plugins();
                undo_before();
                StackItem &item = stack.append();
                item.edl = edl;
@@ -3892,6 +3824,7 @@ void MWindow::stack_push(EDL *new_edl, Indexable *idxbl)
                update_project(LOADMODE_REPLACE);
        }
        gui->unlock_window();
+       show_plugins();
 }
 
 void MWindow::stack_pop()
@@ -3899,6 +3832,7 @@ void MWindow::stack_pop()
        if( !stack.size() ) return;
 // writes on config_path/backup%d.xml
        save_backup();
+       hide_plugins();
 // already have gui lock
        StackItem &item = stack.last();
 // session edl replaced, overwrite and save clip data
@@ -3923,6 +3857,7 @@ void MWindow::stack_pop()
        strcpy(session->filename, edl->path);
        update_project(LOADMODE_REPLACE);
        undo_after(_("open edl"), LOAD_ALL);
+       show_plugins();
        gui->stack_button->update();
        if( mtime && idxbl && idxbl->is_asset ) {
                struct stat st;
@@ -3937,6 +3872,77 @@ void MWindow::stack_pop()
        }
 }
 
+int MWindow::save(EDL *edl, char *filename, int stat)
+{
+       FileXML file;
+       edl->save_xml(&file, filename);
+       file.terminate_string();
+       if( file.write_to_file(filename) ) {
+               eprintf(_("Couldn't open %s"), filename);
+               return 1;
+       }
+       if( stat ) {
+               char string[BCTEXTLEN];
+               char *filename = stack.size() ?
+                       stack[0].edl->path : session->filename;
+               sprintf(string, _("\"%s\" %jdC written"),
+                        filename, file.length());
+               gui->lock_window("SaveAs::run");
+               gui->show_message(string);
+               gui->unlock_window();
+       }
+       return 0;
+}
+
+int MWindow::save(int save_as)
+{
+       char new_path[BCTEXTLEN];  new_path[0] = 0;
+       char *path = stack.size() ? stack[0].edl->path : session->filename;
+       if( save_as || !path[0] ) {
+               if( ConfirmSave::get_save_path(this, new_path) )
+                       return 1;
+               if( stack.size() ) {
+                       strcpy(path, new_path);
+                       set_titlebar(new_path);
+               }
+               else
+                       set_filename(new_path);
+               gui->mainmenu->add_load(new_path);
+               path = new_path;
+       }
+       for( int i=stack.size(); --i>=0;  ) {
+               StackItem &item = stack[i];
+               Indexable *idxbl = item.idxbl;
+               if( idxbl->is_asset ) {
+                       Asset *asset = (Asset *)idxbl;
+                       if( asset->format == FILE_REF ) {
+                               if( save(item.new_edl, asset->path, 0) )
+                                       return 1;
+                       }
+               }
+               else if( item.new_edl != item.idxbl )
+                       item.new_edl->overwrite_clip((EDL*)item.idxbl);
+       }
+       EDL *new_edl = stack.size() ? stack[0].edl : edl;
+       save(new_edl, path, 1);
+       return 0;
+}
+
+void MWindow::show_plugins()
+{
+       for( Track *track=edl->tracks->first; track; track=track->next ) {
+               for( int i=0; i<track->plugin_set.size(); ++i ) {
+                       PluginSet *plugins = track->plugin_set[i];
+                       Plugin *plugin = plugins->get_first_plugin();
+                       for( ; plugin; plugin=(Plugin*)plugin->next ) {
+                               if( plugin->plugin_type == PLUGIN_STANDALONE &&
+                                   plugin->show )
+                                       show_plugin(plugin);
+                       }
+               }
+       }
+}
+
 void MWindow::clip_to_media()
 {
        if( edl->session->proxy_scale != 1 ) {
@@ -4771,32 +4777,25 @@ int MWindow::set_filename(const char *filename)
                strcpy(session->filename, filename);
        if( filename != edl->path )
                strcpy(edl->path, filename);
+       return set_titlebar(filename);
+}
 
-       if(gui)
-       {
-               if(filename[0] == 0)
-               {
-                       gui->set_title(PROGRAM_NAME);
-               }
-               else
-               {
-                       FileSystem dir;
-                       char string[BCTEXTLEN], string2[BCTEXTLEN];
-                       dir.extract_name(string, filename);
-                       sprintf(string2, PROGRAM_NAME ": %s", string);
-                       gui->set_title(string2);
-               }
+int MWindow::set_titlebar(const char *filename)
+{
+       if( !gui ) return 0;
+       if( filename[0] ) {
+               FileSystem dir;
+               char string[BCTEXTLEN], string2[BCTEXTLEN];
+               dir.extract_name(string, filename);
+               sprintf(string2, PROGRAM_NAME ": %s", string);
+               gui->set_title(string2);
        }
+       else
+               gui->set_title(PROGRAM_NAME);
        return 0;
 }
 
 
-
-
-
-
-
-
 int MWindow::set_loop_boundaries()
 {
        double start = edl->local_session->get_selectionstart();
@@ -5084,3 +5083,13 @@ PatchGUI *MWindow::get_patchgui(Track *track)
         return patchgui;
 }
 
+int MWindow::get_cpus()
+{
+       int out_w = edl->session->output_w;
+       int out_h = edl->session->output_h;
+       int cpus = out_w*out_h/0x80000 + 1;
+       if( cpus > preferences->processors )
+               cpus = preferences->processors;
+       return cpus;
+}
+