diff options
-rw-r--r-- | develop-activity/develop_app.py | 155 | ||||
-rw-r--r-- | develop-activity/logviewer.py | 5 | ||||
-rw-r--r-- | develop-activity/new_activity.py | 4 | ||||
-rw-r--r-- | develop-activity/sourceview_editor.py | 7 |
4 files changed, 72 insertions, 99 deletions
diff --git a/develop-activity/develop_app.py b/develop-activity/develop_app.py index dfbb5b9..6028e2b 100644 --- a/develop-activity/develop_app.py +++ b/develop-activity/develop_app.py @@ -19,6 +19,7 @@ import os import os.path import shutil import gobject +import simplejson from gettext import gettext as _ @@ -199,19 +200,6 @@ class DevelopActivity(activity.Activity): def _change_treenotebook_page(self, button, page): self.treenotebook.set_current_page(page) - def is_foreign_dir(self): - """is_foreign_dir: self.activity_dir should be treated as read-only? - - Returns: - True: changes should not be saved in self.activity_dir, - and thus a change_base is necessary before saving changes. - - False: it is safe to save changes in self.activity_dir. - """ - return not (self.external_working_dir - or not self.activity_dir - or self.activity_dir.startswith(self.get_workingdir())) - def show_msg(self, text, title=""): """show_msg(text) shows text in a drop-down alert message. """ @@ -313,8 +301,10 @@ class DevelopActivity(activity.Activity): self._show_alert(_('You must type the name for the new activity')) else: activity_name = name_entry.get_text().strip() + activities_path = os.path.join(os.path.expanduser("~"), + "Activities") activityDir = new_activity.new_activity(activity_name, - self.get_workingdir()) + activities_path) self.first_open_activity(activityDir) # remove the welcome tab self.editor.remove_page(0) @@ -332,19 +322,12 @@ class DevelopActivity(activity.Activity): def _alert_response_cb(self, alert, response_id): self.remove_alert(alert) - def _get_user_path(self): - if "user_path" not in self.__dict__: - self.user_path = os.path.expanduser('~/') - if "isolation" in self.user_path: - self.user_path = ( - os.path.join(*(["/"] + self.user_path.split("/")[0:3]))) - return self.user_path - def _pick_existing_activity(self, button, combo_activities): if combo_activities.get_active() == -1: self._show_alert(_('You must select the activity')) else: - activities_path = os.path.join(self._get_user_path(), "Activities") + activities_path = os.path.join(os.path.expanduser("~"), + "Activities") selected = combo_activities.get_active_iter() activity_name = combo_activities.get_model().get_value(selected, 1) logging.error('Activity selected %s', activity_name) @@ -359,7 +342,7 @@ class DevelopActivity(activity.Activity): self.activity_dir = activity_dir + '/' name = os.path.basename(activity_dir) self.treecolumn.set_title(name) - #self.metadata['title'] = name + self.metadata['title'] = 'Develop %s' % name self.refresh_files() self.treeview.get_selection().connect("changed", self.selection_cb) return name @@ -386,11 +369,15 @@ class DevelopActivity(activity.Activity): def load_file(self, fullPath): """Load one activity subfile into the editor view. """ + logging.error('load_file fullPath %s', fullPath) + logging.error('load_file self.activity_dir %s', self.activity_dir) + if fullPath.startswith(self.activity_dir): filename = fullPath[len(self.activity_dir):] else: filename = fullPath fullPath = os.path.join(self.activity_dir, fullPath) + logging.error('load_file filename %s', filename) self.editor.load_object(fullPath, filename) def selection_cb(self, column): @@ -407,24 +394,14 @@ class DevelopActivity(activity.Activity): self.load_file(path) self.numb = False - def save_source_jobject(self, activity_dir, file_path, filenames=None): - if not activity_dir: - raise NotImplementedError - + def save_bundle(self, file_path): #create bundle dist_dir, dist_name = os.path.split(file_path) builder = XOPackager(Builder(Config(activity_dir, dist_dir, dist_name))) builder.package() - - # fix up datastore object - # FIXME: some of this is overkill, - # legacy from when I created a new jobject each save jobject = self._jobject - if self._shared_activity is not None: - icon_color = self._shared_activity.props.color - else: - icon_color = profile.get_color().to_string() + icon_color = profile.get_color().to_string() metadata = { 'title': _('%s Bundle') % builder.config.activity_name, @@ -439,13 +416,49 @@ class DevelopActivity(activity.Activity): 'preview': '', 'source': activity_dir, } + jobject.file_path = file_path + datastore.write(jobject) + jobject.destroy() + return jobject + + def save_source_jobject(self, activity_dir, file_path, filenames=None): + if not activity_dir: + raise NotImplementedError + + # fix up datastore object + # FIXME: some of this is overkill, + # legacy from when I created a new jobject each save + jobject = self._jobject + icon_color = profile.get_color().to_string() + + metadata = { + 'title': self.metadata['title'], + 'title_set_by_user': '1', + #'suggested_filename': '%s-%s.xo' % (builder.config.bundle_name, + # builder.config.version), + 'icon-color': icon_color, + 'mime_type': 'application/develop-session', + 'activity': self.get_bundle_id(), + 'activity_id': self.get_id(), + 'share-scope': activity.SCOPE_PRIVATE, + 'preview': '', + 'source': activity_dir, + } for k, v in metadata.items(): jobject.metadata[k] = v # dict.update method is missing =( + dev_session_data = {} + if filenames: - jobject.metadata['open_filenames'] = filenames + dev_session_data['open_filenames'] = filenames + + f = open(file_path, 'w') + try: + simplejson.dump(dev_session_data, f) + finally: + f.close() jobject.file_path = file_path - #datastore.write(jobject) - #jobject.destroy() + datastore.write(jobject) + jobject.destroy() return jobject def write_file(self, file_path): @@ -453,43 +466,32 @@ class DevelopActivity(activity.Activity): """ if self.activity_dir is None: return - if self.is_foreign_dir(): - self.debug_msg(u'write file from %s to %s; dirty is %s' % - (self.activity_dir, file_path, str(self.dirty))) if not self.save_unchanged: self.editor.save_all() filenames = OPENFILE_SEPARATOR.join(self.editor.get_all_filenames()) self.debug_msg('activity_dir %s, file_path %s, filenames %s' % - (len(self.activity_dir), - len(file_path), len(filenames))) + (self.activity_dir, file_path, len(filenames))) self._jobject = self.save_source_jobject(self.activity_dir, file_path, filenames) - self.metadata['source'] = self.activity_dir[:-1] + self.metadata['source'] = self.activity_dir self.set_dirty(False) - def get_workingdir(self): - return os.path.join(activity.get_activity_root(), "instance", - WORKING_SOURCE_DIR) - def read_file(self, file_path): - if not os.path.isfile(file_path): - self._show_welcome() - return - workingdir = self.get_workingdir() - if os.path.isdir(workingdir): - shutil.rmtree(workingdir) - #raise IOError("working dir already exists...") + self.activity_dir = self.metadata['source'] + logging.error('read_file self.activity_dir %s', self.activity_dir) + self.first_open_activity(self.activity_dir) + + f = open(file_path, 'r') try: - bundledir = ActivityBundle(file_path).install(workingdir) - except AttributeError: - bundledir = ActivityBundle(file_path).unpack(workingdir) - self.first_open_activity(os.path.join(bundledir)) - logging.info(u'read_file. subfiles: %s' % - self.metadata['open_filenames']) - for filename in self.metadata['open_filenames'].split( + session_data = simplejson.load(f) + for filename in session_data['open_filenames'].split( OPENFILE_SEPARATOR): - if filename: - self.load_file(filename) + if filename: + logging.info('opening : %s', filename) + self.load_file(filename) + finally: + f.close() + self.set_dirty(False) def is_dirty(self): @@ -499,8 +501,7 @@ class DevelopActivity(activity.Activity): self.debug_msg("Setting dirty to %s; activity_dir is %s" % (str(dirty), str(self.activity_dir))) self.dirty = dirty - if dirty and self.activity_dir and self.is_foreign_dir(): - self.change_base() + if dirty: self.save_unchanged = True try: self.debug_msg("Saving a pristine copy for safety") @@ -509,26 +510,6 @@ class DevelopActivity(activity.Activity): self.save_unchanged = False self.dirty = dirty - def change_base(self): - targetdir = self.get_workingdir() - - #if in an editable directory outside ~/Activities, edit in place - if (not self.activity_dir.startswith( - os.path.join(os.path.expanduser("~"), "Activities")) - and os.access(targetdir, os.W_OK)): - self.debug_msg("Editing files in place: " + self.activity_dir) - self.external_working_dir = True - return - - #otherwise, copy for editing - self.debug_msg("Copying files for editing") - if os.path.isdir(targetdir): - shutil.rmtree(targetdir) - olddir = self.activity_dir - shutil.copytree(olddir, targetdir) - self.open_activity(targetdir) - self.editor.reroot(olddir, targetdir) - def update_sidebar_to_page(self, page): if self.numb: #avoid infinite recursion diff --git a/develop-activity/logviewer.py b/develop-activity/logviewer.py index 7f63456..570864b 100644 --- a/develop-activity/logviewer.py +++ b/develop-activity/logviewer.py @@ -45,9 +45,8 @@ class LogMinder(gtk.VBox): logging.info('creating MultiLogView') if not path: # Main path to watch: ~/.sugar/someuser/logs... - path = os.path.join(self.activity._get_user_path(), - ".sugar", "default", "logs") - #env.get_profile_path(), 'logs') + path = os.path.join(os.path.expanduser("~"), ".sugar", "default", + "logs") if not extra_files: # extra files to watch in logviewer diff --git a/develop-activity/new_activity.py b/develop-activity/new_activity.py index 3ae5db0..a9723b3 100644 --- a/develop-activity/new_activity.py +++ b/develop-activity/new_activity.py @@ -13,6 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +import os +import shutil def class_template(name): @@ -77,7 +79,6 @@ class %s(activity.Activity): def new_activity(name, base_path): - import os path = os.path.expanduser(os.path.join(base_path, '%s.activity' % name.replace(' ', ''))) os.makedirs(path) @@ -97,7 +98,6 @@ def new_activity(name, base_path): icon_path = os.path.join(os.path.dirname(__file__), 'activity', 'activity-default.svg') - import shutil shutil.copy(icon_path, activityPath) return path diff --git a/develop-activity/sourceview_editor.py b/develop-activity/sourceview_editor.py index d038b4d..b0ad876 100644 --- a/develop-activity/sourceview_editor.py +++ b/develop-activity/sourceview_editor.py @@ -179,9 +179,6 @@ class GtkSourceview2Editor(gtk.Notebook): def save_all(self): logging.info('save all %i', self.get_n_pages()) - if self.activity.is_foreign_dir(): - logging.info('save all error, still viewing in place') - return for i in range(self.get_n_pages()): page = self._get_page(i) if isinstance(page, GtkSourceview2Page): @@ -269,10 +266,6 @@ class GtkSourceview2Page(gtksourceview2.View): def save(self): if self.text_buffer.can_undo(): # only save if there's something to - # save note: the above is a hack. If activity.is_foreign_dir(), we - #should not save. currently, the above is never true when that is. - #This hack is because we're not keeping a pointer to the activity - # here. buff = self.text_buffer text = buff.get_text(buff.get_start_iter(), buff.get_end_iter()) _file = file(self.fullPath, 'w') |