Remove ancient trunk folder from svn repository
[synfig.git] / synfig-studio / src / synfigapp / main.cpp
diff --git a/synfig-studio/src/synfigapp/main.cpp b/synfig-studio/src/synfigapp/main.cpp
new file mode 100644 (file)
index 0000000..1e396e4
--- /dev/null
@@ -0,0 +1,411 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file synfigapp/main.cpp
+**     \brief Template File
+**
+**     $Id$
+**
+**     \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 <config.h>
+#endif
+
+#include "main.h"
+#include "action.h"
+
+#include <synfig/color.h>
+#include <synfig/gradient.h>
+
+#include <ETL/trivial>
+
+#include <list>
+
+#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 ========================================================= */
+
+/* === S T A T I C S ======================================================= */
+
+static etl::reference_counter synfigapp_ref_count_(0);
+static synfigapp::Action::Main* action_main;
+
+static Color outline_;
+static Color fill_;
+static Gradient gradient_;
+static bool gradient_default_colors_;
+
+static synfig::Distance bline_width_;
+
+static Color::BlendMethod blend_method_;
+static Real opacity_;
+
+static synfigapp::InputDevice::Handle selected_input_device_;
+static list<synfigapp::InputDevice::Handle> input_devices_;
+
+trivial<sigc::signal<void> > signal_outline_color_changed_;
+trivial<sigc::signal<void> > signal_fill_color_changed_;
+trivial<sigc::signal<void> > signal_gradient_changed_;
+trivial<sigc::signal<void> > signal_bline_width_changed_;
+trivial<sigc::signal<void> > signal_blend_method_changed_;
+trivial<sigc::signal<void> > signal_opacity_changed_;
+trivial<sigc::signal<void> > signal_interpolation_changed_;
+
+trivial<Settings> settings_;
+
+static synfig::Waypoint::Interpolation interpolation_;
+
+/* === P R O C E D U R E S ================================================= */
+
+/* === M E T H O D S ======================================================= */
+
+synfigapp::Main::Main(const synfig::String &basepath, synfig::ProgressCallback *cb):
+       synfig::Main(basepath,cb),
+       ref_count_(synfigapp_ref_count_)
+{
+       if(ref_count_.count())
+               return;
+
+       synfigapp_ref_count_.reset();
+       ref_count_=synfigapp_ref_count_;
+
+       // Add initialization after this point
+
+#ifdef ENABLE_NLS
+       bindtextdomain("synfigstudio", LOCALEDIR);
+       bind_textdomain_codeset("synfigstudio", "UTF-8");
+#endif
+
+       action_main=new synfigapp::Action::Main();
+
+       settings_.construct();
+
+       signal_outline_color_changed_.construct();
+       signal_fill_color_changed_.construct();
+       signal_gradient_changed_.construct();
+       signal_opacity_changed_.construct();
+       signal_blend_method_changed_.construct();
+       signal_interpolation_changed_.construct();
+
+       set_outline_color(Color::black());
+       set_fill_color(Color::white());
+       set_gradient_default_colors();
+       set_bline_width(Distance(1,Distance::SYSTEM_POINTS));
+       set_opacity(1.0);
+       set_blend_method(Color::BLEND_COMPOSITE);
+}
+
+synfigapp::Main::~Main()
+{
+       ref_count_.detach();
+       if(!synfigapp_ref_count_.unique())
+               return;
+       synfigapp_ref_count_.detach();
+
+       // Add deinitialization after this point
+
+       delete action_main;
+
+       selected_input_device_=0;
+       input_devices_.clear();
+
+       settings_.destruct();
+       signal_outline_color_changed_.destruct();
+       signal_fill_color_changed_.destruct();
+       signal_gradient_changed_.destruct();
+
+       signal_opacity_changed_.destruct();
+       signal_blend_method_changed_.destruct();
+       signal_interpolation_changed_.destruct();
+}
+
+Settings&
+synfigapp::Main::settings()
+{
+       return settings_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_outline_color_changed()
+{
+       return signal_outline_color_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_fill_color_changed()
+{
+       return signal_fill_color_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_gradient_changed()
+{
+       return signal_gradient_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_bline_width_changed()
+{
+       return signal_bline_width_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_blend_method_changed()
+{
+       return signal_blend_method_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_opacity_changed()
+{
+       return signal_opacity_changed_;
+}
+
+sigc::signal<void>&
+synfigapp::Main::signal_interpolation_changed()
+{
+       return signal_interpolation_changed_;
+}
+
+const synfig::Color&
+synfigapp::Main::get_outline_color()
+{
+       return outline_;
+}
+
+const synfig::Color&
+synfigapp::Main::get_fill_color()
+{
+       return fill_;
+}
+
+const synfig::Gradient&
+synfigapp::Main::get_gradient()
+{
+       return gradient_;
+}
+
+const synfig::Real&
+synfigapp::Main::get_opacity()
+{
+       return opacity_;
+}
+
+synfig::Color::BlendMethod
+synfigapp::Main::get_blend_method()
+{
+       return blend_method_;
+}
+
+void
+synfigapp::Main::set_outline_color(synfig::Color color)
+{
+       outline_=color;
+       signal_outline_color_changed()();
+       if(selected_input_device_)
+               selected_input_device_->set_outline_color(outline_);
+       if(gradient_default_colors_)
+       {
+               gradient_=Gradient(fill_,outline_);
+               signal_gradient_changed()();
+       }
+}
+
+void
+synfigapp::Main::set_fill_color(synfig::Color color)
+{
+       fill_=color;
+       signal_fill_color_changed()();
+
+       if(selected_input_device_)
+               selected_input_device_->set_fill_color(fill_);
+
+       if(gradient_default_colors_)
+       {
+               gradient_=Gradient(fill_,outline_);
+               signal_gradient_changed()();
+       }
+}
+
+void
+synfigapp::Main::set_gradient(synfig::Gradient gradient)
+{
+       gradient_=gradient;
+       gradient_default_colors_=false;
+       signal_gradient_changed()();
+}
+
+void
+synfigapp::Main::set_gradient_default_colors()
+{
+       gradient_default_colors_=true;
+       gradient_=Gradient(fill_,outline_);
+       signal_gradient_changed()();
+}
+
+void
+synfigapp::Main::color_swap()
+{
+       const Color tmp(outline_);
+       outline_=fill_;
+       fill_=tmp;
+
+       if(selected_input_device_)
+       {
+               selected_input_device_->set_outline_color(outline_);
+               selected_input_device_->set_fill_color(fill_);
+       }
+
+       signal_outline_color_changed()();
+       signal_fill_color_changed()();
+
+       if(gradient_default_colors_)
+       {
+               gradient_=Gradient(fill_,outline_);
+               signal_gradient_changed()();
+       }
+}
+
+synfig::Waypoint::Interpolation
+synfigapp::Main::get_interpolation()
+{
+       return interpolation_;
+}
+
+
+void
+synfigapp::Main::set_interpolation(synfig::Waypoint::Interpolation x)
+{
+       if(interpolation_!=x)
+       {
+               interpolation_=x;
+
+               signal_interpolation_changed();
+       }
+}
+
+const synfig::Distance&
+synfigapp::Main::get_bline_width()
+{
+       return bline_width_;
+}
+
+void
+synfigapp::Main::set_bline_width(synfig::Distance x)
+{
+       if(x<0)x=0;
+       if(x!=bline_width_)
+       {
+               bline_width_=x;
+
+               if(selected_input_device_)
+                       selected_input_device_->set_bline_width(x);
+
+               signal_bline_width_changed()();
+       }
+}
+
+void
+synfigapp::Main::set_opacity(synfig::Real x)
+{
+       opacity_=x;
+       if(selected_input_device_)
+               selected_input_device_->set_opacity(opacity_);
+       signal_opacity_changed()();
+}
+
+void
+synfigapp::Main::set_blend_method(synfig::Color::BlendMethod x)
+{
+       blend_method_=x;
+       if(selected_input_device_)
+               selected_input_device_->set_blend_method(x);
+       signal_blend_method_changed()();
+}
+
+
+InputDevice::Handle
+synfigapp::Main::add_input_device(const synfig::String id, InputDevice::Type type)
+{
+       input_devices_.push_back(new InputDevice(id,type));
+       return input_devices_.back();
+}
+
+InputDevice::Handle
+synfigapp::Main::find_input_device(const synfig::String id)
+{
+       list<InputDevice::Handle>::iterator iter;
+       for(iter=input_devices_.begin();iter!=input_devices_.end();++iter)
+               if((*iter)->get_id()==id)
+                       return *iter;
+       return 0;
+}
+
+InputDevice::Handle
+synfigapp::Main::select_input_device(const synfig::String id)
+{
+       InputDevice::Handle input_device(find_input_device(id));
+       if(!input_device)
+               return 0;
+       if(!select_input_device(input_device))
+               return 0;
+       return input_device;
+}
+
+bool
+synfigapp::Main::select_input_device(InputDevice::Handle input_device)
+{
+       assert(input_device);
+
+       // synfig::info("Input device changed to \"%s\"",input_device->get_id().c_str());
+
+       selected_input_device_=input_device;
+
+       set_bline_width(input_device->get_bline_width());
+       set_outline_color(input_device->get_outline_color());
+       set_fill_color(input_device->get_fill_color());
+       set_opacity(input_device->get_opacity());
+       set_blend_method(input_device->get_blend_method());
+
+       return true;
+}
+
+InputDevice::Handle
+synfigapp::Main::get_selected_input_device()
+{
+       return selected_input_device_;
+}
+
+void
+synfigapp::Main::set_state(synfig::String state)
+{
+       if(selected_input_device_)
+               selected_input_device_->set_state(state);
+}