[banshee] [WebBrowser] Add zooming support



commit 487ba85c309e7c70d46b6ae0d5f17e6b985d0b65
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Thu Aug 12 23:53:49 2010 -0700

    [WebBrowser] Add zooming support
    
    Both WebSources (Amazon store and MiroGuide) will save the last zoom
    state.  There are View menu items, keyboard shortcuts, and ctrl-mousewheel
    scrolling.

 .../Banshee.WebBrowser/OssiferWebView.cs           |   18 ++++++
 .../Banshee.WebSource/WebBrowserShell.cs           |    2 +
 .../Banshee.WebSource/WebSource.cs                 |   57 ++++++++++++++++++-
 .../Banshee.WebSource/WebView.cs                   |   22 ++++++++
 .../libossifer/ossifer-web-view.c                  |   14 +++++
 5 files changed, 110 insertions(+), 3 deletions(-)
---
diff --git a/src/Core/Banshee.WebBrowser/Banshee.WebBrowser/OssiferWebView.cs b/src/Core/Banshee.WebBrowser/Banshee.WebBrowser/OssiferWebView.cs
index e171498..600e091 100644
--- a/src/Core/Banshee.WebBrowser/Banshee.WebBrowser/OssiferWebView.cs
+++ b/src/Core/Banshee.WebBrowser/Banshee.WebBrowser/OssiferWebView.cs
@@ -54,6 +54,7 @@ namespace Banshee.WebBrowser
         private Callbacks callbacks;
 
         public event EventHandler LoadStatusChanged;
+        public event Action<float> ZoomChanged;
 
         [DllImport (LIBOSSIFER)]
         private static extern IntPtr ossifer_web_view_get_type ();
@@ -237,6 +238,23 @@ namespace Banshee.WebBrowser
         }
 
         [DllImport (LIBOSSIFER)]
+        private static extern void ossifer_web_view_set_zoom (IntPtr ossifer, float zoomLevel);
+
+        [DllImport (LIBOSSIFER)]
+        private static extern float ossifer_web_view_get_zoom (IntPtr ossifer);
+
+        public float Zoom {
+            get { return ossifer_web_view_get_zoom (Handle); }
+            set {
+                ossifer_web_view_set_zoom (Handle, value);
+                var handler = ZoomChanged;
+                if (handler != null) {
+                    handler (value);
+                }
+            }
+        }
+
+        [DllImport (LIBOSSIFER)]
         private static extern void ossifer_web_view_reload (IntPtr ossifer);
 
         [DllImport (LIBOSSIFER)]
diff --git a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebBrowserShell.cs b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebBrowserShell.cs
index 182ee53..59fdddc 100644
--- a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebBrowserShell.cs
+++ b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebBrowserShell.cs
@@ -47,6 +47,8 @@ namespace Banshee.WebSource
 
         public SearchEntry SearchEntry { get { return search_entry; } }
 
