From 3026976d22aaa75e6078aaf979366d644d76d828 Mon Sep 17 00:00:00 2001 Date: Mon, 24 Jun 2019 23:40:48 +0200 Subject: [PATCH] Added menu options to create new folder/document. --- .../directorymenu/directorymenu-dialog.glade | 64 +++++ plugins/directorymenu/directorymenu.c | 220 +++++++++++++++++- 2 files changed, 283 insertions(+), 1 deletion(-) diff --git a/plugins/directorymenu/directorymenu-dialog.glade b/plugins/directorymenu/directorymenu-dialog.glade index 3222deb2..423d1de8 100644 --- a/plugins/directorymenu/directorymenu-dialog.glade +++ b/plugins/directorymenu/directorymenu-dialog.glade @@ -172,6 +172,70 @@ 2 + + + Show '_New folder' + True + True + False + True + True + True + + + 0 + 4 + 2 + + + + + Show 'New _document' + True + True + False + True + True + True + + + 0 + 5 + 2 + + + + + Show '_New folder' + True + True + False + True + True + True + + + 0 + 4 + 2 + + + + + Show 'New _document' + True + True + False + True + True + True + + + 0 + 5 + 2 + + diff --git a/plugins/directorymenu/directorymenu.c b/plugins/directorymenu/directorymenu.c index 98cd4504..0f64136c 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 -- 2.21.0