Re: [PATCH] Scaffold -- Added tooltips and file modified flag into document-manager

Rui Lopes <[email protected]>
Newsgroups gmane.comp.gnome.devtools
Message-ID <1062675118.607.4.camel@localhost>
Hi all,


On Qua, 2003-09-03 at 16:59, Rui Lopes wrote: 
> Some more things for Scaffold:
> 
> * Added tooltips to document-manager tabs that show the full filename.
> * Added a simple modified flag ('*') to document-manager tab when a file
> is modified.
> 
> 
> Review my TODO and XXX comments and tell me what you think!


Use the attached patch instead.  It adds two lines that I forgot, and
also adds a ChangeLog entry.



Regards,
Rui Lopes
document_manager_tab_tooltips_and_mod_flag.patch (text/x-patch, 7.6 KB)
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/scaffold/ChangeLog,v
retrieving revision 1.273
diff -u -r1.273 ChangeLog
--- ChangeLog	25 Aug 2003 16:49:46 -0000	1.273
+++ ChangeLog	4 Sep 2003 11:19:06 -0000
@@ -1,3 +1,17 @@
+2003-09-04  Rui Lopes  <[email protected]>
+
+	* plugins/document-manager/scaffold-document-manager.c:
+	(scaffold_notebook_document_manager_new), (set_doc_uri),
+	(scaffold_notebook_document_manager_remove_doc), (add_doc),
+	(docman_dispose),
+	(scaffold_notebook_document_manager_instance_init),
+	(document_modified), (document_unmodified),
+	(scaffold_notebook_document_manager_get_prefs_page),
+	(scaffold_notebook_document_manager_open): Added tooltips to
+	document-manager tabs that show the full filename.  Added a
+	simple modified flag ('*') to document-manager tab when a
+	file is modified.
+
 2003-08-25  Danilo Šegan  <[email protected]>
 
 	* configure.in: Added "sr" and "sr@Latn" to ALL_LINGUAS.
Index: plugins/document-manager/scaffold-document-manager.c
===================================================================
RCS file: /cvs/gnome/scaffold/plugins/document-manager/scaffold-document-manager.c,v
retrieving revision 1.32
diff -u -r1.32 scaffold-document-manager.c
--- plugins/document-manager/scaffold-document-manager.c	8 Aug 2003 20:44:19 -0000	1.32
+++ plugins/document-manager/scaffold-document-manager.c	4 Sep 2003 11:19:07 -0000
@@ -61,6 +61,8 @@
 	GHashTable *verbs;
 
 	GConfClient *client;
+
+	GtkTooltips *tooltips;
 };
 
 typedef struct {
@@ -86,6 +88,8 @@
 				    const char *uri, 
 				    gpointer data);
 static void docman_doc_destroy (GtkWidget *widget, gpointer data);
+static void document_modified (GtkWidget *widget, gpointer data);
+static void document_unmodified (GtkWidget *widget, gpointer data);
 static void set_current_document (ScaffoldNotebookDocumentManager *docman,
 				  ScaffoldDocument *doc);
 static void load_new_menu (ScaffoldNotebookDocumentManager *docman);
@@ -101,7 +105,7 @@
 	ScaffoldNotebookDocumentManager *dm;
 
 	dm = g_object_new (SCAFFOLD_TYPE_NOTEBOOK_DOCUMENT_MANAGER, NULL);
-
+ 
 	dm->ui_container = ui_container;
 	dm->ui_component = ui_component;
 
@@ -141,6 +145,7 @@
 {
 	gchar *basename;
 	GdkPixbuf *pixbuf;
+	GtkWidget *tooltip;
 	GtkWidget *label;
 	GtkWidget *icon;
 
@@ -154,6 +159,10 @@
 	gtk_label_set_text (GTK_LABEL (label), basename);
 	g_free (basename);
 
+	tooltip = g_object_get_data (G_OBJECT (document), 
+				   "ScaffoldNotebookDocumentManager::tooltip"); /* XXX: Another name for this? */
+	gtk_tooltips_set_tip (docman->priv->tooltips, tooltip, filename, NULL);
+
 	pixbuf = gdl_icons_get_uri_icon (docman->priv->icons, filename);
 	icon = g_object_get_data (G_OBJECT (document),
 				  "ScaffoldNotebookDocumentManager::icon");
@@ -177,6 +186,7 @@
 			docman->priv->untitled_count--;
 		}
 
+		/* TODO: disconnect our document_(un)modified from document here? */
 		g_signal_emit_by_name (docman, "document_removed", document);
 
 		docman->documents = 
@@ -269,6 +279,7 @@
 static void
 add_doc (ScaffoldNotebookDocumentManager *docman, ScaffoldDocument *document)
 {
+	GtkWidget *event_box;
 	GtkWidget *tab_hbox;
 	GtkWidget *label;
 	GtkWidget *button;
@@ -289,7 +300,7 @@
 	if (uri) {
 		label_str = g_path_get_basename (uri);
 	} else {
-		label_str = g_strdup_printf ("Untitled %ld", ++docman->priv->untitled_count);
+		label_str = g_strdup_printf (_("Untitled %ld"), ++docman->priv->untitled_count);
 		SCAFFOLD_BONOBO_DOCUMENT (document)->untitled = TRUE;
 	}
 
@@ -318,7 +329,14 @@
 
 	g_free (label_str);
 
-	/* Build the tab widget close button */
+	/* Build the tab widgets and tooltip */
+	event_box = gtk_event_box_new ();
+	g_object_set_data (G_OBJECT (document),
+			   "ScaffoldNotebookDocumentManager::tooltip", /* XXX: Another name for this? */
+			   event_box);
+	if (uri)
+		gtk_tooltips_set_tip (docman->priv->tooltips, event_box, uri, NULL);
+
 	tab_hbox = gtk_hbox_new (FALSE, 2);
 	pixmap = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);;
 	button = gtk_button_new ();
