/*
   ui/iconbutton.cc
   This file is part of the Osirion project and is distributed under
   the terms of the GNU General Public License version 2
*/

#include <cmath>

#include "audio/audio.h"
#include "auxiliary/functions.h"
#include "core/application.h"
#include "core/commandbuffer.h"
#include "sys/sys.h"
#include "ui/ui.h"
#include "ui/paint.h"
#include "ui/iconbutton.h"

namespace ui
{

IconButton::IconButton(Widget *parent, const char *icon, const char *command) : Widget(parent)
{
	set_label("iconbutton");
	set_background(false);
	set_border(false);
	set_command(command);
	set_icon(icon);
	set_highlight(false);
}

IconButton::~IconButton()
{
}

void IconButton::print(const size_t indent) const
{
	std::string marker("");
	con_print << aux::pad_left(marker, indent*2) << label() << " \"" << icon() << "\" \"" << command() << "\"" << std::endl;
}

void IconButton::set_command(const char *command)
{
	if (command)
		iconbutton_command.assign(command);
	else
		iconbutton_command.clear();
}

void IconButton::set_command(const std::string &command)
{
	iconbutton_command.assign(command);
}

void IconButton::set_icon(const char *icon)
{
	if (icon)
		iconbutton_icon.assign(icon);
	else
		iconbutton_icon.clear();
}

void IconButton::set_highlight(const bool highlight)
{
	iconbutton_highlight = highlight;
}

void IconButton::set_icon(const std::string &icon)
{
	iconbutton_icon.assign(icon);
}

void IconButton::draw()
{
	math::Color color;
	if (!icon().size())
		return;

	if (disabled()) {
		color.assign(palette()->disabled());
	} else if (highlight() || has_mouse_focus()) {
		color.assign(palette()->highlight());
	} else {
		color.assign(palette()->foreground());
	}

	Paint::draw_bitmap(global_location(), size(), color, icon());
		
// 	if (enabled() && has_mouse_focus()) {
// 		root()->set_pointer("action", Palette::Highlight);
// 	}

}

void IconButton::draw_border()
{
	if (enabled() && has_mouse_focus()) {
		math::Color color(palette()->foreground());
		float t = core::application()->time();
		t = t - floorf(t);
		if (t > 0.5)
			t = 1 - t;
		color.a = 0.5f + t;
		Paint::set_color(color);
		Paint::draw_border(global_location(), size());		
	}
}

bool IconButton::on_mousepress(const unsigned int button)
{
	if (button == SDL_BUTTON_LEFT) {
		if (enabled()) {
			if (iconbutton_command.size()) {
				core::cmd() << iconbutton_command << std::endl;
			}
			audio::play("ui/clicked");
			emit(EventButtonClicked);
		}
		return true;
	}

	return false;
}

void IconButton::on_mouseover(const math::Vector2f &cursor)
{
	if (enabled()) {
		//audio::play("ui/select");
	}
}

}