diff options
Diffstat (limited to 'TurtleArtActivity.py')
-rw-r--r-- | TurtleArtActivity.py | 213 |
1 files changed, 122 insertions, 91 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index 820a9e3..75803e8 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -36,6 +36,7 @@ try: # 0.86 toolbar widgets except ImportError: HAS_TOOLBARBOX = False from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.radiotoolbutton import RadioToolButton from sugar.datastore import datastore from sugar import profile @@ -47,7 +48,7 @@ import tarfile from gettext import gettext as _ from TurtleArt.tapalette import palette_names, help_strings -from TurtleArt.taconstants import ICON_SIZE, BLOCK_SCALE, XO1, XO15 +from TurtleArt.taconstants import ICON_SIZE, BLOCK_SCALE, XO1, XO15, XO175 from TurtleArt.taexporthtml import save_html from TurtleArt.taexportlogo import save_logo from TurtleArt.tautils import data_to_file, data_to_string, data_from_string, \ @@ -63,16 +64,20 @@ class TurtleArtActivity(activity.Activity): super(TurtleArtActivity, self).__init__(handle) self._check_ver_change(get_path(activity, 'data')) - self._setup_visibility_handler() self.has_toolbarbox = HAS_TOOLBARBOX + _logger.debug('_setup_toolbar') self._setup_toolbar() + _logger.debug('_setup_canvas') self._setup_canvas(self._setup_scrolled_window()) + _logger.debug('_setup_palette_toolbar') self._setup_palette_toolbar() + self._setup_help_toolbar() + _logger.debug('_setup_sharing') self._setup_sharing() # Activity toolbar callbacks @@ -80,7 +85,7 @@ class TurtleArtActivity(activity.Activity): def do_save_as_html_cb(self, button): ''' Write html out to datastore. ''' self.save_as_html.set_icon('htmlon') - _logger.debug('saving html code') + _logger.debug('saving HTML code') # Until we have URLs for datastore objects, always embed images. embed_flag = True @@ -217,15 +222,16 @@ class TurtleArtActivity(activity.Activity): def do_palette_buttons_cb(self, button, i): ''' Palette selector buttons ''' if self.tw.selected_palette is not None: - self.palette_buttons[self.tw.selected_palette].set_icon( - palette_names[self.tw.selected_palette] + 'off') + if not self.has_toolbarbox: + self.palette_buttons[self.tw.selected_palette].set_icon( + palette_names[self.tw.selected_palette] + 'off') if self.tw.selected_palette == i: # Hide the palette if it is already selected. self.tw.hideshow_palette(False) self.do_hidepalette() return - - self.palette_buttons[i].set_icon(palette_names[i] + 'on') + if not self.has_toolbarbox: + self.palette_buttons[i].set_icon(palette_names[i] + 'on') self.tw.show_palette(i) self.do_showpalette() @@ -466,153 +472,156 @@ class TurtleArtActivity(activity.Activity): self._palette_toolbar = gtk.Toolbar() self._palette_toolbar_button = ToolbarButton( page=self._palette_toolbar, icon_name='palette') - help_toolbar = gtk.Toolbar() + self._help_toolbar = gtk.Toolbar() help_toolbar_button = ToolbarButton(label=_('Help'), - page=help_toolbar, + page=self._help_toolbar, icon_name='help-toolbar') - journal_toolbar = gtk.Toolbar() - journal_toolbar_button = ToolbarButton(page=journal_toolbar, - icon_name='activity-journal') + self._make_load_save_buttons(activity_toolbar_button) activity_toolbar_button.show() self._toolbox.toolbar.insert(activity_toolbar_button, -1) edit_toolbar_button.show() self._toolbox.toolbar.insert(edit_toolbar_button, -1) - journal_toolbar_button.show() - self._toolbox.toolbar.insert(journal_toolbar_button, -1) view_toolbar_button.show() self._toolbox.toolbar.insert(view_toolbar_button, -1) self._palette_toolbar_button.show() self._toolbox.toolbar.insert(self._palette_toolbar_button, -1) - help_toolbar_button.show() - self._toolbox.toolbar.insert(help_toolbar_button, -1) - - self._add_separator(self._toolbox.toolbar) self._make_project_buttons(self._toolbox.toolbar) - self._add_separator(self._toolbox.toolbar, True) + self._add_separator(self._toolbox.toolbar, expand=True, + visible=False) + + self.samples_button = self._add_button( + 'ta-open', _('Load example'), self.do_samples_cb, + self._toolbox.toolbar) + + help_toolbar_button.show() + self._toolbox.toolbar.insert(help_toolbar_button, -1) stop_button = StopButton(self) stop_button.props.accelerator = '<Ctrl>Q' self._toolbox.toolbar.insert(stop_button, -1) stop_button.show() + _logger.debug('set_toolbar_box') + self.set_toolbar_box(self._toolbox) + self._palette_toolbar_button.set_expanded(True) else: self._toolbox = activity.ActivityToolbox(self) self.set_toolbox(self._toolbox) project_toolbar = gtk.Toolbar() self._toolbox.add_toolbar(_('Project'), project_toolbar) - view_toolbar = gtk.Toolbar() self._toolbox.add_toolbar(_('View'), view_toolbar) - view_toolbar_button = view_toolbar edit_toolbar = gtk.Toolbar() self._toolbox.add_toolbar(_('Edit'), edit_toolbar) - edit_toolbar_button = edit_toolbar journal_toolbar = gtk.Toolbar() self._toolbox.add_toolbar(_('Import/Export'), journal_toolbar) - journal_toolbar_button = journal_toolbar - help_toolbar = gtk.Toolbar() - self._toolbox.add_toolbar(_('Help'), help_toolbar) - help_toolbar_button = help_toolbar + self._help_toolbar = gtk.Toolbar() + self._toolbox.add_toolbar(_('Help'), self._help_toolbar) self._make_palette_buttons(project_toolbar, palette_button=True) self._add_separator(project_toolbar) self._make_project_buttons(project_toolbar) + self._make_load_save_buttons(journal_toolbar) - self.keep_button = self._add_button( - 'filesaveoff', _('Save snapshot'), self.do_keep_cb, - journal_toolbar_button) - self.save_as_html = self._add_button( - 'htmloff', _('Save as HTML'), self.do_save_as_html_cb, - journal_toolbar_button) - self.save_as_logo = self._add_button( - 'logo-saveoff', _('Save as Logo'), self.do_save_as_logo_cb, - journal_toolbar_button) - self.save_as_image = self._add_button( - 'image-saveoff', _('Save as image'), self.do_save_as_image_cb, - journal_toolbar_button) - self.load_ta_project = self._add_button( - 'load-from-journal', _('Import project from the Journal'), - self.do_load_ta_project_cb, journal_toolbar_button) - self._add_separator(journal_toolbar) - self.load_python = self._add_button( - 'pippy-openoff', _('Load Python block'), self.do_load_python_cb, - journal_toolbar_button) - self.samples_button = self._add_button( - 'ta-open', _('Load example'), self.do_samples_cb, - journal_toolbar_button) self._add_button('edit-copy', _('Copy'), self._copy_cb, - edit_toolbar_button, '<Ctrl>c') + edit_toolbar, '<Ctrl>c') self._add_button('edit-paste', _('Paste'), self._paste_cb, - edit_toolbar_button, '<Ctrl>v') + edit_toolbar, '<Ctrl>v') self._add_button('view-fullscreen', _('Fullscreen'), - self.do_fullscreen_cb, view_toolbar_button, - '<Alt>Return') + self.do_fullscreen_cb, view_toolbar, '<Alt>Return') self._add_button('view-Cartesian', _('Cartesian coordinates'), - self.do_cartesian_cb, view_toolbar_button) + self.do_cartesian_cb, view_toolbar) self._add_button('view-polar', _('Polar coordinates'), - self.do_polar_cb, view_toolbar_button) - if get_hardware() in [XO1, XO15]: + self.do_polar_cb, view_toolbar) + if get_hardware() in [XO1, XO15, XO175]: self._add_button('view-metric', _('Metric coordinates'), - self.do_metric_cb, view_toolbar_button) - self._add_separator(view_toolbar) + self.do_metric_cb, view_toolbar) + self._add_separator(view_toolbar, visible=False) self.coordinates_label = self._add_label(_('xcor') + ' = 0 ' + \ _('ycor') + ' = 0 ' + _('heading') + ' = 0', view_toolbar) - self._add_separator(view_toolbar, True) + self._add_separator(view_toolbar, expand=True, visible=False) self.rescale_button = self._add_button( 'expand-coordinates', _('Rescale coordinates up'), - self.do_rescale_cb, view_toolbar_button) + self.do_rescale_cb, view_toolbar) self.resize_up_button = self._add_button( - 'resize+', _('Grow blocks'), self.do_grow_blocks_cb, - view_toolbar_button) + 'resize+', _('Grow blocks'), self.do_grow_blocks_cb, view_toolbar) self.resize_down_button = self._add_button( 'resize-', _('Shrink blocks'), self.do_shrink_blocks_cb, - view_toolbar_button) - if gtk.gtk_version[0] > 2 or gtk.gtk_version[1] > 16: - self.hover_help_label = self._add_label( - _('Move the cursor over the orange palette for help.'), - help_toolbar, gtk.gdk.screen_width() - 2 * ICON_SIZE) - else: - self.hover_help_label = self._add_label( - _('Move the cursor over the orange palette for help.'), - help_toolbar) + view_toolbar) edit_toolbar.show() view_toolbar.show() - help_toolbar.show() + self._help_toolbar.show() self._toolbox.show() - # Setup palette toolbar only *after* initializing the plugins - if self.has_toolbarbox: - self._palette_toolbar_button.set_expanded(True) - else: + if not self.has_toolbarbox: self._toolbox.set_current_toolbar(1) + def _setup_help_toolbar(self): + ''' The help toolbar must be setup we determine what hardware + is in use. ''' + # FIXME: Temporary work-around gtk problem with XO175 + if get_hardware() not in [XO175] and \ + (gtk.gtk_version[0] > 2 or gtk.gtk_version[1] > 16): + self.hover_help_label = self._add_label( + _('Move the cursor over the orange palette for help.'), + self._help_toolbar, gtk.gdk.screen_width() - 2 * ICON_SIZE) + else: + self.hover_help_label = self._add_label( + _('Move the cursor over the orange palette for help.'), + self._help_toolbar) + def _setup_palette_toolbar(self): - # The palette toolbar must be setup *after* plugins are loaded. + ''' The palette toolbar must be setup *after* plugins are loaded. ''' if self.has_toolbarbox: self.palette_buttons = [] - for i, name in enumerate(palette_names): - if i > 0: - suffix = 'off' + for i, palette_name in enumerate(palette_names): + if i == 0: + palette_group = None else: - suffix = 'on' - self.palette_buttons.append(self._add_button(name + suffix, - help_strings[name], self.do_palette_buttons_cb, - self._palette_toolbar_button, None, i)) - self._add_separator(self._palette_toolbar, True) - - self._make_palette_buttons(self._palette_toolbar_button) - - self.set_toolbar_box(self._toolbox) + palette_group = self.palette_buttons[0] + _logger.debug('palette_buttons.append %s', palette_name) + self.palette_buttons.append(self._radio_button_factory( + palette_name + 'off', + self._palette_toolbar, + self.do_palette_buttons_cb, i, + help_strings[palette_name], + palette_group)) + self._add_separator(self._palette_toolbar, expand=True, + visible=False) + self._make_palette_buttons(self._palette_toolbar) self._palette_toolbar.show() + def _make_load_save_buttons(self, toolbar): + self.save_as_image = self._add_button( + 'image-saveoff', _('Save as image'), self.do_save_as_image_cb, + toolbar) + self.save_as_html = self._add_button( + 'htmloff', _('Save as HTML'), self.do_save_as_html_cb, toolbar) + self.save_as_logo = self._add_button( + 'logo-saveoff', _('Save as Logo'), self.do_save_as_logo_cb, + toolbar) + self.keep_button = self._add_button( + 'filesaveoff', _('Save snapshot'), self.do_keep_cb, toolbar) + if not self.has_toolbarbox: + self._add_separator(toolbar) + self.load_ta_project = self._add_button( + 'load-from-journal', _('Import project from the Journal'), + self.do_load_ta_project_cb, toolbar) + self.load_python = self._add_button( + 'pippy-openoff', _('Load Python block'), self.do_load_python_cb, + toolbar) + if not self.has_toolbarbox: + self.samples_button = self._add_button( + 'ta-open', _('Load example'), self.do_samples_cb, toolbar) + def _make_palette_buttons(self, toolbar, palette_button=False): ''' Creates the palette and block buttons for both toolbar types''' if palette_button: # old-style toolbars need this button @@ -802,12 +811,15 @@ class TurtleArtActivity(activity.Activity): toolitem.show() return label - def _add_separator(self, toolbar, expand=False): + def _add_separator(self, toolbar, expand=False, visible=True): ''' Add a separator to a toolbar. ''' separator = gtk.SeparatorToolItem() - separator.props.draw = True + separator.props.draw = visible separator.set_expand(expand) - toolbar.insert(separator, -1) + if hasattr(toolbar, 'insert'): + toolbar.insert(separator, -1) + else: + toolbar.props.page.insert(separator, -1) separator.show() def _add_button(self, name, tooltip, callback, toolbar, accelerator=None, @@ -833,3 +845,22 @@ class TurtleArtActivity(activity.Activity): if not name in help_strings: help_strings[name] = tooltip return button + + def _radio_button_factory(self, button_name, toolbar, cb, arg, tooltip, + group): + ''' Add a radio button to a toolbar ''' + button = RadioToolButton(group=group) + button.set_named_icon(button_name) + if cb is not None: + if arg is None: + button.connect('clicked', cb) + else: + button.connect('clicked', cb, arg) + if hasattr(toolbar, 'insert'): # Add button to the main toolbar... + toolbar.insert(button, -1) + else: # ...or a secondary toolbar. + toolbar.props.page.insert(button, -1) + button.show() + if tooltip is not None: + button.set_tooltip(tooltip) + return button |