/* === S Y N F I G ========================================================= */
/*!	\file dialogsettings.cpp
**	\brief Template File
**
**	\legal
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
**	Copyright (c) 2007, 2008 Chris Moore
**
**	This file is part of Synfig.
**
**	Synfig 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.
**
**	Synfig 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.
**
**	You should have received a copy of the GNU General Public License
**	along with Synfig.  If not, see <https://www.gnu.org/licenses/>.
**	\endlegal
*/
/* ========================================================================= */

/* === H E A D E R S ======================================================= */

#ifdef USING_PCH
#	include "pch.h"
#else
#ifdef HAVE_CONFIG_H
#	include <config.h>
#endif

#include "dialogsettings.h"

#include <gdkmm/general.h>
#include <synfigapp/main.h>

#endif

/* === U S I N G =========================================================== */

using namespace synfig;
using namespace studio;

/* === M A C R O S ========================================================= */

/* === G L O B A L S ======================================================= */

/* === P R O C E D U R E S ================================================= */

/* === M E T H O D S ======================================================= */

DialogSettings::DialogSettings(Gtk::Window* window,const synfig::String& name):
	window(window),
	name(name)
{
	synfigapp::Main::settings().add_domain(this,"window."+name);
}

DialogSettings::~DialogSettings()
{
	synfigapp::Main::settings().remove_domain("window."+name);
}

bool
DialogSettings::get_raw_value(const synfig::String& key, synfig::String& value) const
{
	if(key=="pos")
	{
		// if(!window->is_visible())return false;
		int x,y; window->get_position(x,y);
		value=strprintf("%d %d",x,y);
		return true;
	}
	if(key=="size")
	{
		// if(!window->is_visible())return false;
		int x,y; window->get_size(x,y);
		value=strprintf("%d %d",x,y);
		return true;
	}
	if(key=="x")
	{
		int x,y; window->get_position(x,y);
		value=strprintf("%d",x);
		return true;
	}
	if(key=="y")
	{
		int x,y; window->get_position(x,y);
		value=strprintf("%d",y);
		return true;
	}
	if(key=="w")
	{
		int x,y; window->get_size(x,y);
		value=strprintf("%d",x);
		return true;
	}
	if(key=="h")
	{
		int x,y; window->get_size(x,y);
		value=strprintf("%d",y);
		return true;
	}
	if(key=="visible")
	{
		value=window->get_visible()?"1":"0";
		return true;
	}

	return synfigapp::Settings::get_raw_value(key,value);
}

bool
DialogSettings::set_value(const synfig::String& key,const synfig::String& value)
{
	int screen_w(Gdk::screen_width());
	int screen_h(Gdk::screen_height());

	if(value.empty())
		return false;

	if(key=="pos")
	{
		int x,y;
		if(!strscanf(value,"%d %d",&x, &y))
			return false;

		if (x > screen_w) x = screen_w - 150;
		if (x < 0) x = 0;
		
		if (y > screen_h) y = screen_h - 150;
		if (y < 0) y = 0;

		window->move(x,y);
		return true;
	}
	if(key=="size")
	{
		int x,y;
		if(!strscanf(value,"%d %d",&x, &y))
			return false;

		if (x > screen_w) x = 150;
		if (x < 0) x = 0;
		
		if (y > screen_h) y = 150;
		if (y < 0) y = 0;

		window->set_default_size(x,y);
		return true;
	}
	if(key=="x")
	{
		int x,y; window->get_position(x,y);
		x=atoi(value.c_str());
		window->move(x,y);
		return true;
	}
	if(key=="y")
	{
		int x,y; window->get_position(x,y);
		y=atoi(value.c_str());
		window->move(x,y);
		return true;
	}
	if(key=="w")
	{
		int x,y; window->get_size(x,y);
		x=atoi(value.c_str());
		window->set_default_size(x,y);
		return true;
	}
	if(key=="h")
	{
		int x,y; window->get_size(x,y);
		y=atoi(value.c_str());
		window->set_default_size(x,y);
		return true;
	}
	if(key=="visible")
	{
		if(value=="0")
			window->hide();
		else
			window->present();
		return true;
	}

	return synfigapp::Settings::set_value(key,value);
}

synfigapp::Settings::KeyList
DialogSettings::get_key_list() const
{
	synfigapp::Settings::KeyList ret(synfigapp::Settings::get_key_list());

	ret.push_back("size");
	ret.push_back("pos");
	ret.push_back("visible");

	return ret;
}
