From 33745f1d146dda1748dc2b829c24e0260104c6e4 Mon Sep 17 00:00:00 2001 From: Shubham Arora Date: Fri, 19 Oct 2018 12:07:36 +0530 Subject: [PATCH 1/2] Show all templates in a sub menu --- src/FolderManager/FolderItem.vala | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 67b2426bf5..4741b2cbc9 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -27,6 +27,9 @@ namespace Scratch.FolderManager { private GLib.FileMonitor monitor; private bool children_loaded = false; private string? newly_created_path = null; + private GLib.HashTable templates; + + const int MAX_TEMPLATES = 32; public FolderItem (File file, FileView view) requires (file.is_valid_directory) { Object (file: file, view: view); @@ -154,6 +157,8 @@ namespace Scratch.FolderManager { var new_menu = new Gtk.Menu (); new_menu.append (new_folder_item); new_menu.append (new_file_item); + new_menu.append (new Gtk.SeparatorMenuItem ()); + new_menu.append (create_submenu_for_templates ()); var new_item = new Gtk.MenuItem.with_label (_("New")); new_item.set_submenu (new_menu); @@ -161,6 +166,87 @@ namespace Scratch.FolderManager { return new_item; } + protected Gtk.MenuItem create_submenu_for_templates () { + templates = new GLib.HashTable (direct_hash, direct_equal); + var template_path = GLib.Environment.get_user_special_dir (GLib.UserDirectory.TEMPLATES); + var template_folder = GLib.File.new_for_path (template_path); + load_templates_from_folder (template_folder); + + if (templates.length == 0 ) { + return null; + } + + var templates_menu = new Gtk.Menu (); + GLib.List keys = templates.get_keys (); + + templates.@foreach ((key, val) => { + var folder = key.get_basename (); + var label = val.get_basename (); + var ftype = val.query_file_type (GLib.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null); + if (ftype == GLib.FileType.DIRECTORY) { + if (folder != "Templates") { + } + } else { + // if (folder == "Templates") { + var template_menu_item = new Gtk.MenuItem.with_label (_(label)); + templates_menu.append (template_menu_item); + // } + } + }); + + var template_item = new Gtk.MenuItem.with_label (_("Templates")); + template_item.set_submenu (templates_menu); + + return template_item; + } + + private void load_templates_from_folder (GLib.File template_folder) { + GLib.List file_list = null; + GLib.List folder_list = null; + + GLib.FileEnumerator enumerator; + var f_attr = GLib.FileAttribute.STANDARD_NAME + GLib.FileAttribute.STANDARD_TYPE; + var flags = GLib.FileQueryInfoFlags.NOFOLLOW_SYMLINKS; + try { + enumerator = template_folder.enumerate_children (f_attr, flags, null); + uint count = templates.length; + GLib.File location; + GLib.FileInfo? info = enumerator.next_file (null); + + while (count < MAX_TEMPLATES && (info != null)) { + location = template_folder.get_child (info.get_name ()); + if (info.get_file_type () == GLib.FileType.DIRECTORY) { + folder_list.prepend (location); + } else { + file_list.prepend (location); + count ++; + } + + info = enumerator.next_file (null); + } + } catch (GLib.Error error) { + return; + } + + if (file_list.length () > 0) { + file_list.sort ((a,b) => { + return strcmp (a.get_basename ().down (), b.get_basename ().down ()); + }); + + foreach (var file in file_list) { + templates.insert (file.get_parent (), file); + } + + } + + if (folder_list.length () > 0) { + /* recursively load templates from subdirectories */ + folder_list.@foreach ((folder) => { + load_templates_from_folder (folder); + }); + } + } + private void add_children () { foreach (var child in file.children) { if (child.is_valid_directory) { From b05534966fad3a83bd4efd4920260d6711bcafe4 Mon Sep 17 00:00:00 2001 From: Shubham Arora Date: Sat, 20 Oct 2018 10:35:45 +0530 Subject: [PATCH 2/2] Show folders and subfolders in menu --- src/FolderManager/FolderItem.vala | 42 +++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 4741b2cbc9..90baa2851b 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -158,7 +158,12 @@ namespace Scratch.FolderManager { new_menu.append (new_folder_item); new_menu.append (new_file_item); new_menu.append (new Gtk.SeparatorMenuItem ()); - new_menu.append (create_submenu_for_templates ()); + + var items = create_submenu_for_templates (); + items.@foreach ((item) => { + new_menu.append (item); + return true; + }); var new_item = new Gtk.MenuItem.with_label (_("New")); new_item.set_submenu (new_menu); @@ -166,7 +171,8 @@ namespace Scratch.FolderManager { return new_item; } - protected Gtk.MenuItem create_submenu_for_templates () { + protected Gee.ArrayList create_submenu_for_templates () { + var template_items = new Gee.ArrayList (); templates = new GLib.HashTable (direct_hash, direct_equal); var template_path = GLib.Environment.get_user_special_dir (GLib.UserDirectory.TEMPLATES); var template_folder = GLib.File.new_for_path (template_path); @@ -178,6 +184,11 @@ namespace Scratch.FolderManager { var templates_menu = new Gtk.Menu (); GLib.List keys = templates.get_keys (); + var keys_hash = new Gee.HashSet(); + templates.@foreach ((key, val) => { + keys_hash.add (key); + }); + templates.@foreach ((key, val) => { var folder = key.get_basename (); @@ -187,17 +198,38 @@ namespace Scratch.FolderManager { if (folder != "Templates") { } } else { - // if (folder == "Templates") { + if (folder == "Templates") { var template_menu_item = new Gtk.MenuItem.with_label (_(label)); + template_menu_item.activate.connect(() => critical (label + " clicked")); templates_menu.append (template_menu_item); - // } + } else { + + } } }); var template_item = new Gtk.MenuItem.with_label (_("Templates")); template_item.set_submenu (templates_menu); + template_items.add (template_item); + + keys_hash.@foreach ((item) => { + if (item.get_basename () != "Templates") { + var templates_submenu = new Gtk.Menu (); + templates.@foreach((key, val) => { + if (key == item) { + var t_item = new Gtk.MenuItem.with_label (templates.get (key).get_basename ()); + t_item.activate.connect(() => critical (templates.get (key).get_basename () + " clicked")); + templates_submenu.append (t_item); + } + }); + var sub_menu_item = new Gtk.MenuItem.with_label (_(item.get_basename ())); + sub_menu_item.set_submenu (templates_submenu); + template_items.add (sub_menu_item); + } + return true; + }); - return template_item; + return template_items; } private void load_templates_from_folder (GLib.File template_folder) {