@@ -335,12 +353,14 @@
 	gtk_box_pack_start (GTK_BOX (tab_hbox), label, TRUE, FALSE, 0);
 	gtk_box_pack_end (GTK_BOX (tab_hbox), button, FALSE, FALSE, 0);
 
-	gtk_widget_show_all (tab_hbox);
+	gtk_container_add (GTK_CONTAINER (event_box), tab_hbox);
+	gtk_widget_show_all (event_box);
 
 	gtk_notebook_append_page (GTK_NOTEBOOK (docman),
-				  GTK_WIDGET (document), tab_hbox);
+				  GTK_WIDGET (document), event_box);
 	
 	/* Listen for changes */
+	/* XXX: Why connect'ing to "(un)modifed" signals here? if we are (de)connecting on set_current_document? */
 	g_signal_connect (document, "modified", 
 			  G_CALLBACK (docman_doc_modified), 
 			  docman);
@@ -350,7 +370,14 @@
 	g_signal_connect (document, "uri_changed",
 			  G_CALLBACK (docman_doc_uri_changed),
 			  docman);
-	
+
+	/* Make necessary document connections for changing tab appearance when the file is (un)modified. */
+	g_signal_connect (document, "modified", 
+			  G_CALLBACK (document_modified), 
+			  document);
+	g_signal_connect (document, "unmodified",
+			  G_CALLBACK (document_unmodified),
+			  document);
 
 	g_signal_connect (G_OBJECT(document), "destroy",
 			  G_CALLBACK (docman_doc_destroy),
@@ -410,6 +437,11 @@
 		g_list_free (docman->documents);
 		docman->documents = NULL;
 	}
+
+	if (docman->priv->tooltips) {
+		g_object_unref (docman->priv->tooltips);
+		docman->priv->tooltips = NULL; /* XXX: Why is this needed? */
+	}
 }
 
 static void
@@ -552,6 +584,10 @@
 			  "activate",
 			  G_CALLBACK (docman_recent_files),
 			  dm);
+
+	dm->priv->tooltips = gtk_tooltips_new ();
+	g_object_ref (G_OBJECT (dm->priv->tooltips)); /* XXX: maybe just add the tooltips widget to the notebook? */
+	gtk_object_sink (GTK_OBJECT (dm->priv->tooltips)); /* don't forget to remove the unref from docman_dispose! */
 }
 
 static void
@@ -693,6 +729,50 @@
 }
 
 static void
+document_modified (GtkWidget *widget, gpointer data)
+{
+	ScaffoldDocument *document;
+	GtkWidget *label;
+	const gchar *str;
+	const gchar *new_str;
+
+	g_assert (SCAFFOLD_IS_DOCUMENT (data));
+
+	document = SCAFFOLD_DOCUMENT (data);
+	label = g_object_get_data (G_OBJECT (document), 
+				    "ScaffoldNotebookDocumentManager::label");
+	str = gtk_label_get_label (GTK_LABEL (label));
+
+	new_str = g_strdup_printf ("%s*", str);
+	gtk_label_set_label (GTK_LABEL (label), new_str);
+	g_free ((void*) new_str);
+}
+
+static void
+document_unmodified (GtkWidget *widget, gpointer data)
+{
+	ScaffoldDocument *document;
+	GtkWidget *label;
+	const gchar *str;
+	const gchar *new_str;
+	int length;
+
+	g_assert (SCAFFOLD_IS_DOCUMENT (data));
+
+	document = SCAFFOLD_DOCUMENT (data);
+	label = g_object_get_data (G_OBJECT (document), 
+				    "ScaffoldNotebookDocumentManager::label");
+	str = gtk_label_get_label (GTK_LABEL (label));
+
+	length = strlen (str);
+	if (length > 1 && str[length-1] == '*') {
+		new_str = g_strndup (str, length-1);
+		gtk_label_set_label (GTK_LABEL (label), new_str);
+		g_free ((void*) new_str);
+	}
+}
+
+static void
 set_current_document (ScaffoldNotebookDocumentManager *docman, 
 		      ScaffoldDocument *doc)
 {
@@ -955,7 +1035,7 @@
 			     "document-preferences", NULL);
 
 	if (!gui) {
-		g_warning ("Could not load scaffold-document-manager.glade, reinstall scaffold");
+		g_warning ("Could not load scaffold-document-manager.glade, reinstall scaffold\n");
 		return NULL;
 	}
 
@@ -1003,7 +1083,7 @@
 	if (!gnome_vfs_uri_exists (uri)) {
 		char *msg;
 		msg = g_strdup_printf (_("Could not find file '%s'"), string_uri);
-		g_warning (msg);
+		g_warning ("Could not find file '%s'\n", string_uri);
 		scaffold_dialog_error (msg);
 		g_free (msg);
 		gnome_vfs_uri_unref (uri);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.