[Xfce4-commits] [xfce/xfce4-panel] 01/01: directorymenu: Add create folder/document menuitems (Bug #15639)
noreply at xfce.org
noreply at xfce.org
Sun Jan 5 00:09:41 CET 2020
This is an automated email from the git hooks/post-receive script.
o c h o s i p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository xfce/xfce4-panel.
commit ab86c3c8a1c075b2a5ca4c70b7272ea36b301faf
Author: cryptogopher <xfce at michalczyk.pro>
Date: Tue Dec 10 16:24:28 2019 +0100
directorymenu: Add create folder/document menuitems (Bug #15639)
---
plugins/directorymenu/directorymenu-dialog.glade | 78 +++++++-
plugins/directorymenu/directorymenu.c | 244 ++++++++++++++++++++++-
2 files changed, 312 insertions(+), 10 deletions(-)
diff --git a/plugins/directorymenu/directorymenu-dialog.glade b/plugins/directorymenu/directorymenu-dialog.glade
index b7e6960..6daa61d 100644
--- a/plugins/directorymenu/directorymenu-dialog.glade
+++ b/plugins/directorymenu/directorymenu-dialog.glade
@@ -140,9 +140,56 @@
<property name="top_attach">0</property>
</packing>
</child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Appearance</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">18</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
<child>
- <object class="GtkCheckButton" id="open-folder">
- <property name="label" translatable="yes">Show 'Open _Folder'</property>
+ <object class="GtkCheckButton" id="new-document">
+ <property name="label" translatable="yes">Show 'New Text _Document'</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="new-folder">
+ <property name="label" translatable="yes">Show '_New Folder'</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -153,7 +200,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
- <property name="width">2</property>
</packing>
</child>
<child>
@@ -168,17 +214,31 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">3</property>
- <property name="width">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="open-folder">
+ <property name="label" translatable="yes">Show '_Open _Folder'</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
</object>
</child>
<child type="label">
- <object class="GtkLabel" id="label1">
+ <object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Appearance</property>
+ <property name="label" translatable="yes">Menu</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
@@ -188,7 +248,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
@@ -260,7 +320,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
diff --git a/plugins/directorymenu/directorymenu.c b/plugins/directorymenu/directorymenu.c
index b7e50d9..4bddec1 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
};
@@ -154,6 +160,20 @@ directory_menu_plugin_class_init (DirectoryMenuPluginClass *klass)
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",
NULL, NULL,
@@ -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",
@@ -823,6 +875,162 @@ 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 *grid;
+ GtkWidget *icon;
+ GtkWidget *label;
+ GtkWidget *entry;
+ GDateTime *date;
+ gchar *formatted_date;
+ const gchar *filename;
+ gchar *filepath;
+ GFile *new_file = NULL;
+ GError *error = NULL;
+
+ if (is_folder)
+ {
+ dialog_title = _("Create New Folder");
+ icon = gtk_image_new_from_icon_name ("folder", GTK_ICON_SIZE_DIALOG);
+ }
+ else
+ {
+ dialog_title = _("Create New Text Document");
+ icon = gtk_image_new_from_icon_name ("text-x-generic", GTK_ICON_SIZE_DIALOG);
+ }
+
+ 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);
+
+ grid = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (grid), 9);
+ gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
+ gtk_widget_set_margin_start (grid, 6);
+ gtk_widget_set_margin_end (grid, 6);
+ gtk_widget_set_margin_top (grid, 6);
+ gtk_widget_set_margin_bottom (grid, 6);
+
+ gtk_grid_attach (GTK_GRID (grid), icon, 0, 0, 1, 2);
+
+ label = gtk_label_new (_("Enter the new name:"));
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
+
+ date = g_date_time_new_now_local ();
+ formatted_date = g_date_time_format (date, "%F %T");
+ entry = gtk_entry_new ();
+ gtk_widget_set_hexpand (entry, TRUE);
+ gtk_entry_set_text (GTK_ENTRY(entry), formatted_date);
+ g_free (formatted_date);
+ g_date_time_unref (date);
+ gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1);
+ 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), grid);
+ 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: %s"), 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)
{
/* delay destruction so we can handle the activate event first */
@@ -896,6 +1104,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 (_("Create 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 (_("Create Text 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
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list