/* === S Y N F I G ========================================================= */ /*! \file synfigapp/instance.cpp ** \brief Instance ** ** $Id: instance.cpp 336 2007-03-16 00:39:42Z dooglus $ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** ** 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 #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_TimedSwap::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) ) 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(Canvas::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(Canvas::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_); synfig::info("studio::Instance::~Instance(): Deleted"); } // END of studio::Instance::~Instance() handle Instance::find_canvas_interface(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 std::string &file_name)const { bool ret=save_canvas(file_name,canvas_); if(ret) { reset_action_count(); const_cast& >(signal_saved_)(); } return ret; } bool Instance::save_as(const std::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; }