From 9024b6c5e9846c1a901edfc7e26c4a365c4af100 Mon Sep 17 00:00:00 2001
Date: Sat, 7 Dec 2019 22:14:08 +0100
Subject: [PATCH 1/1] Added menu options to create new folder/document
---
.../directorymenu/directorymenu-dialog.glade | 32 +++
plugins/directorymenu/directorymenu.c | 223 +++++++++++++++++-
2 files changed, 253 insertions(+), 2 deletions(-)
diff --git a/plugins/directorymenu/directorymenu-dialog.glade b/plugins/directorymenu/directorymenu-dialog.glade
index 3222deb2..9decdc48 100644
--- a/plugins/directorymenu/directorymenu-dialog.glade
+++ b/plugins/directorymenu/directorymenu-dialog.glade
@@ -172,6 +172,38 @@
2
+
+
+
+ 0
+ 4
+ 2
+
+
+
+
+
+ 0
+ 5
+ 2
+
+
diff --git a/plugins/directorymenu/directorymenu.c b/plugins/directorymenu/directorymenu.c
index a76bfcc8..9931a66b 100644
--- a/plugins/directorymenu/directorymenu.c
+++ b/plugins/directorymenu/directorymenu.c
@@ -38,6 +38,8 @@
#define DEFAULT_ICON_NAME "folder"
+#define DIALOG_RESPONSE_CREATE 0
+#define DIALOG_RESPONSE_OPEN 1
struct _DirectoryMenuPluginClass
{
@@ -55,6 +57,8 @@ struct _DirectoryMenuPlugin
gchar *icon_name;
guint open_folder;
guint open_in_terminal;
+ guint new_folder;
+ guint new_document;
gchar *file_pattern;
guint hidden_files : 1;
@@ -73,7 +77,9 @@ enum
PROP_FILE_PATTERN,
PROP_HIDDEN_FILES,
PROP_OPEN_FOLDER,
- PROP_OPEN_IN_TERMINAL
+ PROP_OPEN_IN_TERMINAL,
+ PROP_NEW_FOLDER,
+ PROP_NEW_DOCUMENT
};
@@ -153,6 +159,20 @@ directory_menu_plugin_class_init (DirectoryMenuPluginClass *klass)
TRUE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class,
+ PROP_NEW_FOLDER,
+ g_param_spec_boolean ("new-folder",
+ NULL, NULL,
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ PROP_NEW_DOCUMENT,
+ g_param_spec_boolean ("new-document",
+ NULL, NULL,
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class,
PROP_FILE_PATTERN,
g_param_spec_string ("file-pattern",
@@ -189,6 +209,8 @@ directory_menu_plugin_init (DirectoryMenuPlugin *plugin)
plugin->open_folder = TRUE;
plugin->open_in_terminal = TRUE;
+ plugin->new_folder = TRUE;
+ plugin->new_document = TRUE;
}
@@ -224,6 +246,14 @@ directory_menu_plugin_get_property (GObject *object,
g_value_set_boolean (value, plugin->open_in_terminal);
break;
+ case PROP_NEW_FOLDER:
+ g_value_set_boolean (value, plugin->new_folder);
+ break;
+
+ case PROP_NEW_DOCUMENT:
+ g_value_set_boolean (value, plugin->new_document);
+ break;
+
case PROP_FILE_PATTERN:
g_value_set_string (value, panel_str_is_empty (plugin->file_pattern) ?
"" : plugin->file_pattern);
@@ -290,6 +320,14 @@ directory_menu_plugin_set_property (GObject *object,
plugin->open_in_terminal = g_value_get_boolean (value);
break;
+ case PROP_NEW_FOLDER:
+ plugin->new_folder = g_value_get_boolean (value);
+ break;
+
+ case PROP_NEW_DOCUMENT:
+ plugin->new_document = g_value_get_boolean (value);
+ break;
+
case PROP_FILE_PATTERN:
g_free (plugin->file_pattern);
plugin->file_pattern = g_value_dup_string (value);
@@ -330,6 +368,8 @@ directory_menu_plugin_construct (XfcePanelPlugin *panel_plugin)
{ "icon-name", G_TYPE_STRING },
{ "open-folder", G_TYPE_BOOLEAN },
{ "open-in-terminal", G_TYPE_BOOLEAN },
+ { "new-folder", G_TYPE_BOOLEAN },
+ { "new-document", G_TYPE_BOOLEAN },
{ "file-pattern", G_TYPE_STRING },
{ "hidden-files", G_TYPE_BOOLEAN },
{ NULL }
@@ -500,6 +540,18 @@ directory_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
G_OBJECT (object), "active",
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+ object = gtk_builder_get_object (builder, "new-folder");
+ panel_return_if_fail (GTK_IS_CHECK_BUTTON (object));
+ g_object_bind_property (G_OBJECT (plugin), "new-folder",
+ G_OBJECT (object), "active",
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
+ object = gtk_builder_get_object (builder, "new-document");
+ panel_return_if_fail (GTK_IS_CHECK_BUTTON (object));
+ g_object_bind_property (G_OBJECT (plugin), "new-document",
+ G_OBJECT (object), "active",
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
object = gtk_builder_get_object (builder, "file-pattern");
panel_return_if_fail (GTK_IS_ENTRY (object));
g_object_bind_property (G_OBJECT (plugin), "file-pattern",
@@ -810,6 +862,138 @@ directory_menu_plugin_menu_open_folder (GtkWidget *mi,
+static void
+directory_menu_plugin_menu_name_entry_changed (GtkEditable *editable,
+ gpointer dialog)
+{
+ const gchar *text;
+ GtkWidget *create_button;
+ GtkWidget *open_button;
+
+ create_button = gtk_dialog_get_widget_for_response (GTK_DIALOG(dialog),
+ DIALOG_RESPONSE_CREATE);
+ open_button = gtk_dialog_get_widget_for_response (GTK_DIALOG(dialog),
+ DIALOG_RESPONSE_OPEN);
+
+ text = gtk_entry_get_text (GTK_ENTRY(editable));
+ if (strlen(text) > 0)
+ {
+ gtk_widget_set_sensitive (create_button, TRUE);
+ gtk_widget_set_sensitive (open_button, TRUE);
+ }
+ else
+ {
+ gtk_widget_set_sensitive (create_button, FALSE);
+ gtk_widget_set_sensitive (open_button, FALSE);
+ }
+}
+
+
+
+static void
+directory_menu_plugin_create_new (GtkWidget *mi,
+ GFile *parent_dir,
+ gboolean is_folder)
+{
+ GtkWidget *dialog;
+ const gchar *dialog_title;
+ gint dialog_retval;
+ GtkWidget *content;
+ GtkWidget *entry;
+ GDateTime *date;
+ gchar *formatted_date;
+ const gchar *filename;
+ gchar *filepath;
+ GFile *new_file = NULL;
+ GError *error = NULL;
+
+ if (is_folder)
+ dialog_title = "Provide Name of New Folder";
+ else
+ dialog_title = "Provide Name of New Document";
+
+ dialog = gtk_dialog_new_with_buttons (_(dialog_title), NULL,
+ GTK_DIALOG_MODAL,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("C_reate"), DIALOG_RESPONSE_CREATE,
+ _("Create & _Open"), DIALOG_RESPONSE_OPEN,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), 1);
+
+ date = g_date_time_new_now_local ();
+ formatted_date = g_date_time_format (date, "%F %T");
+ entry = gtk_entry_new ();
+ gtk_entry_set_text (GTK_ENTRY(entry), formatted_date);
+ g_free (formatted_date);
+ g_date_time_unref (date);
+
+ g_signal_connect (entry, "changed",
+ G_CALLBACK (directory_menu_plugin_menu_name_entry_changed),
+ dialog);
+
+ content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_container_add (GTK_CONTAINER (content), entry);
+ gtk_entry_set_activates_default (GTK_ENTRY(entry), TRUE);
+ gtk_widget_show_all (dialog);
+
+ dialog_retval = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (dialog_retval >= 0)
+ {
+ filename = gtk_entry_get_text (GTK_ENTRY(entry));
+ if (strlen(filename) > 0)
+ {
+ new_file = g_file_get_child (parent_dir, filename);
+ if (is_folder)
+ g_file_make_directory (new_file, NULL, &error);
+ else
+ g_file_create (new_file, G_FILE_CREATE_NONE, NULL, &error);
+
+ if (error != NULL)
+ {
+ filepath = g_file_get_parse_name (new_file);
+ xfce_dialog_show_error (NULL, error, "Failed to create folder", filepath);
+ g_free (filepath);
+ g_error_free (error);
+ }
+ else if (dialog_retval == DIALOG_RESPONSE_OPEN)
+ {
+ if (is_folder)
+ directory_menu_plugin_menu_open (mi, new_file, "FileManager", TRUE);
+ else
+ directory_menu_plugin_menu_launch (mi, new_file);
+ }
+ g_object_unref (new_file);
+ }
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+
+static void
+directory_menu_plugin_menu_new_folder (GtkWidget *mi,
+ GFile *dir)
+{
+ panel_return_if_fail (GTK_IS_WIDGET (mi));
+ panel_return_if_fail (G_IS_FILE (dir));
+
+ directory_menu_plugin_create_new (mi, dir, TRUE);
+}
+
+
+
+static void
+directory_menu_plugin_menu_new_document (GtkWidget *mi,
+ GFile *dir)
+{
+ panel_return_if_fail (GTK_IS_WIDGET (mi));
+ panel_return_if_fail (G_IS_FILE (dir));
+
+ directory_menu_plugin_create_new (mi, dir, FALSE);
+}
+
+
+
static void
directory_menu_plugin_menu_unload (GtkWidget *menu)
{
@@ -884,6 +1068,40 @@ G_GNUC_END_IGNORE_DEPRECATIONS
gtk_widget_show (image);
}
+ if (plugin->new_folder) {
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ mi = gtk_image_menu_item_new_with_label (_("New Folder"));
+G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ g_signal_connect_data (G_OBJECT (mi), "activate",
+ G_CALLBACK (directory_menu_plugin_menu_new_folder),
+ g_object_ref (dir), (GClosureNotify) (void (*)(void)) g_object_unref, 0);
+ gtk_widget_show (mi);
+
+ image = gtk_image_new_from_icon_name ("folder-new", GTK_ICON_SIZE_MENU);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_widget_show (image);
+ }
+
+ if (plugin->new_document) {
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ mi = gtk_image_menu_item_new_with_label (_("New Document"));
+G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ g_signal_connect_data (G_OBJECT (mi), "activate",
+ G_CALLBACK (directory_menu_plugin_menu_new_document),
+ g_object_ref (dir), (GClosureNotify) (void (*)(void)) g_object_unref, 0);
+ gtk_widget_show (mi);
+
+ image = gtk_image_new_from_icon_name ("document-new", GTK_ICON_SIZE_MENU);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_widget_show (image);
+ }
+
iter = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME
"," G_FILE_ATTRIBUTE_STANDARD_NAME
"," G_FILE_ATTRIBUTE_STANDARD_TYPE
@@ -935,7 +1153,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
g_object_unref (G_OBJECT (iter));
if (G_LIKELY (infos != NULL
- && (plugin->open_folder || plugin->open_in_terminal)))
+ && (plugin->open_folder || plugin->open_in_terminal
+ || plugin->new_folder || plugin->new_document)))
{
mi = gtk_separator_menu_item_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
--
2.23.0