X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fpresets.C;fp=cinelerra-5.1%2Fcinelerra%2Fpresets.C;h=8a2890902a6b9e419965b0432883ca4bfc22a67f;hb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;hp=0000000000000000000000000000000000000000;hpb=4fedf98530b3a6ff1ada6d2b9fbbc470e3df300c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/presets.C b/cinelerra-5.1/cinelerra/presets.C new file mode 100644 index 00000000..8a289090 --- /dev/null +++ b/cinelerra-5.1/cinelerra/presets.C @@ -0,0 +1,438 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bcsignals.h" +#include "bcwindowbase.inc" +#include "file.h" +#include "filesystem.h" +#include "filexml.h" +#include "keyframe.h" +#include "messages.inc" +#include "mwindow.h" +#include "pluginserver.h" +#include "preferences.inc" +#include "presets.h" + +#include +#include + +PresetsDB::PresetsDB() +{ +} + +void PresetsDB::clear() +{ + plugins.remove_all_objects(); +} + +void PresetsDB::load_from_file(char *path, int is_factory, int clear_it) +{ + if( clear_it ) clear(); + FileXML file; + + file.read_from_file(path); + load_common(&file, is_factory); +} + +void PresetsDB::load_from_string(char *string, int is_factory, int clear_it) +{ + if( clear_it ) clear(); + + FileXML file; + file.read_from_string(string); + load_common(&file, is_factory); +} + + + +void PresetsDB::load_common(FileXML *file, int is_factory) +{ + int result = 0; + char string[BCTEXTLEN]; + + do { + result = file->read_tag(); + if( ! result ) { + if( file->tag.title_is("PLUGIN") ) { + PresetsDBPlugin *plugin = 0; + sprintf(string, "Unknown"); + const char *title = file->tag.get_property("TITLE", string); + +// Search for existing plugin + for( int i=0; ititle, title) ) { + plugin = plugins[i]; + break; + } + } + +// Create new plugin + if( !plugin ) { + plugin = new PresetsDBPlugin(title); + plugins.append(plugin); + } + + plugin->load(file, is_factory); + } + } + } while(!result); +} + + +void PresetsDB::save() +{ + FileXML file; + for( int i=0; iget_total_presets(1) > 0 ) { + plugin->save(&file); + } + } + file.terminate_string(); + + char path[BCTEXTLEN]; + sprintf(path, "%s/%s", File::get_config_path(), PRESETS_FILE); + FileSystem fs; + fs.complete_path(path); + file.write_to_file(path); +} + + +int PresetsDB::get_total_presets(char *plugin_title, int user_only) +{ + for( int i=0; ititle, plugin_title) ) { + return plugin->get_total_presets(user_only); + } + } + + return 0; +} + + +// move factory presets to the start, followed by sorted preset titles +void PresetsDB::sort(char *plugin_title) +{ + PresetsDBPlugin *plugin = 0; + for( int i=0; !plugin && ititle, plugin_title) ) + plugin = plugins[i]; + } + + if( plugin ) { + int done = 0; + int total_presets = plugin->get_total_presets(0); + while( !done ) { + done = 1; + for( int i=0; ikeyframes[i]; + PresetsDBKeyframe *keyframe2 = plugin->keyframes[i+1]; + + if( (keyframe2->is_factory && !keyframe1->is_factory) || + (keyframe2->is_factory == keyframe1->is_factory && + strcmp(keyframe2->title, keyframe1->title) < 0) ) { + plugin->keyframes.set(i, keyframe2); + plugin->keyframes.set(i + 1, keyframe1); + done = 0; + } + } + } + } +} + + +char* PresetsDB::get_preset_title(char *plugin_title, int number) +{ + for( int i=0; ititle, plugin_title) ) { + if( number < plugin->keyframes.size() ) + return plugin->keyframes[number]->title; + printf("PresetsDB::get_preset_title %d buffer overrun\n", __LINE__); + break; + } + } + return 0; +} + + +int PresetsDB::get_is_factory(char *plugin_title, int number) +{ + for( int i=0; ititle, plugin_title) ) { + if( number < plugin->keyframes.size() ) + return plugin->keyframes[number]->is_factory; + printf("PresetsDB::get_preset_title %d buffer overrun\n", __LINE__); + break; + } + } + return 0; +} + + +char* PresetsDB::get_preset_data(char *plugin_title, int number) +{ + for( int i=0; ititle, plugin_title) ) { + if( number < plugin->keyframes.size() ) + return plugin->keyframes[number]->data; + printf("PresetsDB::get_preset_data %d buffer overrun\n", __LINE__); + break; + } + } + return 0; +} + +PresetsDBPlugin* PresetsDB::get_plugin(const char *plugin_title) +{ + for( int i=0; ititle, plugin_title) ) + return plugin; + } + return 0; +} + +PresetsDBPlugin* PresetsDB::new_plugin(const char *plugin_title) +{ + PresetsDBPlugin *result = new PresetsDBPlugin(plugin_title); + plugins.append(result); + return result; +} + + +void PresetsDB::save_preset(const char *plugin_title, + const char *preset_title, + char *data) +{ + PresetsDBPlugin *plugin = get_plugin(plugin_title); + if( !plugin ) plugin = new_plugin(plugin_title); + PresetsDBKeyframe *keyframe = plugin->get_keyframe(preset_title, 0); + if( !keyframe ) keyframe = plugin->new_keyframe(preset_title); + keyframe->set_data(data); + save(); + +} + + +void PresetsDB::delete_preset(const char *plugin_title, + const char *preset_title, + int is_factory) +{ + PresetsDBPlugin *plugin = get_plugin(plugin_title); + if( plugin ) { + plugin->delete_keyframe(preset_title); + } + save(); +} + +void PresetsDB::load_preset(const char *plugin_title, + const char *preset_title, + KeyFrame *keyframe, + int is_factory) +{ + PresetsDBPlugin *plugin = get_plugin(plugin_title); + if( plugin ) { + plugin->load_preset(preset_title, keyframe, is_factory); + } +} + +int PresetsDB::preset_exists(const char *plugin_title, + const char *preset_title, + int is_factory) +{ + PresetsDBPlugin *plugin = get_plugin(plugin_title); + if( plugin ) { + return plugin->preset_exists(preset_title, is_factory); + } + return 0; +} + + + + +PresetsDBKeyframe::PresetsDBKeyframe(const char *title, int is_factory) +{ + this->title = strdup(title); + data = 0; + this->is_factory = is_factory; +} + +PresetsDBKeyframe::~PresetsDBKeyframe() +{ + delete [] title; + delete [] data; +} + +void PresetsDBKeyframe::set_data(char *data) +{ + delete [] this->data; + this->data = new char[strlen(data) + 1]; + strcpy(this->data, data); +} + + +PresetsDBPlugin::PresetsDBPlugin(const char *title) +{ + this->title = strdup(title); +} + +PresetsDBPlugin::~PresetsDBPlugin() +{ + keyframes.remove_all_objects(); + delete [] title; +} + +int PresetsDBPlugin::get_total_presets(int user_only) +{ + if( !user_only ) + return keyframes.size(); + int result = 0; + for( int j=0; jis_factory ) ++result; + return result; +} + +void PresetsDBPlugin::load(FileXML *file, int is_factory) +{ + int result = 0; + char string[BCTEXTLEN]; + + do { + result = file->read_tag(); + if( !result ) { + if( file->tag.title_is("/PLUGIN") ) break; + else + if( file->tag.title_is("KEYFRAME") ) { + sprintf(string, "Unknown"); + const char *keyframe_title = file->tag.get_property("TITLE", string); + PresetsDBKeyframe *keyframe = new PresetsDBKeyframe(keyframe_title, is_factory); + + char data[MESSAGESIZE]; + file->read_text_until("/KEYFRAME", data, MESSAGESIZE); + keyframe->set_data(data); + keyframes.append(keyframe); + + } + } + } while(!result); +} + +void PresetsDBPlugin::save(FileXML *file) +{ + file->tag.set_title("PLUGIN"); + file->tag.set_property("TITLE", title); + file->append_tag(); + file->append_newline(); + + for( int j=0; jis_factory ) { + file->tag.set_title("KEYFRAME"); + file->tag.set_property("TITLE", keyframe->title); + file->append_tag(); + file->append_text(keyframe->data); + file->tag.set_title("/KEYFRAME"); + file->append_tag(); + file->append_newline(); + } + } + + file->tag.set_title("/PLUGIN"); + file->append_tag(); + file->append_newline(); +} + +PresetsDBKeyframe* PresetsDBPlugin::get_keyframe(const char *title, + int is_factory) +{ + for( int i=0; ititle, title) && + keyframe->is_factory == is_factory ) + return keyframe; + } + return 0; +} + +void PresetsDBPlugin::delete_keyframe(const char *title) +{ + for( int i=0; ititle, title) && !keyframe->is_factory ) + keyframes.remove_object_number(i); + return; + } +} + + +PresetsDBKeyframe* PresetsDBPlugin::new_keyframe(const char *title) +{ + PresetsDBKeyframe *keyframe = new PresetsDBKeyframe(title, 0); + keyframes.append(keyframe); + return keyframe; +} + +void PresetsDBPlugin::load_preset(const char *preset_title, + KeyFrame *keyframe, + int is_factory) +{ + PresetsDBKeyframe *src = get_keyframe(preset_title, is_factory); + if( src ) { + keyframe->set_data(src->data); +// Save as the plugin's default, Need the path +//printf("PresetsDBPlugin::load_preset %d %s\n", __LINE__, title); + PluginServer *server = MWindow::scan_plugindb(title, -1); + if( server ) { + char path[BCTEXTLEN]; + server->get_defaults_path(path); + FileSystem fs; + fs.complete_path(path); + + FILE *fd = fopen(path, "w"); + if( fd ) { + if( !fwrite(src->data, strlen(src->data), 1, fd) ) { + fprintf(stderr, "PresetsDBPlugin::load_preset %d \"%s\": %s\n", + __LINE__, + path, + strerror(errno)); + } + + fclose(fd); + } + else { + fprintf(stderr, "PresetsDBPlugin::load_preset %d \"%s\": %s\n", + __LINE__, path, strerror(errno)); + } + } + } +} + +int PresetsDBPlugin::preset_exists(const char *preset_title, int is_factory) +{ + PresetsDBKeyframe *src = get_keyframe(preset_title, is_factory); + return src ? 1 : 0; +} +