Clone in a terminal:
SettingsItem.vala
/*
	Copyright (C) 2014 Johan Mattsson

	This library is free software; you can redistribute it and/or modify 
	it under the terms of the GNU Lesser General Public License as 
	published by the Free Software Foundation; either version 3 of the 
	License, or (at your option) any later version.

	This library 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 
	Lesser General Public License for more details.
*/

using Cairo;
using Math;

namespace BirdFont {

public class SettingsItem : GLib.Object {	
	public bool handle_events;
	public bool key_bindings = false;
	public double y = 0;
	public Tool? button = null;
	public bool headline = false;
	public MenuItem menu_item = new MenuItem ("");
	public bool active = false;
	
	Text label;
	
	public SettingsItem (Tool tool, string description) {
		button = tool;
		label = new Text ();
		label.set_text (description);
		handle_events = true;
	}
	
	public SettingsItem.key_binding (MenuItem item) {
		if (item is ToolItem) {
			button = ((ToolItem) item).tool;
		}
		
		label = item.label;
		handle_events = false;
		key_bindings = true;
		menu_item = item;
	}
	
	public SettingsItem.head_line (string label) {
		this.label = new Text ();
		this.label.set_text (label);
		
		handle_events = false;
		headline = true;
	}

	public SettingsItem.color (string color) {
		ColorTool cb;
		Color c;
		
		c = Theme.get_color (color);

		label = new Text ();
		label.set_text (color);
		handle_events = true;
		
		cb = new ColorTool (color);
		cb.set_r (c.r);
		cb.set_g (c.g);
		cb.set_b (c.b);
		cb.set_a (c.a);
		
		cb.color_updated.connect (() => {
			TabBar tab_bar;
			
			Theme.save_color (color, cb.color_r, cb.color_g, cb.color_b, cb.color_a);
			
			tab_bar = MainWindow.get_tab_bar ();
			tab_bar.redraw (0, 0, tab_bar.width, tab_bar.height);
			GlyphCanvas.redraw ();
			Toolbox.redraw_tool_box ();
		});
	
		button = cb;
	}
	
	public void draw (WidgetAllocation allocation, Context cr) {
		Tool t;
		double label_x;
		
		if (headline) {
			cr.save ();
			Theme.color (cr, "Headline Background");
			cr.rectangle (0, y, allocation.width, 40);
			cr.fill ();
			cr.restore ();
				
			cr.save ();
			Theme.text_color (label, "Foreground Inverted");
			label.set_font_size (20);
			label.draw_at_baseline (cr, 21, y + 25);
			cr.restore ();
		} else {
			if (active) {
				cr.save ();
				Theme.color (cr, "Menu Background");
				cr.rectangle (0, y - 5, allocation.width, 40);
				cr.fill ();
				cr.restore ();
			}
			
			label_x = button != null ? 70 : 20;
			label_x *= MainWindow.units;
			
			if (button != null) {
				t = (!) button;
				t.draw (cr);
			}
			
			cr.save ();
			Theme.text_color (label, "Text Tool Box");
			label.set_font_size (17);
			label.draw_at_baseline (cr, label_x, y + 20);
			cr.restore ();
			
			if (key_bindings) {
				Text key_binding_text = new Text ();
				key_binding_text.set_text (menu_item.get_key_bindings ());
				cr.save ();
				
				if (active) {
					Theme.text_color (key_binding_text, "Foreground Inverted");
				} else {
					Theme.text_color (key_binding_text, "Text Tool Box");
				}
				
				key_binding_text.set_font_size (17);
				label_x += label.get_extent () + 20;
				key_binding_text.draw_at_baseline (cr, label_x, y + 20);
				cr.restore ();
			}	
		}
	}
}

}

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112