X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fsynfigapp%2Fcanvasinterface.h;fp=synfig-studio%2Fsrc%2Fsynfigapp%2Fcanvasinterface.h;h=5bb3ec0e3124250bad6892fb0eb9ef0d733bc7c9;hb=a095981e18cc37a8ecc7cd237cc22b9c10329264;hp=0000000000000000000000000000000000000000;hpb=9459638ad6797b8139f1e9f0715c96076dbf0890;p=synfig.git diff --git a/synfig-studio/src/synfigapp/canvasinterface.h b/synfig-studio/src/synfigapp/canvasinterface.h new file mode 100644 index 0000000..5bb3ec0 --- /dev/null +++ b/synfig-studio/src/synfigapp/canvasinterface.h @@ -0,0 +1,313 @@ +/* === S Y N F I G ========================================================= */ +/*! \file canvasinterface.h +** \brief Template Header +** +** $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 +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_APP_CANVASINTERFACE_H +#define __SYNFIG_APP_CANVASINTERFACE_H + +/* === H E A D E R S ======================================================= */ + +//#include +#include +#include +#include +#include +#include "selectionmanager.h" +#include "uimanager.h" +#include "value_desc.h" +#include "editmode.h" + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace synfig { class ValueNode_DynamicList; class Waypoint; class GUIDSet; class Canvas; }; + +namespace synfigapp { + +namespace Action { class ParamList; class Param; class EditModeSet; }; + +class Instance; +class ValueDesc; + +class CanvasInterface : public etl::shared_object, public sigc::trackable +{ + friend class Instance; + friend class Action::EditModeSet; + +public: + + typedef EditMode Mode; + +private: + // Constructor is private to force the use of the "create()" constructor. + CanvasInterface(etl::loose_handle instance,etl::handle canvas); + +private: + etl::loose_handle instance_; + etl::handle canvas_; + etl::handle selection_manager_; + etl::handle ui_interface_; + synfig::Time cur_time_; + Mode mode_; + + sigc::signal signal_layer_raised_; + sigc::signal signal_layer_lowered_; + sigc::signal signal_layer_inserted_; + sigc::signal signal_layer_moved_; + sigc::signal signal_layer_removed_; + sigc::signal signal_layer_status_changed_; + sigc::signal signal_layer_new_description_; + sigc::signal signal_canvas_added_; + sigc::signal signal_canvas_removed_; + + sigc::signal signal_value_node_added_; + sigc::signal signal_value_node_deleted_; + sigc::signal signal_value_node_replaced_; + + sigc::signal signal_keyframe_added_; + sigc::signal signal_keyframe_removed_; + sigc::signal signal_keyframe_changed_; + + sigc::signal signal_id_changed_; + + sigc::signal signal_time_changed_; + + sigc::signal signal_rend_desc_changed_; + + sigc::signal signal_mode_changed_; + + //sigc::signal signal_dirty_preview_; + + sigc::signal signal_layer_param_changed_; + +public: // Signal Interface + + sigc::signal& signal_layer_moved() { return signal_layer_moved_; } + + sigc::signal& signal_layer_new_description() { return signal_layer_new_description_; } + + //! Signal called when layer is raised. + sigc::signal& signal_layer_raised() { return signal_layer_raised_; } + + //! Signal called when layer is lowered. + sigc::signal& signal_layer_lowered() { return signal_layer_lowered_; } + + //! Signal called when layer has been inserted at a given position. + sigc::signal& signal_layer_inserted() { return signal_layer_inserted_; } + + //! Signal called when a layer has been removed from the canvas. + sigc::signal& signal_layer_removed() { return signal_layer_removed_; } + + //! Signal called when the layer's active status has changed. + sigc::signal& signal_layer_status_changed() { return signal_layer_status_changed_; } + + //! Signal called when a canvas has been added. + sigc::signal >& signal_canvas_added() { return signal_canvas_added_; } + + //! Signal called when a canvas has been removed. + sigc::signal >& signal_canvas_removed() { return signal_canvas_removed_; } + + //! Signal called when a layer's parameter has been changed + sigc::signal& signal_layer_param_changed() { return signal_layer_param_changed_; } + + //! Signal called when the canvas's preview needs to be updated + //sigc::signal& signal_dirty_preview() { return signal_dirty_preview_; } + sigc::signal& signal_dirty_preview() { return get_canvas()->signal_dirty(); } + + sigc::signal,etl::handle >& + signal_value_node_child_added() { return get_canvas()->signal_value_node_child_added(); } + sigc::signal,etl::handle >& + signal_value_node_child_removed() { return get_canvas()->signal_value_node_child_removed(); } + + //! Signal called when a ValueNode has changed + sigc::signal >& signal_value_node_added() { return signal_value_node_added_; } + + //! Signal called when a ValueNode has been deleted + sigc::signal >& signal_value_node_deleted() { return signal_value_node_deleted_; } + + //! Signal called when a ValueNode has been changed + sigc::signal >& signal_value_node_changed() { return get_canvas()->signal_value_node_changed(); } + + //! Signal called when a ValueNode has been renamed + sigc::signal >& signal_value_node_renamed() { return get_canvas()->signal_value_node_renamed(); } + + //! Signal called when the mode has changed + sigc::signal signal_mode_changed() { return signal_mode_changed_; } + + //! Signal called when a the ID has been changed + sigc::signal& signal_id_changed() { return signal_id_changed_; } + + //! Signal called whenever the time changes + sigc::signal signal_time_changed() { return signal_time_changed_; } + + //! Signal called whenever a data node has been replaced. + /*! Second ValueNode replaces first */ + sigc::signal& signal_value_node_replaced() + { return signal_value_node_replaced_; } + + //! Signal called whenever the RendDesc changes + sigc::signal& signal_rend_desc_changed() { return signal_rend_desc_changed_; } + + sigc::signal& signal_keyframe_added() { return signal_keyframe_added_; } + + sigc::signal& signal_keyframe_removed() { return signal_keyframe_removed_; } + + sigc::signal& signal_keyframe_changed() { return signal_keyframe_changed_; } + +public: + + void auto_export(const ValueDesc& value_desc); + + void auto_export(synfig::ValueNode::Handle value_node); + + void set_meta_data(const synfig::String& key,const synfig::String& data); + + //! Changes the current SelectionManager object + void set_selection_manager(const etl::handle &sm) { selection_manager_=sm; } + + //! Disables the selection manager + void unset_selection_manager() { selection_manager_=new NullSelectionManager(); } + + //! Returns a handle to the current SelectionManager + const etl::handle &get_selection_manager()const { return selection_manager_; } + + //! Changes the current UIInterface object + void set_ui_interface(const etl::handle &uim) { ui_interface_=uim; } + + //! Disables the UIInterface + void unset_ui_interface() { ui_interface_=new DefaultUIInterface(); } + + //! Returns a handle to the current UIInterface + const etl::handle &get_ui_interface() { return ui_interface_; } + + //! Returns the Canvas associated with this interface + etl::handle get_canvas()const { return canvas_; } + + //! Returns the Instance associated with this interface + etl::loose_handle get_instance()const { return instance_; } + + //! Changes the name of the canvas. Undoable. + void set_name(const synfig::String &x); + + //! Changes the description of the canvas. Undoable. + void set_description(const synfig::String &x); + + //! Changes the ID of the canvas. Undoable. + void set_id(const synfig::String &x); + + //! Convenience function to retrieve the name of the canvas + synfig::String get_name()const { return get_canvas()->get_name(); } + + //! Convenience function to retrieve the description of the canvas + synfig::String get_description()const { return get_canvas()->get_description(); } + + //! Convenience function to retrieve the ID of the canvas + synfig::String get_id()const { return get_canvas()->get_id(); } + + //! Sets the current time + void set_time(synfig::Time x); + + //! Retrieves the current time + synfig::Time get_time()const; + + //! Changes the current time to the next keyframe + void jump_to_next_keyframe(); + + //! Changes the current time to the next keyframe + void jump_to_prev_keyframe(); + + void seek_frame(int frames); + + void seek_time(synfig::Time time); + + //! \writeme + void refresh_current_values(); + + //! Sets the current editing mode + /*! \see Mode */ + void set_mode(Mode x); + + //! Retrieves the current editing mode + /*! \see Mode */ + Mode get_mode()const; + + //! Creates a new layer, of type \c id at the top of the layer stack + // synfig::Layer::Handle add_layer(synfig::String id) { return add_layer_to(id,get_canvas()); } + + synfig::Layer::Handle add_layer_to(synfig::String id,synfig::Canvas::Handle canvas, int depth=0); + + bool convert(ValueDesc value_desc, synfig::String type); + //! Adds the given ValueNode to the canvas. + bool add_value_node(synfig::ValueNode::Handle value_node, synfig::String name); + + + Action::ParamList generate_param_list(const synfigapp::ValueDesc &); + + Action::ParamList generate_param_list(const std::list &); + + void set_rend_desc(const synfig::RendDesc &rend_desc); + + bool import(const synfig::String &filename, synfig::String &errors, synfig::String &warnings, bool resize_image=false); + + + void waypoint_duplicate(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint); + void waypoint_duplicate(synfig::ValueNode::Handle value_node,synfig::Waypoint waypoint); + + void waypoint_remove(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint); + void waypoint_remove(synfig::ValueNode::Handle value_node,synfig::Waypoint waypoint); + + bool change_value(synfigapp::ValueDesc value_desc,synfig::ValueBase new_value); + + + int find_important_value_descs(std::vector& out); + static int find_important_value_descs(synfig::Canvas::Handle canvas,std::vector& out,synfig::GUIDSet& guid_set); + + ~CanvasInterface(); + + static etl::handle create(etl::loose_handle instance,etl::handle canvas); +}; // END of class CanvasInterface + +/*! \class PushMode +** \brief Class that changes the mode of a CanvasInterface, and restores it on destruction. +*/ +class PushMode +{ + CanvasInterface* canvas_interface_; + CanvasInterface::Mode old_mode_; +public: + PushMode(etl::loose_handle c, CanvasInterface::Mode mode): + canvas_interface_(c.get()), old_mode_(canvas_interface_->get_mode()) + { canvas_interface_->set_mode(mode); } + + ~PushMode() { canvas_interface_->set_mode(old_mode_); } +}; // END of class PushMode + +}; // END of namespace studio + +/* === E N D =============================================================== */ + +#endif