From f5f19111313084d7a697a96de6056f5d8f1ce3ed Mon Sep 17 00:00:00 2001 From: Raul Gutierrez Segales Date: Tue, 25 Jan 2011 10:43:39 +0000 Subject: Split the constructor code into small methods --- (limited to 'turtleart.py') diff --git a/turtleart.py b/turtleart.py index d3a0f70..0397572 100755 --- a/turtleart.py +++ b/turtleart.py @@ -72,52 +72,93 @@ _ICON_SUBPATH = 'images/turtle.png' _UPLOAD_SERVER = 'http://turtleartsite.appspot.com' -def mkdir_p(path): - '''Create a directory in a fashion similar to `mkdir -p`''' - try: - os.makedirs(path) - except OSError as exc: - if exc.errno == errno.EEXIST: - pass - else: - raise - - -def _make_sub_menu(menu, name): - """ add a new submenu to the toolbar """ - sub_menu = gtk.MenuItem(name) - sub_menu.show() - sub_menu.set_submenu(menu) - return sub_menu - - -def _make_menu_item(menu, tooltip, callback, arg=None): - """ add a new item to the submenu """ - menu_items = gtk.MenuItem(tooltip) - menu.append(menu_items) - if arg is None: - menu_items.connect('activate', callback) - else: - menu_items.connect('activate', callback, arg) - menu_items.show() +class TurtleMain(): + """ Launch Turtle Art from outside of Sugar """ + def __init__(self): + self._init_vars() + self._parse_command_line() + self._ensure_sugar_paths() -def makepath(path): - """ Make a path if it doesn't previously exist """ - from os import makedirs - from os.path import normpath, dirname, exists + if self.output_png: + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, + gtk.gdk.screen_width(), + gtk.gdk.screen_height()) + self.canvas, mask = pixbuf.render_pixmap_and_mask() + self._build_window() + self._draw_and_quit() + else: + self._read_initial_pos() + self._setup_gtk() + self._build_window() + self._start_gtk() - dpath = normpath(dirname(path)) - if not exists(dpath): - makedirs(dpath) + def _mkdir_p(path): + '''Create a directory in a fashion similar to `mkdir -p`''' + try: + os.makedirs(path) + except OSError as exc: + if exc.errno == errno.EEXIST: + pass + else: + raise + + def _make_sub_menu(self, menu, name): + """ add a new submenu to the toolbar """ + sub_menu = gtk.MenuItem(name) + sub_menu.show() + sub_menu.set_submenu(menu) + return sub_menu + + + def _make_menu_item(self, menu, tooltip, callback, arg=None): + """ add a new item to the submenu """ + menu_items = gtk.MenuItem(tooltip) + menu.append(menu_items) + if arg is None: + menu_items.connect('activate', callback) + else: + menu_items.connect('activate', callback, arg) + menu_items.show() + + def _makepath(self, path): + """ Make a path if it doesn't previously exist """ + from os import makedirs + from os.path import normpath, dirname, exists + + dpath = normpath(dirname(path)) + if not exists(dpath): + makedirs(dpath) + + def _start_gtk(self): + self.win.connect('configure_event', self.tw.update_overlay_position) + self.tw.win = self.win + if self.ta_file is None: + self.tw.load_start() + else: + print self.ta_file + self.tw.load_start(self.ta_file) + self.tw.lc.trace = 0 + self.tw.run_button(0) + gtk.main() + def _draw_and_quit(self): + self.tw.load_start(self.ta_file) + self.tw.lc.trace = 0 + self.tw.run_button(0) + self.tw.save_as_image(self.ta_file, self.canvas) -class TurtleMain(): - """ Launch Turtle Art from outside of Sugar """ + def _build_window(self): + if os.path.exists(_INSTALL_PATH): + self.tw = TurtleArtWindow(self.canvas, _INSTALL_PATH) + elif os.path.exists(_ALTERNATE_INSTALL_PATH): + self.tw = TurtleArtWindow(self.canvas, _ALTERNATE_INSTALL_PATH) + else: + self.tw = TurtleArtWindow(self.canvas, os.path.abspath('.')) - def __init__(self): - """ Parse command-line options and initialize class """ + self.tw.save_folder = os.path.expanduser('~') + def _init_vars(self): # If we are invoked to start a project from Gnome, we should make # sure our current directory is TA's source dir. os.chdir(os.path.dirname(__file__)) @@ -125,8 +166,11 @@ class TurtleMain(): self.ta_file = None self.output_png = False self.uploading = False + self.i = 0 # FIXME: use a better name for this variable + self.scale = 2.0 + self.tw = None - # Parse command line + def _parse_command_line(self): try: opts, args = getopt.getopt(argv[1:], 'ho', ['help', 'output_png']) @@ -155,163 +199,134 @@ class TurtleMain(): if not os.path.exists(self.ta_file): assert False, ('%s: %s' % (self.ta_file, _('File not found'))) - self.i = 0 - self.scale = 2.0 - self.tw = None - - # make sure Sugar paths are present + """ + make sure Sugar paths are present + """ + def _ensure_sugar_paths(self): tapath = os.path.join(os.environ['HOME'], '.sugar', 'default', 'org.laptop.TurtleArtActivity') - map(makepath, (os.path.join(tapath, 'data/'), + map(self._makepath, (os.path.join(tapath, 'data/'), os.path.join(tapath, 'instance/'))) - if self.output_png: - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, - gtk.gdk.screen_width(), - gtk.gdk.screen_height()) - canvas, mask = pixbuf.render_pixmap_and_mask() + def _read_initial_pos(self): + try: + data_file = open(os.path.join(CONFIG_HOME, 'turtleartrc'), 'r') + except IOError: + # Opening the config file failed + # We'll assume it needs to be created + try: + self._mkdir_p(CONFIG_HOME) + data_file = open(os.path.join(CONFIG_HOME, 'turtleartrc'), + 'a+') + except IOError, e: + # We can't write to the configuration file, use + # a faux file that will persist for the length of + # the session. + print _('Configuration directory not writable: %s') % (e) + data_file = cStringIO.StringIO() + data_file.write(str(50) + '\n') + data_file.write(str(50) + '\n') + data_file.write(str(800) + '\n') + data_file.write(str(550) + '\n') + data_file.seek(0) + self.x = int(data_file.readline()) + self.y = int(data_file.readline()) + self.width = int(data_file.readline()) + self.height = int(data_file.readline()) + + def _setup_gtk(self): + win = gtk.Window(gtk.WINDOW_TOPLEVEL) + win.set_default_size(self.width, self.height) + win.move(self.x, self.y) + win.maximize() + win.set_title(_('Turtle Art')) + if os.path.exists(os.path.join(_INSTALL_PATH, _ICON_SUBPATH)): + win.set_icon_from_file(os.path.join(_INSTALL_PATH, + _ICON_SUBPATH)) else: - win = gtk.Window(gtk.WINDOW_TOPLEVEL) - try: - data_file = open(os.path.join(CONFIG_HOME, 'turtleartrc'), 'r') + win.set_icon_from_file(_ICON_SUBPATH) except IOError: - # Opening the config file failed - # We'll assume it needs to be created - try: - mkdir_p(CONFIG_HOME) - data_file = open(os.path.join(CONFIG_HOME, 'turtleartrc'), - 'a+') - except IOError, e: - # We can't write to the configuration file, use - # a faux file that will persist for the length of - # the session. - print _('Configuration directory not writable: %s') % (e) - data_file = cStringIO.StringIO() - data_file.write(str(50) + '\n') - data_file.write(str(50) + '\n') - data_file.write(str(800) + '\n') - data_file.write(str(550) + '\n') - data_file.seek(0) - self.x = int(data_file.readline()) - self.y = int(data_file.readline()) - self.width = int(data_file.readline()) - self.height = int(data_file.readline()) - - win.set_default_size(self.width, self.height) - win.move(self.x, self.y) - win.maximize() - win.set_title(_('Turtle Art')) - if os.path.exists(os.path.join(_INSTALL_PATH, _ICON_SUBPATH)): - win.set_icon_from_file(os.path.join(_INSTALL_PATH, - _ICON_SUBPATH)) - else: - try: - win.set_icon_from_file(_ICON_SUBPATH) - except IOError: - pass - win.connect('delete_event', self._quit_ta) - - menu = gtk.Menu() - _make_menu_item(menu, _('New'), self._do_new_cb) - _make_menu_item(menu, _('Open'), self._do_open_cb) - _make_menu_item(menu, _('Save'), self._do_save_cb) - _make_menu_item(menu, _('Save As'), self._do_save_as_cb) - _make_menu_item(menu, _('Save as image'), self._do_save_picture_cb) - _make_menu_item(menu, _('Save as HTML'), self._do_save_html_cb) - _make_menu_item(menu, _('Save as Logo'), self._do_save_logo_cb) - if _UPLOAD_AVAILABLE: - _make_menu_item(menu, _('Upload to Web'), - self._do_upload_to_web) - _make_menu_item(menu, _('Quit'), self.destroy) - activity_menu = _make_sub_menu(menu, _('File')) - - menu = gtk.Menu() - _make_menu_item(menu, _('Cartesian coordinates'), - self._do_cartesian_cb) - _make_menu_item(menu, _('Polar coordinates'), self._do_polar_cb) - _make_menu_item(menu, _('Rescale coordinates'), - self._do_rescale_cb) - _make_menu_item(menu, _('Grow blocks'), self._do_resize_cb, 1.5) - _make_menu_item(menu, _('Shrink blocks'), - self._do_resize_cb, 0.667) - _make_menu_item(menu, _('Reset block size'), - self._do_resize_cb, -1) - view_menu = _make_sub_menu(menu, _('View')) - - menu = gtk.Menu() - _make_menu_item(menu, _('Copy'), self._do_copy_cb) - _make_menu_item(menu, _('Paste'), self._do_paste_cb) - edit_menu = _make_sub_menu(menu, _('Edit')) - - menu = gtk.Menu() - _make_menu_item(menu, _('Show palette'), self._do_palette_cb) - _make_menu_item(menu, _('Hide palette'), self._do_hide_palette_cb) - _make_menu_item(menu, _('Show/hide blocks'), self._do_hideshow_cb) - tool_menu = _make_sub_menu(menu, _('Tools')) - - menu = gtk.Menu() - _make_menu_item(menu, _('Clean'), self._do_eraser_cb) - _make_menu_item(menu, _('Run'), self._do_run_cb) - _make_menu_item(menu, _('Step'), self._do_step_cb) - _make_menu_item(menu, _('Debug'), self._do_trace_cb) - _make_menu_item(menu, _('Stop'), self._do_stop_cb) - turtle_menu = _make_sub_menu(menu, _('Turtle')) - - vbox = gtk.VBox(False, 0) - win.add(vbox) - vbox.show() - - menu_bar = gtk.MenuBar() - vbox.pack_start(menu_bar, False, False, 2) - menu_bar.show() - - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - sw.show() - canvas = gtk.DrawingArea() - width = gtk.gdk.screen_width() * 2 - height = gtk.gdk.screen_height() * 2 - canvas.set_size_request(width, height) - sw.add_with_viewport(canvas) - canvas.show() - vbox.pack_end(sw, True, True) - - menu_bar.append(activity_menu) - menu_bar.append(edit_menu) - menu_bar.append(view_menu) - menu_bar.append(tool_menu) - menu_bar.append(turtle_menu) - - win.show_all() - - if os.path.exists(_INSTALL_PATH): - self.tw = TurtleArtWindow(canvas, _INSTALL_PATH) - elif os.path.exists(_ALTERNATE_INSTALL_PATH): - self.tw = TurtleArtWindow(canvas, _ALTERNATE_INSTALL_PATH) - else: - self.tw = TurtleArtWindow(canvas, os.path.abspath('.')) - - self.tw.save_folder = os.path.expanduser('~') - - if not self.output_png: - win.connect('configure_event', self.tw.update_overlay_position) - self.tw.win = win - if self.ta_file is None: - self.tw.load_start() - else: - print self.ta_file - self.tw.load_start(self.ta_file) - self.tw.lc.trace = 0 - self.tw.run_button(0) - - gtk.main() - - else: - self.tw.load_start(self.ta_file) - self.tw.lc.trace = 0 - self.tw.run_button(0) - self.tw.save_as_image(self.ta_file, canvas) + pass + win.connect('delete_event', self._quit_ta) + + vbox = gtk.VBox(False, 0) + win.add(vbox) + vbox.show() + + menu_bar = self._get_menu_bar() + vbox.pack_start(menu_bar, False, False, 2) + menu_bar.show() + + sw = gtk.ScrolledWindow() + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw.show() + canvas = gtk.DrawingArea() + width = gtk.gdk.screen_width() * 2 + height = gtk.gdk.screen_height() * 2 + canvas.set_size_request(width, height) + sw.add_with_viewport(canvas) + canvas.show() + vbox.pack_end(sw, True, True) + + win.show_all() + self.win = win + self.canvas = canvas + + def _get_menu_bar(self): + menu = gtk.Menu() + self._make_menu_item(menu, _('New'), self._do_new_cb) + self._make_menu_item(menu, _('Open'), self._do_open_cb) + self._make_menu_item(menu, _('Save'), self._do_save_cb) + self._make_menu_item(menu, _('Save As'), self._do_save_as_cb) + self._make_menu_item(menu, _('Save as image'), self._do_save_picture_cb) + self._make_menu_item(menu, _('Save as HTML'), self._do_save_html_cb) + self._make_menu_item(menu, _('Save as Logo'), self._do_save_logo_cb) + if _UPLOAD_AVAILABLE: + self._make_menu_item(menu, _('Upload to Web'), + self._do_upload_to_web) + self._make_menu_item(menu, _('Quit'), self.destroy) + activity_menu = self._make_sub_menu(menu, _('File')) + + menu = gtk.Menu() + self._make_menu_item(menu, _('Cartesian coordinates'), + self._do_cartesian_cb) + self._make_menu_item(menu, _('Polar coordinates'), self._do_polar_cb) + self._make_menu_item(menu, _('Rescale coordinates'), + self._do_rescale_cb) + self._make_menu_item(menu, _('Grow blocks'), self._do_resize_cb, 1.5) + self._make_menu_item(menu, _('Shrink blocks'), + self._do_resize_cb, 0.667) + self._make_menu_item(menu, _('Reset block size'), + self._do_resize_cb, -1) + view_menu = self._make_sub_menu(menu, _('View')) + + menu = gtk.Menu() + self._make_menu_item(menu, _('Copy'), self._do_copy_cb) + self._make_menu_item(menu, _('Paste'), self._do_paste_cb) + edit_menu = self._make_sub_menu(menu, _('Edit')) + + menu = gtk.Menu() + self._make_menu_item(menu, _('Show palette'), self._do_palette_cb) + self._make_menu_item(menu, _('Hide palette'), self._do_hide_palette_cb) + self._make_menu_item(menu, _('Show/hide blocks'), self._do_hideshow_cb) + tool_menu = self._make_sub_menu(menu, _('Tools')) + + menu = gtk.Menu() + self._make_menu_item(menu, _('Clean'), self._do_eraser_cb) + self._make_menu_item(menu, _('Run'), self._do_run_cb) + self._make_menu_item(menu, _('Step'), self._do_step_cb) + self._make_menu_item(menu, _('Debug'), self._do_trace_cb) + self._make_menu_item(menu, _('Stop'), self._do_stop_cb) + turtle_menu = self._make_sub_menu(menu, _('Turtle')) + + menu_bar = gtk.MenuBar() + menu_bar.append(activity_menu) + menu_bar.append(edit_menu) + menu_bar.append(view_menu) + menu_bar.append(tool_menu) + menu_bar.append(turtle_menu) + return menu_bar def _quit_ta(self, widget=None, e=None): """ Save changes on exit """ -- cgit v0.9.1