diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 76348e1f5..5acdf88fe 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,19 @@ +2006-02-04 Don Allingham + * src/AddMedia.py: relative path support + * src/AddrEdit.py: add DisplayTab support + * src/DdTargets.py: repository references support + * src/DisplayTabs.py: repository reference support + * src/EditMedia.py: save support + * src/EditSource.py: save support + * src/ImageSelect.py: remove unused stuff + * src/Sources.py: use object instead of gobject.TYPE_PYOBJECT + * src/Utils.py: relative path calculator + * src/ViewManager.py: change cwd to directory of the file so that + relative paths work + * src/edit_person.glade: fix size + * src/gramps.glade: add relative path indicator + * src/GrampsDb/_ReadGedcom.py: remove useless compare + 2006-02-03 Don Allingham * src/AttrEdit.py: use DisplayTabs * src/NameEdit.py: use DisplayTabs diff --git a/gramps2/src/AddMedia.py b/gramps2/src/AddMedia.py index c06ad2fa4..b6a14f930 100644 --- a/gramps2/src/AddMedia.py +++ b/gramps2/src/AddMedia.py @@ -86,6 +86,7 @@ class AddMediaObject: self.file_text = self.glade.get_widget("fname") self.internal = self.glade.get_widget('internal') self.internal.connect('toggled',self.internal_toggled) + self.relpath = self.glade.get_widget('relpath') self.temp_name = "" self.object = None @@ -118,6 +119,12 @@ class AddMediaObject: mobj.set_mime_type(None) else: filename = self.file_text.get_filename() + + if self.relpath.get_active(): + p = self.db.get_save_path() + if not os.path.isdir(p): + p = os.path.dirname(p) + filename = Utils.relative_path(filename,p) if os.path.exists(filename) == 0: msgstr = _("Cannot import %s") diff --git a/gramps2/src/AddrEdit.py b/gramps2/src/AddrEdit.py index 518e06094..7bcb6e220 100644 --- a/gramps2/src/AddrEdit.py +++ b/gramps2/src/AddrEdit.py @@ -31,7 +31,6 @@ mechanism for the user to edit address information. # #------------------------------------------------------------------------- from gettext import gettext as _ -import gc #------------------------------------------------------------------------- # @@ -56,6 +55,7 @@ import DisplayState import Spell from WindowUtils import GladeIf +from DisplayTabs import * #------------------------------------------------------------------------- # @@ -103,26 +103,14 @@ class AddressEditor(DisplayState.ManagedWindow): self.postal.set_editable(not self.db.readonly) self.phone = self.top.get_widget("phone") self.phone.set_editable(not self.db.readonly) - self.note_field = self.top.get_widget("addr_note") - self.note_field.set_editable(not self.db.readonly) - self.spell = Spell.Spell(self.note_field) self.priv = self.top.get_widget("priv") self.priv.set_sensitive(not self.db.readonly) - self.slist = self.top.get_widget("slist") - self.sources_label = self.top.get_widget("sources_tab") - self.notes_label = self.top.get_widget("note_tab") - self.general_label = self.top.get_widget("general_tab") - self.flowed = self.top.get_widget("addr_flowed") - self.flowed.set_sensitive(not self.db.readonly) - self.preform = self.top.get_widget("addr_preform") - self.preform.set_sensitive(not self.db.readonly) title_label = self.top.get_widget("title") Utils.set_titles(self.window,title_label,_('Address Editor')) if self.addr: - self.srcreflist = self.addr.get_source_references() self.addr_date_obj = RelLib.Date(self.addr.get_date_object()) self.addr_start.set_text(DateHandler.get_date(self.addr)) self.street.set_text(self.addr.get_street()) @@ -132,29 +120,9 @@ class AddressEditor(DisplayState.ManagedWindow): self.postal.set_text(self.addr.get_postal_code()) self.phone.set_text(self.addr.get_phone()) self.priv.set_active(self.addr.get_privacy()) - if self.addr.get_note(): - self.note_field.get_buffer().set_text(self.addr.get_note()) - Utils.bold_label(self.notes_label) - if addr.get_note_format() == 1: - self.preform.set_active(1) - else: - self.flowed.set_active(1) - Utils.bold_label(self.general_label) - else: - Utils.unbold_label(self.sources_label) - Utils.bold_label(self.general_label) else: - Utils.unbold_label(self.general_label) self.addr_date_obj = RelLib.Date() - self.srcreflist = [] self.addr = RelLib.Address() - self.switch_page() - - self.sourcetab = Sources.SourceTab( - self.dbstate, self.uistate, self.track, - self.srcreflist, self, self.top, self.window, self.slist, - self.top.get_widget('add_src'), self.top.get_widget('edit_src'), - self.top.get_widget('del_src'), self.db.readonly) date_stat = self.top.get_widget("date_stat") date_stat.set_sensitive(not self.db.readonly) @@ -167,21 +135,45 @@ class AddressEditor(DisplayState.ManagedWindow): okbtn = self.top.get_widget('button121') okbtn.set_sensitive(not self.db.readonly) self.gladeif.connect('button129','clicked',self.on_help_clicked) - self.gladeif.connect('notebook2','switch_page',self.on_switch_page) - self.window.set_transient_for(self.parent_window) - self.window.show() + self._create_tabbed_pages() + + self.show() + + def _add_page(self,page): + self.notebook.insert_page(page) + self.notebook.set_tab_label(page,page.get_tab_widget()) + return page + + def _create_tabbed_pages(self): + """ + Creates the notebook tabs and inserts them into the main + window. + + """ + + vbox = self.top.get_widget('vbox') + + self.notebook = gtk.Notebook() + + self.srcref_list = self._add_page(SourceEmbedList( + self.dbstate,self.uistate, self.track, + self.addr.source_list)) + self.note_tab = self._add_page(NoteTab( + self.dbstate, self.uistate, self.track, + self.addr.get_note_object())) + + self.notebook.show_all() + vbox.pack_start(self.notebook,True) def on_delete_event(self,obj,b): self.gladeif.close() self.close() - gc.collect() def close_window(self,obj): self.gladeif.close() - self.close() self.window.destroy() - gc.collect() + self.close() def build_menu_names(self,obj): return (_('Address'),_('Address Editor')) @@ -204,12 +196,11 @@ class AddressEditor(DisplayState.ManagedWindow): postal = unicode(self.postal.get_text()) b = self.note_field.get_buffer() note = unicode(b.get_text(b.get_start_iter(),b.get_end_iter(),False)) - format = self.preform.get_active() priv = self.priv.get_active() self.addr.set_source_reference_list(self.srcreflist) - self.update(date_obj,street,city,state,country,postal,phone,note,format,priv) + self.update(date_obj,street,city,state,country,postal,phone,priv) self.callback(self.addr) self.close_window(obj) @@ -219,7 +210,7 @@ class AddressEditor(DisplayState.ManagedWindow): if get() != data: set(data) - def update(self,date_obj,street,city,state,country,postal,phone,note,format,priv): + def update(self,date_obj,street,city,state,country,postal,phone,priv): """Compares the data items, and updates if necessary""" if not self.addr.get_date_object().is_equal(date_obj): @@ -234,16 +225,3 @@ class AddressEditor(DisplayState.ManagedWindow): self.check(self.addr.get_note,self.addr.set_note,note) self.check(self.addr.get_note_format,self.addr.set_note_format,format) self.check(self.addr.get_privacy,self.addr.set_privacy,priv) - - def on_switch_page(self,obj,a,page): - self.switch_page() - - def switch_page(self): - buf = self.note_field.get_buffer() - start = buf.get_start_iter() - stop = buf.get_end_iter() - text = unicode(buf.get_text(start,stop,False)) - if text: - Utils.bold_label(self.notes_label) - else: - Utils.unbold_label(self.notes_label) diff --git a/gramps2/src/DdTargets.py b/gramps2/src/DdTargets.py index 661ee8e4c..09df3fd00 100644 --- a/gramps2/src/DdTargets.py +++ b/gramps2/src/DdTargets.py @@ -103,6 +103,7 @@ class _DdTargets(object): self.ATTRIBUTE = _DdType(self,'pattr') self.ADDRESS = _DdType(self,'paddr') self.SOURCEREF = _DdType(self,'srcref') + self.REPOREF = _DdType(self,'reporef') self.NAME = _DdType(self,'name') self.MEDIAOBJ = _DdType(self,'mediaobj') self.DATA = _DdType(self,'data_tuple') diff --git a/gramps2/src/DisplayTabs.py b/gramps2/src/DisplayTabs.py index 56ba01196..1d6a4c44f 100644 --- a/gramps2/src/DisplayTabs.py +++ b/gramps2/src/DisplayTabs.py @@ -537,7 +537,7 @@ class EventEmbedList(EmbeddedList): _column_names = [ (_('Type'),0,100), - (_('Description'),1,200), + (_('Description'),1,175), (_('ID'),2, 60), (_('Date'),3, 150), (_('Place'),4, 140), @@ -1103,6 +1103,61 @@ class SourceEmbedList(EmbeddedList): self.changed = True self.rebuild() +#------------------------------------------------------------------------- +# +# RepoEmbedList +# +#------------------------------------------------------------------------- +class RepoEmbedList(EmbeddedList): + + _HANDLE_COL = 4 + _DND_TYPE = DdTargets.REPOREF + + _column_names = [ + (_('ID'), 0, 75), + (_('Title'), 1, 200), + (_('Call Number'), 2, 125), + (_('Type'), 3, 100), + ] + + def __init__(self,dbstate,uistate,track,obj): + self.obj = obj + EmbeddedList.__init__(self, dbstate, uistate, track, + _('Repositories'), RepoRefModel) + + def get_icon_name(self): + return 'gramps-repository' + + def get_data(self): + return self.obj + + def column_order(self): + return ((1,0),(1,1),(1,2),(1,3)) + + def add_button_clicked(self,obj): + from RepositoryRefEdit import RepositoryRefEdit + + ref = RelLib.RepositoryRef() + RepositoryRefEdit.RepositoryRefEdit( + self.dbstate, self.uistate, self.track, ref, self.add_callback) + + def add_callback(self,obj): + self.get_data().append(name) + self.changed = True + self.rebuild() + + def edit_button_clicked(self,obj): + from RepositoryRefEdit import RepositoryRefEdit + + ref = self.get_selected() + if ref: + RepositoryRefEdit.RepositoryRefEdit( + self.dbstate, self.uistate, self.track, ref, self.edit_callback) + + def edit_callback(self,name): + self.changed = True + self.rebuild() + #------------------------------------------------------------------------- # # ChildModel @@ -1256,7 +1311,7 @@ class EventRefModel(gtk.ListStore): if t == RelLib.EventRef.CUSTOM: return v else: - return Utils.event_roles[t] + return Utils.event_roles.get(t,"error %d" % t) def column_date(self,event_ref): event = self.db.get_event_from_handle(event_ref.ref) @@ -1378,7 +1433,7 @@ class DataModel(gtk.ListStore): #------------------------------------------------------------------------- # -# DataModel +# SourceRefModel # #------------------------------------------------------------------------- class SourceRefModel(gtk.ListStore): @@ -1393,7 +1448,30 @@ class SourceRefModel(gtk.ListStore): #------------------------------------------------------------------------- # -# SourceBacRefModel +# RepoRefModel +# +#------------------------------------------------------------------------- +class RepoRefModel(gtk.ListStore): + + def __init__(self,ref_list,db): + gtk.ListStore.__init__(self,str,str,str,str,object) + self.db = db + for ref in ref_list: + repo = self.db.get_repository_from_handle(ref.ref) + self.append(row=[repo.gramps_id, repo.name, ref.call_number, + self.type_of(repo), ref,]) + + def type_of(self,ref): + v,s = ref.get_type() + + if v == RelLib.RepoRef.CUSTOM: + return unicode(s) + else: + return Utils.source_media_types.get(v,"error %s" % v) + +#------------------------------------------------------------------------- +# +# SourceBackRefModel # #------------------------------------------------------------------------- class SourceBackRefModel(gtk.ListStore): diff --git a/gramps2/src/EditMedia.py b/gramps2/src/EditMedia.py index 66c5edb66..5b2d06c4b 100644 --- a/gramps2/src/EditMedia.py +++ b/gramps2/src/EditMedia.py @@ -196,11 +196,10 @@ class EditMedia(DisplayState.ManagedWindow): self.change_dialog.get_widget("path").set_text(fname) def on_apply_clicked(self, obj): - t = self.notes.get_buffer() - text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False)) desc = unicode(self.descr_window.get_text()) note = self.obj.get_note() path = self.change_dialog.get_widget('path').get_text() + if path != self.obj.get_path(): mime = GrampsMime.get_type(path) self.obj.set_mime_type(mime) @@ -209,15 +208,6 @@ class EditMedia(DisplayState.ManagedWindow): if not self.date_object.is_equal(self.obj.get_date_object()): self.obj.set_date_object(self.date_object) - format = self.preform.get_active() - if text != note or desc != self.obj.get_description(): - self.obj.set_note(text) - self.obj.set_description(desc) - if format != self.obj.get_note_format(): - self.obj.set_note_format(format) - if self.lists_changed: - self.obj.set_attribute_list(self.alist) - self.obj.set_source_reference_list(self.srcreflist) trans = self.db.transaction_begin() self.db.commit_media_object(self.obj,trans) self.db.transaction_commit(trans,_("Edit Media Object")) diff --git a/gramps2/src/EditSource.py b/gramps2/src/EditSource.py index 767083d07..a56313fbd 100644 --- a/gramps2/src/EditSource.py +++ b/gramps2/src/EditSource.py @@ -56,8 +56,7 @@ import Spell import GrampsDisplay import DisplayState -from DisplayTabs import NoteTab, GalleryTab, DataEmbedList, SourceBackRefList - +from DisplayTabs import * from WindowUtils import GladeIf #------------------------------------------------------------------------- @@ -207,6 +206,8 @@ class EditSource(DisplayState.ManagedWindow): self.author = self.top_window.get_widget("author") self.pubinfo = self.top_window.get_widget("pubinfo") self.abbrev = self.top_window.get_widget("abbrev") + self.cancel = self.top_window.get_widget('cancel') + self.ok = self.top_window.get_widget('ok') self.vbox = self.top_window.get_widget('vbox') @@ -222,8 +223,9 @@ class EditSource(DisplayState.ManagedWindow): self.abbrev.set_text(source.get_abbreviation()) self.abbrev.set_editable(mode) - self.top_window.get_widget('ok').set_sensitive(not self.db.readonly) - self.top_window.get_widget('cancel').connect('clicked', self.close_window) + self.ok.set_sensitive(not self.db.readonly) + self.cancel.connect('clicked', self.close_window) + self.ok.connect('clicked', self.apply_clicked) self.notebook = gtk.Notebook() self.notebook.show() @@ -233,19 +235,18 @@ class EditSource(DisplayState.ManagedWindow): self.show() - self.model = None # This will hold the model for backreferences once it is complete. - def load_data(self): - self.note_tab = NoteTab(self.dbstate, self.uistate, self.track, - self.source.get_note_object()) - self.gallery_tab = GalleryTab(self.dbstate, self.uistate, self.track, - self.source.get_media_list()) - - self.data_tab = DataEmbedList(self.dbstate, self.uistate, self.track, - self.source) - - self.backref_tab = SourceBackRefList(self.dbstate, self.uistate, self.track, - self.db.find_backlink_handles(self.source.handle)) + self.note_tab = NoteTab( + self.dbstate, self.uistate, self.track, self.source.get_note_object()) + self.gallery_tab = GalleryTab( + self.dbstate, self.uistate, self.track, self.source.get_media_list()) + self.data_tab = DataEmbedList( + self.dbstate, self.uistate, self.track, self.source) + self.repo_tab = RepoEmbedList( + self.dbstate, self.uistate, self.track, self.source.get_reporef_list()) + self.backref_tab = SourceBackRefList( + self.dbstate, self.uistate, self.track, + self.db.find_backlink_handles(self.source.handle)) self.notebook.insert_page(self.note_tab) self.notebook.set_tab_label(self.note_tab,self.note_tab.get_tab_widget()) @@ -256,6 +257,9 @@ class EditSource(DisplayState.ManagedWindow): self.notebook.insert_page(self.gallery_tab) self.notebook.set_tab_label(self.gallery_tab,self.gallery_tab.get_tab_widget()) + self.notebook.insert_page(self.repo_tab) + self.notebook.set_tab_label(self.repo_tab,self.repo_tab.get_tab_widget()) + self.notebook.insert_page(self.backref_tab) self.notebook.set_tab_label(self.backref_tab,self.backref_tab.get_tab_widget()) @@ -287,17 +291,12 @@ class EditSource(DisplayState.ManagedWindow): self.gladeif.close() self.close() - def on_source_apply_clicked(self,obj): + def apply_clicked(self,obj): title = unicode(self.title.get_text()) author = unicode(self.author.get_text()) pubinfo = unicode(self.pubinfo.get_text()) abbrev = unicode(self.abbrev.get_text()) - note = unicode( - self.notes_buffer.get_text(self.notes_buffer.get_start_iter(), - self.notes_buffer.get_end_iter(), - False)) - format = self.preform.get_active() if author != self.source.get_author(): self.source.set_author(author) @@ -310,31 +309,7 @@ class EditSource(DisplayState.ManagedWindow): if abbrev != self.source.get_abbreviation(): self.source.set_abbreviation(abbrev) - - if note != self.source.get_note(): - self.source.set_note(note) - - if format != self.source.get_note_format(): - self.source.set_note_format(format) - - new_map = {} - for val in range(0,len(self.data_model)): - node = self.data_model.get_iter(val) - key = self.data_model.get_value(node,0) - value = self.data_model.get_value(node,1) - if key: - new_map[unicode(key)] = unicode(value) - if new_map != self.source.get_data_map(): - self.source.set_data_map(new_map) - - # update repository refs - repos_ref_list = [] - for val in range(0,len(self.repos_ref_model)): - iter = self.repos_ref_model.get_iter(val) - repos_ref_list.append(self.repos_ref_model.get_value(iter,0)) - - self.source.set_reporef_list(repos_ref_list) - + trans = self.db.transaction_begin() if self.source.get_handle() == None: self.db.add_source(self.source,trans) @@ -343,7 +318,6 @@ class EditSource(DisplayState.ManagedWindow): self.db.transaction_commit(trans,_("Edit Source (%s)") % title) self.close(obj) - class DelSrcQuery: def __init__(self,source,db,the_lists): self.source = source diff --git a/gramps2/src/GrampsDb/_ReadGedcom.py b/gramps2/src/GrampsDb/_ReadGedcom.py index 6f2f6c6a3..9a1b72c71 100644 --- a/gramps2/src/GrampsDb/_ReadGedcom.py +++ b/gramps2/src/GrampsDb/_ReadGedcom.py @@ -811,7 +811,7 @@ class GedcomParser: self.parse_repository(self.repo) self.db.commit_repository(self.repo, self.trans) del self.repo - elif matches[2] in ["SUBM","SUBN","REPO"]: + elif matches[2] in ("SUBM","SUBN"): self.ignore_sub_junk(1) elif matches[1] in (TOKEN_SUBM,TOKEN_SUBN,TOKEN_OBJE,TOKEN__EVENT_DEFN): self.ignore_sub_junk(1) diff --git a/gramps2/src/ImageSelect.py b/gramps2/src/ImageSelect.py index 1c6058a01..1f1da2f33 100644 --- a/gramps2/src/ImageSelect.py +++ b/gramps2/src/ImageSelect.py @@ -79,596 +79,6 @@ _drag_targets = [ ('text/uri-list',0,2), ('application/x-rootwin-drop',0,1)] -#------------------------------------------------------------------------- -# -# ImageSelect class -# -#------------------------------------------------------------------------- -class ImageSelect: - - def __init__(self, path, db, parent, parent_window=None): - """Creates an edit window. Associates a person with the window.""" - self.path = path; - self.db = db - self.dataobj = None - self.parent = parent - self.parent_window = parent_window - self.canvas_list = {} - self.p_map = {} - self.canvas = None - - def add_thumbnail(self, photo): - "should be overrridden" - pass - - def load_images(self): - "should be overrridden" - pass - - def internal_toggled(self, obj): - self.fname.set_sensitive(not obj.get_active()) - - def create_add_dialog(self): - """Create the gnome dialog for selecting a new photo and entering - its description.""" - - if self.path == '': - return - - self.glade = gtk.glade.XML(const.gladeFile,"imageSelect","gramps") - self.window = self.glade.get_widget("imageSelect") - - self.fname = self.glade.get_widget("fname") - self.image = self.glade.get_widget("image") - self.internal = self.glade.get_widget("internal") - self.internal.connect('toggled',self.internal_toggled) - self.description = self.glade.get_widget("photoDescription") - self.temp_name = "" - - Utils.set_titles(self.window,self.glade.get_widget('title'), - _('Select a media object')) - - - self.gladeif = GladeIf(self.glade) - self.gladeif.connect('fname', 'update_preview', self.on_name_changed) - - if os.path.isdir(_last_path): - self.fname.set_current_folder(_last_path) - - if self.parent_window: - self.window.set_transient_for(self.parent_window) - self.window.show() - self.val = self.window.run() - if self.val == gtk.RESPONSE_OK: - self.on_savephoto_clicked() - self.window.destroy() - gc.collect() - - def on_help_imagesel_clicked(self,obj): - """Display the relevant portion of GRAMPS manual""" - GrampsDisplay.help('gramps-edit-quick') - self.val = self.window.run() - - def on_name_changed(self, obj): - """The filename has changed. Verify it and load the picture.""" - filename = unicode(self.fname.get_filename()) - - basename = os.path.basename(filename) - (root,ext) = os.path.splitext(basename) - old_title = unicode(self.description.get_text()) - - if old_title == "" or old_title == self.temp_name: - self.description.set_text(root) - self.temp_name = root - - filename = Utils.find_file( filename) - if filename: - mtype = GrampsMime.get_type(filename) - if mtype and mtype.startswith("image"): - image = RelImage.scale_image(filename,const.thumbScale) - self.image.set_from_pixbuf(image) - else: - i = GrampsMime.find_mime_type_pixbuf(mtype) - self.image.set_from_pixbuf(i) - - def on_savephoto_clicked(self): - """Save the photo in the dataobj object. (Required function)""" - global _last_path - - filename = self.fname.get_filename() - _last_path = os.path.dirname(filename) - - description = unicode(self.description.get_text()) - - internal = self.internal.get_active() - - if not internal: - if os.path.exists(filename) == 0: - msgstr = _("Cannot import %s") - msgstr2 = _("The filename supplied could not be found.") - ErrorDialog(msgstr % filename, msgstr2) - return - - already_imported = None - - for o_id in self.db.get_media_object_handles(): - o = self.db.get_object_from_handle(o_id) - if o.get_path() == filename: - already_imported = o - break - - if already_imported: - oref = RelLib.MediaRef() - oref.set_reference_handle(already_imported.get_handle()) - self.dataobj.add_media_reference(oref) - self.add_thumbnail(oref) - else: - mtype = GrampsMime.get_type(filename) - mobj = RelLib.MediaObject() - if description == "": - description = os.path.basename(filename) - mobj.set_description(description) - mobj.set_mime_type(mtype) - mobj.set_path(filename) - else: - mobj = RelLib.MediaObject() - mobj.set_description(description) - mobj.set_mime_type(None) - - if not already_imported: - trans = self.db.transaction_begin() - self.savephoto(mobj,trans) - self.db.transaction_commit(trans,'Edit Media Objects') - - self.parent.lists_changed = 1 - self.load_images() - - def savephoto(self, photo, transaction): - """Save the photo in the dataobj object - must be overridden""" - pass - -#------------------------------------------------------------------------- -# -# Gallery class - This class handles all the logic underlying a -# picture gallery. This class does not load or contain the widget -# data structure to actually display the gallery. -# -#------------------------------------------------------------------------- -class Gallery(ImageSelect): - def __init__(self, dataobj, commit, path, icon_list, db, parent, parent_window=None): - ImageSelect.__init__(self, path, db, parent, parent_window) - - self.commit = commit - if path: - icon_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.MEDIAOBJ.target()]+_drag_targets, - gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE) - icon_list.connect('event',self.item_event) - if not db.readonly: - icon_list.connect("drag_data_received", - self.on_photolist_drag_data_received) - icon_list.connect("drag_data_get", - self.on_photolist_drag_data_get) - icon_list.connect("drag_begin", self.on_drag_begin) - - _iconlist_refs.append(icon_list) - self.in_event = 0 - - # Remember arguments - self.path = path; - self.dataobj = dataobj; - self.iconlist = icon_list; - self.root = self.iconlist.root() - self.old_media_list = [RelLib.MediaRef(ref) for ref in dataobj.get_media_list()] - - # Local object variables - self.y = 0 - self.remember_x = -1 - self.remember_y = -1 - self.button = None - self.drag_item = None - self.sel = None - self.photo = None - - def close(self): - self.iconlist.hide() - if self.canvas_list: - for a in self.canvas_list.values(): - a[0].destroy() - a[1].destroy() - a[2].destroy() - self.p_map = None - self.canvas_list = None - - def on_canvas1_event(self,obj,event): - """ - Handle resize events over the canvas, redrawing if the size changes - """ - pass - - def on_drag_begin(self,obj,context): - if const.dnd_images: - handle = self.sel_obj.get_reference_handle() - media_obj = self.db.get_object_from_handle(handle) - pix = ImgManip.get_thumbnail_image(media_obj.get_path(), - media_obj.get_mime_type()) - context.set_icon_pixbuf(pix,0,0) - - def item_event(self, widget, event=None): - - if self.in_event: - return False - - self.in_event = 1 - if self.button and event.type == gtk.gdk.MOTION_NOTIFY : - if widget.drag_check_threshold(int(self.remember_x),int(self.remember_y), - int(event.x),int(event.y)): - self.drag_item = widget.get_item_at(self.remember_x, - self.remember_y) - icon_index = self.get_index(widget,event.x,event.y) - if icon_index == -1: - return - for i in self.dataobj.get_media_list(): - handle = i.get_reference_handle() - m = self.db.get_object_from_handle(handle) - - media_list = self.dataobj.get_media_list() - - if icon_index >= len(media_list): - return False - self.sel_obj = media_list[icon_index] - - handle = self.sel_obj.get_reference_handle() - media_obj = self.db.get_object_from_handle(handle) - - if self.drag_item: - widget.drag_begin([DdTargets.MEDIAOBJ.target()]+_drag_targets, - gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE, - self.button, event) - - self.in_event = 0 - return True - - style = self.iconlist.get_style() - - if event.type == gtk.gdk.BUTTON_PRESS: - if event.button == 1: - # Remember starting position. - - item = widget.get_item_at(event.x,event.y) - if item: - (i,t,b,self.photo,oid) = self.p_map[item] - t.set(fill_color_gdk=style.fg[gtk.STATE_SELECTED]) - b.set(fill_color_gdk=style.bg[gtk.STATE_SELECTED]) - if self.sel: - (i,t,b,photo,oid) = self.p_map[self.sel] - t.set(fill_color_gdk=style.fg[gtk.STATE_NORMAL]) - b.set(fill_color_gdk=style.bg[gtk.STATE_NORMAL]) - - self.sel = item - - self.remember_x = event.x - self.remember_y = event.y - self.button = event.button - self.in_event = 0 - return True - - elif event.button == 3: - item = widget.get_item_at(event.x,event.y) - if item: - (i,t,b,self.photo,oid) = self.p_map[item] - self.show_popup(self.photo,event) - self.in_event = 0 - return True - elif event.type == gtk.gdk.BUTTON_RELEASE: - self.button = 0 - elif event.type == gtk.gdk.MOTION_NOTIFY: - if event.state & gtk.gdk.BUTTON1_MASK: - # Get the new position and move by the difference - new_x = event.x - new_y = event.y - - self.remember_x = new_x - self.remember_y = new_y - - self.in_event = 0 - return True - - if event.type == gtk.gdk.EXPOSE: - self.load_images() - - self.in_event = 0 - return False - - def savephoto(self,photo,transaction): - """Save the photo in the dataobj object. (Required function)""" - self.db.add_object(photo,transaction) - oref = RelLib.MediaRef() - oref.set_reference_handle(photo.get_handle()) - self.dataobj.add_media_reference(oref) - - def add_thumbnail(self, photo): - """Scale the image and add it to the IconList.""" - oid = photo.get_reference_handle() - media_obj = self.db.get_object_from_handle(oid) - if self.canvas_list.has_key(photo): - (grp,item,text,x,y) = self.canvas_list[photo] - if x != self.cx or y != self.cy: - grp.move(self.cx-x,self.cy-y) - else: - description = media_obj.get_description() - if len(description) > 20: - description = "%s..." % description[0:20] - - try: - mtype = media_obj.get_mime_type() - image = ImgManip.get_thumbnail_image(media_obj.get_path(),mtype) - except gobject.GError,msg: - ErrorDialog(str(msg)) - image = gtk.gdk.pixbuf_new_from_file(const.icon) - except: - image = gtk.gdk.pixbuf_new_from_file(const.icon) - - x = image.get_width() - y = image.get_height() - - grp = self.root.add(CanvasGroup,x=self.cx,y=self.cy) - - xloc = (_IMAGEX-x)/2 - yloc = (_IMAGEY-y)/2 - - style = self.iconlist.get_style() - - box = grp.add(CanvasRect,x1=0,x2=_IMAGEX,y1=_IMAGEY-20, - y2=_IMAGEY, fill_color_gdk=style.bg[gtk.STATE_NORMAL]) - item = grp.add(CanvasPixbuf, - pixbuf=image,x=xloc, y=yloc) - text = grp.add(CanvasText, x=_IMAGEX/2, - anchor=gtk.ANCHOR_CENTER, - justification=gtk.JUSTIFY_CENTER, - y=_IMAGEY-10, text=description) - - # make sure that the text string doesn't exceed the size of the box - - bnds = text.get_bounds() - while bnds[0] <0: - description = description[0:-4] + "..." - text.set(text=description) - bnds = text.get_bounds() - - for i in [ item, text, box, grp ] : - self.p_map[i] = (item,text,box,photo,oid) - i.show() - - self.canvas_list[photo] = (grp,item,text,self.cx,self.cy) - - self.cx += _PAD + _IMAGEX - - if self.cx + _PAD + _IMAGEX > self.x: - self.cx = _PAD - self.cy += _PAD + _IMAGEY - - def load_images(self): - """clears the currentImages list to free up any cached - Imlibs. Then add each photo in the place's list of photos to the - photolist window.""" - - self.pos = 0 - self.cx = _PAD - self.cy = _PAD - - (self.x,self.y) = self.iconlist.get_size() - - self.max = (self.x)/(_IMAGEX+_PAD) - - for photo in self.dataobj.get_media_list(): - self.add_thumbnail(photo) - - if self.cy > self.y: - self.iconlist.set_scroll_region(0,0,self.x,self.cy) - else: - self.iconlist.set_scroll_region(0,0,self.x,self.y) - - if self.dataobj.get_media_list(): - Utils.bold_label(self.parent.gallery_label) - else: - Utils.unbold_label(self.parent.gallery_label) - - def get_index(self,obj,x,y): - x_offset = int(x)/(_IMAGEX+_PAD) - y_offset = int(y)/(_IMAGEY+_PAD) - index = (y_offset*(self.max))+x_offset - return min(index,len(self.dataobj.get_media_list())) - - def on_photolist_drag_data_received(self,w, context, x, y, data, info, time): - if data and data.format == 8: - icon_index = self.get_index(w,x,y) - d = Utils.fix_encoding(data.data.replace('\0',' ').strip()) - protocol,site,mfile,j,k,l = urlparse.urlparse(d) - if protocol == "file": - name = Utils.fix_encoding(mfile) - mime = GrampsMime.get_type(name) - photo = RelLib.MediaObject() - photo.set_path(name) - photo.set_mime_type(mime) - basename = os.path.basename(name) - (root,ext) = os.path.splitext(basename) - photo.set_description(root) - trans = self.db.transaction_begin() - self.savephoto(photo,trans) - if GrampsKeys.get_media_reference() == 0: - photo.set_path(name) - self.db.transaction_commit(trans,_("Drag Media Object")) - self.parent.lists_changed = 1 - if GrampsKeys.get_media_global(): - GlobalMediaProperties(self.db,photo, - self,self.parent_window) - elif protocol != "": - import urllib - u = urllib.URLopener() - try: - tfile,headers = u.retrieve(d) - except (IOError,OSError), msg: - t = _("Could not import %s") % d - ErrorDialog(t,str(msg)) - return - tfile = Utils.fix_encoding(tfile) - mime = GrampsMime.get_type(tfile) - photo = RelLib.MediaObject() - photo.set_mime_type(mime) - photo.set_description(d) - photo.set_path(tfile) - trans = self.db.transaction_begin() - self.db.add_object(photo,trans) - self.db.transaction_commit(trans,_("Drag Media Object")) - oref = RelLib.MediaRef() - oref.set_reference_handle(photo.get_handle()) - self.dataobj.add_media_reference(oref) -# This code seems to be reproducing what is already done. -# try: -# photo.set_path(name) -# except: -# photo.set_path(tfile) -# return - self.add_thumbnail(oref) - self.parent.lists_changed = 1 - if GrampsKeys.get_media_global(): - GlobalMediaProperties(self.db,photo, - self,self.parent_window) - else: - if self.db.has_object_handle(data.data): - icon_index = self.get_index(w,x,y) - index = 0 - for p in self.dataobj.get_media_list(): - if data.data == p.get_reference_handle(): - if index == icon_index or icon_index == -1: - return - else: - nl = self.dataobj.get_media_list() - item = nl[index] - if icon_index == 0: - del nl[index] - nl = [item] + nl - else: - del nl[index] - nl = nl[0:icon_index] + [item] + nl[icon_index:] - self.dataobj.set_media_list(nl) - self.parent.lists_changed = 1 - self.load_images() - return - index = index + 1 - oref = RelLib.MediaRef() - oref.set_reference_handle(data.data) - self.dataobj.add_media_reference(oref) - self.add_thumbnail(oref) - self.parent.lists_changed = 1 - if GrampsKeys.get_media_global(): - LocalMediaProperties(oref,self.path,self,self.parent_window) - - def on_photolist_drag_data_get(self,w, context, selection_data, info, time): - if info == 1: - return - data = self.p_map[self.drag_item] - selection_data.set(selection_data.target, 8, data[4]) - self.drag_item = None - - def on_add_media_clicked(self, obj): - """User wants to add a new photo. Create a dialog to find out - which photo they want.""" - self.create_add_dialog() - - def on_select_media_clicked(self,obj): - """User wants to add a new object that is already in a database. - Create a dialog to find out which object they want.""" - - s_o = SelectObject.SelectObject(self.db,_("Select an Object")) - obj = s_o.run() - if not obj: - return - oref = RelLib.MediaRef() - oref.set_reference_handle(obj.get_handle()) - self.dataobj.add_media_reference(oref) - self.add_thumbnail(oref) - - self.parent.lists_changed = 1 - self.load_images() - - def on_delete_media_clicked(self, obj): - """User wants to delete a new photo. Remove it from the displayed - thumbnails, and remove it from the dataobj photo list.""" - - if self.sel: - (i,t,b,photo,oid) = self.p_map[self.sel] - val = self.canvas_list[photo] - val[0].hide() - val[1].hide() - val[2].hide() - - l = self.dataobj.get_media_list() - l.remove(photo) - self.dataobj.set_media_list(l) - self.parent.lists_changed = 1 - self.load_images() - - def on_edit_media_clicked(self, obj): - """User wants to delete a new photo. Remove it from the displayed - thumbnails, and remove it from the dataobj photo list.""" - - if self.sel: - (i,t,b,photo,oid) = self.p_map[self.sel] - base_obj = self.db.get_object_from_handle(photo.get_reference_handle()) - - if base_obj.get_mime_type(): - LocalMediaProperties(photo,self.path,self,self.parent_window) - else: - import NoteEdit - NoteEdit.NoteEditor(base_obj,self.parent,self.parent_window, - self.note_callback) - - def note_callback(self,data): - trans = self.db.transaction_begin() - self.db.commit_media_object(data,trans) - self.db.transaction_commit(trans,_("Edit Media Object")) - - def show_popup(self, photo, event): - """Look for right-clicks on a picture and create a popup - menu of the available actions.""" - - menu = gtk.Menu() - menu.set_title(_("Media Object")) - obj = self.db.get_object_from_handle(photo.get_reference_handle()) - mtype = obj.get_mime_type() - progname = GrampsMime.get_application(mtype) - - if progname and len(progname) > 1: - Utils.add_menuitem(menu,_("Open in %s") % progname[1], - photo,self.popup_view_photo) - if mtype and mtype.startswith("image"): - Utils.add_menuitem(menu,_("Edit with the GIMP"), - photo,self.popup_edit_photo) - Utils.add_menuitem(menu,_("Edit Object Properties"),photo, - self.popup_change_description) - menu.popup(None,None,None,event.button,event.time) - - def popup_view_photo(self, obj): - """Open this picture in a picture viewer""" - photo = obj.get_data('o') - Utils.view_photo(self.db.get_object_from_handle(photo.get_reference_handle())) - - def popup_edit_photo(self, obj): - """Open this picture in a picture editor""" - photo = obj.get_data('o') - if os.fork() == 0: - obj = self.db.get_object_from_handle(photo.get_reference_handle()) - os.execvp(const.editor,[const.editor, obj.get_path()]) - - def popup_change_description(self, obj): - """Bring up a window allowing the user to edit the description - of a picture.""" - photo = obj.get_data('o') - LocalMediaProperties(photo,self.path,self) - - #------------------------------------------------------------------------- # # LocalMediaProperties @@ -930,473 +340,6 @@ class LocalMediaProperties: PluginMgr.get_image_attributes(), self.attr_callback) -#------------------------------------------------------------------------- -# -# GlobalMediaProperties -# -#------------------------------------------------------------------------- -class GlobalMediaProperties(DisplayState.ManagedWindow): - - def __init__(self,state,uistate,track,obj): - #self.parent = parent - self.dp = DateHandler.parser - self.dd = DateHandler.displayer - - win_menu_label = _("Media Properties") - - if obj: - ## if self.parent.parent.child_windows.has_key(obj.get_handle()): -## self.parent.parent.child_windows[obj.get_handle()].present(None) -## return -## else: - self.win_key = obj.get_handle() - else: - self.win_key = self - - DisplayState.ManagedWindow.__init__( - self, uistate, [], self.win_key, win_menu_label, _('Media Properties')) - - if self.already_exist: - return - - self.state = state - self.uistate = uistate - - self.pdmap = {} - self.child_windows = {} - self.obj = obj - self.lists_changed = 0 - self.db = self.state.db - self.idle = None - if obj: - self.date_object = RelLib.Date(self.obj.get_date_object()) - self.alist = self.obj.get_attribute_list()[:] - self.refs = 0 - else: - self.date_object = RelLib.Date() - self.alist = [] - self.refs = 1 - - self.refmodel = None # this becomes the model for the references - - self.path = self.db.get_save_path() - self.change_dialog = gtk.glade.XML(const.gladeFile, - "change_global","gramps") - self.gladeif = GladeIf(self.change_dialog) - - mode = not self.db.readonly - - title = _('Media Properties Editor') - - self.window = self.change_dialog.get_widget('change_global') - self.date_entry = self.change_dialog.get_widget('date') - self.date_entry.set_editable(mode) - - if self.obj: - self.date_entry.set_text(self.dd.display(self.date_object)) - - Utils.set_titles(self.window, - self.change_dialog.get_widget('title'),title) - - self.descr_window = self.change_dialog.get_widget("description") - self.descr_window.set_editable(mode) - - self.notes = self.change_dialog.get_widget("notes") - self.notes.set_editable(mode) - self.spell = Spell.Spell(self.notes) - - self.date_edit = self.change_dialog.get_widget("date_edit") - self.date_edit.set_sensitive(mode) - - self.date_check = DateEdit.DateEdit( - self.date_object, self.date_entry, - self.date_edit, self.window) - - self.pixmap = self.change_dialog.get_widget("pixmap") - self.attr_type = self.change_dialog.get_widget("attr_type") - self.attr_value = self.change_dialog.get_widget("attr_value") - self.attr_details = self.change_dialog.get_widget("attr_details") - - self.attr_list = self.change_dialog.get_widget("attr_list") - - self.attr_label = self.change_dialog.get_widget("attrGlobal") - self.notes_label = self.change_dialog.get_widget("notesGlobal") - self.refs_label = self.change_dialog.get_widget("refsGlobal") - self.flowed = self.change_dialog.get_widget("global_flowed") - self.flowed.set_sensitive(mode) - self.preform = self.change_dialog.get_widget("global_preform") - self.preform.set_sensitive(mode) - - titles = [(_('Attribute'),0,150),(_('Value'),1,100)] - - self.atree = ListModel.ListModel(self.attr_list,titles, - self.on_attr_list_select_row, - self.on_update_attr_clicked) - - self.slist = self.change_dialog.get_widget("src_list") - self.sources_label = self.change_dialog.get_widget("sourcesGlobal") - if self.obj: - self.srcreflist = [RelLib.SourceRef(ref) - for ref in self.obj.get_source_references()] - else: - self.srcreflist = [] - - self.sourcetab = Sources.SourceTab( - self.srcreflist,self, - self.change_dialog, - self.window, self.slist, - self.change_dialog.get_widget('gl_add_src'), - self.change_dialog.get_widget('gl_edit_src'), - self.change_dialog.get_widget('gl_del_src')) - - self.descr_window.set_text(self.obj.get_description()) - mtype = self.obj.get_mime_type() - if mtype: - pb = ImgManip.get_thumbnail_image(self.obj.get_path(),mtype) - self.pixmap.set_from_pixbuf(pb) - descr = GrampsMime.get_description(mtype) - if descr: - self.change_dialog.get_widget("type").set_text(descr) - else: - self.change_dialog.get_widget("type").set_text(_('Note')) - self.pixmap.hide() - - self.change_dialog.get_widget("gid").set_text(self.obj.get_gramps_id()) - - self.update_info() - - if self.obj.get_note(): - self.notes.get_buffer().set_text(self.obj.get_note()) - Utils.bold_label(self.notes_label) - if self.obj.get_note_format() == 1: - self.preform.set_active(1) - else: - self.flowed.set_active(1) - - self.gladeif.connect('change_global','delete_event', - self.on_delete_event) - self.gladeif.connect('button91','clicked',self.close) - self.gladeif.connect('ok','clicked',self.on_ok_clicked) - self.gladeif.connect('button102','clicked',self.on_help_clicked) - self.gladeif.connect('notebook2','switch_page', - self.on_notebook_switch_page) - self.gladeif.connect('add_attr','clicked',self.on_add_attr_clicked) - self.gladeif.connect('button101','clicked',self.on_update_attr_clicked) - self.gladeif.connect('del_attr','clicked',self.on_delete_attr_clicked) - - for name in ['gl_del_src','gl_add_src','add_attr','del_attr','ok']: - self.change_dialog.get_widget(name).set_sensitive(mode) - - self.redraw_attr_list() - #if parent_window: - # self.window.set_transient_for(parent_window) - #self.add_itself_to_menu() - self.window.show() - if not self.refs: - Utils.temp_label(self.refs_label,self.window) - self.cursor_type = None - self.idle = gobject.idle_add(self.display_refs) - - def on_delete_event(self,obj,b): - #self.close_child_windows() - #self.remove_itself_from_menu() - gc.collect() - - def close(self,obj): - #self.close_child_windows() - #self.remove_itself_from_menu() - self.window.destroy() - if self.idle != None: - gobject.source_remove(self.idle) - gc.collect() - -## def close_child_windows(self): -## for child_window in self.child_windows.values(): -## child_window.close(None) -## self.child_windows = {} - -## def add_itself_to_menu(self): -## self.parent.parent.child_windows[self.win_key] = self -## label = _('Media Object') -## self.parent_menu_item = gtk.MenuItem(label) -## self.parent_menu_item.set_submenu(gtk.Menu()) -## self.parent_menu_item.show() -## self.parent.parent.winsmenu.append(self.parent_menu_item) -## self.winsmenu = self.parent_menu_item.get_submenu() -## self.menu_item = gtk.MenuItem(_('Properties Editor')) -## self.menu_item.connect("activate",self.present) -## self.menu_item.show() -## self.winsmenu.append(self.menu_item) - -## def remove_itself_from_menu(self): -## del self.parent.parent.child_windows[self.win_key] -## self.menu_item.destroy() -## self.winsmenu.destroy() -## self.parent_menu_item.destroy() - - def present(self,obj): - self.window.present() - - def on_up_clicked(self,obj): - store,node = self.atree.get_selected() - if node: - row = self.atree.get_row(node) - if row != 0: - self.atree.select_row(row-1) - - def on_down_clicked(self,obj): - model,node = self.atree.get_selected() - if not node: - return - row = self.atree.get_row(node) - self.atree.select_row(row+1) - - def update_info(self): - fname = self.obj.get_path() - self.change_dialog.get_widget("path").set_text(fname) - - def redraw_attr_list(self): - self.atree.clear() - self.amap = {} - for attr in self.alist: - d = [attr.get_type(),attr.get_value()] - node = self.atree.add(d,attr) - self.amap[str(attr)] = node - if self.alist: - Utils.bold_label(self.attr_label) - else: - Utils.unbold_label(self.attr_label) - - def button_press(self,obj): - data = self.refmodel.get_selected_objects() - if not data: - return - (data_type,handle) = data[0] - if data_type == 0: - import EditPerson - person = self.db.get_person_from_handle(handle) - EditPerson.EditPerson(self.parent.parent,person,self.db) - elif data_type == 1: - import Marriage - family = self.db.get_family_from_handle(handle) - Marriage.Marriage(self.parent.parent,family,self.db) - elif data_type == 2: - import EventEdit - event = self.db.get_event_from_handle(handle) - event_name = event.get_name() - if const.family_events.has_key(event_name): - EventEdit.FamilyEventEditor( - self,", ", event, None, 0, None, None, self.db.readonly) - elif const.personal_events.has_key(event_name): - EventEdit.PersonEventEditor( - self,", ", event, None, 0, None, None, self.db.readonly) - elif event_name in ["Birth","Death"]: - EventEdit.PersonEventEditor( - self,", ", event, None, 1, None, None, self.db.readonly) - elif data_type == 3: - import EditPlace - place = self.db.get_place_from_handle(handle) - EditPlace.EditPlace(self.parent.parent,place) - elif data_type == 4: - source = self.db.get_source_from_handle(handle) - import EditSource - EditSource.EditSource(source,self.db,self.parent.parent, - None,self.db.readonly) - - def display_refs(self): - - self.refs = 1 # not sure what this does - - if not self.refmodel: - self.any_refs = False - media_handle = self.obj.get_handle() - - titles = [(_('Type'),0,150),(_('ID'),1,75),(_('Name'),2,150)] - self.refmodel = ListModel.ListModel( - self.change_dialog.get_widget("refinfo"), - titles, - event_func=self.button_press) - - self.backlink_generator = self.db.find_backlink_handles(media_handle) - - - while True: # The loop is broken when the backlink_generator finishes - - try: - reference = self.backlink_generator.next() - except StopIteration: - # Last reference reached. - break - - # If we make it here then there is at least one reference - self.any_refs = True - - cls_name,handle = reference - - if cls_name == 'Person': - person = self.db.get_person_from_handle(handle) - name = NameDisplay.displayer.display(person) - gramps_id = person.get_gramps_id() - self.refmodel.add([_("Person"),gramps_id,name], - (0,handle)) - self.model.add([_("Person"),gramps_id,name],(0,handle)) - - elif cls_name == 'Event': - event = self.db.get_event_from_handle(handle) - name = event.get_name() - gramps_id = event.get_gramps_id() - self.refmodel.add([_("Event"),gramps_id,name], - (2,handle)) - - elif cls_name == 'Family': - family = self.db.get_family_from_handle(handle) - name = Utils.family_name(family,self.db) - gramps_id = family.get_gramps_id() - self.refmodel.add([_("Family"),gramps_id,name], - (1,handle)) - - elif cls_name == 'Place': - place = self.db.get_place_from_handle(handle) - name = place.get_title() - gramps_id = place.get_gramps_id() - self.refmodel.add([_("Place"),gramps_id,name], - (3,handle)) - - elif cls_name == 'Source': - source = self.db.get_source_from_handle(handle) - name = source.get_title() - gramps_id = source.get_gramps_id() - self.refmodel.add([_("Source"),gramps_id,name], - (4,handle)) - - elif cls_name == 'Media': - obj = self.db.get_object_from_handle(handle) - name = obj.get_description() - gramps_id = obj.get_gramps_id() - self.refmodel.add([_("Media"),gramps_id,name], - (5,handle)) - - else: - # If we get here it means there is a new Primary object type - # that has been added to the database. Print a warning - # to remind us that this code need updating. - log("WARNING: Unhandled Primary object type returned from " - "find_backlink_handles()\n") - - if gtk.events_pending(): - return True - - if self.any_refs: - Utils.bold_label(self.refs_label,self.window) - else: - Utils.unbold_label(self.refs_label,self.window) - - self.ref_not_loaded = 0 - self.backlink_generator = None - - return False - - - def on_notebook_switch_page(self,obj,junk,page): - if page == 3 and not self.refs: - Utils.temp_label(self.refs_label,self.window) - self.idle = gobject.idle_add(self.display_refs) - t = self.notes.get_buffer() - text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False)) - if text: - Utils.bold_label(self.notes_label) - else: - Utils.unbold_label(self.notes_label) - - def get_place(self,field,makenew=0): - text = unicode(field.get_text().strip()) - if text: - if self.pdmap.has_key(text): - return self.pdmap[text] - elif makenew: - place = RelLib.Place() - place.set_title(text) - trans = self.db.transaction_begin() - self.db.add_place(place,trans) - self.db.transaction_commit(trans,_('Add Place (%s)' % text)) - self.pdmap[text] = place.get_handle() - return place.get_handle() - else: - return None - else: - return None - - def on_apply_clicked(self, obj): - t = self.notes.get_buffer() - text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False)) - desc = unicode(self.descr_window.get_text()) - note = self.obj.get_note() - path = self.change_dialog.get_widget('path').get_text() - if path != self.obj.get_path(): - mime = GrampsMime.get_type(path) - self.obj.set_mime_type(mime) - self.obj.set_path(path) - - if not self.date_object.is_equal(self.obj.get_date_object()): - self.obj.set_date_object(self.date_object) - - format = self.preform.get_active() - if text != note or desc != self.obj.get_description(): - self.obj.set_note(text) - self.obj.set_description(desc) - if format != self.obj.get_note_format(): - self.obj.set_note_format(format) - if self.lists_changed: - self.obj.set_attribute_list(self.alist) - self.obj.set_source_reference_list(self.srcreflist) - trans = self.db.transaction_begin() - self.db.commit_media_object(self.obj,trans) - self.db.transaction_commit(trans,_("Edit Media Object")) - - def on_help_clicked(self, obj): - """Display the relevant portion of GRAMPS manual""" - GrampsDisplay.help('adv-media') - - def on_ok_clicked(self, obj): - self.on_apply_clicked(obj) - self.close(obj) - - def on_attr_list_select_row(self,obj): - store,node = self.atree.get_selected() - if node: - attr = self.atree.get_object(node) - - self.attr_type.set_label(attr.get_type()) - self.attr_value.set_text(attr.get_value()) - else: - self.attr_type.set_label('') - self.attr_value.set_text('') - - def attr_callback(self,attr): - self.redraw_attr_list() - self.atree.select_iter(self.amap[str(attr)]) - - def on_update_attr_clicked(self,obj): - import AttrEdit - - store,node = self.atree.get_selected() - if node: - attr = self.atree.get_object(node) - AttrEdit.AttributeEditor(self,attr,"Media Object", - PluginMgr.get_image_attributes(), - self.attr_callback) - - def on_delete_attr_clicked(self,obj): - if Utils.delete_selected(obj,self.alist): - self.lists_changed = 1 - self.redraw_attr_list() - - def on_add_attr_clicked(self,obj): - import AttrEdit - AttrEdit.AttributeEditor(self,None,"Media Object", - PluginMgr.get_image_attributes(), - self.attr_callback) - class DeleteMediaQuery: def __init__(self,media_handle,db,the_lists): diff --git a/gramps2/src/Sources.py b/gramps2/src/Sources.py index 1ed01ba77..ed11f4c65 100644 --- a/gramps2/src/Sources.py +++ b/gramps2/src/Sources.py @@ -36,7 +36,6 @@ import gc import gtk import gtk.glade from gtk.gdk import ACTION_COPY, BUTTON1_MASK, INTERP_BILINEAR, pixbuf_new_from_file -from gobject import TYPE_PYOBJECT import cPickle as pickle #------------------------------------------------------------------------- @@ -217,7 +216,7 @@ class SourceTab: self.window = window self.slist = clist self.selection = clist.get_selection() - self.model = gtk.ListStore(str,str,TYPE_PYOBJECT) + self.model = gtk.ListStore(str,str,object) self.readonly = readonly add_btn.set_sensitive(not readonly) diff --git a/gramps2/src/Utils.py b/gramps2/src/Utils.py index dc01a9045..1684bcd1e 100644 --- a/gramps2/src/Utils.py +++ b/gramps2/src/Utils.py @@ -1118,6 +1118,23 @@ def get_type_converter_by_name(val_str): return unicode return unicode +def relative_path(original, base): + if not os.path.exists(original) or not os.path.isdir(base): + return original + + base_list = (os.path.abspath(base)).split(os.sep) + target_list = (os.path.abspath(original)).split(os.sep) + + # Starting from the filepath root, work out how much of the filepath is + # shared by base and target. + + for i in range(min(len(base_list), len(target_list))): + if base_list[i] <> target_list[i]: break + else: + i+=1 + rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] + return os.path.join(*rel_list) + class ProgressMeter: """ Progress meter class for GRAMPS. diff --git a/gramps2/src/ViewManager.py b/gramps2/src/ViewManager.py index 5ed759970..46036cf59 100644 --- a/gramps2/src/ViewManager.py +++ b/gramps2/src/ViewManager.py @@ -715,6 +715,11 @@ class ViewManager: _('You do not have write access ' 'to the selected file.')) + try: + os.chdir(os.path.dirname(filename)) + except: + print "could not change directory" + try: if self.load_database(filename,callback,mode=mode): if filename[-1] == '/': diff --git a/gramps2/src/edit_person.glade b/gramps2/src/edit_person.glade index 3e2286a63..3708665eb 100644 --- a/gramps2/src/edit_person.glade +++ b/gramps2/src/edit_person.glade @@ -9,7 +9,7 @@ GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False - 600 + 500 True False gramps.png diff --git a/gramps2/src/gramps.glade b/gramps2/src/gramps.glade index bbf69456d..cebce2d55 100644 --- a/gramps2/src/gramps.glade +++ b/gramps2/src/gramps.glade @@ -1353,7 +1353,7 @@ True True - False + True True 0 @@ -9668,7 +9668,7 @@ Very High 6 True - 2 + 3 2 False 6 @@ -9736,6 +9736,28 @@ Very High False True + + 1 + 2 + 2 + 3 + fill + + + + + + + True + True + Convert to a relative path + True + GTK_RELIEF_NORMAL + True + False + False + True + 1 2 @@ -14216,6 +14238,7 @@ Very High GTK_WIN_POS_NONE False 600 + 450 True False gramps.png @@ -14293,7 +14316,7 @@ Very High - + True False 0 @@ -14735,427 +14758,7 @@ Very High 0 - True - True - - - - - - True - True - True - True - GTK_POS_TOP - False - False - - - - - True - False - 0 - - - - 6 - True - False - 6 - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - edit_sm.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-remove - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_SPREAD - 30 - - - 0 - False - True - - - - - False - True - - - - - - True - False - 0 - - - - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Sources - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - - - - - - True - False - 0 - - - - 350 - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - True - True - - - - - - 12 - True - 2 - 3 - False - 12 - 24 - - - - True - <b>Format</b> - True - True - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 3 - 0 - 1 - fill - - - - - - - True - Multiple spaces, tabs, and single line breaks are replaced with single spaces. Two consecutive line breaks mark a new paragraph. - True - _Flowed - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 1 - 2 - 1 - 2 - - - - - - - - True - Formatting is preserved, except for the leading whitespace. Multiple spaces, tabs, and all line breaks are respected. - True - _Preformatted - True - GTK_RELIEF_NORMAL - True - False - False - True - addr_flowed - - - 2 - 3 - 1 - 2 - - - - - - - 0 - True - True - - - - - False - True - - - - - - True - False - 0 - - - - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Note - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - - - - - 0 - True + False True