SF.net SVN: geany-plugins:[1770] trunk/geany-plugins/webhelper/src/ gwh-plugin.c

colombanw at users.sourceforge.net colombanw at xxxxx
Sun Dec 12 21:41:55 UTC 2010


Revision: 1770
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1770&view=rev
Author:   colombanw
Date:     2010-12-12 21:41:55 +0000 (Sun, 12 Dec 2010)

Log Message:
-----------
WebHelper: Add a configuration dialog

Add a configuration dialog and allow runtime positioning of the web
view widget.

Modified Paths:
--------------
    trunk/geany-plugins/webhelper/src/gwh-plugin.c

Modified: trunk/geany-plugins/webhelper/src/gwh-plugin.c
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-plugin.c	2010-12-12 21:41:36 UTC (rev 1769)
+++ trunk/geany-plugins/webhelper/src/gwh-plugin.c	2010-12-12 21:41:55 UTC (rev 1770)
@@ -62,6 +62,57 @@
 
 
 static void
+attach_browser (void)
+{
+  GwhBrowserPosition position;
+  
+  g_object_get (G_settings, "browser-position", &position, NULL);
+  if (position == GWH_BROWSER_POSITION_LEFT) {
+    G_notebook = geany_data->main_widgets->sidebar_notebook;
+  } else {
+    G_notebook = geany_data->main_widgets->message_window_notebook;
+  }
+  G_page_num = gtk_notebook_append_page (GTK_NOTEBOOK (G_notebook), G_browser,
+                                         gtk_label_new (_("Web preview")));
+}
+
+static void
+detach_browser (void)
+{
+  /* remove the page we added. we handle the case where the page were
+   * reordered */
+  if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
+                                 G_page_num) != G_browser) {
+    gint i;
+    gint n;
+    
+    G_page_num = -1;
+    n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (G_notebook));
+    for (i = 0; i < n; i++) {
+      if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
+                                     i) == G_browser) {
+        G_page_num = i;
+        break;
+      }
+    }
+  }
+  if (G_page_num >= 0) {
+    gtk_notebook_remove_page (GTK_NOTEBOOK (G_notebook), G_page_num);
+  }
+}
+
+static void
+on_settings_browser_position_notify (GObject     *object,
+                                     GParamSpec  *pspec,
+                                     gpointer     data)
+{
+  g_object_ref (G_browser);
+  detach_browser ();
+  attach_browser ();
+  g_object_unref (G_browser);
+}
+
+static void
 on_document_save (GObject        *obj,
                   GeanyDocument  *doc,
                   gpointer        user_data)
@@ -150,8 +201,6 @@
 void
 plugin_init (GeanyData *data)
 {
-  gint position;
-  
   /* even though it's not really a good idea to keep all the library we load
    * into memory, this is needed for webkit. first, without this we creash after
    * module unloading, and webkitgtk inserts static data into the GLib
@@ -166,17 +215,12 @@
   g_signal_connect (G_browser, "populate-popup",
                     G_CALLBACK (on_browser_populate_popup), NULL);
   
-  g_object_get (G_OBJECT (G_settings), "browser-position", &position, NULL);
-  if (position == GWH_BROWSER_POSITION_LEFT) {
-    G_notebook = data->main_widgets->sidebar_notebook;
-  } else {
-    G_notebook = data->main_widgets->message_window_notebook;
-  }
-  G_page_num = gtk_notebook_append_page (GTK_NOTEBOOK (G_notebook), G_browser,
-                                         gtk_label_new (_("Web preview")));
-  
+  attach_browser ();
   gtk_widget_show_all (G_browser);
   
+  g_signal_connect (G_settings, "notify::browser-position",
+                    G_CALLBACK (on_settings_browser_position_notify), NULL);
+  
   plugin_signal_connect (geany_plugin, NULL, "document-save", TRUE,
                          G_CALLBACK (on_document_save), NULL);
 }
@@ -184,26 +228,62 @@
 void
 plugin_cleanup (void)
 {
-  /* remove the page we added. we handle the case where the page were
-   * reordered */
-  if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
-                                 G_page_num) != G_browser) {
-    gint i;
-    gint n;
+  detach_browser ();
+  
+  save_config ();
+}
+
+
+typedef struct _GwhConfigDialog GwhConfigDialog;
+struct _GwhConfigDialog
+{
+  GtkWidget *browser_position;
+  GtkWidget *browser_auto_reload;
+};
+
+static void
+on_configure_dialog_response (GtkDialog        *dialog,
+                              gint              response_id,
+                              GwhConfigDialog  *cdialog)
+{
+  switch (response_id) {
+    case GTK_RESPONSE_ACCEPT:
+    case GTK_RESPONSE_APPLY:
+    case GTK_RESPONSE_OK:
+    case GTK_RESPONSE_YES: {
+      gwh_settings_widget_sync (G_settings, cdialog->browser_position);
+      gwh_settings_widget_sync (G_settings, cdialog->browser_auto_reload);
+      break;
+    }
     
-    G_page_num = -1;
-    n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (G_notebook));
-    for (i = 0; i < n; i++) {
-      if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
-                                     i) == G_browser) {
-        G_page_num = i;
-        break;
-      }
-    }
+    default: break;
   }
-  if (G_page_num >= 0) {
-    gtk_notebook_remove_page (GTK_NOTEBOOK (G_notebook), G_page_num);
+  
+  if (response_id != GTK_RESPONSE_APPLY) {
+    g_free (cdialog);
   }
+}
+
+
+GtkWidget *
+plugin_configure (GtkDialog *dialog)
+{
+  GtkWidget        *box;
+  GwhConfigDialog  *cdialog;
   
-  save_config ();
+  cdialog = g_malloc (sizeof *cdialog);
+  
+  box = gtk_vbox_new (FALSE, 6);
+  cdialog->browser_position = gwh_settings_widget_new (G_settings,
+                                                       "browser-position");
+  gtk_box_pack_start (GTK_BOX (box), cdialog->browser_position, FALSE, TRUE, 0);
+  cdialog->browser_auto_reload = gwh_settings_widget_new (G_settings,
+                                                          "browser-auto-reload");
+  gtk_box_pack_start (GTK_BOX (box), cdialog->browser_auto_reload,
+                      FALSE, TRUE, 0);
+  
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (on_configure_dialog_response), cdialog);
+  
+  return box;
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list