Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArtActivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArtActivity.py')
-rw-r--r--TurtleArtActivity.py251
1 files changed, 106 insertions, 145 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index ac648da..a5b689a 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -38,7 +38,6 @@ try: # 0.86 toolbar widgets
HAS_TOOLBARBOX = True
except ImportError:
HAS_TOOLBARBOX = False
-from sugar.graphics.icon import Icon
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.graphics.alert import (ConfirmationAlert, NotifyAlert)
@@ -98,8 +97,6 @@ class TurtleArtActivity(activity.Activity):
self.canvas = self.sw
_logger.debug('_setup_palette_toolbar')
- self.palette_buttons = []
- self._overflow_buttons = []
self._setup_palette_toolbar()
self._setup_extra_controls()
@@ -124,21 +121,32 @@ class TurtleArtActivity(activity.Activity):
if not self.has_toolbarbox:
return
- # If the screen width has changed, we may need to reformat
- # the palette toolbar
- self._setup_palette_toolbar()
+ # If there are too many palettes to fit, put them in a
+ # scrolling window
+ if self.palette_toolbar_button.is_expanded():
+ palette_was_expanded = True
+ self.palette_toolbar_button.set_expanded(False)
+ else:
+ palette_was_expanded = False
+ self._toolbox.toolbar.remove(self.palette_toolbar_button)
+ self._toolbox.toolbar.remove(self.palette_palette_button)
+ if gtk.gdk.screen_width() / (len(self.palette_buttons) + 2) \
+ < style.GRID_CELL_SIZE:
+ self._toolbox.toolbar.insert(self.palette_palette_button, 3)
+ self.palette_palette_button.show()
+ else:
+ self._toolbox.toolbar.insert(self.palette_toolbar_button, 3)
+ self.palette_toolbar_button.show()
+ if palette_was_expanded:
+ self.palette_toolbar_button.set_expanded(True)
- # And we may need to shuffle some buttons
if self.keep_button in self._toolbox.toolbar:
self._toolbox.toolbar.remove(self.extras_separator)
self._toolbox.toolbar.remove(self.keep_button)
self._toolbox.toolbar.remove(self.samples_button)
self._toolbox.toolbar.remove(self.stop_separator)
self._toolbox.toolbar.remove(self.stop_button)
- if self._view_sep_1 in self._view_toolbar:
- self._view_toolbar.remove(self._view_sep_1)
- self._view_toolbar.remove(self.coordinates_toolitem)
- self._view_toolbar.remove(self._view_sep_2)
+
if gtk.gdk.screen_width() / 14 < style.GRID_CELL_SIZE:
self.keep_button2.show()
self.keep_label2.show()
@@ -160,16 +168,16 @@ class TurtleArtActivity(activity.Activity):
self._toolbox.toolbar.insert(self.stop_separator, -1)
self.stop_separator.show()
self._toolbox.toolbar.insert(self.stop_button, -1)
- if get_hardware() in [XO1, XO15, XO175, XO4]:
- self._view_toolbar.insert(self._view_sep_1, 4)
- self._view_toolbar.insert(self.coordinates_toolitem, 5)
- self._view_toolbar.insert(self._view_sep_2, 6)
- else:
- self._view_toolbar.insert(self._view_sep_1, 3)
- self._view_toolbar.insert(self.coordinates_toolitem, 4)
- self._view_toolbar.insert(self._view_sep_2, 5)
+
+ # Refresh the buttons to the right of our intervention
+ self.eraser_button.show()
+ self.run_button.show()
+ self.step_button.show()
+ self.stop_turtle_button.show()
+ self._help_button.show()
+ self.stop_button.show()
+
self._toolbox.show_all()
- self._view_toolbar.show_all()
# Activity toolbar callbacks
def do_save_as_logo_cb(self, button):
@@ -568,9 +576,9 @@ class TurtleArtActivity(activity.Activity):
page=edit_toolbar,
icon_name='toolbar-edit')
- self._view_toolbar = gtk.Toolbar()
+ view_toolbar = gtk.Toolbar()
self.view_toolbar_button = ToolbarButton(label=_('View'),
- page=self._view_toolbar,
+ page=view_toolbar,
icon_name='toolbar-view')
self._palette_toolbar = gtk.Toolbar()
self.palette_toolbar_button = ToolbarButton(
@@ -597,8 +605,8 @@ class TurtleArtActivity(activity.Activity):
self._project_toolbar = gtk.Toolbar()
self._toolbox.add_toolbar(_('Project'), self._project_toolbar)
- self._view_toolbar = gtk.Toolbar()
- self._toolbox.add_toolbar(_('View'), self._view_toolbar)
+ view_toolbar = gtk.Toolbar()
+ self._toolbox.add_toolbar(_('View'), view_toolbar)
edit_toolbar = gtk.Toolbar()
self._toolbox.add_toolbar(_('Edit'), edit_toolbar)
journal_toolbar = gtk.Toolbar()
@@ -618,38 +626,32 @@ class TurtleArtActivity(activity.Activity):
self._undo_cb, edit_toolbar)
self._add_button('view-fullscreen', _('Fullscreen'),
- self.do_fullscreen_cb, self._view_toolbar,
- '<Alt>Return')
+ self.do_fullscreen_cb, view_toolbar, '<Alt>Return')
self._add_button('view-Cartesian', _('Cartesian coordinates'),
- self.do_cartesian_cb, self._view_toolbar)
+ self.do_cartesian_cb, view_toolbar)
self._add_button('view-polar', _('Polar coordinates'),
- self.do_polar_cb, self._view_toolbar)
+ self.do_polar_cb, view_toolbar)
if get_hardware() in [XO1, XO15, XO175, XO4]:
self._add_button('view-metric', _('Metric coordinates'),
- self.do_metric_cb, self._view_toolbar)
- self._view_sep_1 = self._add_separator(self._view_toolbar,
- visible=False)
- self.coordinates_label, self.coordinates_toolitem = \
- self._add_label(
- _('xcor') + ' = 0 ' + _('ycor') + ' = 0 ' + _('heading') + ' = 0',
- self._view_toolbar)
- self._view_sep_2 = self._add_separator(self._view_toolbar,
- expand=True, visible=False)
+ 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, expand=True, visible=False)
self.rescale_button = self._add_button(
'expand-coordinates', _('Rescale coordinates up'),
- self.do_rescale_cb, self._view_toolbar)
+ self.do_rescale_cb, view_toolbar)
self.resize_up_button = self._add_button(
- 'resize+', _('Grow blocks'), self.do_grow_blocks_cb,
- self._view_toolbar)
+ '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,
- self._view_toolbar)
+ view_toolbar)
self._hover_help_toggle = self._add_button(
'help-off', _('Turn off hover help'), self._do_hover_help_toggle,
- self._view_toolbar)
+ view_toolbar)
edit_toolbar.show()
- self._view_toolbar.show()
+ view_toolbar.show()
self._toolbox.show()
if not self.has_toolbarbox:
@@ -793,92 +795,54 @@ class TurtleArtActivity(activity.Activity):
def _setup_palette_toolbar(self):
''' The palette toolbar must be setup *after* plugins are loaded. '''
if self.has_toolbarbox:
- n = int(gtk.gdk.screen_width() / style.GRID_CELL_SIZE) - 2
- if len(palette_names) > n:
- n -= 1 # Make room for the palette button
- m = len(palette_names) - n
- if gtk.gdk.screen_width() - style.GRID_CELL_SIZE < \
- int(m * (style.GRID_CELL_SIZE + 2)):
- width = gtk.gdk.screen_width() - style.GRID_CELL_SIZE
- height = int(style.GRID_CELL_SIZE * 1.5)
- else:
- width = int(m * (style.GRID_CELL_SIZE + 2))
- height = style.GRID_CELL_SIZE
-
- if len(self.palette_buttons) == 0:
- self._generate_palette_buttons()
- self._overflow_palette = \
- self._overflow_palette_button.get_palette()
- self._overflow_box = gtk.HBox()
- self._overflow_box.set_homogeneous(False)
- self._overflow_sw = gtk.ScrolledWindow()
- self._overflow_sw.set_policy(gtk.POLICY_AUTOMATIC,
- gtk.POLICY_NEVER)
- self._overflow_sw.add_with_viewport(self._overflow_box)
- else: # remove the radio buttons and overflow buttons
- for button in self.palette_buttons:
- if button in self._palette_toolbar:
- self._palette_toolbar.remove(button)
- if self._overflow_palette_button in self._palette_toolbar:
- self._palette_toolbar.remove(self._overflow_palette_button)
-
- for i in range(len(self.palette_buttons)):
- if i < n:
- self._palette_toolbar.insert(self.palette_buttons[i], -1)
- if i == n and n < len(self.palette_buttons):
- self._palette_toolbar.insert(
- self._overflow_palette_button, -1)
- if i >= n:
- self._overflow_box.pack_start(self._overflow_buttons[i])
-
- self._overflow_sw.set_size_request(width, height)
- self._overflow_sw.show()
-
- '''
- if self.tw.hw in [XO1, XO15, XO175, XO4]:
- self._make_palette_buttons(self._palette_toolbar)
- '''
- self._palette_toolbar.show()
- self._overflow_box.show_all()
- self._overflow_palette.set_content(self._overflow_sw)
-
- def _generate_palette_buttons(self):
- ''' Create a radio button and a normal button for each palette '''
- for i, palette_name in enumerate(palette_names):
- if i == 0:
- palette_group = None
- else:
- palette_group = self.palette_buttons[0]
- _logger.debug('palette_buttons.append %s', palette_name)
- self.palette_buttons.append(self._radio_button_factory(
+
+ self.palette_palette_button = self._add_button(
+ 'palette', _('Palettes'), self._palette_palette_cb,
+ self._toolbox.toolbar)
+ self._palette_palette = self.palette_palette_button.get_palette()
+ button_box = gtk.VBox()
+ button_box.set_homogeneous(False)
+ button_sw = gtk.ScrolledWindow()
+ button_sw.set_size_request(
+ int(gtk.gdk.screen_width() / 3),
+ gtk.gdk.screen_height() - style.GRID_CELL_SIZE * 3)
+ button_sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ button_sw.add_with_viewport(button_box)
+ button_sw.show()
+
+ self.palette_buttons = []
+ for i, palette_name in enumerate(palette_names):
+ if i == 0:
+ palette_group = None
+ else:
+ 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_button_and_label(
palette_name + 'off',
- None,
- # self._palette_toolbar,
- self.do_palette_buttons_cb, i,
help_strings[palette_name],
- palette_group))
- self._overflow_buttons.append(self._add_button(
- palette_name + 'off',
- None,
- self.do_palette_buttons_cb,
- None,
- arg=i))
- # And we need an extra button for the overflow
- self._overflow_palette_button = self._radio_button_factory(
- 'overflow',
- None,
- # self._palette_toolbar,
- self._overflow_palette_cb, None,
- _('Palettes'),
- palette_group)
-
- def _overflow_palette_cb(self, button):
- if self._overflow_palette:
- if not self._overflow_palette.is_up():
- self._overflow_palette.popup(immediate=True,
- state=self._overflow_palette.SECONDARY)
+ self.do_palette_buttons_cb, i,
+ button_box)
+ if self.tw.hw in [XO1, XO15, XO175, XO4]:
+ self._add_separator(self._palette_toolbar, expand=True,
+ visible=False)
+ self._make_palette_buttons(self._palette_toolbar)
+ self._palette_toolbar.show()
+ button_box.show_all()
+ self._palette_palette.set_content(button_sw)
+
+ def _palette_palette_cb(self, button):
+ if self._palette_palette:
+ if not self._palette_palette.is_up():
+ self._palette_palette.popup(immediate=True,
+ state=self._palette_palette.SECONDARY)
else:
- self._overflow_palette.popdown(immediate=True)
+ self._palette_palette.popdown(immediate=True)
return
def _make_load_save_buttons(self, toolbar):
@@ -956,8 +920,6 @@ class TurtleArtActivity(activity.Activity):
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
- self._add_separator(self._palette_toolbar, expand=True,
- visible=False)
self.palette_button = self._add_button(
'paletteoff', _('Hide palette'), self.do_palette_cb,
toolbar, _('<Ctrl>p'))
@@ -1410,7 +1372,7 @@ in order to use the plugin.'))
toolitem.add(label)
toolbar.insert(toolitem, -1)
toolitem.show()
- return label, toolitem
+ return label
def _add_separator(self, toolbar, expand=False, visible=True):
''' Add a separator to a toolbar. '''
@@ -1441,8 +1403,8 @@ in order to use the plugin.'))
pass
button.show()
if toolbar is not None:
- if hasattr(toolbar, 'insert'):
- toolbar.insert(button, -1) # Add button to the main toolbar...
+ 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)
@@ -1460,29 +1422,28 @@ in order to use the plugin.'))
button.connect('clicked', cb)
else:
button.connect('clicked', cb, arg)
- if toolbar is not None:
- if hasattr(toolbar, 'insert'): # Add button to the main toolbar...
- toolbar.insert(button, position)
- else: # ...or a secondary toolnbar.
- toolbar.props.page.insert(button, position)
+ if hasattr(toolbar, 'insert'): # Add button to the main toolbar...
+ toolbar.insert(button, position)
+ else: # ...or a secondary toolbar.
+ toolbar.props.page.insert(button, position)
button.show()
if tooltip is not None:
button.set_tooltip(tooltip)
return button
- def _add_button_and_label(self, name, label, cb, cb_args, box):
+ def _add_button_and_label(self, name, tooltip, cb, cb_args, box):
''' Add a button and a label to a box '''
- button = self._add_button(name, None, cb, None, arg=cb_args)
button_and_label = gtk.HBox()
- button_and_label.pack_start(button, False, False, padding=0)
- mylabel = gtk.Label(label)
- mylabel.set_justify(gtk.JUSTIFY_LEFT)
- mylabel.set_line_wrap(True)
- mylabel.show()
- button_and_label.pack_start(mylabel, False, False, padding=1)
+ button = self._add_button(name, None, cb, None, arg=cb_args)
+ button_and_label.pack_start(button, False, False, padding=5)
+ label = gtk.Label(tooltip)
+ label.set_justify(gtk.JUSTIFY_LEFT)
+ label.set_line_wrap(True)
+ label.show()
+ button_and_label.pack_start(label, False, False, padding=5)
box.pack_start(button_and_label)
button_and_label.show()
- return button, mylabel
+ return button, label
def _notify_successful_save(self, title='', msg=''):
''' Notify user when saves are completed '''