summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTristan Van Berkom <tvb@src.gnome.org>2006-01-28 23:16:42 +0000
committerTristan Van Berkom <tvb@src.gnome.org>2006-01-28 23:16:42 +0000
commitc86edf977855d284fd095f13a8bcbb056d2e5cae (patch)
tree9dc5a4b0e7d3c2407ac2ae48ec9efe547f3a81b2 /src
parent73cacc1ef164335af07987dbc60e269804a6f3df (diff)
downloadglade-c86edf977855d284fd095f13a8bcbb056d2e5cae.tar.gz
GladeEPropFlags now shows treeview directly in editor - Mikael Hermansson
* src/glade-editor-property.c: GladeEPropFlags now shows treeview directly in editor - Mikael Hermansson * src/glade-project.[ch]: Removed "resource-updated" signal, added "resource-added" signal, now resource signals seem to be working more logicly (but there will be no signal fired when a resource's contents is overwritten from a different source).
Diffstat (limited to 'src')
-rw-r--r--src/glade-editor-property.c258
-rw-r--r--src/glade-project.c77
-rw-r--r--src/glade-project.h2
3 files changed, 196 insertions, 141 deletions
diff --git a/src/glade-editor-property.c b/src/glade-editor-property.c
index 09f7c774..f2936200 100644
--- a/src/glade-editor-property.c
+++ b/src/glade-editor-property.c
@@ -733,7 +733,7 @@ glade_eprop_enum_create_input (GladeEditorProperty *eprop)
typedef struct {
GladeEditorProperty parent_instance;
- GtkWidget *entry;
+ GtkTreeModel *model;
} GladeEPropFlags;
GLADE_MAKE_EPROP (GladeEPropFlags, glade_eprop_flags)
@@ -755,84 +755,151 @@ static void
glade_eprop_flags_load (GladeEditorProperty *eprop, GladeProperty *property)
{
GladeEPropFlags *eprop_flags = GLADE_EPROP_FLAGS (eprop);
- gchar *text;
+ GFlagsClass *class;
+ guint flag_num, value;
+
/* Chain up first */
editor_property_class->load (eprop, property);
if (property)
{
- text = glade_property_class_make_string_from_flags
- (eprop->class, g_value_get_flags(property->value),
- TRUE);
- gtk_entry_set_text (GTK_ENTRY (eprop_flags->entry), text);
- g_free (text);
+
+ /* Populate the model with the flags. */
+
+ class = g_type_class_ref (G_VALUE_TYPE (property->value));
+ value = g_value_get_flags (property->value);
+
+ gtk_list_store_clear(GTK_LIST_STORE(eprop_flags->model));
+ /* Step through each of the flags in the class. */
+ for (flag_num = 0; flag_num < class->n_values; flag_num++) {
+ GtkTreeIter iter;
+ guint mask;
+ gboolean setting;
+ gchar *value_name;
+
+ mask = class->values[flag_num].value;
+ setting = ((value & mask) == mask) ? TRUE : FALSE;
+
+ value_name = glade_property_class_get_displayable_value
+ (eprop->class, class->values[flag_num].value);
+
+ if (value_name == NULL) value_name = class->values[flag_num].value_name;
+
+ /* Add a row to represent the flag. */
+ gtk_list_store_append (GTK_LIST_STORE(eprop_flags->model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE(eprop_flags->model), &iter,
+ FLAGS_COLUMN_SETTING,
+ setting,
+ FLAGS_COLUMN_SYMBOL,
+ value_name,
+ -1);
+ }
+ g_type_class_unref(class);
}
}
+
static void
-flag_toggled (GtkCellRendererToggle *cell,
- gchar *path_string,
- GtkTreeModel *model)
+flag_toggled_direct (GtkCellRendererToggle *cell,
+ gchar *path_string,
+ GladeEditorProperty *eprop)
{
GtkTreeIter iter;
- gboolean setting;
+ guint new_value;
+ gboolean selected;
+ guint value;
+ value = new_value =0;
+ gint flag_num=0;
+ GFlagsClass *class;
- gtk_tree_model_get_iter_from_string (model, &iter, path_string);
+ GladeEPropFlags *eprop_flags= GLADE_EPROP_FLAGS(eprop);
- gtk_tree_model_get (model, &iter,
- FLAGS_COLUMN_SETTING, &setting,
+ if (!eprop->property)
+ return ;
+
+ class = g_type_class_ref (G_VALUE_TYPE (eprop->property->value));
+ value = g_value_get_flags (eprop->property->value);
+
+ gtk_tree_model_get_iter_from_string (eprop_flags->model, &iter, path_string);
+
+ gtk_tree_model_get (eprop_flags->model, &iter,
+ FLAGS_COLUMN_SETTING, &selected,
-1);
- setting = setting ? FALSE : TRUE;
+ selected = selected ? FALSE : TRUE;
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- FLAGS_COLUMN_SETTING, setting,
+ gtk_list_store_set (GTK_LIST_STORE (eprop_flags->model), &iter,
+ FLAGS_COLUMN_SETTING, selected,
-1);
+
+
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (eprop_flags->model), &iter);
+
+ /* Step through each of the flags in the class, checking if
+ the corresponding toggle in the dialog is selected, If it
+ is, OR the flags' mask with the new value. */
+ for (flag_num = 0; flag_num < class->n_values; flag_num++) {
+ gboolean setting;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (eprop_flags->model), &iter,
+ FLAGS_COLUMN_SETTING, &setting,
+ -1);
+
+ if (setting)
+ new_value |= class->values[flag_num].value;
+
+ gtk_tree_model_iter_next (GTK_TREE_MODEL (eprop_flags->model),
+ &iter);
+ }
+
+ /* If the new_value is different from the old value, we need
+ to update the property. */
+ if (new_value != value) {
+ GValue val = { 0, };
+
+ g_value_init (&val, G_VALUE_TYPE (eprop->property->value));
+ g_value_set_flags (&val, new_value);
+
+ if (eprop->use_command == FALSE)
+ glade_property_set_value (eprop->property, &val);
+ else
+ glade_command_set_property (eprop->property, &val);
+
+ g_value_unset (&val);
+ }
+
+
+
}
-static void
-glade_eprop_flags_show_dialog (GtkWidget *button,
- GladeEditorProperty *eprop)
+static GtkWidget*
+glade_eprop_flags_create_treeview(GladeEditorProperty *eprop)
{
- GtkWidget *editor;
- GtkWidget *dialog;
GtkWidget *scrolled_window;
- GtkListStore *model;
GtkWidget *tree_view;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
- GFlagsClass *class;
- gint response_id;
- guint flag_num, value;
+ GladeEPropFlags *eprop_flags=GLADE_EPROP_FLAGS(eprop);
+ if (!eprop_flags->model)
+ eprop_flags->model = GTK_TREE_MODEL(gtk_list_store_new (2, G_TYPE_BOOLEAN,
+ G_TYPE_STRING));
- editor = gtk_widget_get_toplevel (button);
- dialog = gtk_dialog_new_with_buttons (_("Set Flags"),
- GTK_WINDOW (editor),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK,
- GTK_RESPONSE_OK,
- NULL);
- gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 400);
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window),
GLADE_GENERIC_BORDER_WIDTH);
gtk_widget_show (scrolled_window);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- scrolled_window, TRUE, TRUE, 0);
- /* Create the treeview using a simple list model with 2 columns. */
- model = gtk_list_store_new (2, G_TYPE_BOOLEAN, G_TYPE_STRING);
+
- tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+ tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (eprop_flags->model));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
gtk_widget_show (tree_view);
gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
@@ -846,7 +913,8 @@ glade_eprop_flags_show_dialog (GtkWidget *button,
NULL);
g_signal_connect (renderer, "toggled",
- G_CALLBACK (flag_toggled), model);
+ G_CALLBACK (flag_toggled_direct), eprop);
+
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, renderer, TRUE);
@@ -857,81 +925,34 @@ glade_eprop_flags_show_dialog (GtkWidget *button,
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
- /* Populate the model with the flags. */
- class = g_type_class_ref (G_VALUE_TYPE (eprop->property->value));
- value = g_value_get_flags (eprop->property->value);
-
- /* Step through each of the flags in the class. */
- for (flag_num = 0; flag_num < class->n_values; flag_num++) {
- GtkTreeIter iter;
- guint mask;
- gboolean setting;
- gchar *value_name;
-
- mask = class->values[flag_num].value;
- setting = ((value & mask) == mask) ? TRUE : FALSE;
-
- value_name = glade_property_class_get_displayable_value
- (eprop->class, class->values[flag_num].value);
-
- if (value_name == NULL) value_name = class->values[flag_num].value_name;
-
- /* Add a row to represent the flag. */
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter,
- FLAGS_COLUMN_SETTING,
- setting,
- FLAGS_COLUMN_SYMBOL,
- value_name,
- -1);
- }
-
- /* Run the dialog. */
- response_id = gtk_dialog_run (GTK_DIALOG (dialog));
-
- /* If the user selects OK, update the flags property. */
- if (response_id == GTK_RESPONSE_OK) {
- GtkTreeIter iter;
- guint new_value = 0;
-
- gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
-
- /* Step through each of the flags in the class, checking if
- the corresponding toggle in the dialog is selected, If it
- is, OR the flags' mask with the new value. */
- for (flag_num = 0; flag_num < class->n_values; flag_num++) {
- gboolean setting;
-
- gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
- FLAGS_COLUMN_SETTING, &setting,
- -1);
-
- if (setting)
- new_value |= class->values[flag_num].value;
-
- gtk_tree_model_iter_next (GTK_TREE_MODEL (model),
- &iter);
- }
- /* If the new_value is different from the old value, we need
- to update the property. */
- if (new_value != value) {
- GValue val = { 0, };
-
- g_value_init (&val, G_VALUE_TYPE (eprop->property->value));
- g_value_set_flags (&val, new_value);
-
- if (eprop->use_command == FALSE)
- glade_property_set_value (eprop->property, &val);
- else
- glade_command_set_property (eprop->property, &val);
+ return scrolled_window;
+}
- g_value_unset (&val);
- }
+static void
+glade_eprop_flags_show_dialog (GtkWidget *button,
+ GladeEditorProperty *eprop)
+{
+ GtkWidget *editor;
+ GtkWidget *dialog;
+ GtkWidget *scrolled_window;
+ guint response_id ;
- }
+ editor = gtk_widget_get_toplevel (button);
+ dialog = gtk_dialog_new_with_buttons (_("Set Flags"),
+ GTK_WINDOW (editor),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK,
+ NULL);
+ gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 400);
- g_type_class_unref (class);
+ scrolled_window = glade_eprop_flags_create_treeview(eprop);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+ scrolled_window, TRUE, TRUE, 0);
+ response_id = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
@@ -940,15 +961,13 @@ glade_eprop_flags_show_dialog (GtkWidget *button,
static GtkWidget *
glade_eprop_flags_create_input (GladeEditorProperty *eprop)
{
- GladeEPropFlags *eprop_flags = GLADE_EPROP_FLAGS (eprop);
GtkWidget *hbox;
GtkWidget *button;
+ GtkWidget *widget;
hbox = gtk_hbox_new (FALSE, 0);
- eprop_flags->entry = gtk_entry_new ();
- gtk_entry_set_editable (GTK_ENTRY (eprop_flags->entry), FALSE);
- gtk_widget_show (eprop_flags->entry);
- gtk_box_pack_start (GTK_BOX (hbox), eprop_flags->entry, TRUE, TRUE, 0);
+ widget = glade_eprop_flags_create_treeview(eprop);
+ gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
button = gtk_button_new_with_label ("...");
gtk_widget_show (button);
@@ -957,6 +976,7 @@ glade_eprop_flags_create_input (GladeEditorProperty *eprop)
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (glade_eprop_flags_show_dialog),
eprop);
+
return hbox;
}
diff --git a/src/glade-project.c b/src/glade-project.c
index 78ef6c57..43d27f07 100644
--- a/src/glade-project.c
+++ b/src/glade-project.c
@@ -55,7 +55,7 @@ enum
WIDGET_NAME_CHANGED,
SELECTION_CHANGED,
CLOSE,
- RESOURCE_UPDATED,
+ RESOURCE_ADDED,
RESOURCE_REMOVED,
LAST_SIGNAL
};
@@ -157,11 +157,11 @@ glade_project_class_init (GladeProjectClass *class)
G_TYPE_NONE,
0);
- glade_project_signals[RESOURCE_UPDATED] =
- g_signal_new ("resource-updated",
+ glade_project_signals[RESOURCE_ADDED] =
+ g_signal_new ("resource-added",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GladeProjectClass, resource_updated),
+ G_STRUCT_OFFSET (GladeProjectClass, resource_added),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE,
@@ -188,7 +188,7 @@ glade_project_class_init (GladeProjectClass *class)
class->widget_name_changed = NULL;
class->selection_changed = NULL;
class->close = NULL;
- class->resource_updated = NULL;
+ class->resource_added = NULL;
class->resource_removed = NULL;
}
@@ -1252,6 +1252,18 @@ glade_project_resource_fullpath (GladeProject *project,
}
+static gboolean
+find_resource_by_resource (GladeProperty *key,
+ const gchar *resource,
+ const gchar *resource_cmp)
+{
+ g_assert (resource);
+ g_assert (resource_cmp);
+ return (!strcmp (resource, resource_cmp));
+}
+
+
+
/**
* glade_project_set_resource:
* @project: A #GladeProject
@@ -1274,24 +1286,32 @@ glade_project_set_resource (GladeProject *project,
g_return_if_fail (GLADE_IS_PROJECT (project));
g_return_if_fail (GLADE_IS_PROPERTY (property));
- last_resource = g_hash_table_lookup (project->resources, property);
- if (resource) base_resource = g_path_get_basename (resource);
-
- if (last_resource)
+ if ((last_resource =
+ g_hash_table_lookup (project->resources, property)) != NULL)
last_resource_dup = g_strdup (last_resource);
+
+ /* Get dependable input */
+ if (resource && resource[0] != '\0' && strcmp (resource, "."))
+ base_resource = g_path_get_basename (resource);
+ /* If the resource has been removed or the base name has changed
+ * then remove from hash and emit removed.
+ */
if (last_resource_dup &&
(base_resource == NULL || strcmp (last_resource_dup, base_resource)))
{
g_hash_table_remove (project->resources, property);
- /* Emit remove signal
- */
- g_signal_emit (G_OBJECT (project),
- glade_project_signals [RESOURCE_REMOVED],
- 0, last_resource_dup);
+ if (g_hash_table_find (project->resources,
+ (GHRFunc)find_resource_by_resource,
+ last_resource_dup) == NULL)
+ g_signal_emit (G_OBJECT (project),
+ glade_project_signals [RESOURCE_REMOVED],
+ 0, last_resource_dup);
}
+ /* Copy files when importing widgets with resources.
+ */
if (project->path)
{
dirname = g_path_get_dirname (project->path);
@@ -1301,20 +1321,35 @@ glade_project_set_resource (GladeProject *project,
g_file_test (resource, G_FILE_TEST_IS_REGULAR) &&
strcmp (fullpath, resource))
{
+ /* FIXME: In the case of copy/pasting widgets
+ * across projects we should ask the user about
+ * copying any resources.
+ */
glade_util_copy_file (resource, fullpath);
}
g_free (fullpath);
g_free (dirname);
}
- g_hash_table_insert (project->resources, property, base_resource);
-
- /* Emit update signal
- */
if (base_resource)
- g_signal_emit (G_OBJECT (project),
- glade_project_signals [RESOURCE_UPDATED],
- 0, base_resource);
+ {
+
+ /* If the resource has been added or the base name has
+ * changed then emit added.
+ */
+ if ((last_resource_dup == NULL ||
+ strcmp (last_resource_dup, base_resource)) &&
+ g_hash_table_find (project->resources,
+ (GHRFunc)find_resource_by_resource,
+ base_resource) == NULL)
+ g_signal_emit (G_OBJECT (project),
+ glade_project_signals [RESOURCE_ADDED],
+ 0, base_resource);
+
+ g_hash_table_insert (project->resources, property, base_resource);
+
+ }
+ g_free (last_resource_dup);
}
static void
diff --git a/src/glade-project.h b/src/glade-project.h
index 68a3e360..eb91900e 100644
--- a/src/glade-project.h
+++ b/src/glade-project.h
@@ -69,7 +69,7 @@ struct _GladeProjectClass
void (*selection_changed) (GladeProject *project);
void (*close) (GladeProject *project);
- void (*resource_updated) (GladeProject *project,
+ void (*resource_added) (GladeProject *project,
const gchar *resource);
void (*resource_removed) (GladeProject *project,
const gchar *resource);