[Sugar-devel] [PATCH Help] Migrated to Gtk3 and WebKit.WebView SL #3466

Chris Leonard cjlhomeaddress at gmail.com
Tue Apr 24 21:52:26 EDT 2012


Hey Doc Sprinters,

Manuel (humitos) Kaufman has recently been patching the old Help
Activity to work with GTK3+

Seeing as he has recently been through the activity code line-by-line,
someone should offer him the FOSS-standard bribe of beers to be
delivered at a future time and place to help you guys turn your new
content into a new version o Help.

Just a thought.

cjl

On Tue, Apr 24, 2012 at 9:26 PM, Manuel Kaufmann <humitos at gmail.com> wrote:
>  - All the code was migrated to Gtk3 following this guide[1]
>  - Toolbar View's icon was changed from "camera" to the right one: "toolbar-view"
>
> [1] http://wiki.sugarlabs.org/go/Features/GTK3/Porting
>
> Signed-off-by: Manuel Kaufmann <humitos at gmail.com>
> ---
>  browser.py          |   45 ++------------
>  helpactivity.py     |  165 ++++++++++++++++++++++-----------------------------
>  mybutton.py         |   53 -----------------
>  progresslistener.py |   27 +++++----
>  setup.py            |    2 +-
>  viewtoolbar.py      |   12 ++--
>  6 files changed, 97 insertions(+), 207 deletions(-)
>  delete mode 100644 mybutton.py
>
> diff --git a/browser.py b/browser.py
> index 4d89715..ab24d1d 100644
> --- a/browser.py
> +++ b/browser.py
> @@ -12,53 +12,18 @@
>  # along with this program; if not, write to the Free Software
>  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>
> -import os
> -import time
> -import logging
> -from gettext import gettext as _
> -
> -import gobject
> -import gtk
> -import hulahop
> -import xpcom
> -from xpcom.nsError import *
> -from xpcom import components
> -from xpcom.components import interfaces
> -from hulahop.webview import WebView
> -
> -from sugar.datastore import datastore
> -from sugar import profile
> -from sugar import env
> -from sugar.activity import activity
> -from sugar.graphics import style
> -
> +from gi.repository import WebKit
>  from progresslistener import ProgressListener
>
>  _ZOOM_AMOUNT = 0.1
>
> -class Browser(WebView):
> +
> +class Browser(WebKit.WebView):
>     def __init__(self):
> -        WebView.__init__(self)
> +        WebKit.WebView.__init__(self)
>
>         self.progress = ProgressListener()
>
>     def do_setup(self):
> -        WebView.do_setup(self)
> +        WebKit.WebView.do_setup(self)
>         self.progress.setup(self)
> -
> -    def zoom_in(self):
> -        contentViewer = self.doc_shell.queryInterface( \
> -                interfaces.nsIDocShell).contentViewer
> -        if contentViewer is not None:
> -            markupDocumentViewer = contentViewer.queryInterface( \
> -                    interfaces.nsIMarkupDocumentViewer)
> -            markupDocumentViewer.fullZoom += _ZOOM_AMOUNT
> -
> -    def zoom_out(self):
> -        contentViewer = self.doc_shell.queryInterface( \
> -                interfaces.nsIDocShell).contentViewer
> -        if contentViewer is not None:
> -            markupDocumentViewer = contentViewer.queryInterface( \
> -                    interfaces.nsIMarkupDocumentViewer)
> -            markupDocumentViewer.fullZoom -= _ZOOM_AMOUNT
> -
> diff --git a/helpactivity.py b/helpactivity.py
> index 210c423..84e1688 100755
> --- a/helpactivity.py
> +++ b/helpactivity.py
> @@ -15,25 +15,20 @@
>  import os
>  from gettext import gettext as _
>
> -import gtk
> -import gobject
> +from gi.repository import Gtk
> +from gi.repository import GObject
>
> -from sugar.activity import activity
> -from sugar.graphics.toolbutton import ToolButton
> -from sugar.graphics.toolcombobox import ToolComboBox
> +from sugar3.activity import activity
> +from sugar3.graphics.toolbutton import ToolButton
> +from sugar3.graphics.toolbarbox import ToolbarBox, ToolbarButton
> +from sugar3.activity.widgets import StopButton
>
> -import hulahop
> -hulahop.startup(os.path.join(activity.get_activity_root(), 'data/gecko'))
> -
> -#from hulahop.webview import WebView
>  from browser import Browser
> -import xpcom
> -from xpcom.components import interfaces
>  from viewtoolbar import ViewToolbar
> -gobject.threads_init()
>
> -HOME = os.path.join(activity.get_bundle_path(), 'help/XO_Introduction.html')
> -#HOME = "http://website.com/something.html"
> +HOME = 'file://' + os.path.join(activity.get_bundle_path(),
> +                                'help/XO_Introduction.html')
> +
>
>  class HelpActivity(activity.Activity):
>     def __init__(self, handle):
> @@ -41,91 +36,72 @@ class HelpActivity(activity.Activity):
>
>         self.props.max_participants = 1
>
> +        # we do not have collaboration features
> +        # make the share option insensitive
> +        self.max_participants = 1
> +
>         self._web_view = Browser()
> +        self._scrolled_window = Gtk.ScrolledWindow()
> +        self._scrolled_window.add(self._web_view)
> +        self._scrolled_window.show()
> +
> +        toolbar_box = ToolbarBox()
> +
> +        viewtoolbar = ViewToolbar(self)
> +        viewbutton = ToolbarButton(page=viewtoolbar,
> +                                   icon_name='toolbar-view')
> +        toolbar_box.toolbar.insert(viewbutton, -1)
> +        viewbutton.show()
> +
> +        separator = Gtk.SeparatorToolItem()
> +        #separator.props.draw = False
> +        #separator.set_expand(True)
> +        toolbar_box.toolbar.insert(separator, -1)
> +        separator.show()
> +
> +        #lets reuse the code below
> +        navtoolbar = Toolbar(self._web_view)
> +
> +        toolitem = Gtk.ToolItem()
> +        navtoolbar._home.reparent(toolitem)
> +        toolbar_box.toolbar.insert(toolitem, -1)
> +        navtoolbar._home.show()
> +        toolitem.show()
> +
> +        toolitem = Gtk.ToolItem()
> +        navtoolbar._back.reparent(toolitem)
> +        toolbar_box.toolbar.insert(toolitem, -1)
> +        navtoolbar._back.show()
> +        toolitem.show()
> +
> +        toolitem = Gtk.ToolItem()
> +        navtoolbar._forward.reparent(toolitem)
> +        toolbar_box.toolbar.insert(toolitem, -1)
> +        navtoolbar._forward.show()
> +        toolitem.show()
> +
> +        separator = Gtk.SeparatorToolItem()
> +        separator.props.draw = False
> +        separator.set_expand(True)
> +        toolbar_box.toolbar.insert(separator, -1)
> +        separator.show()
> +
> +        stop_button = StopButton(self)
> +        toolbar_box.toolbar.insert(stop_button, -1)
> +        stop_button.show()
> +
> +        self.set_toolbar_box(toolbar_box)
> +        toolbar_box.show()
> +
> +        self.set_canvas(self._scrolled_window)
>
> -        try:
> -            from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton
> -            from sugar.activity.widgets import ActivityToolbarButton, StopButton, \
> -                                            ShareButton
> -            from mybutton import MyActivityToolbarButton
> -
> -            toolbar_box = ToolbarBox()
> -            activity_button = MyActivityToolbarButton(self)
> -            toolbar_box.toolbar.insert(activity_button, 0)
> -            activity_button.show()
> -
> -            viewtoolbar = ViewToolbar(self)
> -            viewbutton = ToolbarButton(page=viewtoolbar, \
> -                                        icon_name='camera')
> -            toolbar_box.toolbar.insert(viewbutton, -1)
> -            viewbutton.show()
> -
> -            separator = gtk.SeparatorToolItem()
> -            #separator.props.draw = False
> -            #separator.set_expand(True)
> -            toolbar_box.toolbar.insert(separator, -1)
> -            separator.show()
> -
> -            #lets reuse the code below
> -            navtoolbar = Toolbar(self._web_view)
> -
> -            toolitem = gtk.ToolItem()
> -            navtoolbar._home.reparent(toolitem)
> -            toolbar_box.toolbar.insert(toolitem, -1)
> -            navtoolbar._home.show()
> -            toolitem.show()
> -
> -            toolitem = gtk.ToolItem()
> -            navtoolbar._back.reparent(toolitem)
> -            toolbar_box.toolbar.insert(toolitem, -1)
> -            navtoolbar._back.show()
> -            toolitem.show()
> -
> -            toolitem = gtk.ToolItem()
> -            navtoolbar._forward.reparent(toolitem)
> -            toolbar_box.toolbar.insert(toolitem, -1)
> -            navtoolbar._forward.show()
> -            toolitem.show()
> -
> -            # we do not have collaboration features
> -            # make the share option insensitive
> -            self.max_participants = 1
> -
> -            separator = gtk.SeparatorToolItem()
> -            separator.props.draw = False
> -            separator.set_expand(True)
> -            toolbar_box.toolbar.insert(separator, -1)
> -            separator.show()
> -
> -            stop_button = StopButton(self)
> -            toolbar_box.toolbar.insert(stop_button, -1)
> -            stop_button.show()
> -
> -            self.set_toolbar_box(toolbar_box)
> -            toolbar_box.show()
> -
> -        except ImportError:
> -            toolbox = activity.ActivityToolbox(self)
> -            self.set_toolbox(toolbox)
> -            toolbox.show()
> -
> -            toolbar = Toolbar(self._web_view)
> -            toolbox.add_toolbar(_('Navigation'), toolbar)
> -            toolbar.show()
> -            viewtoolbar = ViewToolbar(self)
> -            toolbox.add_toolbar(_('View'),viewtoolbar)
> -            viewtoolbar.show()
> -
> -            toolbox.set_current_toolbar(1)
> -
> -        self.set_canvas(self._web_view)
>         self._web_view.show()
> -
>         self._web_view.load_uri(HOME)
>
> -class Toolbar(gtk.Toolbar):
> +
> +class Toolbar(Gtk.Toolbar):
>     def __init__(self, web_view):
> -        gobject.GObject.__init__(self)
> +        GObject.GObject.__init__(self)
>
>         self._web_view = web_view
>
> @@ -169,10 +145,9 @@ class Toolbar(gtk.Toolbar):
>
>     def _go_back_cb(self, button):
>         self._web_view.web_navigation.goBack()
> -
> +
>     def _go_forward_cb(self, button):
>         self._web_view.web_navigation.goForward()
>
>     def _go_home_cb(self, button):
>         self._web_view.load_uri(HOME)
> -
> diff --git a/mybutton.py b/mybutton.py
> deleted file mode 100644
> index b1f1f84..0000000
> --- a/mybutton.py
> +++ /dev/null
> @@ -1,53 +0,0 @@
> -# mybutton.py  A version of ActivityToolbarButton that hides the "Keep"
> -# button.
> -
> -# Copyright (C) 2010  James D. Simmons
> -#
> -# This program is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License along
> -# with this program; if not, write to the Free Software Foundation, Inc.,
> -# 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  US
> -import gtk
> -import gconf
> -
> -from sugar.graphics.toolbarbox import ToolbarButton
> -from sugar.activity.widgets import ActivityToolbar
> -from sugar.graphics.xocolor import XoColor
> -from sugar.graphics.icon import Icon
> -from sugar.bundle.activitybundle import ActivityBundle
> -
> -def _create_activity_icon(metadata):
> -    if metadata.get('icon-color', ''):
> -        color = XoColor(metadata['icon-color'])
> -    else:
> -        client = gconf.client_get_default()
> -        color = XoColor(client.get_string('/desktop/sugar/user/color'))
> -
> -    from sugar.activity.activity import get_bundle_path
> -    bundle = ActivityBundle(get_bundle_path())
> -    icon = Icon(file=bundle.get_icon(), xo_color=color)
> -
> -    return icon
> -
> -class MyActivityToolbarButton(ToolbarButton):
> -
> -    def __init__(self, activity, **kwargs):
> -        toolbar = ActivityToolbar(activity, orientation_left=True)
> -        toolbar.stop.hide()
> -        toolbar.keep.hide()
> -        toolbar.title.unset_flags(gtk.CAN_FOCUS)
> -
> -        ToolbarButton.__init__(self, page=toolbar, **kwargs)
> -
> -        icon = _create_activity_icon(activity.metadata)
> -        self.set_icon_widget(icon)
> -        icon.show()
> diff --git a/progresslistener.py b/progresslistener.py
> index cf3cb43..c098843 100644
> --- a/progresslistener.py
> +++ b/progresslistener.py
> @@ -12,26 +12,27 @@
>  # along with this program; if not, write to the Free Software
>  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>
> -import gobject
>  import xpcom
>  from xpcom.components import interfaces
> +from gi.repository import GObject
>
> -class ProgressListener(gobject.GObject):
> +
> +class ProgressListener(GObject.GObject):
>     _com_interfaces_ = interfaces.nsIWebProgressListener
>
>     __gsignals__ = {
> -        'location-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
> +        'location-changed': (GObject.SignalFlags.RUN_FIRST, None,
>                              ([object])),
> -        'loading-start':    (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
> +        'loading-start':    (GObject.SignalFlags.RUN_FIRST, None,
>                              ([])),
> -        'loading-stop':     (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
> +        'loading-stop':     (GObject.SignalFlags.RUN_FIRST, None,
>                              ([])),
> -        'loading-progress': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
> +        'loading-progress': (GObject.SignalFlags.RUN_FIRST, None,
>                              ([float]))
>     }
>
>     def __init__(self):
> -        gobject.GObject.__init__(self)
> +        GObject.GObject.__init__(self)
>
>         self.total_requests = 0
>         self.completed_requests = 0
> @@ -48,21 +49,21 @@ class ProgressListener(gobject.GObject):
>                interfaces.nsIWebProgress.NOTIFY_LOCATION
>
>         browser.web_progress.addProgressListener(self._wrapped_self, mask)
> -
> +
>     def _reset_requests_count(self):
>         self.total_requests = 0
>         self.completed_requests = 0
> -
> +
>     def onLocationChange(self, webProgress, request, location):
>         self.emit('location-changed', location)
> -
> +
>     def onProgressChange(self, webProgress, request, curSelfProgress,
>                          maxSelfProgress, curTotalProgress, maxTotalProgress):
>         pass
> -
> +
>     def onSecurityChange(self, webProgress, request, state):
>         pass
> -
> +
>     def onStateChange(self, webProgress, request, stateFlags, status):
>         if stateFlags & interfaces.nsIWebProgressListener.STATE_IS_REQUEST:
>             if stateFlags & interfaces.nsIWebProgressListener.STATE_START:
> @@ -73,7 +74,7 @@ class ProgressListener(gobject.GObject):
>         if stateFlags & interfaces.nsIWebProgressListener.STATE_IS_NETWORK:
>             if stateFlags & interfaces.nsIWebProgressListener.STATE_START:
>                 self.emit('loading-start')
> -                self._reset_requests_count()
> +                self._reset_requests_count()
>             elif stateFlags & interfaces.nsIWebProgressListener.STATE_STOP:
>                 self.emit('loading-stop')
>
> diff --git a/setup.py b/setup.py
> index 8c17051..653d383 100755
> --- a/setup.py
> +++ b/setup.py
> @@ -14,6 +14,6 @@
>  # along with this program; if not, write to the Free Software
>  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>
> -from sugar.activity import bundlebuilder
> +from sugar3.activity import bundlebuilder
>
>  bundlebuilder.start()
> diff --git a/viewtoolbar.py b/viewtoolbar.py
> index c5dc990..13a1ce5 100644
> --- a/viewtoolbar.py
> +++ b/viewtoolbar.py
> @@ -16,13 +16,15 @@
>
>  from gettext import gettext as _
>
> -import gtk
> +from gi.repository import Gtk
> +from gi.repository import GObject
>
> -from sugar.graphics.toolbutton import ToolButton
> +from sugar3.graphics.toolbutton import ToolButton
>
> -class ViewToolbar(gtk.Toolbar):
> +
> +class ViewToolbar(Gtk.Toolbar):
>     def __init__(self, activity):
> -        gtk.Toolbar.__init__(self)
> +        GObject.GObject.__init__(self)
>
>         self._activity = activity
>
> @@ -40,7 +42,7 @@ class ViewToolbar(gtk.Toolbar):
>         self.insert(self.zoomin, -1)
>         self.zoomin.show()
>
> -        self.separator = gtk.SeparatorToolItem()
> +        self.separator = Gtk.SeparatorToolItem()
>         self.separator.set_draw(True)
>         self.insert(self.separator, -1)
>         self.separator.show()
> --
> 1.7.10
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel


More information about the Sugar-devel mailing list