From 2037538e828f3fb7e8ba21b589bc3dacea612198 Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Mon, 20 May 2019 18:00:31 -0400 Subject: [PATCH 1/5] Project Folder now has open in submenu. - Refactored existing FolderItem "open in" menu code to a separate function. - ProjectFolderItem uses this method --- src/FolderManager/FolderItem.vala | 80 +++++++++++++----------- src/FolderManager/ProjectFolderItem.vala | 11 ++++ 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 03ff4a0f6a..6150ad2669 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -61,47 +61,19 @@ namespace Scratch.FolderManager { } public override Gtk.Menu? get_context_menu () { - var other_menuitem = new Gtk.MenuItem.with_label (_("Other Application…")); - other_menuitem.activate.connect (() => show_app_chooser (file)); - - var open_in_menu = new Gtk.Menu (); - var contractor_menu = new Gtk.Menu (); GLib.FileInfo info = null; + string file_type = ""; try { info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, 0); + file_type = info.get_attribute_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE); } catch (Error e) { warning (e.message); } if (info != null) { - var file_type = info.get_attribute_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE); - - List external_apps = GLib.AppInfo.get_all_for_type (file_type); - - foreach (AppInfo app_info in external_apps) { - if (app_info.get_id () == GLib.Application.get_default ().application_id + ".desktop") { - continue; - } - - var menuitem_icon = new Gtk.Image.from_gicon (app_info.get_icon (), Gtk.IconSize.MENU); - menuitem_icon.pixel_size = 16; - - var menuitem_grid = new Gtk.Grid (); - menuitem_grid.add (menuitem_icon); - menuitem_grid.add (new Gtk.Label (app_info.get_name ())); - - var item_app = new Gtk.MenuItem (); - item_app.add (menuitem_grid); - - item_app.activate.connect (() => { - launch_app_with_file (app_info, file.file); - }); - open_in_menu.add (item_app); - } - try { var contracts = Granite.Services.ContractorProxy.get_contracts_by_mime (file_type); foreach (var contract in contracts) { @@ -114,12 +86,6 @@ namespace Scratch.FolderManager { } } - open_in_menu.add (new Gtk.SeparatorMenuItem ()); - open_in_menu.add (other_menuitem); - - var open_in_item = new Gtk.MenuItem.with_label (_("Open In")); - open_in_item.submenu = open_in_menu; - var contractor_item = new Gtk.MenuItem.with_label (_("Other Actions")); contractor_item.submenu = contractor_menu; @@ -133,7 +99,7 @@ namespace Scratch.FolderManager { delete_item.activate.connect (trash); var menu = new Gtk.Menu (); - menu.append (open_in_item); + menu.append (create_submenu_for_openin (info, file_type)); menu.append (contractor_item); menu.append (new Gtk.SeparatorMenuItem ()); menu.append (create_submenu_for_new ()); @@ -144,6 +110,46 @@ namespace Scratch.FolderManager { return menu; } + protected Gtk.MenuItem create_submenu_for_openin (GLib.FileInfo? info, string file_type) { + var other_menuitem = new Gtk.MenuItem.with_label (_("Other Application…")); + other_menuitem.activate.connect (() => show_app_chooser (file)); + + var open_in_menu = new Gtk.Menu (); + + if (info != null) { + List external_apps = GLib.AppInfo.get_all_for_type (file_type); + + foreach (AppInfo app_info in external_apps) { + if (app_info.get_id () == GLib.Application.get_default ().application_id + ".desktop") { + continue; + } + + var menuitem_icon = new Gtk.Image.from_gicon (app_info.get_icon (), Gtk.IconSize.MENU); + menuitem_icon.pixel_size = 16; + + var menuitem_grid = new Gtk.Grid (); + menuitem_grid.add (menuitem_icon); + menuitem_grid.add (new Gtk.Label (app_info.get_name ())); + + var item_app = new Gtk.MenuItem (); + item_app.add (menuitem_grid); + + item_app.activate.connect (() => { + launch_app_with_file (app_info, file.file); + }); + open_in_menu.add (item_app); + } + } + + open_in_menu.add (new Gtk.SeparatorMenuItem ()); + open_in_menu.add (other_menuitem); + + var open_in_item = new Gtk.MenuItem.with_label (_("Open In")); + open_in_item.submenu = open_in_menu; + + return open_in_item; + } + protected Gtk.MenuItem create_submenu_for_new () { var new_folder_item = new Gtk.MenuItem.with_label (_("Folder")); new_folder_item.activate.connect(() => add_folder ()); diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index f32e7a53a5..46166852c0 100644 --- a/src/FolderManager/ProjectFolderItem.vala +++ b/src/FolderManager/ProjectFolderItem.vala @@ -84,8 +84,19 @@ namespace Scratch.FolderManager { trash (); }); + GLib.FileInfo info = null; + string file_type = ""; + + try { + info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, 0); + file_type = info.get_attribute_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE); + } catch (Error e) { + warning (e.message); + } + var menu = new Gtk.Menu (); menu.append (close_item); + menu.append (create_submenu_for_openin (info, file_type)); menu.append (create_submenu_for_new ()); menu.append (delete_item); From e923879771f69c03458f98e85ee31c7f553483a4 Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Mon, 20 May 2019 18:21:36 -0400 Subject: [PATCH 2/5] Updated function name to match conventions --- src/FolderManager/FolderItem.vala | 4 ++-- src/FolderManager/ProjectFolderItem.vala | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 6150ad2669..884a012f55 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -99,7 +99,7 @@ namespace Scratch.FolderManager { delete_item.activate.connect (trash); var menu = new Gtk.Menu (); - menu.append (create_submenu_for_openin (info, file_type)); + menu.append (create_submenu_for_open_in (info, file_type)); menu.append (contractor_item); menu.append (new Gtk.SeparatorMenuItem ()); menu.append (create_submenu_for_new ()); @@ -110,7 +110,7 @@ namespace Scratch.FolderManager { return menu; } - protected Gtk.MenuItem create_submenu_for_openin (GLib.FileInfo? info, string file_type) { + protected Gtk.MenuItem create_submenu_for_open_in (GLib.FileInfo? info, string file_type) { var other_menuitem = new Gtk.MenuItem.with_label (_("Other Application…")); other_menuitem.activate.connect (() => show_app_chooser (file)); diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index 46166852c0..f72ad16215 100644 --- a/src/FolderManager/ProjectFolderItem.vala +++ b/src/FolderManager/ProjectFolderItem.vala @@ -96,7 +96,7 @@ namespace Scratch.FolderManager { var menu = new Gtk.Menu (); menu.append (close_item); - menu.append (create_submenu_for_openin (info, file_type)); + menu.append (create_submenu_for_open_in (info, file_type)); menu.append (create_submenu_for_new ()); menu.append (delete_item); From 4d6f4aaac25cd3467ea9f9d6e29330a5d73acee4 Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Wed, 22 May 2019 11:05:02 -0400 Subject: [PATCH 3/5] Implemented requested changes. --- src/FolderManager/FolderItem.vala | 10 ++++++---- src/FolderManager/ProjectFolderItem.vala | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 884a012f55..491800b467 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -64,11 +64,11 @@ namespace Scratch.FolderManager { var contractor_menu = new Gtk.Menu (); GLib.FileInfo info = null; - string file_type = ""; + unowned string? file_type = null; try { - info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, 0); - file_type = info.get_attribute_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE); + info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, GLib.FileQueryInfoFlags.NONE); + file_type = info.get_content_type(); } catch (Error e) { warning (e.message); } @@ -110,10 +110,12 @@ namespace Scratch.FolderManager { return menu; } - protected Gtk.MenuItem create_submenu_for_open_in (GLib.FileInfo? info, string file_type) { + protected Gtk.MenuItem create_submenu_for_open_in (GLib.FileInfo? info, string? file_type) { var other_menuitem = new Gtk.MenuItem.with_label (_("Other Application…")); other_menuitem.activate.connect (() => show_app_chooser (file)); + file_type = file_type ?? "inode/directory"; + var open_in_menu = new Gtk.Menu (); if (info != null) { diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index f72ad16215..ddd5642554 100644 --- a/src/FolderManager/ProjectFolderItem.vala +++ b/src/FolderManager/ProjectFolderItem.vala @@ -85,11 +85,11 @@ namespace Scratch.FolderManager { }); GLib.FileInfo info = null; - string file_type = ""; + unowned string? file_type = null; try { - info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, 0); - file_type = info.get_attribute_string (GLib.FileAttribute.STANDARD_CONTENT_TYPE); + info = file.file.query_info (GLib.FileAttribute.STANDARD_CONTENT_TYPE, GLib.FileQueryInfoFlags.NONE); + file_type = info.get_content_type(); } catch (Error e) { warning (e.message); } From 2d2d0ea5a3c60a220863a61be3ffbec9397beb8a Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Tue, 2 Jul 2019 13:48:59 -0400 Subject: [PATCH 4/5] Remove static call from loop to increase performance. --- src/FolderManager/FolderItem.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 491800b467..7a156dadee 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -120,9 +120,11 @@ namespace Scratch.FolderManager { if (info != null) { List external_apps = GLib.AppInfo.get_all_for_type (file_type); + + string this_id = GLib.Application.get_default ().application_id + ".desktop"; foreach (AppInfo app_info in external_apps) { - if (app_info.get_id () == GLib.Application.get_default ().application_id + ".desktop") { + if (app_info.get_id () == this_id) { continue; } From 7ffedf2d1f48f641c8cfd451b6d15fa8e8218c52 Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Wed, 3 Jul 2019 13:01:16 -0400 Subject: [PATCH 5/5] Only show separator if default apps are found. --- src/FolderManager/FolderItem.vala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 7a156dadee..ca92a703df 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -145,7 +145,10 @@ namespace Scratch.FolderManager { } } - open_in_menu.add (new Gtk.SeparatorMenuItem ()); + if (open_in_menu.get_children ().length () > 0) { + open_in_menu.add (new Gtk.SeparatorMenuItem ()); + } + open_in_menu.add (other_menuitem); var open_in_item = new Gtk.MenuItem.with_label (_("Open In"));