Clone in a terminal:
DescriptionDisplay.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 {

public class DescriptionDisplay : TableLayout {
	TextArea postscript_name;
	TextArea name;
	TextArea style;
	CheckBox bold;
	CheckBox italic;
	TextArea weight;
	TextArea italic_angle;
	TextArea full_name;
	TextArea unique_id;
	TextArea version;
	TextArea description;
	TextArea copyright;
	TextArea license;
	LineTextArea license_url;
	TextArea trademark;
	LineTextArea manufacturer;
	LineTextArea designer;
	LineTextArea vendor_url;
	LineTextArea designer_url;
	
	private static bool disable_copyright = false;
	
	public DescriptionDisplay () {
		double margin = 12;
		double label_size = 20;
		double label_margin = 4;
		Headline headline;
		Font font = BirdFont.get_current_font ();
		
		postscript_name = new LineTextArea (label_size);
		name = new LineTextArea (label_size);
		style = new LineTextArea (label_size);
		weight = new LineTextArea (label_size);
		italic_angle = new LineTextArea (label_size);
		full_name = new LineTextArea (label_size);
		unique_id = new LineTextArea (label_size);
		version = new LineTextArea (label_size);
		description = new TextArea (label_size);
		copyright = new TextArea (label_size);
		license = new TextArea (label_size);
		license_url = new LineTextArea (label_size);
		trademark = new TextArea (label_size);
		manufacturer = new LineTextArea (label_size);
		designer = new LineTextArea (label_size);
		vendor_url = new LineTextArea (label_size);
		designer_url = new LineTextArea (label_size);
	
		headline = new Headline (t_("Name and Description"));
		headline.margin_bottom = 20;
		widgets.add (headline);

		widgets.add (new Text (t_("PostScript Name"), label_size, label_margin));
		postscript_name.margin_bottom = margin;
		postscript_name.set_text (font.postscript_name);
		postscript_name.text_changed.connect ((t) => {
			font.postscript_name = t;
			font.touch ();
		});
		widgets.add (postscript_name);
		focus_ring.add (postscript_name);
		
		widgets.add (new Text (t_("Name"), label_size, label_margin));
		name.margin_bottom = margin;
		name.set_text (font.name);
		name.text_changed.connect ((t) => {
			font.name = t;
			font.touch ();
		});
		widgets.add (name);
		focus_ring.add (name);
		
		widgets.add (new Text (t_("Style"), label_size, label_margin));
		style.margin_bottom = 1.5 * margin;
		style.set_text (font.subfamily);
		style.text_changed.connect ((t) => {
			font.subfamily = t;
			font.touch ();
		});
		widgets.add (style);
		focus_ring.add (style);
		
		bold = new CheckBox (t_("Bold"), label_size);
		bold.updated.connect ((c) => {
			font.bold = c;
			font.touch ();
		});
		bold.checked = font.bold;
		widgets.add (bold);
		focus_ring.add (bold);
		
		italic = new CheckBox (t_("Italic"), label_size);
		italic.updated.connect ((c) => {
			font.italic = c;
			font.touch ();
		});
		italic.checked = font.italic;
		italic.margin_bottom = margin;
		widgets.add (italic);
		focus_ring.add (italic);
		
		widgets.add (new Text (t_("Weight"), label_size, label_margin));
		weight.margin_bottom = margin;
		weight.set_text (font.get_weight ());
		weight.text_changed.connect ((t) => {
			font.set_weight (t);
			font.touch ();
		});
		widgets.add (weight);
		focus_ring.add (weight);

		/*
		Italic angle in counter-clockwise degrees from the vertical. Zero
		for upright text, negative for text that leans to the right (forward).
		*/

		widgets.add (new Text (t_("Italic angle, use negative values for text that leans to the right."), label_size, label_margin));
		italic_angle.margin_bottom = margin;
		italic_angle.set_text (Doubles.round (font.italic_angle));
		italic_angle.text_changed.connect ((t) => {
			font.set_italic_angle (t);
			font.touch ();
		});
		widgets.add (italic_angle);
		focus_ring.add (italic_angle);
		
		widgets.add (new Text (t_("Full Name (Name and Style)"), label_size, label_margin));
		full_name.margin_bottom = margin;
		full_name.set_text (font.full_name);
		full_name.text_changed.connect ((t) => {
			font.full_name = t;
			font.touch ();
			MainWindow.get_toolbox ().update_all_expanders ();
		});
		widgets.add (full_name);
		focus_ring.add (full_name);
		
		widgets.add (new Text (t_("Unique Identifier"), label_size, label_margin));
		unique_id.margin_bottom = margin;
		unique_id.set_text (font.unique_identifier);
		unique_id.text_changed.connect ((t) => {
			font.unique_identifier = t;
			font.touch ();
		});
		widgets.add (unique_id);
		focus_ring.add (unique_id);
		
		widgets.add (new Text (t_("Version"), label_size, label_margin));
		version.margin_bottom = margin;
		version.set_text (font.version);
		version.text_changed.connect ((t) => {
			font.version = t;
			font.touch ();
		});
		widgets.add (version);
		focus_ring.add (version);

		widgets.add (new Text (t_("Description"), label_size, label_margin));
		description.margin_bottom = margin;
		description.set_text (font.description);
		description.scroll.connect (scroll_event);
		description.text_changed.connect ((t) => {
			font.description = t;
			font.touch ();
		});
		widgets.add (description);
		focus_ring.add (description);
		
		widgets.add (new Text (t_("Copyright"), label_size, label_margin));
		copyright.margin_bottom = margin;
		copyright.set_text (font.copyright);
		copyright.scroll.connect (scroll_event);
		copyright.text_changed.connect ((t) => {
			font.copyright = t;
			font.touch ();
		});
		copyright.set_editable (!disable_copyright);
		widgets.add (copyright);
		focus_ring.add (copyright);

		widgets.add (new Text (t_("License"), label_size, label_margin));
		license.margin_bottom = margin;
		license.set_text (font.license);
		license.scroll.connect (scroll_event);
		license.text_changed.connect ((t) => {
			font.license = t;
			font.touch ();
		});
		license.set_editable (!disable_copyright);
		widgets.add (license);
		focus_ring.add (license);

		widgets.add (new Text (t_("License URL"), label_size, label_margin));
		license_url.margin_bottom = margin;
		license_url.set_text (font.license_url);
		license_url.scroll.connect (scroll_event);
		license_url.text_changed.connect ((t) => {
			font.license_url = t;
			font.touch ();
		});
		license_url.set_editable (!disable_copyright);
		widgets.add (license_url);
		focus_ring.add (license_url);

		widgets.add (new Text (t_("Trademark"), label_size, label_margin));
		trademark.margin_bottom = margin;
		trademark.set_text (font.trademark);
		trademark.scroll.connect (scroll_event);
		trademark.text_changed.connect ((t) => {
			font.trademark = t;
			font.touch ();
		});
		trademark.set_editable (!disable_copyright);
		widgets.add (trademark);
		focus_ring.add (trademark);

		widgets.add (new Text (t_("Manufacturer"), label_size, label_margin));
		manufacturer.margin_bottom = margin;
		manufacturer.set_text (font.manufacturer);
		manufacturer.scroll.connect (scroll_event);
		manufacturer.text_changed.connect ((t) => {
			font.manufacturer = t;
			font.touch ();
		});
		widgets.add (manufacturer);
		focus_ring.add (manufacturer);

		widgets.add (new Text (t_("Designer"), label_size, label_margin));
		designer.margin_bottom = margin;
		designer.set_text (font.designer);
		designer.scroll.connect (scroll_event);
		designer.text_changed.connect ((t) => {
			font.designer = t;
			font.touch ();
		});
		widgets.add (designer);
		focus_ring.add (designer);

		widgets.add (new Text (t_("Vendor URL"), label_size, label_margin));
		vendor_url.margin_bottom = margin;
		vendor_url.set_text (font.vendor_url);
		vendor_url.scroll.connect (scroll_event);
		vendor_url.text_changed.connect ((t) => {
			font.vendor_url = t;
			font.touch ();
		});
		widgets.add (vendor_url);
		focus_ring.add (vendor_url);

		widgets.add (new Text (t_("Designer URL"), label_size, label_margin));
		designer_url.margin_bottom = margin;
		designer_url.set_text (font.designer_url);
		designer_url.scroll.connect (scroll_event);
		designer_url.text_changed.connect ((t) => {
			font.designer_url = t;
			font.touch ();
		});
		widgets.add (designer_url);
		focus_ring.add (designer_url);
				
		set_focus (postscript_name);
		
		foreach (Widget w in widgets) {
			if (w is Text) {
				Theme.text_color ((Text) w, "Text Foreground");
			}
		}
	}

	public static void set_copyright_editable (bool t) {
		disable_copyright = !t;
	}

	public override string get_label () {
		return t_("Name and Description");
	}

	public override string get_name () {
		return "Description";
	}
	
	public override void selected_canvas () {
		copyright.set_editable (!disable_copyright);
		base.selected_canvas ();
	}
	
	public void paste (string text) {
		if (0 <= focus_index < focus_ring.size) {
			Widget widget = focus_ring.get (focus_index);
			
			if (widget is TextArea) {
				TextArea text_area = (TextArea) widget;
				text_area.insert_text (text);
			}
		}
	}
	
	public string get_copy_selection () {
		if (0 <= focus_index < focus_ring.size) {
			Widget widget = focus_ring.get (focus_index);
			
			if (widget is TextArea) {
				TextArea text_area = (TextArea) widget;
				return text_area.get_selected_text ();
			}
		}
		
		return "";
	}
}

}

Contact

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