[Xfce4-commits] <xfce4-panel:devel> Add some initial code for launcher item editing.
Nick Schermer
nick at xfce.org
Tue Aug 11 20:35:09 CEST 2009
Updating branch refs/heads/devel
to 6ac3cada0c839e2a70aee99fa8cbcedfb0f6b05d (commit)
from 044d2369a8295945c373e9d7ee7505bc02e5988c (commit)
commit 6ac3cada0c839e2a70aee99fa8cbcedfb0f6b05d
Author: Nick Schermer <nick at xfce.org>
Date: Sat Jun 20 23:00:03 2009 +0200
Add some initial code for launcher item editing.
plugins/launcher/launcher-dialog.c | 210 +++++++++++++++++++++++++++++++++++-
1 files changed, 209 insertions(+), 1 deletions(-)
diff --git a/plugins/launcher/launcher-dialog.c b/plugins/launcher/launcher-dialog.c
index e1bd094..7da6647 100644
--- a/plugins/launcher/launcher-dialog.c
+++ b/plugins/launcher/launcher-dialog.c
@@ -338,7 +338,7 @@ launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
gtk_widget_set_sensitive (GTK_WIDGET (object), sensitive);
object = gtk_builder_get_object (dialog->builder, "item-edit");
- sensitive = !!(position >= 0 && n_children > 0); /* TODO custom items only (??) */
+ sensitive = !!(position >= 0 && n_children > 0);
gtk_widget_set_sensitive (GTK_WIDGET (object), sensitive);
object = gtk_builder_get_object (dialog->builder, "arrow-position");
@@ -354,6 +354,54 @@ launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
static void
+launcher_dialog_editor_populate (LauncherPluginDialog *dialog,
+ XfceMenuItem *item)
+{
+ GObject *object;
+ const gchar *path;
+ gchar *current_dir = NULL;
+
+ panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (dialog->plugin));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
+ panel_return_if_fail (XFCE_IS_MENU_ITEM (item));
+
+ object = gtk_builder_get_object (dialog->builder, "item-name");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_entry_set_text (GTK_ENTRY (object),
+ xfce_menu_item_get_name (item));
+
+ object = gtk_builder_get_object (dialog->builder, "item-description");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_entry_set_text (GTK_ENTRY (object),
+ xfce_menu_item_get_comment (item));
+
+ object = gtk_builder_get_object (dialog->builder, "item-command");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_entry_set_text (GTK_ENTRY (object),
+ xfce_menu_item_get_command (item));
+
+ object = gtk_builder_get_object (dialog->builder, "item-working-directory");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ path = xfce_menu_item_get_path (item);
+ if (path == NULL || g_path_is_absolute (path) == FALSE)
+ path = current_dir = g_get_current_dir ();
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (object), path);
+ g_free (current_dir);
+
+ object = gtk_builder_get_object (dialog->builder, "item-terminal");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object),
+ xfce_menu_item_requires_terminal (item));
+
+ object = gtk_builder_get_object (dialog->builder, "item-startup-notify");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object),
+ xfce_menu_item_supports_startup_notification (item));
+}
+
+
+
+static void
launcher_dialog_item_button_clicked (GtkWidget *button,
LauncherPluginDialog *dialog)
{
@@ -365,6 +413,7 @@ launcher_dialog_item_button_clicked (GtkWidget *button,
GtkTreeModel *model;
GtkTreeIter iter_a, iter_b;
GtkTreePath *path;
+ XfceMenuItem *item = NULL;
panel_return_if_fail (GTK_IS_BUILDABLE (button));
panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
@@ -410,8 +459,22 @@ launcher_dialog_item_button_clicked (GtkWidget *button,
}
else if (exo_str_is_equal (name, "item-edit"))
{
+ /* polulate the dialog */
+ gtk_tree_model_get (model, &iter_a, COL_ITEM, &item, -1);
+ if (G_UNLIKELY (item == NULL))
+ return;
+ launcher_dialog_editor_populate (dialog, item);
+
+ /* show the dialog */
object = gtk_builder_get_object (dialog->builder, "dialog-editor");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
gtk_widget_show (GTK_WIDGET (object));
+
+ /* create a tree path of the selected item, we use this to
+ * replace the menu item after saving */
+ path = gtk_tree_model_get_path (model, &iter_a);
+ g_object_set_data_full (G_OBJECT (object), "item-path", path,
+ (GDestroyNotify) gtk_tree_path_free);
}
else if (exo_str_is_equal (name, "item-move-up"))
{
@@ -473,15 +536,160 @@ launcher_dialog_response (GtkWidget *widget,
static void
+launcher_dialog_editor_write_value (XfceRc *rc,
+ GtkBuilder *builder,
+ const gchar *name,
+ const gchar *key)
+{
+ GObject *object;
+ const gchar *text;
+
+ panel_return_if_fail (GTK_IS_BUILDER (builder));
+
+ object = gtk_builder_get_object (builder, name);
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ text = gtk_entry_get_text (GTK_ENTRY (object));
+ if (IS_STRING (text))
+ xfce_rc_write_entry (rc, key, text);
+ else
+ xfce_rc_delete_entry (rc, key, FALSE);
+}
+
+
+
+static void
launcher_dialog_editor_response (GtkWidget *widget,
gint response_id,
LauncherPluginDialog *dialog)
{
+ GObject *object;
+ GtkTreePath *path;
+ XfceMenuItem *item = NULL;
+ gchar *user_dir, *new_file = NULL;
+ const gchar *filename;
+ guint i;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ XfceRc *rc;
+
panel_return_if_fail (GTK_IS_DIALOG (widget));
panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (dialog->plugin));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
+
+ if (response_id == 2)
+ {
+ /* get the user directory */
+ user_dir = xfce_resource_save_location (XFCE_RESOURCE_CONFIG,
+ "/xfce4/xfce4-panel/", TRUE);
+ if (G_UNLIKELY (user_dir == NULL))
+ {
+ g_critical ("Failed to create the panel config directory.");
+ goto leave;
+ }
+
+ object = gtk_builder_get_object (dialog->builder, "item-treeview");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (object));
+
+ /* get the menu item attached to the dialog */
+ path = g_object_get_data (G_OBJECT (widget), "item-path");
+ if (!gtk_tree_model_get_iter (model, &iter, path))
+ goto leave;
+ gtk_tree_model_get (model, &iter, COL_ITEM, &item, -1);
+ panel_return_if_fail (XFCE_IS_MENU_ITEM (item));
+
+ /* check if the item is already in the users directory */
+ filename = xfce_menu_item_get_filename (item);
+ if (!g_str_has_prefix (filename, user_dir))
+ {
+ /* create a unique filename for the copy */
+ for (i = 1; i < 100 /* arbitairy limit */; i++)
+ {
+ /* create the new filename */
+ new_file = g_strdup_printf ("%slauncher-%d-%d.desktop",
+ user_dir,
+ xfce_panel_plugin_get_unique_id (XFCE_PANEL_PLUGIN (dialog->plugin)),
+ i++);
+
+ /* we're done if the file does not exist yet */
+ if (!g_file_test (new_file, G_FILE_TEST_IS_REGULAR))
+ break;
+
+ /* cleanup before we try again */
+ g_free (new_file);
+ }
+
+ /* set new filename */
+ filename = new_file;
+ }
+
+ /* cleanup */
+ g_free (user_dir);
+
+ /* store the new item data */
+ rc = xfce_rc_simple_open (filename, FALSE);
+ if (G_LIKELY (rc != NULL))
+ {
+ /* write some default stuff */
+ xfce_rc_set_group (rc, "Desktop Entry");
+ xfce_rc_write_entry (rc, "Type", "Application");
+ xfce_rc_write_entry (rc, "Encoding", "UTF-8");
+
+ /* write text entries */
+ launcher_dialog_editor_write_value (rc, dialog->builder,
+ "item-name",
+ "Name");
+ launcher_dialog_editor_write_value (rc, dialog->builder,
+ "item-description",
+ "Comment");
+ launcher_dialog_editor_write_value (rc, dialog->builder,
+ "item-command",
+ "Exec");
+
+ /* TODO */
+ /*launcher_dialog_editor_write_value (rc, dialog->builder,
+ "item-working-directory",
+ "Path");*/
+
+ object = gtk_builder_get_object (dialog->builder, "item-terminal");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ xfce_rc_write_bool_entry (rc, "Terminal",
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)));
+ object = gtk_builder_get_object (dialog->builder, "item-startup-notify");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ xfce_rc_write_bool_entry (rc, "StartupNotify",
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)));
+
+ xfce_rc_close (rc);
+ }
+
+ /* release the menu item */
+ if (G_LIKELY (item != NULL))
+ g_object_unref (G_OBJECT (item));
+
+ /* update the model */
+ item = xfce_menu_item_new (filename);
+ if (G_LIKELY (item != NULL))
+ {
+ launcher_dialog_items_insert_item (GTK_LIST_STORE (model),
+ &iter, item);
+ g_object_unref (G_OBJECT (item));
+ }
+
+ /* cleanup */
+ g_free (new_file);
+
+ /* write the model to xfconf */
+ launcher_dialog_tree_save (dialog);
+ }
+
+leave:
/* hide the dialog, since it's owned by gtkbuilder */
gtk_widget_hide (widget);
+
+ /* unset the item path */
+ g_object_set_data (G_OBJECT (widget), "item-path", NULL);
}
More information about the Xfce4-commits
mailing list