The Birdfont Source Code
Use table in recent files tab
These changes was commited to the Birdfont repository Sat, 28 Mar 2015 18:20:27 +0000.
Contributing
Send patches or pull requests to johan.mattsson.m@gmail.com.
Clone this repository: git clone https://github.com/johanmattssonm/birdfont.git
Use table in recent files tab
--- a/birdfont/GtkWindow.vala
+++ b/birdfont/GtkWindow.vala
@@ -239,7 +239,8 @@
}
public void set_scrollbar_size (double size) {
- scrollbar.adjustment.page_size = size;
+ scrollbar.adjustment.page_size = size;
+ scrollbar.set_visible (size != 0);
}
public void set_scrollbar_position (double position) {
--- a/libbirdfont/BirdFont.vala
+++ b/libbirdfont/BirdFont.vala
@@ -533,7 +533,7 @@
public static void load_font_from_command_line () {
string file = args.get_file ();
if (file != "") {
- FileTab.load_font (file);
+ RecentFiles.load_font (file);
}
}
@@ -590,16 +590,6 @@
}
return backup;
- }
-
- internal static File get_thumbnail_directory () {
- File thumbnails = get_child (get_settings_directory (), "thumbnails");
-
- if (!thumbnails.query_exists ()) {
- DirUtils.create ((!) thumbnails.get_path (), 0755);
- }
-
- return thumbnails;
}
internal static File get_settings_directory () {
--- a/libbirdfont/FileTab.vala
+++ /dev/null
@@ -1,518 +1,1 @@
- /*
- Copyright (C) 2013 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 FileTab : FontDisplay {
-
- int scroll = 0;
- int visible_rows = 0;
- double row_height;
- double top;
- WidgetAllocation allocation = new WidgetAllocation ();
- Gee.ArrayList<Font> recent_fonts = new Gee.ArrayList<Font> ();
- Gee.ArrayList<string> backups = new Gee.ArrayList<string> (); // FIXME: use ref counted object
-
- Button create_new_font;
-
- public signal void open_file ();
-
- public FileTab () {
- row_height = 30 * MainWindow.units;
- top = 2 * row_height;
- create_new_font = new Button (t_("New Font"));
- create_new_font.widget_x = 50 * MainWindow.units;
- create_new_font.widget_y = top + 20 * MainWindow.units;
-
- create_new_font.action.connect (() => {
- MenuTab.new_file ();
- });
- }
-
- 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));
- }
- }
-
- public void load_backup (string file_name) {
- File backup_file;
-
- if (MenuTab.suppress_event) {
- return;
- }
-
- backup_file = BirdFont.get_backup_directory ();
- backup_file = get_child (backup_file, file_name);
- load_font ((!) backup_file.get_path ());
- }
-
- public void delete_backup (string file_name) {
- File backup_file;
-
- if (MenuTab.suppress_event) {
- return;
- }
-
- 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 override void button_press (uint button, double ex, double ey) {
- if (recent_fonts.size == 0 && !has_backup ()) {
- create_new_font.button_press (button, ex, ey);
- }
- }
-
- public override void button_release (int button, double ex, double ey) {
- int r, i;
-
- if (MenuTab.suppress_event) {
- return;
- }
-
- return_if_fail (!is_null(this));
-
- r = (int) rint ((ey - 17) / row_height) + scroll;
- i = scroll;
-
- if (scroll == 0) {
- i += 2; // heading
- } else {
- i -= scroll; // no headline
- }
-
- if (button != 1) {
- return;
- }
-
- if (is_null (recent_fonts)) {
- warning ("No recent fonts");
- return;
- }
-
- foreach (Font font in recent_fonts) {
-
- if (is_null (font)) {
- warning ("Can't find font in list.");
- break;
- }
-
- if (is_null (font.font_file)) {
- warning ("File is not set for font.");
- break;
- }
-
- if (i == r) {
- load_font ((!) font.font_file);
- open_file ();
-
- // open_file will close this tab and the list of files
- // will be deleted here.
-
- return;
- }
- i++;
- }
-
- if (is_null (backups)) {
- // FIXME:
- // warning ("No backups");
- return;
- }
-
- i += 2;
- foreach (string backup in backups) {
- if (i == r) {
- if (ex < 35) {
- delete_backup (backup);
- } else {
- load_backup (backup);
- open_file ();
- return;
- }
- }
- i++;
- }
- }
-
- public override void draw (WidgetAllocation allocation, Context cr) {
- double y = 0;
- int s = 0;
- bool color = (scroll % 2) == 0;
-
- this.allocation = allocation;
-
- if (scroll == 0) {
- y += top;
- }
-
- visible_rows = (int) (allocation.height / row_height);
-
- cr.save ();
- Theme.color (cr, "Background 1");
- cr.rectangle (0, 0, allocation.width, allocation.height);
- cr.fill ();
- cr.restore ();
-
- if (recent_fonts.size == 0 && !has_backup ()) {
- cr.save ();
- Theme.color (cr, "Foreground 2");
- cr.set_font_size (18 * MainWindow.units);
- cr.move_to (50 * MainWindow.units, top - 9 * MainWindow.units);
- cr.show_text (t_("No fonts created yet."));
- cr.restore ();
-
- create_new_font.draw (cr);
- }
-
- if (scroll == 0 && recent_fonts.size > 0) {
- cr.save ();
- Theme.color (cr, "Foreground 2");
- cr.set_font_size (18 * MainWindow.units);
- cr.move_to (50 * MainWindow.units, top - 9 * MainWindow.units);
- cr.show_text (t_("Recent files"));
- cr.restore ();
- }
-
- cr.save ();
- Theme.color (cr, "Background 5");
- cr.set_font_size (12 * MainWindow.units);
-
- foreach (Font font in recent_fonts) {
- if (s++ >= scroll) {
- draw_file_row (allocation, cr, font, color, y);
- y += row_height;
- color = !color;
- }
- }
-
- if (has_backup ()) {
- color = true;
-
- if (s >= scroll) {
- cr.save ();
- Theme.color (cr, "Background 5");
- cr.set_font_size (18 * MainWindow.units);
- cr.move_to (50 * MainWindow.units, y + 2 * row_height - 9 * MainWindow.units);
- cr.show_text (t_("Backup"));
- cr.restore ();
- s += 2;
- y += 2 * row_height;
- }
-
- foreach (string backup in backups) {
- if (s++ >= scroll) {
- draw_backup_row (allocation, cr, backup, color, y);
- y += row_height;
- color = !color;
- }
- }
- }
-
- cr.restore ();
- }
-
- private void draw_file_row (WidgetAllocation allocation, Context cr, Font font, bool color, double y) {
- string fn = (!) font.font_file;
- Text file;
-
- fn = fn.substring (fn.replace ("\\", "/").last_index_of ("/") + 1);
- draw_background (cr, allocation, y, color);
-
- file = new Text (fn);
- Theme.text_color (file, "Foreground 6");
- file.widget_x = 50 * MainWindow.units;
- file.widget_y = y + 5 * MainWindow.units;
- file.draw (cr);
- }
-
- private void draw_backup_row (WidgetAllocation allocation, Context cr, string backup, bool color, double y) {
- File thumbnail;
- double u = MainWindow.units;
-
- thumbnail = get_child (BirdFont.get_thumbnail_directory (), backup);
-
- draw_background (cr, allocation, y, color);
-
- cr.move_to (50 * u, y + row_height / 2 + 5 * u);
- cr.show_text (backup);
-
- // draw x
- cr.move_to ((35 - 5) * u, y + row_height / 2 + (12 - 14) * u);
- cr.line_to ((35 - 10) * u, y + row_height / 2 + (12 - 9) * u);
-
- cr.move_to ((35 - 10) * u, y + row_height / 2 + (12 - 14) * u);
- cr.line_to ((35 - 5) * u, y + row_height / 2 + (12 - 9) * u);
-
- cr.stroke ();
- }
-
- void draw_background (Context cr, WidgetAllocation allocation, double y, bool color) {
- if (color) {
- draw_background_color (cr, allocation, y, 1);
- } else {
- draw_background_color (cr, allocation, y, 0.5);
- }
- }
-
- void draw_background_color (Context cr, WidgetAllocation allocation, double y, double opacity) {
- cr.save ();
- Theme.color_opacity (cr, "Background 10", opacity);
- cr.rectangle (0, y, allocation.width, row_height);
- cr.fill ();
- cr.restore ();
- }
-
- public override string get_label () {
- return t_("Files");
- }
-
- public override string get_name () {
- return "Files";
- }
-
- public override bool has_scrollbar () {
- return true;
- }
-
- public override void scroll_wheel_down (double x, double y) {
- uint r = rows ();
-
- if (r > visible_rows) {
- scroll += 2;
- }
-
- if (scroll > r - visible_rows) {
- scroll = (int) (r - visible_rows);
- }
-
- if (scroll < 0) {
- scroll = 0;
- }
-
- update_scrollbar ();
- redraw_area (0, 0, allocation.width, allocation.height);
- }
-
- public override void scroll_wheel_up (double x, double y) {
- scroll -= 2;
-
- if (scroll < 0) {
- scroll = 0;
- }
-
- update_scrollbar ();
- redraw_area (0, 0, allocation.width, allocation.height);
- }
-
- public override void selected_canvas () {
- update_recent_files ();
- update_scrollbar ();
-
- backups.clear ();
-
- backups = get_backups ();
- redraw_area (0, 0, allocation.width, allocation.height);
- }
-
- public override void update_scrollbar () {
- int r = rows ();
-
- if (r == 0 || visible_rows == 0) {
- MainWindow.set_scrollbar_size (0);
- MainWindow.set_scrollbar_position (0);
- } else {
- MainWindow.set_scrollbar_size ((double) visible_rows / r);
- MainWindow.set_scrollbar_position ((double) scroll / r);
- }
- }
-
- public override void scroll_to (double percent) {
- int r = rows ();
- scroll = (int) (percent * r);
-
- if (scroll > r - visible_rows) {
- scroll = (int) (r - visible_rows);
- }
-
- redraw_area (0, 0, allocation.width, allocation.height);
- }
-
- int rows () {
- int l = (int) (recent_fonts.size + backups.size);
-
- if (has_backup ()) {
- l += 2;
- }
-
- l += 2;
- return l;
- }
-
- public void update_recent_files () {
- Font font;
-
- recent_fonts.clear ();
-
- foreach (var f in Preferences.get_recent_files ()) {
- if (f == "") continue;
-
- File file = File.new_for_path (f);
-
- font = new Font ();
-
- font.set_font_file (f);
-
- if (file.query_exists ()) {
- recent_fonts.insert (0, font);
- }
- }
- }
-
- bool has_backup () {
- return backups.size > 0;
- }
-
- public static void delete_backups () {
- FileEnumerator enumerator;
- FileInfo? file_info;
- string file_name;
- File backup_file;
- File dir = BirdFont.get_backup_directory ();
-
- try {
- enumerator = dir.enumerate_children (FileAttribute.STANDARD_NAME, 0);
- while ((file_info = enumerator.next_file ()) != null) {
- file_name = ((!) file_info).get_name ();
- backup_file = get_child (dir, file_name);
- backup_file.delete ();
- }
- } catch (Error e) {
- warning (e.message);
- }
- }
-
- public Gee.ArrayList<string> get_backups () {
- FileEnumerator enumerator;
- string file_name;
- FileInfo? file_info;
- Gee.ArrayList<string> backups = new Gee.ArrayList<string> ();
- File dir = BirdFont.get_backup_directory ();
- Font font = BirdFont.get_current_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;
- }
-
- backups.insert (0, file_name);
- }
- } catch (Error e) {
- warning (e.message);
- }
-
- return backups;
- }
- }
-
- }
--- a/libbirdfont/LigatureList.vala
+++ b/libbirdfont/LigatureList.vala
@@ -107,11 +107,22 @@
rows.add (row);
i = 0;
+
+ if (ligatures.contextual_ligatures.size > 0) {
+ row = new Row.headline (t_("Contextual Substitutions"));
+ rows.add (row);
+ }
+
ligatures.get_contextual_ligatures ((liga) => {
row = new Row.columns_4 (liga.ligatures, liga.backtrack, liga.input, liga.lookahead, i);
rows.add (row);
i++;
});
+
+ if (ligatures.ligatures.size > 0) {
+ row = new Row.headline (t_("Ligatures"));
+ rows.add (row);
+ }
ligatures.get_ligatures ((subst, liga) => {
row = new Row.columns_3 (liga, "", subst, i);
--- a/libbirdfont/MainWindow.vala
+++ b/libbirdfont/MainWindow.vala
@@ -20,7 +20,7 @@
public static GlyphCanvas glyph_canvas;
public static MainWindow singleton;
public static MenuTab menu_tab;
- public static FileTab file_tab;
+ public static RecentFiles file_tab;
public static OverView over_view;
public static TabBar tabs;
public static NativeWindow native_window;
@@ -42,7 +42,7 @@
tabs = new TabBar ();
tools = new Toolbox (glyph_canvas, tabs);
menu_tab = new MenuTab ();
- file_tab = new FileTab ();
+ file_tab = new RecentFiles ();
over_view = new OverView();
kerning_display = new KerningDisplay ();
character_database = new CharDatabase ();
@@ -100,7 +100,7 @@
singleton = new MainWindow ();
}
- public static FileTab get_recent_files_tab () {
+ public static RecentFiles get_recent_files_tab () {
return file_tab;
}
--- a/libbirdfont/Row.vala
+++ b/libbirdfont/Row.vala
@@ -17,13 +17,17 @@
namespace BirdFont {
public class Row : GLib.Object {
-
int index = 0;
bool delete_button = true;
+
+ public double y = 0;
public Gee.ArrayList<Text> column_text = new Gee.ArrayList<Text> ();
+
GLib.Object? row_data = null;
public static const int MAX_COLUMNS = 5;
+
+ public bool is_headline = false;
public int columns {
get {
@@ -37,6 +41,13 @@
this.delete_button = delete_button;
}
+ public Row.headline (string label) {
+ index = -1;
+ column_text.add (new Text (label, 25 * MainWindow.units));
+ delete_button = false;
+ is_headline = true;
+ }
+
public Row.columns_1 (string label, int index, bool delete_button = true) {
this.index = index;
column_text.add (new Text (label, 17 * MainWindow.units));
@@ -112,8 +123,12 @@
public void set_index (int index) {
this.index = index;
+ }
+
+ public double get_height () {
+ return is_headline ? 75 * MainWindow.units : 25 * MainWindow.units;
}
}
}
--- a/libbirdfont/Table.vala
+++ b/libbirdfont/Table.vala
@@ -20,8 +20,9 @@
/** Table functions. */
public abstract class Table : FontDisplay {
- int scroll = 0;
- int visible_rows = 0;
+ double scroll = 0;
+ double page_height = 0;
+
WidgetAllocation allocation = new WidgetAllocation ();
Gee.ArrayList<int> column_width = new Gee.ArrayList<int> ();
@@ -30,12 +31,8 @@
public abstract void selected_row (Row row, int column, bool delete_button);
public override void draw (WidgetAllocation allocation, Context cr) {
- double y = 0;
- int s = 0;
bool color = (scroll + 1 % 2) == 0;
-
- layout ();
-
+
if (allocation.width != this.allocation.width
|| allocation.height != this.allocation.height) {
this.allocation = allocation;
@@ -43,7 +40,7 @@
update_scrollbar ();
}
- visible_rows = (int) (allocation.height / 18.0);
+ layout ();
cr.save ();
Theme.color (cr, "Background 1");
@@ -52,9 +49,15 @@
cr.restore ();
foreach (Row r in get_rows ()) {
- if (s++ >= scroll) {
- draw_row (allocation, cr, r, y, color, true);
- y += 25 * MainWindow.units;
+ if (scroll < r.y < scroll + allocation.height
+ || scroll < r.y + r.get_height () < scroll + allocation.height) {
+
+ if (r.is_headline) {
+ draw_headline (allocation, cr, r, r.y - scroll);
+ } else {
+ draw_row (allocation, cr, r, r.y - scroll, color, true);
+ }
+
color = !color;
}
}
@@ -69,6 +72,7 @@
column_width.add (0);
}
+ page_height = 0;
foreach (Row row in get_rows ()) {
return_if_fail (row.columns <= column_width.size);
@@ -84,7 +88,25 @@
column_width.set (i, width);
}
}
+
+ row.y = page_height;
+ page_height += row.get_height ();
}
+ }
+
+ private void draw_headline (WidgetAllocation allocation, Context cr,
+ Row row, double y) {
+
+ Text t;
+
+ cr.save ();
+ Theme.color (cr, "Foreground 1");
+ t = row.get_column (0);
+ t.widget_x = 40 * MainWindow.units;;
+ t.widget_y = y + 45 * MainWindow.units;
+ t.draw (cr);
+ cr.restore ();
+
}
private void draw_row (WidgetAllocation allocation, Context cr,
@@ -131,8 +153,6 @@
}
public override void button_release (int button, double ex, double ey) {
- int s = 0;
- double y = 0;
double x = 0;
int column = -1;
Row? selected = null;
@@ -141,34 +161,32 @@
if (button != 1) {
return;
}
-
+
foreach (Row r in get_rows ()) {
- if (s++ >= scroll) {
- if (y <= ey <= y + 25 * MainWindow.units) {
+ if (r.y <= ey + scroll <= r.y + r.get_height ()) {
+
+ x = 0;
+ for (int i = 0; i < r.columns; i++) {
+ return_if_fail (0 <= i < column_width.size);
- x = 0;
- for (int i = 0; i < r.columns; i++) {
- return_if_fail (0 <= i < column_width.size);
-
- if (x <= ex < x + column_width.get (i)) {
- column = i;
- }
-
- x += column_width.get (i);
+ if (x <= ex < x + column_width.get (i)) {
+ column = i;
}
- over_delete = (ex < 18 && r.has_delete_button ());
-
- if (over_delete) {
- column = -1;
- }
-
- selected = r;
-
- break;
+ x += column_width.get (i);
+ }
+
+ over_delete = (ex < 18 && r.has_delete_button ());
+
+ if (over_delete) {
+ column = -1;
}
- y += 25 * MainWindow.units;
+ if (!r.is_headline) {
+ selected = r;
+ }
+
+ break;
}
}
@@ -185,14 +203,13 @@
}
public override void scroll_wheel_down (double x, double y) {
- int nrows = get_rows ().size;
- scroll += 3;
+ scroll += 30;
- if (scroll > nrows - visible_rows) {
- scroll = (int) (nrows - visible_rows);
+ if (scroll > page_height - allocation.height) {
+ scroll = page_height - allocation.height;
}
- if (visible_rows > nrows) {
+ if (allocation.height > page_height) {
scroll = 0;
}
@@ -201,7 +218,7 @@
}
public override void scroll_wheel_up (double x, double y) {
- scroll -= 3;
+ scroll -= 30;
if (scroll < 0) {
scroll = 0;
@@ -212,23 +229,20 @@
}
public override void update_scrollbar () {
- uint rows = get_rows ().size;
-
- if (rows == 0 || visible_rows == 0) {
+ if (page_height == 0 || allocation.height >= page_height) {
MainWindow.set_scrollbar_size (0);
MainWindow.set_scrollbar_position (0);
} else {
- MainWindow.set_scrollbar_size ((double) visible_rows / rows);
- MainWindow.set_scrollbar_position ((double) scroll / rows);
+ MainWindow.set_scrollbar_size (allocation.height / page_height);
+ MainWindow.set_scrollbar_position (scroll / (page_height - allocation.height));
}
}
public override void scroll_to (double percent) {
- uint rows = get_rows ().size;
- scroll = (int) (percent * rows);
+ scroll = percent * page_height;
- if (scroll > rows - visible_rows) {
- scroll = (int) (rows - visible_rows);
+ if (scroll > page_height) {
+ scroll = (int) (page_height - allocation.height);
}
redraw_area (0, 0, allocation.width, allocation.height);