Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2013-02-27 19:53:22 (GMT)
committer Walter Bender <walter.bender@gmail.com>2013-02-27 19:53:22 (GMT)
commit925cde8b131e007858b07942f2212bf55c633c45 (patch)
treeeb5ba3f8a1797895f05a985bdc906148b0632d83
parentdc37966504e7746e8d05bab22ea876bd70bb0769 (diff)
hide label on view toolbar when narrow screen; new artwork
-rw-r--r--TurtleArtActivity.py251
-rw-r--r--icons/overflow.svg39
2 files changed, 184 insertions, 106 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index a5b689a..ac648da 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -38,6 +38,7 @@ 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)
@@ -97,6 +98,8 @@ 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()
@@ -121,32 +124,21 @@ class TurtleArtActivity(activity.Activity):
if not self.has_toolbarbox:
return
- # 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)
+ # If the screen width has changed, we may need to reformat
+ # the palette toolbar
+ self._setup_palette_toolbar()
+ # 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()
@@ -168,16 +160,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)
-
- # 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()
-
+ 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)
self._toolbox.show_all()
+ self._view_toolbar.show_all()
# Activity toolbar callbacks
def do_save_as_logo_cb(self, button):
@@ -576,9 +568,9 @@ class TurtleArtActivity(activity.Activity):
page=edit_toolbar,
icon_name='toolbar-edit')
- view_toolbar = gtk.Toolbar()
+ self._view_toolbar = gtk.Toolbar()
self.view_toolbar_button = ToolbarButton(label=_('View'),
- page=view_toolbar,
+ page=self._view_toolbar,
icon_name='toolbar-view')
self._palette_toolbar = gtk.Toolbar()
self.palette_toolbar_button = ToolbarButton(
@@ -605,8 +597,8 @@ class TurtleArtActivity(activity.Activity):
self._project_toolbar = gtk.Toolbar()
self._toolbox.add_toolbar(_('Project'), self._project_toolbar)
- view_toolbar = gtk.Toolbar()
- self._toolbox.add_toolbar(_('View'), view_toolbar)
+ self._view_toolbar = gtk.Toolbar()
+ self._toolbox.add_toolbar(_('View'), self._view_toolbar)
edit_toolbar = gtk.Toolbar()
self._toolbox.add_toolbar(_('Edit'), edit_toolbar)
journal_toolbar = gtk.Toolbar()
@@ -626,32 +618,38 @@ class TurtleArtActivity(activity.Activity):
self._undo_cb, edit_toolbar)
self._add_button('view-fullscreen', _('Fullscreen'),
- self.do_fullscreen_cb, view_toolbar, '<Alt>Return')
+ self.do_fullscreen_cb, self._view_toolbar,
+ '<Alt>Return')
self._add_button('view-Cartesian', _('Cartesian coordinates'),
- self.do_cartesian_cb, view_toolbar)
+ self.do_cartesian_cb, self._view_toolbar)
self._add_button('view-polar', _('Polar coordinates'),
- self.do_polar_cb, view_toolbar)
+ self.do_polar_cb, self._view_toolbar)
if get_hardware() in [XO1, XO15, XO175, XO4]:
self._add_button('view-metric', _('Metric coordinates'),
- 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.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.rescale_button = self._add_button(
'expand-coordinates', _('Rescale coordinates up'),
- self.do_rescale_cb, view_toolbar)
+ self.do_rescale_cb, self._view_toolbar)
self.resize_up_button = self._add_button(
- 'resize+', _('Grow blocks'), self.do_grow_blocks_cb, view_toolbar)
+ 'resize+', _('Grow blocks'), self.do_grow_blocks_cb,
+ self._view_toolbar)
self.resize_down_button = self._add_button(
'resize-', _('Shrink blocks'), self.do_shrink_blocks_cb,
- view_toolbar)
+ self._view_toolbar)
self._hover_help_toggle = self._add_button(
'help-off', _('Turn off hover help'), self._do_hover_help_toggle,
- view_toolbar)
+ self._view_toolbar)
edit_toolbar.show()
- view_toolbar.show()
+ self._view_toolbar.show()
self._toolbox.show()
if not self.has_toolbarbox:
@@ -795,54 +793,92 @@ class TurtleArtActivity(activity.Activity):
def _setup_palette_toolbar(self):
''' The palette toolbar must be setup *after* plugins are loaded. '''
if self.has_toolbarbox:
-
- 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',
- help_strings[palette_name],
- self.do_palette_buttons_cb, i,
- button_box)
+ 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._add_separator(self._palette_toolbar, expand=True,
- visible=False)
- self._make_palette_buttons(self._palette_toolbar)
+ 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)
+ 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(
+ 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)
else:
- self._palette_palette.popdown(immediate=True)
+ self._overflow_palette.popdown(immediate=True)
return
def _make_load_save_buttons(self, toolbar):
@@ -920,6 +956,8 @@ 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'))
@@ -1372,7 +1410,7 @@ in order to use the plugin.'))
toolitem.add(label)
toolbar.insert(toolitem, -1)
toolitem.show()
- return label
+ return label, toolitem
def _add_separator(self, toolbar, expand=False, visible=True):
''' Add a separator to a toolbar. '''
@@ -1403,8 +1441,8 @@ in order to use the plugin.'))
pass
button.show()
if toolbar is not None:
- if hasattr(toolbar, 'insert'): # Add button to the main toolbar...
- toolbar.insert(button, -1)
+ if hasattr(toolbar, 'insert'):
+ toolbar.insert(button, -1) # Add button to the main toolbar...
else: # ...or a secondary toolbar.
toolbar.props.page.insert(button, -1)
@@ -1422,28 +1460,29 @@ in order to use the plugin.'))
button.connect('clicked', cb)
else:
button.connect('clicked', cb, arg)
- 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)
+ 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)
button.show()
if tooltip is not None:
button.set_tooltip(tooltip)
return button
- def _add_button_and_label(self, name, tooltip, cb, cb_args, box):
+ def _add_button_and_label(self, name, label, cb, cb_args, box):
''' Add a button and a label to a box '''
- button_and_label = gtk.HBox()
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)
+ 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)
box.pack_start(button_and_label)
button_and_label.show()
- return button, label
+ return button, mylabel
def _notify_successful_save(self, title='', msg=''):
''' Notify user when saves are completed '''
diff --git a/icons/overflow.svg b/icons/overflow.svg
new file mode 100644
index 0000000..b43db05
--- /dev/null
+++ b/icons/overflow.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.0"
+ width="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <g
+ id="g4725">
+ <path
+ d="m 1.5000002,25.5 0,-8 a 8,8 0 0 1 7.9999997,-8 L 17.5,9.5 l 0,4 20,0 0,-4 8,0 a 8,8 0 0 1 8,8 l 0,8 0,8 a 8,8 0 0 1 -8,8 l -8,0 -2,0 0,4 -16,0 0,-4 -2,0 -8.0000001,0 a 8,8 0 0 1 -7.9999998,-8 l 0,-8 z"
+ id="path2882"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.5;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 27.5,41.250001 c 7.594278,0 13.75,-6.155723 13.75,-13.75 C 41.25,19.905111 35.094278,13.75 27.5,13.75 c -7.594278,0 -13.75,6.155111 -13.75,13.750001 0,7.594277 6.155722,13.75 13.75,13.75 z M 21.140166,24.581945 c 0.382556,-0.381333 0.884278,-0.573833 1.387834,-0.573833 0.502333,0 1.005278,0.1925 1.387833,0.573833 l 3.568889,3.564611 3.457056,-3.545667 c 0.385,-0.394166 0.894666,-0.590944 1.405555,-0.590944 0.493778,0 0.99,0.186389 1.372556,0.558556 0.773667,0.756555 0.791389,1.998944 0.03422,2.778111 l -4.8455,4.965889 c -0.0012,0 -0.0012,0 -0.0018,0 -0.0061,0.0067 -0.0092,0.01283 -0.01344,0.01711 -0.07089,0.07028 -0.149722,0.127111 -0.226722,0.184555 -0.02383,0.01711 -0.04339,0.03911 -0.06783,0.05683 -0.06967,0.04583 -0.146667,0.08128 -0.22,0.118555 -0.04156,0.02139 -0.08006,0.04767 -0.122223,0.06539 -0.06111,0.02383 -0.124055,0.03911 -0.187,0.05683 -0.0605,0.01956 -0.116722,0.04156 -0.178444,0.055 -0.05072,0.011 -0.103278,0.011 -0.153389,0.01711 -0.07456,0.0092 -0.149111,0.02017 -0.223667,0.022 -0.04339,0 -0.08983,-0.0086 -0.133833,-0.01283 -0.08128,-0.0043 -0.162555,-0.0067 -0.241389,-0.022 -0.04583,-0.0086 -0.08983,-0.02628 -0.136278,-0.03911 -0.07578,-0.02139 -0.153388,-0.03728 -0.227944,-0.06783 -0.05072,-0.01956 -0.09839,-0.05011 -0.149111,-0.07395 -0.06478,-0.03361 -0.131389,-0.06356 -0.193111,-0.100833 -0.05133,-0.03544 -0.09778,-0.07944 -0.146056,-0.118555 -0.05255,-0.03911 -0.107555,-0.07456 -0.155222,-0.122834 -0.0031,-0.0018 -0.0055,-0.0067 -0.0079,-0.0086 -0.0043,-0.0024 -0.0067,-0.0049 -0.0086,-0.0067 l -4.975706,-4.968306 c -0.766333,-0.769388 -0.768167,-2.011778 0.0012,-2.782389 z"
+ id="path3941"
+ style="fill:#282828;fill-opacity:1" />
+ </g>
+</svg>