From ccbce872af9f9e042811035c3681dd225a89f678 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 28 Feb 2013 17:30:29 +0000 Subject: recommitting many changes in support of touch and rotation --- diff --git a/NEWS b/NEWS index 860b99a..e5f0b00 100644 --- a/NEWS +++ b/NEWS @@ -1,9 +1,10 @@ 173 ENHANCEMENTS: -* Increase expand/shrink dots for touch +* Increase expand/shrink show/hide dots for easier touching * Enable canvas dragging with touch * Update screen constants (e.g., width, height) when screen rotates +* Switch between a toolbar and a palette, depending upon screen aspect ratio 172 diff --git a/TurtleArt/tasprite_factory.py b/TurtleArt/tasprite_factory.py index 3278e8a..a860e5b 100755 --- a/TurtleArt/tasprite_factory.py +++ b/TurtleArt/tasprite_factory.py @@ -998,11 +998,16 @@ class SVG: svg = "/n/n" if noscale: scale = 2.0 - scale2 = 1.0 x = self._hide_x * scale y = self._hide_y * scale - r = self._dot_radius - y2 = y - 1.5 + r = self._dot_radius * 2 + scale = 5 + scale2 = 2 + y2 = y - 10 + svg += self._circle(r, x - r / 2, y - r / 2) + self._fill, self._stroke = HIDE_WHITE, HIDE_WHITE + svg += self._rect(10 * scale2, scale, x - 9 * scale2, y2) + self._fill, self._stroke = _saved_fill, _saved_stroke else: scale = self._scale * 1.75 scale2 = scale / 2 @@ -1010,10 +1015,10 @@ class SVG: y = self._hide_y * self._scale r = self._dot_radius * scale2 y2 = y - scale2 - svg += self._circle(r, x, y) - self._fill, self._stroke = HIDE_WHITE, HIDE_WHITE - svg += self._rect(10 * scale2, scale, x - 5 * scale2, y2) - self._fill, self._stroke = _saved_fill, _saved_stroke + svg += self._circle(r, x, y) + self._fill, self._stroke = HIDE_WHITE, HIDE_WHITE + svg += self._rect(10 * scale2, scale, x - 5 * scale2, y2) + self._fill, self._stroke = _saved_fill, _saved_stroke return svg def _show_dot(self): diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index 56bc960..e842e41 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -1173,29 +1173,32 @@ class TurtleArtWindow(): def _layout_palette(self, n, regenerate=False, show=True): ''' Layout prototypes in a palette. ''' + BUTTON_SIZE = 32 + MARGIN = 5 if n is not None: if self.orientation == HORIZONTAL_PALETTE: - x, y = 20, self.toolbar_offset + 5 + x, y = BUTTON_SIZE, self.toolbar_offset + MARGIN x, y, max_w = self._horizontal_layout(x, y, self.palettes[n]) if n == palette_names.index('trash'): x, y, max_w = self._horizontal_layout(x + max_w, y, self.trash_stack) - w = x + max_w + 25 + w = x + max_w + BUTTON_SIZE + MARGIN self._make_palette_spr(n, 0, self.toolbar_offset, w, PALETTE_HEIGHT, regenerate) if show: - self.palette_button[2].move((w - 20, self.toolbar_offset)) + self.palette_button[2].move( + (w - BUTTON_SIZE, self.toolbar_offset)) else: - x, y = 5, self.toolbar_offset + 15 + x, y = MARGIN, self.toolbar_offset + BUTTON_SIZE + MARGIN x, y, max_h = self._vertical_layout(x, y, self.palettes[n]) if n == palette_names.index('trash'): x, y, max_h = self._vertical_layout(x, y + max_h, self.trash_stack) - h = y + max_h + 25 - self.toolbar_offset + h = y + max_h + BUTTON_SIZE + MARGIN - self.toolbar_offset self._make_palette_spr(n, 0, self.toolbar_offset, PALETTE_WIDTH, h, regenerate) if show: - self.palette_button[2].move((PALETTE_WIDTH - 20, + self.palette_button[2].move((PALETTE_WIDTH - BUTTON_SIZE, self.toolbar_offset)) if show: self.palette_button[2].save_xy = \ @@ -1350,6 +1353,8 @@ before making changes to your Turtle Blocks program')) self._put_in_trash(b1) else: self._put_in_trash(find_top_block(b)) + self.show_toolbar_palette(palette_names.index('trash'), + regenerate=True) elif blk.name in MACROS: self.new_macro(blk.name, x + 20, y + 20) else: @@ -1797,6 +1802,7 @@ before making changes to your Turtle Blocks program')) blk.type = 'deleted' blk.spr.hide() self.trash_stack = [] + self.show_toolbar_palette(palette_names.index('trash'), regenerate=True) def _in_the_trash(self, x, y): ''' Is x, y over a palette? ''' @@ -2375,6 +2381,7 @@ before making changes to your Turtle Blocks program')) self.selected_turtle = None if self.active_turtle is None: self.canvas.set_turtle(self.default_turtle_name) + self._coordinate_counter = 0 return # If we don't have a group of blocks, then there is nothing to do. diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index a5b689a..04067a8 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -201,6 +201,11 @@ class TurtleArtActivity(activity.Activity): def do_load_ta_project_cb(self, button): ''' Load a project from the Journal. ''' + if hasattr(self, 'get_window'): + _logger.debug('setting watch cursor') + if hasattr(self.get_window(), 'get_cursor'): + self._old_cursor = self.get_window().get_cursor() + self.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) chooser(self, 'org.laptop.TurtleArtActivity', self._load_ta_project) def _load_ta_project(self, dsobject): @@ -214,6 +219,12 @@ class TurtleArtActivity(activity.Activity): def do_load_ta_plugin_cb(self, button): ''' Load a plugin from the Journal. ''' # FIXME: we are looking for tar files + # While the file is loading, use the watch cursor + if hasattr(self, 'get_window'): + _logger.debug('setting watch cursor') + if hasattr(self.get_window(), 'get_cursor'): + self._old_cursor = self.get_window().get_cursor() + self.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) chooser(self, '', self._load_ta_plugin) def _load_ta_plugin(self, dsobject): @@ -795,6 +806,96 @@ class TurtleArtActivity(activity.Activity): def _setup_palette_toolbar(self): ''' The palette toolbar must be setup *after* plugins are loaded. ''' if self.has_toolbarbox: +<<<<<<< HEAD + n = int(gtk.gdk.screen_width() / style.GRID_CELL_SIZE) - 2 + _logger.debug(palette_names) + if len(palette_names) > n: + n -= 1 # Make room for the palette button + # n = 6 + 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) + # self.palette_buttons[i].connect( + # 'clicked', self.do_palette_buttons_cb, i) + 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_buttons[i].connect( + # 'clicked', self.do_palette_buttons_cb, 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( + palette_name + 'off', + None, + 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._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.palette_palette_button = self._add_button( 'palette', _('Palettes'), self._palette_palette_cb, @@ -841,6 +942,7 @@ class TurtleArtActivity(activity.Activity): if not self._palette_palette.is_up(): self._palette_palette.popup(immediate=True, state=self._palette_palette.SECONDARY) +>>>>>>> cabc4e32f1559efd82c1a52e0f8c3db9255fb6f5 else: self._palette_palette.popdown(immediate=True) return @@ -1135,25 +1237,33 @@ Plugin section of plugin.info file.') _logger.debug('Creating plugin palette %s...' % ( palette_name.strip())) j = len(self.palette_buttons) - self.palette_buttons.insert(j - 1, + _logger.debug('radio button') + self.palette_buttons.append( self._radio_button_factory( palette_name.strip() + 'off', self._palette_toolbar, self.do_palette_buttons_cb, j - 1, help_strings[palette_name.strip()], - self.palette_buttons[0], - position=j - 1)) + self.palette_buttons[0])) + _logger.debug('overflow button') + self._overflow_buttons.append( + self._add_button( + palette_name.strip() + 'off', + None, + self.do_palette_buttons_cb, + None, + arg=j - 1)) + _logger.debug('pack in box') + self._overflow_box.pack_start( + self._overflow_buttons[j - 1]) self.tw.palettes.insert(j - 1, []) self.tw.palette_sprs.insert(j - 1, [None, None]) else: _logger.debug('Palette already exists... \ skipping insert') - # We need to change the index associated with the - # Trash Palette Button. - j = len(palette_names) - self.palette_buttons[j - 1].connect( - 'clicked', self.do_palette_buttons_cb, j - 1) + _logger.debug('reinitializing palette toolbar') + self._setup_palette_toolbar() else: self.tw.showlabel('status', label=_('Please restart Turtle Art \ @@ -1198,12 +1308,8 @@ in order to use the plugin.')) def read_file(self, file_path, run_it=False, plugin=False): ''' Open a project or plugin and then run it. ''' if hasattr(self, 'tw') and self.tw is not None: - # While the file is loading, use the watch cursor - if hasattr(self, 'get_window'): - _logger.debug('setting watch cursor') - if hasattr(self.get_window(), 'get_cursor'): - self._old_cursor = self.get_window().get_cursor() - self.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) + if not hasattr(self, '_old_cursor'): + self._old_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) _logger.debug('Read file: %s' % (file_path)) # Could be a plugin or deprecated gtar or tar file... if plugin or file_path.endswith(('.gtar', '.tar', '.tar.gz')): 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 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/images/palettehorizontal.svg b/images/palettehorizontal.svg index 6cc62bf..051920b 100644 --- a/images/palettehorizontal.svg +++ b/images/palettehorizontal.svg @@ -2,24 +2,38 @@ + + + + image/svg+xml + + + + + + style="fill:#00000f;fill-opacity:1;fill-rule:nonzero;stroke:#00000f;stroke-width:2.12657046;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> diff --git a/images/palettehshift.svg b/images/palettehshift.svg index 38158aa..dc5f82e 100644 --- a/images/palettehshift.svg +++ b/images/palettehshift.svg @@ -9,8 +9,8 @@ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" - width="16" - height="16" + width="32" + height="32" id="svg2"> @@ -46,41 +46,45 @@ offset="1" /> - + transform="matrix(1.9999999,0,0,1.9999999,3.5982256e-7,-0.00237004)" + id="g2995"> + d="m 18.983051,7.5932202 a 10.915255,10.169492 0 1 1 -21.8305089,0 10.915255,10.169492 0 1 1 21.8305089,0 z" + transform="matrix(0.68421284,0,0,0.73438846,2.4799099,2.4236267)" + id="path2819" + style="fill:#ffd000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + transform="matrix(0,-1.3333333,1.3333333,0,-2.6666664,18.666666)" + id="g3924"> - - - - - + + + + + + + + diff --git a/images/palettenext.svg b/images/palettenext.svg index ccecdfa..66b5efd 100644 --- a/images/palettenext.svg +++ b/images/palettenext.svg @@ -2,29 +2,43 @@ + + + + image/svg+xml + + + + + + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.12657046;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + style="fill:#00fe00;fill-opacity:1;stroke:#00fe00;stroke-width:1.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> diff --git a/images/palettevertical.svg b/images/palettevertical.svg index 552ecdf..a7e62f7 100644 --- a/images/palettevertical.svg +++ b/images/palettevertical.svg @@ -2,25 +2,39 @@ + + + + image/svg+xml + + + + + + style="fill:#00000f;fill-opacity:1;fill-rule:nonzero;stroke:#00000f;stroke-width:2.12657046;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> diff --git a/images/palettevshift.svg b/images/palettevshift.svg index 504272f..a6ce6f4 100644 --- a/images/palettevshift.svg +++ b/images/palettevshift.svg @@ -9,8 +9,8 @@ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" - width="16" - height="16" + width="32" + height="32" id="svg2"> @@ -46,41 +46,45 @@ offset="1" /> - + transform="matrix(0,1.9999999,-1.9999999,0,31.999999,-0.00236984)" + id="g2995"> + d="m 18.983051,7.5932202 a 10.915255,10.169492 0 1 1 -21.8305089,0 10.915255,10.169492 0 1 1 21.8305089,0 z" + transform="matrix(0.68421284,0,0,0.73438846,2.4799099,2.4236267)" + id="path2819" + style="fill:#ffd000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + transform="matrix(0,-1.3333333,1.3333333,0,-2.6666664,18.666666)" + id="g3924"> - - - - - + + + + + + + + -- cgit v0.9.1