[Sugar-devel] [PATCH] Add-view-source-for-sugar-toolkit

Walter Bender walter.bender at gmail.com
Mon Aug 22 11:04:03 EDT 2011


On Mon, Aug 22, 2011 at 10:17 AM, Simon Schampijer <simon at schampijer.de> wrote:
> On 08/19/2011 06:50 PM, Walter Bender wrote:
>>
>> From: Walter Bender<walter.bender at gmail.com>
>>
>> As per feedback from the design team, I have added a radio button to view
>> the source of the sugar-toolkit to the standard view source toolbar.
>>
>> ---
>>
>> Note: This is a modified version of an earlier patch that updates the
>> title
>> displayed in the View Source toolbar when switching between the activity
>> source
>> and the sugar-toolkit source. This patch also selects activity/activity.py
>> to
>> display in the viewer by default when looking at the sugar-toolkit source.
>>
>> Note: In this version of the patch, the TreeView is seeded with env.py.
>> This
>> patch also includes from cosmetic changes from erikos. It has been rebased
>> to
>> the latest version of sugar (2011-08-19)
>
> Hi Walter,
>
> thanks for the updated patch, applies cleanly now!
>
> A few smaller comments:
>
> I have attached a few screenshots [1] to illustrate a inconsistency I see
> with the title. While the title for the activity bundle and instance bundle
> says something like: "View source: 'Browse Activity'" the view source title
> for the toolkit is: "View Sugar toolkit source". Should we change the latter
> to: "View source: 'Sugar toolkit'"?
>
> For a follow up patch: when we display the instance (the activity document,
> in the case of Browse the html page loaded) we should adjust the title as
> well accordingly. Probably: "View source: 'Activity document'".
>
> Regards,
>   Simon
>
> [1] http://dev.laptop.org/~erikos/view_source/
>
>>  src/jarabe/view/viewsource.py |  127
>> +++++++++++++++++++++++++++++++---------
>>  1 files changed, 98 insertions(+), 29 deletions(-)
>>
>> diff --git a/src/jarabe/view/viewsource.py b/src/jarabe/view/viewsource.py
>> index 648e740..63a6977 100644
>> --- a/src/jarabe/view/viewsource.py
>> +++ b/src/jarabe/view/viewsource.py
>> @@ -17,6 +17,7 @@
>>  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
>>  USA
>>
>>  import os
>> +import sys
>>  import logging
>>  from gettext import gettext as _
>>
>> @@ -90,8 +91,15 @@ def setup_view_source(activity):
>>          _logger.debug('Activity without bundle_path nor document_path')
>>          return
>>
>> +    sugar_toolkit_path = None
>> +    for path in sys.path:
>> +        if path.endswith('site-packages'):
>> +            if os.path.exists(os.path.join(path, 'sugar')):
>> +                sugar_toolkit_path = os.path.join(path, 'sugar')
>> +                break
>> +
>>      view_source = ViewSource(window_xid, bundle_path, document_path,
>> -                             activity.get_title())
>> +                             sugar_toolkit_path, activity.get_title())
>>      map_activity_to_window[window_xid] = view_source
>>      view_source.show()
>>
>> @@ -99,10 +107,12 @@ def setup_view_source(activity):
>>  class ViewSource(gtk.Window):
>>      __gtype_name__ = 'SugarViewSource'
>>
>> -    def __init__(self, window_xid, bundle_path, document_path, title):
>> +    def __init__(self, window_xid, bundle_path, document_path,
>> +                 sugar_toolkit_path, title):
>>          gtk.Window.__init__(self)
>>
>> -        logging.debug('ViewSource paths: %r %r', bundle_path,
>> document_path)
>> +        _logger.debug('ViewSource paths: %r %r %r', bundle_path,
>> +                      document_path, sugar_toolkit_path)
>>
>>          self.set_decorated(False)
>>          self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
>> @@ -113,6 +123,7 @@ class ViewSource(gtk.Window):
>>          self.set_size_request(width, height)
>>
>>          self._parent_window_xid = window_xid
>> +        self._sugar_toolkit_path = sugar_toolkit_path
>>
>>          self.connect('realize', self.__realize_cb)
>>          self.connect('destroy', self.__destroy_cb, document_path)
>> @@ -122,7 +133,8 @@ class ViewSource(gtk.Window):
>>          self.add(vbox)
>>          vbox.show()
>>
>> -        toolbar = Toolbar(title, bundle_path, document_path)
>> +        toolbar = Toolbar(title, bundle_path, document_path,
>> +                          sugar_toolkit_path)
>>          vbox.pack_start(toolbar, expand=False)
>>          toolbar.connect('stop-clicked', self.__stop_clicked_cb)
>>          toolbar.connect('source-selected', self.__source_selected_cb)
>> @@ -132,26 +144,44 @@ class ViewSource(gtk.Window):
>>          vbox.pack_start(pane)
>>          pane.show()
>>
>> -        self._selected_file = None
>> +        self._selected_bundle_file = None
>> +        self._selected_sugar_file = None
>>          file_name = ''
>>
>>          activity_bundle = ActivityBundle(bundle_path)
>>          command = activity_bundle.get_command()
>>          if len(command.split(' '))>  1:
>> -            name = command.split(' ')[1].split('.')[0]
>> -            file_name = name + '.py'
>> +            name = command.split(' ')[1].split('.')[-1]
>> +            tmppath = command.split(' ')[1].replace('.', '/')
>> +            file_name = tmppath[0:-(len(name) + 1)] + '.py'
>>              path = os.path.join(activity_bundle.get_path(), file_name)
>> -            self._selected_file = path
>> +            self._selected_bundle_file = path
>> +
>> +        # Split the tree pane into two vertical panes, one of which
>> +        # will be hidden
>
> If not a clear todo I would remove this comment.
>
>> +        tree_panes = gtk.VPaned()
>> +        tree_panes.show()
>> +
>> +        self._bundle_source_viewer = FileViewer(bundle_path, file_name)
>> +        self._bundle_source_viewer.connect('file-selected',
>> +                                           self.__file_selected_cb)
>> +        tree_panes.add1(self._bundle_source_viewer)
>> +        self._bundle_source_viewer.show()
>>
>> -        self._file_viewer = FileViewer(bundle_path, file_name)
>> -        self._file_viewer.connect('file-selected',
>> self.__file_selected_cb)
>> -        pane.add1(self._file_viewer)
>> -        self._file_viewer.show()
>> +        file_name = 'env.py'
>> +        self._selected_sugar_file = os.path.join(sugar_toolkit_path,
>> file_name)
>> +        self._sugar_source_viewer = FileViewer(sugar_toolkit_path,
>> file_name)
>> +        self._sugar_source_viewer.connect('file-selected',
>> +                                          self.__file_selected_cb)
>> +        tree_panes.add2(self._sugar_source_viewer)
>> +        self._sugar_source_viewer.hide()
>> +
>> +        pane.add1(tree_panes)
>>
>>          self._source_display = SourceDisplay()
>>          pane.add2(self._source_display)
>>          self._source_display.show()
>> -        self._source_display.file_path = self._selected_file
>> +        self._source_display.file_path = self._selected_bundle_file
>>
>>          if document_path is not None:
>>              self._select_source(document_path)
>> @@ -178,12 +208,23 @@ class ViewSource(gtk.Window):
>>
>>      def _select_source(self, path):
>>          if os.path.isfile(path):
>> +            _logger.debug('_select_source called with file: %r', path)
>>              self._source_display.file_path = path
>> -            self._file_viewer.hide()
>> +            self._bundle_source_viewer.hide()
>> +            self._sugar_source_viewer.hide()
>> +        elif path == self._sugar_toolkit_path:
>> +            _logger.debug('_select_source called with sugar toolkit path:
>> %r',
>> +                          path)
>> +            self._sugar_source_viewer.set_path(path)
>> +            self._source_display.file_path = self._selected_sugar_file
>> +            self._sugar_source_viewer.show()
>> +            self._bundle_source_viewer.hide()
>>          else:
>> -            self._file_viewer.set_path(path)
>> -            self._source_display.file_path = self._selected_file
>> -            self._file_viewer.show()
>> +            _logger.debug('_select_source called with path: %r', path)
>> +            self._bundle_source_viewer.set_path(path)
>> +            self._source_display.file_path = self._selected_bundle_file
>> +            self._bundle_source_viewer.show()
>> +            self._sugar_source_viewer.hide()
>>
>>      def __destroy_cb(self, window, document_path):
>>          del map_activity_to_window[self._parent_window_xid]
>> @@ -198,7 +239,10 @@ class ViewSource(gtk.Window):
>>      def __file_selected_cb(self, file_viewer, file_path):
>>          if file_path is not None and os.path.isfile(file_path):
>>              self._source_display.file_path = file_path
>> -            self._selected_file = file_path
>> +            if file_viewer == self._bundle_source_viewer:
>> +                self._selected_bundle_file = file_path
>> +            else:
>> +                self._selected_sugar_file = file_path
>>          else:
>>              self._source_display.file_path = None
>>
>> @@ -269,10 +313,12 @@ class Toolbar(gtk.Toolbar):
>>                              ([str])),
>>      }
>>
>> -    def __init__(self, title, bundle_path, document_path):
>> +    def __init__(self, title, bundle_path, document_path,
>> sugar_toolkit_path):
>>          gtk.Toolbar.__init__(self)
>>
>>          document_button = None
>> +        self.bundle_path = bundle_path
>> +        self.sugar_toolkit_path = sugar_toolkit_path
>>
>>          self._add_separator()
>>
>> @@ -304,11 +350,31 @@ class Toolbar(gtk.Toolbar):
>>              activity_button.show()
>>              self._add_separator()
>>
>> -        text = _('View source: %r') % title
>> -        label = gtk.Label()
>> -        label.set_markup('<b>%s</b>' % text)
>> -        label.set_alignment(0, 0.5)
>> -        self._add_widget(label)
>> +        if sugar_toolkit_path is not None:
>> +            sugar_button = RadioToolButton()
>> +            icon = Icon(icon_name='computer-xo',
>> +                        icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR,
>> +                        fill_color=style.COLOR_TRANSPARENT.get_svg(),
>> +                        stroke_color=style.COLOR_WHITE.get_svg())
>> +            sugar_button.set_icon_widget(icon)
>> +            icon.show()
>> +            if document_button is not None:
>> +                sugar_button.props.group = document_button
>> +            else:
>> +                sugar_button.props.group = activity_button
>> +            sugar_button.props.tooltip = _('Sugar Toolkit Source')
>> +            sugar_button.connect('toggled', self.__button_toggled_cb,
>> +                                 sugar_toolkit_path)
>> +            self.insert(sugar_button, -1)
>> +            sugar_button.show()
>> +            self._add_separator()
>> +
>> +        self.activity_title_text = _('View source: %r') % title
>> +        self.sugar_toolkit_title_text = _('View Sugar toolkit source')
>> +        self.label = gtk.Label()
>> +        self.label.set_markup('<b>%s</b>' % self.activity_title_text)
>> +        self.label.set_alignment(0, 0.5)
>> +        self._add_widget(self.label)
>>
>>          self._add_separator(True)
>>
>> @@ -344,6 +410,10 @@ class Toolbar(gtk.Toolbar):
>>      def __button_toggled_cb(self, button, path):
>>          if button.props.active:
>>              self.emit('source-selected', path)
>> +        if path == self.sugar_toolkit_path:
>> +            self.label.set_markup('<b>%s</b>' %
>> self.sugar_toolkit_title_text)
>> +        else:  # Use activity title for either bundle path or document
>> path
>> +            self.label.set_markup('<b>%s</b>' % self.activity_title_text)
>
> I guess here is what I have been requested above, an alert title for the
> document.
>
>>
>>  class FileViewer(gtk.ScrolledWindow):
>> @@ -386,22 +456,23 @@ class FileViewer(gtk.ScrolledWindow):
>>          self.emit('file-selected', None)
>>          if self._path == path:
>>              return
>> +
>>          self._path = path
>>          self._tree_view.set_model(gtk.TreeStore(str, str))
>> +        self._model = self._tree_view.get_model()
>>          self._add_dir_to_model(path)
>>
>>      def _add_dir_to_model(self, dir_path, parent=None):
>> -        model = self._tree_view.get_model()
>>          for f in os.listdir(dir_path):
>>              if f.endswith(_EXCLUDE_EXTENSIONS) or f in _EXCLUDE_NAMES:
>>                  continue
>>
>>              full_path = os.path.join(dir_path, f)
>>              if os.path.isdir(full_path):
>> -                new_iter = model.append(parent, [f, full_path])
>> +                new_iter = self._model.append(parent, [f, full_path])
>>                  self._add_dir_to_model(full_path, new_iter)
>>              else:
>> -                current_iter = model.append(parent, [f, full_path])
>> +                current_iter = self._model.append(parent, [f, full_path])
>>                  if f == self._initial_filename:
>>                      selection = self._tree_view.get_selection()
>>                      selection.select_iter(current_iter)
>> @@ -441,8 +512,6 @@ class SourceDisplay(gtk.ScrolledWindow):
>>          self._file_path = None
>>
>>      def _set_file_path(self, file_path):
>> -        if file_path == self._file_path:
>> -            return
>>          self._file_path = file_path
>>
>>          if self._file_path is None:
>
>

Good catch. I agree we should make the title phrasing consistent along
the lines you suggest: View Source: Sugar toolkit

Regarding the other change: View Source: Activity Document, I also
agree as per an earlier discussion in the design meeting. However, I
hadn' made that change, figuring it was introducing something new to
the patch at this late date. Happy to do so if you give me leave to
make changes after the freeze date.

The other change I would suggest would be to add the view-source badge
to the icons in the toolbar. But this too could easily wait until the
next release cycle.

thanks.

-walter

-- 
Walter Bender
Sugar Labs
http://www.sugarlabs.org


More information about the Sugar-devel mailing list