/* === S Y N F I G ========================================================= */
/*!	\file splash.cpp
**	\brief writeme
**
**	\legal
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
**	Copyright (c) 2007 Chris Moore
**	Copyright (c) 2008 Paul Wise
**
**	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 "splash.h"

#include <string>

#include <gtkmm/fixed.h>
#include <gtkmm/frame.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>
#include <gdkmm/rgba.h>

#include <gui/app.h>
#include <gui/localization.h>
#include <gui/resourcehelper.h>

#include <synfig/general.h>

#endif

using namespace studio;

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

#ifndef VERSION
#define VERSION	"unknown"
#endif

#ifndef IMAGE_EXT
#	define IMAGE_EXT	"png"
#endif

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

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

class studio::SplashProgress : public synfig::ProgressCallback
{
	Splash &splash;

public:

	SplashProgress(Splash &splash):splash(splash) { }

	virtual bool task(const std::string &task)
	{
		if(splash.tasklabel)
		{
			splash.tasklabel->set_label(task);
			splash.tasklabel->show();
		}

		synfig::info(task);

		studio::App::process_all_events();
		return true;
	}

	virtual bool error(const std::string &task)
	{
		if(splash.tasklabel)
		{
			splash.tasklabel->set_label(_("ERROR:")+task);
			splash.tasklabel->show();
		}

		synfig::error(task);

		studio::App::process_all_events();
		return true;
	}

	virtual bool warning(const std::string &task)
	{
		if(splash.tasklabel)
		{
			splash.tasklabel->set_label(_("WARNING:")+task);
			splash.tasklabel->show();
		}

		synfig::warning(task);

		studio::App::process_all_events();
		return true;
	}

	virtual bool amount_complete(int current, int total)
	{
		if(splash.progressbar)
		{
			splash.progressbar->set_fraction((float)current/(float)total);
			splash.progressbar->show();
		}

		studio::App::process_all_events();
		return true;
	}
}; // END of class SplashProgress

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

Splash::Splash():
	Gtk::Window(Gtk::WINDOW_TOPLEVEL)
{
	std::string imagepath = ResourceHelper::get_image_path() + '/';

	// Create the splash image
	Gtk::Image* splash_image = manage(new class Gtk::Image());
	/* Dual-splash code:
	srand(time(nullptr));
	const float ran = rand()/float(RAND_MAX);
	int number = 1;
	if(ran >0.499999)
		number = 2;
	//synfig::info("%s", strprintf("%d",number).c_str());
	splash_image->set(imagepath+"splash_screen"+strprintf("%d",number)+"." IMAGE_EXT);
	*/
	splash_image->set(imagepath + "splash_screen." IMAGE_EXT);
	splash_image->set_halign(Gtk::ALIGN_CENTER);
	splash_image->set_halign(Gtk::ALIGN_CENTER);
	splash_image->set_margin_start(0);
	splash_image->set_margin_end(0);
	splash_image->set_margin_top(0);
	splash_image->set_margin_bottom(0);

	// Get the image size
	int image_w = 350; int image_h = 0;
	Glib::RefPtr<Gdk::Pixbuf> pixbuf = splash_image->get_pixbuf();
	if( pixbuf ){
		image_w = pixbuf->get_width();
		image_h = pixbuf->get_height();
	}

	// Create the progress bar
	progressbar = manage(new class Gtk::ProgressBar());
	progressbar->set_size_request(image_w,24);

	// Create the current task label
	tasklabel = manage(new class Gtk::Label());
	tasklabel->set_size_request(image_w,24);
	tasklabel->set_use_underline(false);

	// Create the version label
	versionlabel = manage(new class Gtk::Label());
	versionlabel->set_label("" VERSION);
	versionlabel->set_size_request(image_w,24);
	versionlabel->set_use_underline(false);
	versionlabel->get_style_context()->add_class("color-white");
	versionlabel->show();

	// Create the Gtk::Fixed container and put all of the widgets into it
	Gtk::Fixed* fixed = manage(new class Gtk::Fixed());
	if( pixbuf ) fixed->put(*splash_image, 0, 0);
	fixed->put(*progressbar, 0, image_h+24);
	fixed->put(*tasklabel, 0, image_h);
	fixed->put(*versionlabel, 0, image_h-24);

	// Create shadow around the outside of the window
	Gtk::Frame* frame = manage(new class Gtk::Frame());
	frame->set_shadow_type(Gtk::SHADOW_OUT);
  	frame->add(*fixed);

	// Set up the parameters for this pop-up window
	set_title("Synfig Studio " VERSION);
	set_modal(false);
	property_window_position().set_value(Gtk::WIN_POS_CENTER);
	set_resizable(false);
	set_type_hint(Gdk::WINDOW_TYPE_HINT_SPLASHSCREEN);
	set_auto_startup_notification(false);
	try {
		set_icon_name("synfig_icon");
	} catch(...) {
		synfig::warning("Unable to open synfig icon for Splash");
	}
	add(*frame);

	// show everything off
	if( pixbuf ) splash_image->show();
	fixed->show();
	frame->show();

	// Once the splash is shown, we want startup stuff to continue as normal
	signal_map().connect(sigc::mem_fun(*this, &Splash::enable_startup_notification));

	cb=new SplashProgress(*this);
}

Splash::~Splash()
{
	delete cb;
}

synfig::ProgressCallback *
Splash::get_callback()
{
	return cb;
}

void
Splash::enable_startup_notification(){
	set_auto_startup_notification(true);
}
