[banshee] [WebBrowser] Add zooming support
- From: Gabriel Burt <gburt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee] [WebBrowser] Add zooming support
- Date: Fri, 13 Aug 2010 06:55:36 +0000 (UTC)
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]