X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fsynfigapp%2Finstance.cpp;fp=synfig-studio%2Fsrc%2Fsynfigapp%2Finstance.cpp;h=c3c542bb357394f1449da25e6192c409f063bd8a;hb=a095981e18cc37a8ecc7cd237cc22b9c10329264;hp=0000000000000000000000000000000000000000;hpb=9459638ad6797b8139f1e9f0715c96076dbf0890;p=synfig.git diff --git a/synfig-studio/src/synfigapp/instance.cpp b/synfig-studio/src/synfigapp/instance.cpp new file mode 100644 index 0000000..c3c542b --- /dev/null +++ b/synfig-studio/src/synfigapp/instance.cpp @@ -0,0 +1,186 @@ +/* === S Y N F I G ========================================================= */ +/*! \file synfigapp/instance.cpp +** \brief Instance +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore +** +** This package 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 package 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. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "instance.h" +#include "canvasinterface.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "general.h" + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace synfigapp; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +static std::map, loose_handle > instance_map_; + +/* === P R O C E D U R E S ================================================= */ + +bool +synfigapp::is_editable(synfig::ValueNode::Handle value_node) +{ + if(ValueNode_Const::Handle::cast_dynamic(value_node) + || ValueNode_Animated::Handle::cast_dynamic(value_node) + || ValueNode_Composite::Handle::cast_dynamic(value_node) + || ValueNode_RadialComposite::Handle::cast_dynamic(value_node) + ||(ValueNode_Reference::Handle::cast_dynamic(value_node) && !ValueNode_Greyed::Handle::cast_dynamic(value_node)) + || ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_node) + || ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_node) + || ValueNode_BLineCalcWidth::Handle::cast_dynamic(value_node) + || ValueNode_Scale::Handle::cast_dynamic(value_node) + ) + return true; + return false; +} + +etl::handle +synfigapp::find_instance(etl::handle canvas) +{ + if(instance_map_.count(canvas)==0) + return 0; + return instance_map_[canvas]; +} + +/* === M E T H O D S ======================================================= */ + +Instance::Instance(etl::handle canvas): + CVSInfo(canvas->get_file_name()), + canvas_(canvas) +{ + assert(canvas->is_root()); + + unset_selection_manager(); + + instance_map_[canvas]=this; +} // END of synfigapp::Instance::Instance() + +handle +Instance::create(etl::handle canvas) +{ + // Construct a new instance + handle instance(new Instance(canvas)); + + return instance; +} // END of synfigapp::Instance::create() + +synfig::String +Instance::get_file_name()const +{ + return get_canvas()->get_file_name(); +} + +void +Instance::set_file_name(const synfig::String &name) +{ + get_canvas()->set_file_name(name); + CVSInfo::set_file_name(name); +} + +Instance::~Instance() +{ + instance_map_.erase(canvas_); + + if (getenv("SYNFIG_DEBUG_DESTRUCTORS")) + synfig::info("Instance::~Instance(): Deleted"); +} + +handle +Instance::find_canvas_interface(synfig::Canvas::Handle canvas) +{ + if(!canvas) + return 0; + while(canvas->is_inline()) + canvas=canvas->parent(); + + CanvasInterfaceList::iterator iter; + + for(iter=canvas_interface_list().begin();iter!=canvas_interface_list().end();iter++) + if((*iter)->get_canvas()==canvas) + return *iter; + + return CanvasInterface::create(this,canvas); +} + +bool +Instance::save()const +{ + bool ret=save_canvas(get_file_name(),canvas_); + if(ret) + { + reset_action_count(); + const_cast& >(signal_saved_)(); + } + return ret; +} + +bool +Instance::save_as(const synfig::String &file_name) +{ + bool ret; + + String old_file_name(get_file_name()); + + set_file_name(file_name); + + ret=save_canvas(file_name,canvas_); + + if(ret) + { + reset_action_count(); + signal_saved_(); + } + else + set_file_name(old_file_name); + + signal_filename_changed_(); + + return ret; +}