+        public WebView View { get { return view; } }
+
         public WebBrowserShell (string name, WebView view) : base (2, 4, false)
         {
             this.name = name;
diff --git a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebSource.cs b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebSource.cs
index 481f5f8..274aa4e 100644
--- a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebSource.cs
+++ b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebSource.cs
@@ -27,10 +27,14 @@
 using System;
 using Mono.Unix;
 
+using Gtk;
+
 using Hyena;
 
 using Banshee.Sources;
 using Banshee.Sources.Gui;
+using Banshee.Gui;
+using Banshee.Configuration;
 using Banshee.WebBrowser;
 
 namespace Banshee.WebSource
@@ -38,20 +42,67 @@ namespace Banshee.WebSource
     public abstract class WebSource : Source
     {
         private WebSourceContents source_contents;
+        private WebView view;
+        private BansheeActionGroup actions;
 
         public WebSource (string name, int order, string id) : base (name, name, order, id)
         {
             TypeUniqueId = id;
             Properties.Set<bool> ("Nereid.SourceContents.HeaderVisible", false);
+
+            actions = new BansheeActionGroup (id);
+            actions.Add (
+                new ActionEntry ("ZoomIn"  + id, Stock.ZoomIn,  null, "<control>plus", null, (o, a) => view.ZoomIn ()),
+                new ActionEntry ("ZoomOut" + id, Stock.ZoomOut, null, "<control>minus", null, (o, a) => view.ZoomOut ()),
+                new ActionEntry ("Zoom100" + id, Stock.Zoom100, null, "<control>0", null, (o, a) => view.Zoom = 1f)
+            );
+
+            Properties.Set<BansheeActionGroup> ("ActiveSourceActions", actions);
         }
 
         public override void Activate ()
         {
             if (source_contents == null) {
                 var shell = GetWidget ();
+
+                // float isn't supported by gconf apparently
+                var zoom_conf = CreateSchema<double> ("webview_zoom", 1f, null, null);
+                shell.View.Zoom = (float)zoom_conf.Get ();
+                shell.View.ZoomChanged += z => zoom_conf.Set (z);
+                view = shell.View;
+
                 Properties.Set<ISourceContents> ("Nereid.SourceContents",
                     source_contents = new WebSourceContents (this, shell));
                 Properties.Set<Banshee.Widgets.SearchEntry> ("Nereid.SearchEntry", shell.SearchEntry);
+
+                actions.AddUiFromString (String.Format (@"
+                    <ui>
+                      <menubar name=""MainMenu"" action=""MainMenuAction"">
+                        <menu name=""ViewMenu"" action=""ViewMenuAction"">
+                          <placeholder name=""ViewMenuAdditions"">
+                            <separator/>
+                            <menuitem action=""ZoomIn{0}""/>
+                            <menuitem action=""ZoomOut{0}""/>
+                            <menuitem action=""Zoom100{0}""/>
+                            <separator/>
+                          </placeholder>
+                        </menu>
+                      </menubar>
+                    </ui>", TypeUniqueId
+                ));
+
+                // Add additional menu item keybindings
+                var item = actions.ActionManager.UIManager.GetWidget ("/MainMenu/ViewMenu/ViewMenuAdditions/ZoomIn" + TypeUniqueId);
+                item.AddAccelerator ("activate", actions.ActionManager.UIManager.AccelGroup,
+                    (uint) Gdk.Key.KP_Add, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible);
+                item.AddAccelerator ("activate", actions.ActionManager.UIManager.AccelGroup,
+                    (uint) Gdk.Key.equal, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible);
+
+                item = actions.ActionManager.UIManager.GetWidget ("/MainMenu/ViewMenu/ViewMenuAdditions/ZoomOut" + TypeUniqueId);
+                item.AddAccelerator ("activate", actions.ActionManager.UIManager.AccelGroup,
+                    (uint) Gdk.Key.KP_Subtract, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible);
+                item.AddAccelerator ("activate", actions.ActionManager.UIManager.AccelGroup,
+                    (uint) Gdk.Key.underscore, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible);
             }
 
             base.Activate ();
@@ -66,9 +117,9 @@ namespace Banshee.WebSource
         private class WebSourceContents : ISourceContents
         {
             private WebSource source;
-            private Gtk.Widget widget;
+            private Widget widget;
 
-            public WebSourceContents (WebSource source, Gtk.Widget widget)
+            public WebSourceContents (WebSource source, Widget widget)
             {
                 this.source = source;
                 this.widget = widget;
@@ -83,7 +134,7 @@ namespace Banshee.WebSource
             {
             }
 
-            public Gtk.Widget Widget {
+            public Widget Widget {
                 get { return widget; }
             }
 
diff --git a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebView.cs b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebView.cs
index 786cbd2..ae63e06 100644
--- a/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebView.cs
+++ b/src/Core/Banshee.WebBrowser/Banshee.WebSource/WebView.cs
@@ -54,6 +54,28 @@ namespace Banshee.WebSource
             CanSearch = false;
         }
 
+        const float ZOOM_STEP = 0.05f;
+
+        public void ZoomIn ()
+        {
+            Zoom += ZOOM_STEP;
+        }
+
+        public void ZoomOut ()
+        {
+            Zoom -= ZOOM_STEP;
+        }
+
+        protected override bool OnScrollEvent (Gdk.EventScroll scroll)
+        {
+            if ((scroll.State & Gdk.ModifierType.ControlMask) != 0) {
+                Zoom += (scroll.Direction == Gdk.ScrollDirection.Up) ? ZOOM_STEP : -ZOOM_STEP;
+                return true;
+            }
+
+            return base.OnScrollEvent (scroll);
+        }
+
         protected override void OnLoadStatusChanged (OssiferLoadStatus status)
         {
             if ((status == OssiferLoadStatus.FirstVisuallyNonEmptyLayout ||
diff --git a/src/Core/Banshee.WebBrowser/libossifer/ossifer-web-view.c b/src/Core/Banshee.WebBrowser/libossifer/ossifer-web-view.c
index 920904a..57a4c4a 100644
--- a/src/Core/Banshee.WebBrowser/libossifer/ossifer-web-view.c
+++ b/src/Core/Banshee.WebBrowser/libossifer/ossifer-web-view.c
@@ -350,6 +350,20 @@ ossifer_web_view_reload (OssiferWebView *ossifer)
 }
 
 void
+ossifer_web_view_set_zoom (OssiferWebView *ossifer, gfloat zoomLevel)
+{
+    g_return_if_fail (OSSIFER_WEB_VIEW (ossifer));
+    return webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW (ossifer), zoomLevel);
+}
+
+gfloat
+ossifer_web_view_get_zoom (OssiferWebView *ossifer)
+{
+    g_return_val_if_fail (OSSIFER_WEB_VIEW (ossifer), 1);
+    return webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (ossifer));
+}
+
+void
 ossifer_web_view_reload_bypass_cache (OssiferWebView *ossifer)
 {
     g_return_if_fail (OSSIFER_WEB_VIEW (ossifer));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]