/* This file is part of Patchage.
 * Copyright 2014 David Robillard <http://drobilla.net>
 *
 * Patchage 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 3 of the License, or (at your option)
 * any later version.
 *
 * Patchage 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 details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Patchage.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef PATCHAGE_LEGEND_HPP
#define PATCHAGE_LEGEND_HPP

#include "Configuration.hpp"

#include <gtkmm/box.h>
#include <gtkmm/colorbutton.h>
#include <gtkmm/label.h>

class Legend : public Gtk::HBox
{
public:
	explicit Legend(const Configuration& configuration)
	{
		add_button(PortType::jack_audio,
		           "Audio",
		           configuration.get_port_color(PortType::jack_audio));

#ifdef HAVE_JACK_METADATA
		add_button(PortType::jack_cv,
		           "CV",
		           configuration.get_port_color(PortType::jack_cv));
		add_button(PortType::jack_osc,
		           "OSC",
		           configuration.get_port_color(PortType::jack_osc));
#endif

		add_button(PortType::jack_midi,
		           "MIDI",
		           configuration.get_port_color(PortType::jack_midi));

		add_button(PortType::alsa_midi,
		           "ALSA MIDI",
		           configuration.get_port_color(PortType::alsa_midi));

		show_all_children();
	}

	void add_button(const PortType id, const std::string& label, uint32_t rgba)
	{
		Gdk::Color col;
		col.set_rgb(((rgba >> 24) & 0xFF) * 0x100,
		            ((rgba >> 16) & 0xFF) * 0x100,
		            ((rgba >> 8) & 0xFF) * 0x100);
		auto* box = new Gtk::HBox();
		auto* but = new Gtk::ColorButton(col);
		but->set_use_alpha(false);
		but->signal_color_set().connect(sigc::bind(
		    sigc::mem_fun(this, &Legend::on_color_set), id, label, but));

		box->pack_end(*Gtk::manage(but));
		box->pack_end(*Gtk::manage(new Gtk::Label(label)), false, false, 2);

		this->pack_start(*Gtk::manage(box), false, false, 6);
	}

	void on_color_set(const PortType          id,
	                  const std::string&      label,
	                  const Gtk::ColorButton* but)
	{
		const Gdk::Color col  = but->get_color();
		const uint32_t   rgba = (((col.get_red() / 0x100) << 24) |
                               ((col.get_green() / 0x100) << 16) |
                               ((col.get_blue() / 0x100) << 8) | 0xFF);

		signal_color_changed.emit(id, label, rgba);
	}

	sigc::signal<void, PortType, std::string, uint32_t> signal_color_changed;
};

#endif // PATCHAGE_LEGEND_HPP