[gnome-builder] create-project: use Browse button for project parent directory
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] create-project: use Browse button for project parent directory
- Date: Tue, 28 Jun 2016 09:17:40 +0000 (UTC)
commit af03f37c50ba830075d91d0f41d39687f85d20c0
Author: Christian Hergert <chergert redhat com>
Date: Tue Jun 28 02:14:00 2016 -0700
create-project: use Browse button for project parent directory
This follows more closely the updated designs that call for a Browse
button next to the directory containing the created folder.
plugins/create-project/gbp-create-project-widget.c | 168 ++++++++++++--------
.../create-project/gbp-create-project-widget.ui | 21 +--
2 files changed, 106 insertions(+), 83 deletions(-)
---
diff --git a/plugins/create-project/gbp-create-project-widget.c
b/plugins/create-project/gbp-create-project-widget.c
index b8611ce..361b6ae 100644
--- a/plugins/create-project/gbp-create-project-widget.c
+++ b/plugins/create-project/gbp-create-project-widget.c
@@ -30,14 +30,11 @@ struct _GbpCreateProjectWidget
GtkEntry *project_name_entry;
GtkEntry *project_location_entry;
- GtkFileChooserButton *project_location_button;
+ GtkButton *project_location_button;
GtkComboBoxText *project_language_chooser;
GtkFlowBox *project_template_chooser;
- GtkFileChooserDialog *select_folder_dialog;
GtkComboBoxText *versioning_chooser;
GtkComboBoxText *license_chooser;
-
- guint auto_update : 1;
};
enum {
@@ -109,20 +106,6 @@ validate_name (const gchar *name)
}
static void
-gbp_create_project_widget_location_changed (GbpCreateProjectWidget *self,
- GtkEntry *entry)
-{
- g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
- g_assert (GTK_IS_ENTRY (entry));
-
- self->auto_update = FALSE;
-
- g_signal_handlers_disconnect_by_func (self->project_location_entry,
- gbp_create_project_widget_location_changed,
- self);
-}
-
-static void
gbp_create_project_widget_name_changed (GbpCreateProjectWidget *self,
GtkEntry *entry)
{
@@ -153,19 +136,6 @@ gbp_create_project_widget_name_changed (GbpCreateProjectWidget *self,
project_dir = g_ascii_strdown (g_strdelimit (project_name, " ", '-'), -1);
}
- if (self->auto_update)
- {
- g_signal_handlers_block_by_func (self->project_location_entry,
- gbp_create_project_widget_location_changed,
- self);
-
- gtk_entry_set_text (self->project_location_entry, project_dir);
-
- g_signal_handlers_unblock_by_func (self->project_location_entry,
- gbp_create_project_widget_location_changed,
- self);
- }
-
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_IS_READY]);
}
@@ -299,6 +269,96 @@ vcs_initializers_foreach_cb (PeasExtensionSet *set,
gtk_combo_box_text_append (self->versioning_chooser, id, title);
}
+static gchar *
+gbp_create_project_widget_get_directory (GbpCreateProjectWidget *self)
+{
+ const gchar *text;
+
+ g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
+
+ text = gtk_entry_get_text (self->project_location_entry);
+
+ if (*text == '~')
+ return g_build_filename (g_get_home_dir (),
+ &text[1],
+ NULL);
+
+ return g_strdup (text);
+}
+
+static void
+gbp_create_project_widget_set_directory (GbpCreateProjectWidget *self,
+ const gchar *filename)
+{
+ g_autofree gchar *freeme = NULL;
+
+ g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
+
+ if (filename == NULL)
+ filename = g_get_home_dir ();
+
+ if (g_str_has_prefix (filename, g_get_home_dir ()))
+ {
+ freeme = g_build_filename ("~", filename + strlen (g_get_home_dir ()), NULL);
+ filename = freeme;
+ }
+
+ gtk_entry_set_text (self->project_location_entry, filename);
+}
+
+static void
+on_dialog_response (GbpCreateProjectWidget *self,
+ gint response_id,
+ GtkFileChooserDialog *dialog)
+{
+ g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
+ g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ g_autofree gchar *path = NULL;
+
+ path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ gbp_create_project_widget_set_directory (self, path);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_IS_READY]);
+}
+
+static void
+gbp_create_project_widget_browse_clicked (GbpCreateProjectWidget *self,
+ GtkButton *button)
+{
+ g_autofree gchar *path = NULL;
+ GtkWidget *dialog;
+ GtkWidget *toplevel;
+
+ g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
+ g_assert (GTK_IS_BUTTON (button));
+
+ path = gbp_create_project_widget_get_directory (self);
+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
+ dialog = gtk_file_chooser_dialog_new (_("Select Project Directory"),
+ GTK_WINDOW (toplevel),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ _("Cancel"), GTK_RESPONSE_CANCEL,
+ _("Select"), GTK_RESPONSE_OK,
+ NULL);
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), path);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+ g_signal_connect_object (dialog,
+ "response",
+ G_CALLBACK (on_dialog_response),
+ self,
+ G_CONNECT_SWAPPED);
+
+ gtk_window_present (GTK_WINDOW (dialog));
+}
+
static void
gbp_create_project_widget_constructed (GObject *object)
{
@@ -324,8 +384,6 @@ gbp_create_project_widget_constructed (GObject *object)
gtk_combo_box_set_active (GTK_COMBO_BOX (self->project_language_chooser), 0);
gtk_combo_box_set_active (GTK_COMBO_BOX (self->versioning_chooser), 0);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (self->license_chooser), "gpl_3");
-
- self->auto_update = TRUE;
}
static void
@@ -366,16 +424,6 @@ gbp_create_project_widget_is_ready (GbpCreateProjectWidget *self)
}
static void
-make_dialog_modal (GbpCreateProjectWidget *self,
- GtkFileChooserDialog *dialog)
-{
- g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
- g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
-
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-}
-
-static void
gbp_create_project_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -421,7 +469,6 @@ gbp_create_project_widget_class_init (GbpCreateProjectWidgetClass *klass)
gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, project_location_entry);
gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, project_language_chooser);
gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, project_template_chooser);
- gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, select_folder_dialog);
gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, versioning_chooser);
gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, license_chooser);
}
@@ -440,13 +487,14 @@ gbp_create_project_widget_init (GbpCreateProjectWidget *self)
if (!ide_str_empty0 (path))
{
+ g_autofree gchar *adjusted = NULL;
+
if (!g_path_is_absolute (path))
projects_dir = g_build_filename (g_get_home_dir (), path, NULL);
else
projects_dir = g_steal_pointer (&path);
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (self->project_location_button),
- projects_dir);
+ gbp_create_project_widget_set_directory (self, projects_dir);
}
gtk_flow_box_set_filter_func (self->project_template_chooser,
@@ -460,9 +508,9 @@ gbp_create_project_widget_init (GbpCreateProjectWidget *self)
self,
G_CONNECT_SWAPPED);
- g_signal_connect_object (self->project_location_entry,
- "changed",
- G_CALLBACK (gbp_create_project_widget_location_changed),
+ g_signal_connect_object (self->project_location_button,
+ "clicked",
+ G_CALLBACK (gbp_create_project_widget_browse_clicked),
self,
G_CONNECT_SWAPPED);
@@ -477,18 +525,6 @@ gbp_create_project_widget_init (GbpCreateProjectWidget *self)
G_CALLBACK (gbp_create_project_widget_template_selected),
self,
G_CONNECT_SWAPPED);
-
- g_signal_connect_object (self->select_folder_dialog,
- "show",
- G_CALLBACK (make_dialog_modal),
- self,
- G_CONNECT_SWAPPED);
-
- gtk_dialog_add_buttons (GTK_DIALOG (self->select_folder_dialog),
- _("Select"), GTK_RESPONSE_OK,
- _("Cancel"), GTK_RESPONSE_CANCEL,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (self->select_folder_dialog), GTK_RESPONSE_OK);
}
static void
@@ -612,7 +648,6 @@ gbp_create_project_widget_create_async (GbpCreateProjectWidget *self,
PeasEngine *engine;
PeasPluginInfo *plugin_info;
const gchar *text;
- const gchar *child_name;
const gchar *license_id;
const gchar *vcs_id;
const gchar *author_name;
@@ -640,13 +675,8 @@ gbp_create_project_widget_create_async (GbpCreateProjectWidget *self,
g_strdup ("name"),
g_variant_ref_sink (g_variant_new_string (g_strdelimit (name, " ", '-'))));
- child_name = gtk_entry_get_text (self->project_location_entry);
- location = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->project_location_button));
-
- if (!ide_str_empty0 (child_name))
- path = g_build_filename (location, child_name, NULL);
- else
- path = g_steal_pointer (&location);
+ location = gbp_create_project_widget_get_directory (self);
+ path = g_build_filename (location, name, NULL);
g_hash_table_insert (params,
g_strdup ("path"),
diff --git a/plugins/create-project/gbp-create-project-widget.ui
b/plugins/create-project/gbp-create-project-widget.ui
index 811461b..ec6b79e 100644
--- a/plugins/create-project/gbp-create-project-widget.ui
+++ b/plugins/create-project/gbp-create-project-widget.ui
@@ -1,9 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
- <object class="GtkFileChooserDialog" id="select_folder_dialog">
- <property name="action">select-folder</property>
- <property name="local-only">true</property>
- </object>
<template class="GbpCreateProjectWidget" parent="GtkBin">
<child>
<object class="GtkScrolledWindow">
@@ -24,7 +20,7 @@
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
- <property name="expand">true</property>
+ <property name="vexpand">true</property>
<property name="halign">end</property>
<property name="spacing">24</property>
<property name="visible">true</property>
@@ -35,6 +31,7 @@
<object class="GtkLabel" id="project_name_label">
<property name="label" translatable="yes">Project Name</property>
<property name="halign">end</property>
+ <property name="hexpand">true</property>
<property name="valign">start</property>
<property name="visible">true</property>
<attributes>
@@ -49,9 +46,9 @@
</child>
<child>
<object class="GtkLabel" id="row2_1">
- <property name="label" translatable="yes">Location</property>
- <property name="expand">true</property>
+ <property name="label" translatable="yes">Project Location</property>
<property name="halign">end</property>
+ <property name="hexpand">true</property>
<property name="visible">true</property>
<attributes>
<attribute name="weight" value="bold"/>
@@ -146,20 +143,16 @@
<property name="visible">true</property>
<style>
<class name="linked"/>
- <class name="linked-on-right"/>
</style>
<child>
- <object class="GtkFileChooserButton" id="project_location_button">
- <property name="action">select-folder</property>
- <property name="dialog">select_folder_dialog</property>
- <property name="local-only">true</property>
+ <object class="GtkEntry" id="project_location_entry">
<property name="expand">true</property>
<property name="visible">true</property>
</object>
</child>
<child>
- <object class="GtkEntry" id="project_location_entry">
- <property name="expand">true</property>
+ <object class="GtkButton" id="project_location_button">
+ <property name="label" translatable="yes">Browse…</property>
<property name="visible">true</property>
</object>
</child>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]