Clone in a terminal:
ThemeTab.vala
/*
	Copyright (C) 2014 2015 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 {

internal class ThemeTab : SettingsDisplay {
	static ThemeTab singleton;
	ColorTool color_tool;
	
	public ThemeTab () {
		base ();
		color_tool = new ColorTool ();
		singleton = this;
		create_setting_items ();
	}
	
	public static ThemeTab get_instance () {
		return singleton;
	}
	
	public void color_updated (Color c) {
		color_tool.set_color (c);
	}
	
	public override void create_setting_items () {
		tools.clear ();
		
		tools.add (new SettingsItem.head_line (t_("Themes")));
		
		Gee.ArrayList<Tool> theme_buttons = new Gee.ArrayList<Tool> ();
		
		foreach (string theme in Theme.themes) {
			string label;
			Tool select_theme = new Tool (theme);

			select_theme.deselect_action.connect((self) => {
				self.set_active (false);
			});
			
			select_theme.select_action.connect((self) => {
				string theme_file = self.get_name ();
				Toolbox toolbox;
				
				Preferences.set ("theme", theme_file);
				Theme.load_theme (theme_file);
					
				foreach (Tool t in theme_buttons) {
					t.set_selected (false);
					t.set_active (false);
				}
				
				self.set_selected (true);
				create_setting_items ();
				
				toolbox = MainWindow.get_toolbox ();
				foreach (ToolCollection tc in toolbox.tool_sets) {
					tc.redraw ();
				}
				
				foreach (Expander e in Toolbox.current_set.get_expanders ()) {
					e.redraw ();
				}
				
				redraw_ui ();
			});
		
			select_theme.set_icon ("theme");
			
			label = get_label_from_file_name (theme);
			
			tools.add (new SettingsItem (select_theme, label));
			theme_buttons.add (select_theme);
			
			if (select_theme.get_name () == Theme.current_theme) {
				select_theme.set_selected (true);
			}
		}

		foreach (Tool t in theme_buttons) {
			t.set_selected (t.name == Theme.current_theme);
		}

		Tool add_theme = new Tool ("add_new_theme");
		add_theme.select_action.connect((self) => {
			foreach (Tool t in theme_buttons) {
				t.set_selected (false);
			}
			
			self.set_selected (false);
			Theme.add_new_theme (this); 
			GlyphCanvas.redraw ();
		});
		tools.add (new SettingsItem (add_theme, t_("Add new theme")));
		
		tools.add (new SettingsItem.head_line (t_("Colors")));

		foreach (string color in Theme.color_list) {
			SettingsItem s = new SettingsItem.color (color);
			ColorTool c = (ColorTool) ((!) s.button);
			
			tools.add (s);

			c.select_action.connect((self) => {
				color_tool = (ColorTool) self;
			});
			
			c.deselect_action.connect((self) => {
				color_tool = new ColorTool ();
			});
			
			c.color_updated.connect (() => {
				create_setting_items ();
				GlyphCanvas.redraw ();
			});
		}
	}

	public static void redraw_ui (){
		TabBar tb;
		
		Toolbox.redraw_tool_box ();		
				
		GlyphCanvas.redraw ();
				
		tb = MainWindow.get_tab_bar ();
		tb.redraw (0, 0, tb.width, tb.height);
			
		OverviewItem.label_background = null;
		OverviewItem.selected_label_background = null;
		OverviewItem.label_background_no_menu = null;
		OverviewItem.selected_label_background_no_menu = null;		
	}
	
	public static string get_label_from_file_name (string theme) {
		string label;
		
		if (theme == "dark.theme") {
			label = t_("Dark");
		} else if (theme == "bright.theme") {
			label = t_("Bright");
		} else if (theme == "high_contrast.theme") {
			label = t_("High contrast");
		} else if (theme == "custom.theme") {
			label = t_("Custom");
		} else {
			label = theme.replace (".theme", "");
		}
		
		return label;
	}

	public override string get_label () {
		return t_("Themes");
	}

	public override string get_name () {
		return "Themes";
	}
}

}

Contact

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