Blame synfig-studio/src/synfigapp/main.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file synfigapp/main.cpp
Carlos Lopez a09598
**	\brief Template File
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
**	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
**	the License, or (at your option) any later version.
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
**	General Public License for more details.
Carlos Lopez a09598
**	\endlegal
Carlos Lopez a09598
*/
Carlos Lopez a09598
/* ========================================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef USING_PCH
Carlos Lopez a09598
#	include "pch.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#ifdef HAVE_CONFIG_H
Carlos Lopez a09598
#	include <config.h></config.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#include "main.h"
Carlos Lopez a09598
#include "action.h"
2055f1
bw 94d8a6
#include <synfig general.h=""></synfig>
bw 94d8a6
Carlos Lopez a09598
#include <synfig color.h=""></synfig>
Carlos Lopez a09598
#include <synfig gradient.h=""></synfig>
873d31
#include <glibmm.h></glibmm.h>
Carlos Lopez a09598
Carlos Lopez a09598
#include <etl trivial=""></etl>
Carlos Lopez a09598
Carlos Lopez a09598
#include <list></list>
Carlos Lopez a09598
abdbf2
#include <synfigapp localization.h=""></synfigapp>
Carlos Lopez a09598
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === U S I N G =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
using namespace synfigapp;
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
ad24f5
#ifndef SYNFIG_USER_APP_DIR
ad24f5
#ifdef __APPLE__
ad24f5
#define SYNFIG_USER_APP_DIR	"Library/Synfig"
ad24f5
#elif defined(_WIN32)
ad24f5
#define SYNFIG_USER_APP_DIR	"Synfig"
ad24f5
#else
568107
#define SYNFIG_USER_APP_DIR	".config/synfig"
ad24f5
#endif
ad24f5
#endif
ad24f5
Carlos Lopez a09598
/* === S T A T I C S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
static etl::reference_counter synfigapp_ref_count_(0);
Carlos Lopez a09598
static synfigapp::Action::Main* action_main;
Carlos Lopez a09598
Carlos Lopez a09598
static Color outline_;
Carlos Lopez a09598
static Color fill_;
Carlos Lopez a09598
static Gradient gradient_;
Carlos Lopez a09598
static bool gradient_default_colors_;
Carlos Lopez a09598
Carlos Lopez a09598
static synfig::Distance bline_width_;
Carlos Lopez a09598
bff965
//static Color::BlendMethod blend_method_;
d435fa
//static Real opacity_;
Carlos Lopez a09598
Carlos Lopez a09598
static synfigapp::InputDevice::Handle selected_input_device_;
Carlos Lopez a09598
static list<synfigapp::inputdevice::handle> input_devices_;</synfigapp::inputdevice::handle>
Carlos Lopez a09598
Carlos Lopez a09598
trivial<sigc::signal<void> > signal_outline_color_changed_;</sigc::signal<void>
Carlos Lopez a09598
trivial<sigc::signal<void> > signal_fill_color_changed_;</sigc::signal<void>
Carlos Lopez a09598
trivial<sigc::signal<void> > signal_gradient_changed_;</sigc::signal<void>
Carlos Lopez a09598
trivial<sigc::signal<void> > signal_bline_width_changed_;</sigc::signal<void>
bff965
//trivial<sigc::signal<void> > signal_blend_method_changed_;</sigc::signal<void>
d435fa
//trivial<sigc::signal<void> > signal_opacity_changed_;</sigc::signal<void>
Carlos Lopez a09598
trivial<sigc::signal<void> > signal_interpolation_changed_;</sigc::signal<void>
Carlos Lopez a09598
Carlos Lopez a09598
trivial<settings> settings_;</settings>
Carlos Lopez a09598
Carlos Lopez a09598
static synfig::Waypoint::Interpolation interpolation_;
Carlos Lopez a09598
Carlos Lopez a09598
/* === P R O C E D U R E S ================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E T H O D S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
synfigapp::Main::Main(const synfig::String &basepath, synfig::ProgressCallback *cb):
Carlos Lopez a09598
	synfig::Main(basepath,cb),
Carlos Lopez a09598
	ref_count_(synfigapp_ref_count_)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(ref_count_.count())
Carlos Lopez a09598
		return;
Carlos Lopez a09598
Carlos Lopez a09598
	synfigapp_ref_count_.reset();
Carlos Lopez a09598
	ref_count_=synfigapp_ref_count_;
Carlos Lopez a09598
Carlos Lopez a09598
	// Add initialization after this point
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef ENABLE_NLS
873d31
	String locale_dir;
873d31
	locale_dir = etl::dirname(basepath)+ETL_DIRECTORY_SEPARATOR+"share"+ETL_DIRECTORY_SEPARATOR+"locale";
873d31
	
c55bbc
	bindtextdomain(GETTEXT_PACKAGE, Glib::locale_from_utf8(locale_dir).c_str() );
0bdb5b
	bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
	action_main=new synfigapp::Action::Main();
Carlos Lopez a09598
Carlos Lopez a09598
	settings_.construct();
Carlos Lopez a09598
Carlos Lopez a09598
	signal_outline_color_changed_.construct();
Carlos Lopez a09598
	signal_fill_color_changed_.construct();
Carlos Lopez a09598
	signal_gradient_changed_.construct();
d435fa
	//signal_opacity_changed_.construct();
bff965
	//signal_blend_method_changed_.construct();
Carlos Lopez a09598
	signal_interpolation_changed_.construct();
Carlos Lopez a09598
Carlos Lopez a09598
	set_outline_color(Color::black());
Carlos Lopez a09598
	set_fill_color(Color::white());
Carlos Lopez a09598
	set_gradient_default_colors();
Carlos Lopez a09598
	set_bline_width(Distance(1,Distance::SYSTEM_POINTS));
d435fa
	//set_opacity(1.0);
bff965
	//set_blend_method(Color::BLEND_BY_LAYER);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
synfigapp::Main::~Main()
Carlos Lopez a09598
{
Carlos Lopez a09598
	ref_count_.detach();
Carlos Lopez a09598
	if(!synfigapp_ref_count_.unique())
Carlos Lopez a09598
		return;
Carlos Lopez a09598
	synfigapp_ref_count_.detach();
Carlos Lopez a09598
Carlos Lopez a09598
	// Add deinitialization after this point
Carlos Lopez a09598
Carlos Lopez a09598
	delete action_main;
Carlos Lopez a09598
Carlos Lopez a09598
	selected_input_device_=0;
Carlos Lopez a09598
	input_devices_.clear();
Carlos Lopez a09598
Carlos Lopez a09598
	settings_.destruct();
Carlos Lopez a09598
	signal_outline_color_changed_.destruct();
Carlos Lopez a09598
	signal_fill_color_changed_.destruct();
Carlos Lopez a09598
	signal_gradient_changed_.destruct();
Carlos Lopez a09598
d435fa
	//signal_opacity_changed_.destruct();
bff965
	//signal_blend_method_changed_.destruct();
Carlos Lopez a09598
	signal_interpolation_changed_.destruct();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Settings&
Carlos Lopez a09598
synfigapp::Main::settings()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return settings_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_outline_color_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_outline_color_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_fill_color_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_fill_color_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_gradient_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_gradient_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_bline_width_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_bline_width_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
bff965
/*
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_blend_method_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_blend_method_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_opacity_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_opacity_changed_;
Carlos Lopez a09598
}
d435fa
*/
Carlos Lopez a09598
Carlos Lopez a09598
sigc::signal<void>&</void>
Carlos Lopez a09598
synfigapp::Main::signal_interpolation_changed()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return signal_interpolation_changed_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
const synfig::Color&
Carlos Lopez a09598
synfigapp::Main::get_outline_color()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return outline_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
const synfig::Color&
Carlos Lopez a09598
synfigapp::Main::get_fill_color()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return fill_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
const synfig::Gradient&
Carlos Lopez a09598
synfigapp::Main::get_gradient()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return gradient_;
Carlos Lopez a09598
}
Carlos Lopez a09598
b17ac8
/*
Carlos Lopez a09598
const synfig::Real&
Carlos Lopez a09598
synfigapp::Main::get_opacity()
Carlos Lopez a09598
{
d435fa
	return 1.0;
Carlos Lopez a09598
}
b17ac8
*/
Carlos Lopez a09598
Carlos Lopez a09598
synfig::Color::BlendMethod
Carlos Lopez a09598
synfigapp::Main::get_blend_method()
Carlos Lopez a09598
{
bff965
	return Color::BLEND_BY_LAYER;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_outline_color(synfig::Color color)
Carlos Lopez a09598
{
Carlos Lopez a09598
	outline_=color;
Carlos Lopez a09598
	signal_outline_color_changed()();
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
		selected_input_device_->set_outline_color(outline_);
Carlos Lopez a09598
	if(gradient_default_colors_)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		gradient_=Gradient(fill_,outline_);
Carlos Lopez a09598
		signal_gradient_changed()();
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_fill_color(synfig::Color color)
Carlos Lopez a09598
{
Carlos Lopez a09598
	fill_=color;
Carlos Lopez a09598
	signal_fill_color_changed()();
Carlos Lopez a09598
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
		selected_input_device_->set_fill_color(fill_);
Carlos Lopez a09598
Carlos Lopez a09598
	if(gradient_default_colors_)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		gradient_=Gradient(fill_,outline_);
Carlos Lopez a09598
		signal_gradient_changed()();
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_gradient(synfig::Gradient gradient)
Carlos Lopez a09598
{
Carlos Lopez a09598
	gradient_=gradient;
Carlos Lopez a09598
	gradient_default_colors_=false;
Carlos Lopez a09598
	signal_gradient_changed()();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_gradient_default_colors()
Carlos Lopez a09598
{
Carlos Lopez a09598
	gradient_default_colors_=true;
Carlos Lopez a09598
	gradient_=Gradient(fill_,outline_);
Carlos Lopez a09598
	signal_gradient_changed()();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::color_swap()
Carlos Lopez a09598
{
Carlos Lopez a09598
	const Color tmp(outline_);
Carlos Lopez a09598
	outline_=fill_;
Carlos Lopez a09598
	fill_=tmp;
Carlos Lopez a09598
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		selected_input_device_->set_outline_color(outline_);
Carlos Lopez a09598
		selected_input_device_->set_fill_color(fill_);
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	signal_outline_color_changed()();
Carlos Lopez a09598
	signal_fill_color_changed()();
Carlos Lopez a09598
Carlos Lopez a09598
	if(gradient_default_colors_)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		gradient_=Gradient(fill_,outline_);
Carlos Lopez a09598
		signal_gradient_changed()();
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
synfig::Waypoint::Interpolation
Carlos Lopez a09598
synfigapp::Main::get_interpolation()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return interpolation_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_interpolation(synfig::Waypoint::Interpolation x)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(interpolation_!=x)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		interpolation_=x;
Carlos Lopez a09598
def467
		signal_interpolation_changed()();
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
const synfig::Distance&
Carlos Lopez a09598
synfigapp::Main::get_bline_width()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return bline_width_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_bline_width(synfig::Distance x)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(x<0)x=0;
Carlos Lopez a09598
	if(x!=bline_width_)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		bline_width_=x;
Carlos Lopez a09598
Carlos Lopez a09598
		if(selected_input_device_)
Carlos Lopez a09598
			selected_input_device_->set_bline_width(x);
Carlos Lopez a09598
Carlos Lopez a09598
		signal_bline_width_changed()();
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
d435fa
/*
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_opacity(synfig::Real x)
Carlos Lopez a09598
{
Carlos Lopez a09598
	opacity_=x;
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
		selected_input_device_->set_opacity(opacity_);
Carlos Lopez a09598
	signal_opacity_changed()();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_blend_method(synfig::Color::BlendMethod x)
Carlos Lopez a09598
{
Carlos Lopez a09598
	blend_method_=x;
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
		selected_input_device_->set_blend_method(x);
Carlos Lopez a09598
	signal_blend_method_changed()();
Carlos Lopez a09598
}
bff965
*/
Carlos Lopez a09598
Carlos Lopez a09598
InputDevice::Handle
Carlos Lopez a09598
synfigapp::Main::add_input_device(const synfig::String id, InputDevice::Type type)
Carlos Lopez a09598
{
Carlos Lopez a09598
	input_devices_.push_back(new InputDevice(id,type));
Carlos Lopez a09598
	return input_devices_.back();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
InputDevice::Handle
Carlos Lopez a09598
synfigapp::Main::find_input_device(const synfig::String id)
Carlos Lopez a09598
{
Carlos Lopez a09598
	list<inputdevice::handle>::iterator iter;</inputdevice::handle>
Carlos Lopez a09598
	for(iter=input_devices_.begin();iter!=input_devices_.end();++iter)
Carlos Lopez a09598
		if((*iter)->get_id()==id)
Carlos Lopez a09598
			return *iter;
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
InputDevice::Handle
Carlos Lopez a09598
synfigapp::Main::select_input_device(const synfig::String id)
Carlos Lopez a09598
{
Carlos Lopez a09598
	InputDevice::Handle input_device(find_input_device(id));
Carlos Lopez a09598
	if(!input_device)
Carlos Lopez a09598
		return 0;
Carlos Lopez a09598
	if(!select_input_device(input_device))
Carlos Lopez a09598
		return 0;
Carlos Lopez a09598
	return input_device;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
synfigapp::Main::select_input_device(InputDevice::Handle input_device)
Carlos Lopez a09598
{
Carlos Lopez a09598
	assert(input_device);
Carlos Lopez a09598
Carlos Lopez a09598
	// synfig::info("Input device changed to \"%s\"",input_device->get_id().c_str());
Carlos Lopez a09598
Carlos Lopez a09598
	selected_input_device_=input_device;
Carlos Lopez a09598
Carlos Lopez a09598
	set_bline_width(input_device->get_bline_width());
Carlos Lopez a09598
	set_outline_color(input_device->get_outline_color());
Carlos Lopez a09598
	set_fill_color(input_device->get_fill_color());
d435fa
	//set_opacity(input_device->get_opacity());
bff965
	//set_blend_method(input_device->get_blend_method());
Carlos Lopez a09598
Carlos Lopez a09598
	return true;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
InputDevice::Handle
Carlos Lopez a09598
synfigapp::Main::get_selected_input_device()
Carlos Lopez a09598
{
Carlos Lopez a09598
	return selected_input_device_;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
synfigapp::Main::set_state(synfig::String state)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(selected_input_device_)
Carlos Lopez a09598
		selected_input_device_->set_state(state);
Carlos Lopez a09598
}
ad24f5
ad24f5
synfig::String
ad24f5
synfigapp::Main::get_user_app_directory()
ad24f5
{
ad24f5
	String dir;
671edc
	if (char* synfig_user_settings_dir = getenv("SYNFIG_USER_SETTINGS")) {
671edc
		dir =  Glib::locale_from_utf8(String(synfig_user_settings_dir));
671edc
	} else {
671edc
		dir = Glib::get_home_dir()+ETL_DIRECTORY_SEPARATOR+SYNFIG_USER_APP_DIR;
671edc
	}
ad24f5
	return dir;
ad24f5
}