Clone in a terminal:
Commit 7a3d713
Johan Mattsson - 2015-03-28T18:25:21+00:00
7a3d713c3ee784ddf8eb06bf1ec332624ddb81a9johan.mattsson.m@gmail.com

Recent file tab

Changed files (1)

Diff

diff --git a/libbirdfont/RecentFiles.vala b/libbirdfont/RecentFiles.valanew file mode 100644index 0000000..24e9cb4--- /dev/null+++ b/libbirdfont/RecentFiles.vala@@ -0,0 +1,245 @@+/*+    Copyright (C) 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 {++/** A list of recently edited fonts. */+public class RecentFiles : Table {+	Gee.ArrayList<Row> rows = new Gee.ArrayList<Row> ();+	+	const int RECENT_FONT = -2;+	const int BACKUP = -3;+	+	public RecentFiles () {+	}++	public override Gee.ArrayList<Row> get_rows () {+		return rows;+	}++	public override void selected_row (Row row, int column, bool delete_button) {	+		Font f;++		if (row.get_index () == RECENT_FONT) {+			return_if_fail (row.get_row_data () is Font);+			f = (Font) row.get_row_data ();+			load_font (f.get_path ());+		}+				+		if (row.get_index () == BACKUP) {+			return_if_fail (row.get_row_data () is Font);+			f = (Font) row.get_row_data ();+			delete_backup (f.get_file_name ());+		}+	}++	public override void update_rows () {+		Row row;+		Gee.ArrayList<Font> recent_fonts = get_recent_font_files ();+		Gee.ArrayList<Font> backups = get_backups ();+		+		rows.clear ();++		if (recent_fonts.size > 0) {			+			row = new Row.headline (t_("Recent Files"));+			rows.add (row);	+		}+		+		foreach (Font font in recent_fonts) {+			row = new Row.columns_1 (font.get_file_name (), RECENT_FONT, false);+			row.set_row_data (font);+			rows.add (row);+		}++		if (backups.size > 0) {			+			row = new Row.headline (t_("Backups"));+			rows.add (row);	+		}+		+		foreach (Font font in backups) {+			row = new Row.columns_1 (font.get_file_name (), BACKUP, true);+			row.set_row_data (font);+			rows.add (row);+		}+		+		GlyphCanvas.redraw ();+	}++	public override string get_label () {+		return t_("Files");+	}++	public override string get_name () {+		return "Files";+	}++	public Gee.ArrayList<Font> get_recent_font_files () {+		File file;+		Font font;+		bool unique;+		Gee.ArrayList<Font> fonts = new Gee.ArrayList<Font> ();++		foreach (string f in Preferences.get_recent_files ()) {+			if (f == "") {+				continue;+			}+			+			file = File.new_for_path (f);++			font = new Font ();+			font.set_font_file (f);++			unique = true;+			foreach (Font recent_font in fonts) {+				if (recent_font.get_path () == f) {+					unique = false;+				}+			}+			+			if (unique && file.query_exists ()) { +				fonts.insert (0, font);+			}+		}+		+		return fonts;	+	}++	public Gee.ArrayList<Font> get_backups () {+		FileEnumerator enumerator;+		string file_name;+		FileInfo? file_info;+		Gee.ArrayList<Font> backups = new Gee.ArrayList<Font> ();+		File dir = BirdFont.get_backup_directory ();+		Font font = BirdFont.get_current_font ();+		Font backup_font;++		try {+			enumerator = dir.enumerate_children (FileAttribute.STANDARD_NAME, 0);+			while ((file_info = enumerator.next_file ()) != null) {+				file_name = ((!) file_info).get_name ();+				+				// ignore old backup files+				if (file_name.has_prefix ("current_font_")) {+					continue;+				}+				+				// ignore backup of the current font+				if (file_name == @"$(font.get_name ()).bf") {+					continue;+				}+				+				backup_font = new Font ();+				backup_font.set_font_file ((!) get_child (dir, file_name).get_path ());+				backups.insert (0, backup_font);+			}+		} catch (Error e) {+			warning (e.message);+		}+    +		return backups;	+	}++	public void delete_backup (string file_name) {+		File backup_file;+		+		try {+			backup_file = BirdFont.get_backup_directory ();+			backup_file = get_child (backup_file, file_name);+			if (backup_file.query_exists ()) {+				backup_file.delete ();	+			}+		} catch (GLib.Error e) {+			warning (e.message);+		}+		+		selected_canvas ();+	}+	+	public static void load_font (string fn) {+		Font font;+		SaveDialogListener dialog = new SaveDialogListener ();++		if (MenuTab.suppress_event) {+			return;+		}+		+		font = BirdFont.get_current_font ();++		MenuTab.load_callback = new LoadCallback ();+		MenuTab.load_callback.file_loaded.connect (() => {+			Font f;++			if (MenuTab.suppress_event) {+				return;+			}+				+			f = BirdFont.get_current_font ();+			+			MainWindow.get_drawing_tools ().remove_all_grid_buttons ();+			foreach (string v in f.grid_width) {+				MainWindow.get_drawing_tools ().parse_grid (v);+			}+			+			DrawingTools.background_scale.set_value (f.background_scale);+			KerningTools.update_kerning_classes ();+			MenuTab.show_all_available_characters ();+		});+		+		dialog.signal_discard.connect (() => {+			Font f;++			if (MenuTab.suppress_event) {+				return;+			}+					+			f = BirdFont.new_font ();+			+			MainWindow.clear_glyph_cache ();+			MainWindow.close_all_tabs ();+			+			f.set_file (fn);+			Preferences.add_recent_files (fn);+			+			MainWindow.native_window.load (); // background thread+		});++		dialog.signal_save.connect (() => {+			if (MenuTab.suppress_event) {+				warn_if_test ("Event suppressed.");+				return;+			}+			+			MenuTab.set_save_callback (new SaveCallback ());+			MenuTab.save_callback.file_saved.connect (() => {+				dialog.signal_discard ();+			});+			MenuTab.save_callback.save (); // background thread+		});++		dialog.signal_cancel.connect (() => {+			MainWindow.hide_dialog ();+		});+				+		if (!font.is_modified ()) {+			dialog.signal_discard ();+		} else {+			MainWindow.show_dialog (new SaveDialog (dialog));+		}+	}+}++}

Contact

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