From fe8b4e18390494a8e6616b9e6e6a046fd13e1443 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Sun, 24 Sep 2006 04:37:59 +0000 Subject: [PATCH] 2006-09-23 Don Allingham * src/images/sources.svg: new icon * src/images/reports.svg: new icon * src/images/tools.svg: new icon * src/images/events.svg: new icon * src/images/place.svg: new icon * src/images/tools.svg: new icon * src/ViewManager.py: use new icons * src/gramps_main.py: register new icons 2006-09-22 Don Allingham * src/GrampsDb/_GrampsGEDDB.py: support for disabling transactions * src/GrampsDb/_GrampsXMLDB.py: support for disabling transactions * src/GrampsDb/_GrampsBSDDB.py: support for disabling transactions * src/GrampsDb/_GrampsDbBase.py: support for disabling transactions * src/GrampsDb/_ReadGedcom.py: check for IO Eror * src/ViewManager.py: display message if a portability problem is detected * src/QuestionDialog.py: Add Warning dialog that can be disabled * src/DbLoader.py: Detect missing database problem * src/ArgHandler.py: support for disabling transactions * src/GrampsCfg.py: new config keys for transactions * src/Config/_GrampsConfigKeys.py: new config keys for transactions 2006-09-17 Don Allingham * src/ViewManager.py: handle missing database on autoload (#447) * src/ArgHandler.py: handle missing database on autoload (#447) * src/DbLoader.py: handle missing database on autoload (#447) * src/Makefile.am: remove uninstalled packages from makefile * src/GrampsDb/_ReadXML.py: place vs. address changes * src/GrampsDb/_WriteXML.py: place vs. address changes * src/GrampsDb/_EditPlace.py: place vs. address changes * src/Editors/_EditPlace.py: place vs. address changes * src/Editors/_EditLocation.py: place vs. address changes * src/RelLib/_Address.py: place vs. address changes * src/RelLib/_LocationBase.py: place vs. address changes * src/RelLib/_Location.py: place vs. address changes * src/DisplayTabs/_LocationModel.py: place vs. address changes * src/DisplayTabs/_LocationEmbedList.py: place vs. address changes * src/glade/gramps.glade: place vs. address changes svn: r7325 --- ChangeLog | 41 + configure.in | 3 - data/gramps.schemas.in | 24 + src/ArgHandler.py | 6 +- src/Config/_GrampsConfigKeys.py | 4 + src/DbLoader.py | 44 +- src/DisplayTabs/_LocationEmbedList.py | 6 +- src/DisplayTabs/_LocationModel.py | 2 +- src/Editors/_EditFamily.py | 16 +- src/Editors/_EditLocation.py | 6 + src/Editors/_EditPerson.py | 1 - src/Editors/_EditPlace.py | 4 + src/GrampsCfg.py | 2 + src/GrampsDb/_GrampsBSDDB.py | 108 ++- src/GrampsDb/_GrampsDbBase.py | 1 - src/GrampsDb/_GrampsGEDDB.py | 2 +- src/GrampsDb/_GrampsXMLDB.py | 14 +- src/GrampsDb/_ReadGedcom.py | 5 +- src/GrampsDb/_ReadXML.py | 3 +- src/GrampsDb/_WriteXML.py | 10 +- src/Makefile.am | 3 - src/QuestionDialog.py | 37 +- src/RelLib/_Address.py | 33 +- src/RelLib/_Location.py | 10 +- src/RelLib/_LocationBase.py | 18 +- src/ViewManager.py | 57 +- src/glade/gramps.glade | 1122 +++++++++++++------------ src/gramps_main.py | 16 +- src/images/Makefile.am | 14 +- src/images/events.png | Bin 2786 -> 0 bytes src/images/events.svg | 267 ++++++ src/images/place.svg | 980 +++++++++++++++++++++ src/images/relation.png | Bin 3533 -> 0 bytes src/images/reports.svg | 506 +++++++++++ src/images/sources.png | Bin 3290 -> 0 bytes src/images/sources.svg | 292 +++++++ src/images/tools.png | Bin 1132 -> 0 bytes src/images/tools.svg | 520 ++++++++++++ src/plugins/EventCmp.py | 2 +- 39 files changed, 3539 insertions(+), 640 deletions(-) delete mode 100644 src/images/events.png create mode 100644 src/images/events.svg create mode 100644 src/images/place.svg delete mode 100644 src/images/relation.png create mode 100644 src/images/reports.svg delete mode 100644 src/images/sources.png create mode 100644 src/images/sources.svg delete mode 100644 src/images/tools.png create mode 100644 src/images/tools.svg diff --git a/ChangeLog b/ChangeLog index 0119b75cd..a703572ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,44 @@ +2006-09-23 Don Allingham + * src/images/sources.svg: new icon + * src/images/reports.svg: new icon + * src/images/tools.svg: new icon + * src/images/events.svg: new icon + * src/images/place.svg: new icon + * src/images/tools.svg: new icon + * src/ViewManager.py: use new icons + * src/gramps_main.py: register new icons + +2006-09-22 Don Allingham + * src/GrampsDb/_GrampsGEDDB.py: support for disabling transactions + * src/GrampsDb/_GrampsXMLDB.py: support for disabling transactions + * src/GrampsDb/_GrampsBSDDB.py: support for disabling transactions + * src/GrampsDb/_GrampsDbBase.py: support for disabling transactions + * src/GrampsDb/_ReadGedcom.py: check for IO Eror + * src/ViewManager.py: display message if a portability problem is + detected + * src/QuestionDialog.py: Add Warning dialog that can be disabled + * src/DbLoader.py: Detect missing database problem + * src/ArgHandler.py: support for disabling transactions + * src/GrampsCfg.py: new config keys for transactions + * src/Config/_GrampsConfigKeys.py: new config keys for transactions + +2006-09-17 Don Allingham + * src/ViewManager.py: handle missing database on autoload (#447) + * src/ArgHandler.py: handle missing database on autoload (#447) + * src/DbLoader.py: handle missing database on autoload (#447) + * src/Makefile.am: remove uninstalled packages from makefile + * src/GrampsDb/_ReadXML.py: place vs. address changes + * src/GrampsDb/_WriteXML.py: place vs. address changes + * src/GrampsDb/_EditPlace.py: place vs. address changes + * src/Editors/_EditPlace.py: place vs. address changes + * src/Editors/_EditLocation.py: place vs. address changes + * src/RelLib/_Address.py: place vs. address changes + * src/RelLib/_LocationBase.py: place vs. address changes + * src/RelLib/_Location.py: place vs. address changes + * src/DisplayTabs/_LocationModel.py: place vs. address changes + * src/DisplayTabs/_LocationEmbedList.py: place vs. address changes + * src/glade/gramps.glade: place vs. address changes + 2006-09-16 Brian Matherly * src/plugins/Checkpoint.py: typo diff --git a/configure.in b/configure.in index f30fde928..78acb7427 100644 --- a/configure.in +++ b/configure.in @@ -205,14 +205,11 @@ src/FilterEditor/Makefile src/Mime/Makefile src/DisplayTabs/Makefile src/DisplayModels/Makefile -src/ObjectSelector/Makefile src/Selectors/Makefile src/GrampsLogger/Makefile -src/TreeViews/Makefile src/GrampsDb/Makefile src/Merge/Makefile src/docgen/Makefile -src/Models/Makefile src/Editors/Makefile src/Filters/Makefile src/Filters/Rules/Makefile diff --git a/data/gramps.schemas.in b/data/gramps.schemas.in index c2538aedc..220dea372 100644 --- a/data/gramps.schemas.in +++ b/data/gramps.schemas.in @@ -672,5 +672,29 @@ + + /schemas/apps/gramps/behavior/port-warn + /apps/gramps/behavior/port-warn + gramps + bool + 1 + + Enables the display of portability warning + Enables the display of portability warning. + + + + + /schemas/apps/gramps/behavior/transactions + /apps/gramps/behavior/transactions + gramps + bool + 1 + + Enables the use of transactions + Enables the use of transactions, which increase data security and improve speed. + + + diff --git a/src/ArgHandler.py b/src/ArgHandler.py index af54b2f2a..92a61b974 100644 --- a/src/ArgHandler.py +++ b/src/ArgHandler.py @@ -427,8 +427,6 @@ class ArgHandler: print "Exiting." os._exit(0) -## if self.imports: -## self.parent.import_tool_callback() elif Config.get(Config.RECENT_FILE) and Config.get(Config.AUTOLOAD): rf = Config.get(Config.RECENT_FILE) filetype = Mime.get_type(rf) @@ -745,7 +743,9 @@ class NewNativeDbPrompter: if os.path.splitext(filename)[1] != ".grdb": filename = filename + ".grdb" choose.destroy() - self.state.db = GrampsDb.gramps_db_factory(const.app_gramps)() + print Config.TRANSACTIONS + self.state.db = GrampsDb.gramps_db_factory(const.app_gramps)( + Config.TRANSACTIONS) self.vm.read_file(filename) self.state.signal_change() self.change_page(None, None) diff --git a/src/Config/_GrampsConfigKeys.py b/src/Config/_GrampsConfigKeys.py index bf59d37eb..c7cac6eda 100644 --- a/src/Config/_GrampsConfigKeys.py +++ b/src/Config/_GrampsConfigKeys.py @@ -28,6 +28,7 @@ COMPLETE_COLOR = ('preferences','complete-color', 2) TODO_COLOR = ('preferences','todo-color', 2) CUSTOM_MARKER_COLOR = ('preferences','custom-marker-color', 2) FAMILY_WARN = ('preferences','family-warn', 0) +PORT_WARN = ('preferences','port-warn', 0) HIDE_EP_MSG = ('preferences','hide-ep-msg', 0) LAST_VIEW = ('preferences','last-view', 1) FAMILY_SIBLINGS = ('preferences','family-siblings', 0) @@ -35,6 +36,7 @@ AUTOLOAD = ('behavior','autoload', 0) SPELLCHECK = ('behavior','spellcheck', 0) BETAWARN = ('behavior','betawarn', 0) WELCOME = ('behavior','welcome', 1) +TRANSACTIONS = ('behavior','transactions', 1) DATE_FORMAT = ('preferences','date-format', 1) DONT_ASK = ('interface','dont-ask', 0) HEIGHT = ('interface','height', 1) @@ -84,6 +86,7 @@ default_value = { TODO_COLOR : '#ff0000', CUSTOM_MARKER_COLOR : '#8b008b', FAMILY_WARN : True, + PORT_WARN : True, HIDE_EP_MSG : False, LAST_VIEW : 0, FAMILY_SIBLINGS : True, @@ -91,6 +94,7 @@ default_value = { SPELLCHECK : False, BETAWARN : False, WELCOME : 100, + TRANSACTIONS : True, DATE_FORMAT : 0, DONT_ASK : False, HEIGHT : 500, diff --git a/src/DbLoader.py b/src/DbLoader.py index 19f879c0f..52f4c58d7 100644 --- a/src/DbLoader.py +++ b/src/DbLoader.py @@ -150,19 +150,31 @@ class DbLoader: filename = choose.get_filename() if self.check_errors(filename): return ('','') - if os.path.splitext(filename)[1] != ".grdb": + + ext = os.path.splitext(filename)[1].lower() + if ext == ".ged": + filetype = const.app_gedcom + elif ext == ".gramps": + filetype = const.app_gramps_xml + elif ext == ".grdb": + filetype = const.app_gramps + else: filename = filename + ".grdb" + filetype = const.app_gramps + choose.destroy() try: self.dbstate.db.close() except: pass - filetype = const.app_gramps + self.read_file(filename,filetype) + try: os.chdir(os.path.dirname(filename)) except: return ('','') + self.dbstate.db.db_is_open = True return (filename,filetype) else: choose.destroy() @@ -377,16 +389,27 @@ class DbLoader: should enable signals, as well as finish up with other UI goodies. """ - if os.path.exists(filename) and (not os.access(filename, os.W_OK)): - mode = "r" - QuestionDialog.WarningDialog(_('Read only database'), - _('You do not have write access ' - 'to the selected file.')) + if os.path.exists(filename): + if not os.access(filename, os.W_OK): + mode = "r" + QuestionDialog.WarningDialog(_('Read only database'), + _('You do not have write access ' + 'to the selected file.')) + else: + mode = "w" + elif filetype == 'unknown': + QuestionDialog.WarningDialog( + _('Missing or Invalid database'), + _('%s could not be found.\n' + 'It is possible that this file no longer exists ' + 'or has been moved.') % filename) + return False else: - mode = "w" + mode = 'w' dbclass = GrampsDb.gramps_db_factory(db_type = filetype) - self.dbstate.change_database(dbclass()) + + self.dbstate.change_database(dbclass(Config.get(Config.TRANSACTIONS))) self.dbstate.db.disable_signals() self.uistate.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) @@ -394,6 +417,7 @@ class DbLoader: try: self.dbstate.db.load(filename,self.uistate.pulse_progressbar,mode) + self.dbstate.db.set_save_path(filename) try: os.chdir(os.path.dirname(filename)) except: @@ -405,6 +429,8 @@ class DbLoader: except Exception: log.error("Failed to open database.", exc_info=True) + return True + def open_saved_as(self, filename, filetype): dbclass = GrampsDb.gramps_db_factory(db_type = filetype) new_database = dbclass() diff --git a/src/DisplayTabs/_LocationEmbedList.py b/src/DisplayTabs/_LocationEmbedList.py index 24e723a7d..711b0b5ee 100644 --- a/src/DisplayTabs/_LocationEmbedList.py +++ b/src/DisplayTabs/_LocationEmbedList.py @@ -49,9 +49,9 @@ class LocationEmbedList(EmbeddedList): _DND_TYPE = DdTargets.LOCATION _column_names = [ - (_('City'), 0, 150), - (_('County'), 1, 100), - (_('Church Parish'), 2, 100), + (_('Street'), 0, 150), + (_('City'), 1, 100), + (_('County'), 2, 100), (_('State/Province'), 3, 100), (_('Country'), 4, 75), ] diff --git a/src/DisplayTabs/_LocationModel.py b/src/DisplayTabs/_LocationModel.py index df7132083..bbbe32ecd 100644 --- a/src/DisplayTabs/_LocationModel.py +++ b/src/DisplayTabs/_LocationModel.py @@ -45,5 +45,5 @@ class LocationModel(gtk.ListStore): gtk.ListStore.__init__(self, str, str, str, str, str, object) self.db = db for obj in obj_list: - self.append(row=[obj.city, obj.county, obj.parish, + self.append(row=[obj.street, obj.city, obj.county, obj.state, obj.country, obj, ]) diff --git a/src/Editors/_EditFamily.py b/src/Editors/_EditFamily.py index 5cfd75989..e4cd83e8d 100644 --- a/src/Editors/_EditFamily.py +++ b/src/Editors/_EditFamily.py @@ -382,12 +382,16 @@ class EditFamily(EditPrimary): for i in self.hidden: i.set_sensitive(False) - glade = gtk.glade.XML(const.gladeFile,'family_warn') - dialog = glade.get_widget('family_warn') - dialog.run() - if glade.get_widget('dont_show').get_active(): - Config.set(Config.FAMILY_WARN,True) - dialog.destroy() + import QuestionDialog + QuestionDialog.MessageHideDialog( + _("Adding parents to a person"), + _("It is possible to accidentally create multiple " + "families with the same parents. To help avoid " + "this problem, only the buttons to select parents " + "are available when you create a new family. The " + "remaining fields will become available after you " + "attempt to select a parent."), + Config.FAMILY_WARN) else: self.add_parent = False diff --git a/src/Editors/_EditLocation.py b/src/Editors/_EditLocation.py index 239e72b91..519d28e93 100644 --- a/src/Editors/_EditLocation.py +++ b/src/Editors/_EditLocation.py @@ -56,6 +56,12 @@ class EditLocation(EditSecondary): _('Location Editor')) def _setup_fields(self): + self.city = MonitoredEntry( + self.top.get_widget("street"), + self.obj.set_street, + self.obj.get_street, + self.db.readonly) + self.city = MonitoredEntry( self.top.get_widget("city"), self.obj.set_city, diff --git a/src/Editors/_EditPerson.py b/src/Editors/_EditPerson.py index 0accf40d2..55c5648ed 100644 --- a/src/Editors/_EditPerson.py +++ b/src/Editors/_EditPerson.py @@ -94,7 +94,6 @@ class EditPerson(EditPrimary): """ Creates an EditPerson window. Associates a person with the window. """ - EditPrimary.__init__(self, state, uistate, track, person, state.db.get_person_from_handle, callback) diff --git a/src/Editors/_EditPlace.py b/src/Editors/_EditPlace.py index b16c22b53..b5753481b 100644 --- a/src/Editors/_EditPlace.py +++ b/src/Editors/_EditPlace.py @@ -83,6 +83,10 @@ class EditPlace(EditPrimary): self.obj.set_title, self.obj.get_title, self.db.readonly) + self.city = MonitoredEntry( + self.top.get_widget("street"), + mloc.set_street, mloc.get_street, self.db.readonly) + self.city = MonitoredEntry( self.top.get_widget("city"), mloc.set_city, mloc.get_city, self.db.readonly) diff --git a/src/GrampsCfg.py b/src/GrampsCfg.py index ff1164cd1..6aef09351 100644 --- a/src/GrampsCfg.py +++ b/src/GrampsCfg.py @@ -493,6 +493,8 @@ class GrampsPreferences(ManagedWindow.ManagedWindow): 4, Config.ONLINE_MAPS) self.add_checkbox(table, _('Use shading in Relationship View'), 5, Config.RELATION_SHADE) + self.add_checkbox(table, _('Enable database transactions'), + 6, Config.TRANSACTIONS) return table diff --git a/src/GrampsDb/_GrampsBSDDB.py b/src/GrampsDb/_GrampsBSDDB.py index 43dd9587d..3b2da5003 100644 --- a/src/GrampsDb/_GrampsBSDDB.py +++ b/src/GrampsDb/_GrampsBSDDB.py @@ -59,7 +59,7 @@ import Errors from BasicUtils import UpdateCallback _MINVERSION = 5 -_DBVERSION = 10 +_DBVERSION = 11 def find_surname(key,data): return str(data[3][5]) @@ -143,13 +143,13 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): """GRAMPS database object. This object is a base class for other objects.""" - UseTXN = True - - def __init__(self): + def __init__(self, use_txn = True): """creates a new GrampsDB""" + GrampsDbBase.__init__(self) self.txn = None self.secondary_connected = False + self.UseTXN = use_txn def open_flags(self): if self.UseTXN: @@ -369,7 +369,7 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): # it makes no sense to go further if not self.version_supported: self._close_early() - + self.family_map = self.open_table(self.full_name, "family") self.place_map = self.open_table(self.full_name, "places") self.source_map = self.open_table(self.full_name, "sources") @@ -411,6 +411,7 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): # If secondary indices change, then they should removed # or rebuilt by upgrade as well. In any case, the # self.secondary_connected flag should be set accordingly. + if self.need_upgrade(): self.gramps_upgrade(callback) @@ -1011,9 +1012,7 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): try: self.env.lsn_reset(self.full_name) except AttributeError: - print "Your grdb database is not portable!" - print "It will not work if you move the file to another machine." - print "Export to XML for portability." + pass self.env.close() @@ -1394,6 +1393,7 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): "Sponsored", "Foster", "Unknown", "Other", ] version = self.metadata.get('version',default=_MINVERSION) + t = time.time() if version < 6: self.gramps_upgrade_6() @@ -1405,6 +1405,8 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): self.gramps_upgrade_9() elif version < 10: self.gramps_upgrade_10() + elif version < 11: + self.gramps_upgrade_11() print "Upgrade time:", int(time.time()-t), "seconds" def gramps_upgrade_6(self): @@ -2019,6 +2021,96 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): print "Done upgrading to DB version 10" + def gramps_upgrade_11(self): + print "Upgrading to DB version 11 -- this may take a while" + + table_flags = self.open_flags() + self.reference_map_primary_map = db.DB(self.env) + self.reference_map_primary_map.set_flags(db.DB_DUP) + self.reference_map_primary_map.open(self.full_name, + "reference_map_primary_map", + db.DB_BTREE, flags=table_flags) + self.reference_map.associate(self.reference_map_primary_map, + find_primary_handle, + table_flags) + + + # This upgrade adds attribute lists to Event and EventRef objects + length = len(self.person_map) + len(self.place_map) + self.set_total(length) + + # so starting (batch) transaction here. + trans = self.transaction_begin("",True) + + # Personal event references + for handle in self.person_map.keys(): + info = self.person_map[handle] + + new_address_list = [] + for addr in info[11]: + loc = ( addr[9], addr[4], u'', addr[5], addr[6], + addr[7], addr[8]) + addr = (addr[0],addr[1],addr[2],addr[3], loc) + new_address_list.append(addr) + + new_info = info[0:11] + (new_address_list,) + info[12:] + + person = Person() + person.unserialize(new_info) + + self.commit_person(person,trans) + self.update() + + # Personal event references + for handle in self.place_map.keys(): + info = self.place_map[handle] + + (h, gramps_id, title, long, lat, main_loc, alt_loc, urls, + media_list, source_list, note, change, marker, private) = info + + if main_loc: + m, p, c = main_loc + m = ((u'', m[0], c, m[1], m[2], m[3], m[4])) + + main_loc = (m, p) + + loc_list = [] + for l in alt_loc: + + m, p, c = l + m = ((u'', m[0], c, m[1], m[2], m[3], m[4])) + + l = (m, p) + loc_list.append(l) + + info = (h, gramps_id, title, long, lat, main_loc, loc_list, urls, + media_list, source_list, note, change, marker, private) + + place = Place() + place.unserialize(info) + + self.commit_place(place,trans) + self.update() + + self.reset() + + self.transaction_commit(trans,"Upgrade to DB version 10") + + self.reference_map_primary_map.close() + + if self.UseTXN: + # Separate transaction to save metadata + the_txn = self.env.txn_begin() + else: + the_txn = None + self.metadata.put('version', 11, txn=the_txn) + if self.UseTXN: + the_txn.commit() + else: + self.metadata.sync() + + print "Done upgrading to DB version 11" + class BdbTransaction(Transaction): def __init__(self,msg,db,batch=False,no_magic=False): Transaction.__init__(self,msg,db,batch,no_magic) diff --git a/src/GrampsDb/_GrampsDbBase.py b/src/GrampsDb/_GrampsDbBase.py index 704cfa38d..4a97d3366 100644 --- a/src/GrampsDb/_GrampsDbBase.py +++ b/src/GrampsDb/_GrampsDbBase.py @@ -207,7 +207,6 @@ class GrampsDbBase(GrampsDBCallback): """ GrampsDBCallback.__init__(self) - self.readonly = False self.rand = random.Random(time.time()) self.smap_index = 0 diff --git a/src/GrampsDb/_GrampsGEDDB.py b/src/GrampsDb/_GrampsGEDDB.py index ef857f70c..16480080e 100644 --- a/src/GrampsDb/_GrampsGEDDB.py +++ b/src/GrampsDb/_GrampsGEDDB.py @@ -41,7 +41,7 @@ class GrampsGEDDB(GrampsInMemDB): """GRAMPS database object. This object is a base class for other objects.""" - def __init__(self): + def __init__(self, use_txn = False): """creates a new GrampsDB""" GrampsInMemDB.__init__(self) diff --git a/src/GrampsDb/_GrampsXMLDB.py b/src/GrampsDb/_GrampsXMLDB.py index 088cffa12..a14776e8d 100644 --- a/src/GrampsDb/_GrampsXMLDB.py +++ b/src/GrampsDb/_GrampsXMLDB.py @@ -41,17 +41,21 @@ class GrampsXMLDB(GrampsInMemDB): """GRAMPS database object. This object is a base class for other objects.""" - def __init__(self): + def __init__(self, use_txn = True): """creates a new GrampsDB""" GrampsInMemDB.__init__(self) - def load(self,name,callback,mode="w"): + def load(self, name, callback, mode="w"): + if self.db_is_open: self.close() - GrampsInMemDB.load(self,name,callback,mode) + GrampsInMemDB.load(self, name, callback, mode) self.id_trans = {} - - importData(self,name,callback,use_trans=False) + + try: + importData(self, name, callback, use_trans=False) + except OSError, IOError: + return 1 self.bookmarks = self.metadata.get('bookmarks') if self.bookmarks == None: diff --git a/src/GrampsDb/_ReadGedcom.py b/src/GrampsDb/_ReadGedcom.py index 8eccf2f6d..eb8af9e60 100644 --- a/src/GrampsDb/_ReadGedcom.py +++ b/src/GrampsDb/_ReadGedcom.py @@ -192,7 +192,10 @@ intRegexp = re.compile(r"\s*INT\s+([^(]+)\((.*)\)$") #------------------------------------------------------------------------- def importData(database, filename, callback=None, use_trans=False): - f = open(filename,"r") + try: + f = open(filename,"r") + except IOError: + return ansel = False gramps = False diff --git a/src/GrampsDb/_ReadXML.py b/src/GrampsDb/_ReadXML.py index 7a5a4498d..2ce0da5ed 100644 --- a/src/GrampsDb/_ReadXML.py +++ b/src/GrampsDb/_ReadXML.py @@ -105,7 +105,7 @@ def importData(database, filename, callback=None,cl=0,use_trans=False): ro = database.readonly database.readonly = False - + if gzip_ok: use_gzip = 1 try: @@ -698,6 +698,7 @@ class GrampsParser(UpdateCallback): loc.phone = attrs.get('phone','') loc.postal = attrs.get('postal','') loc.city = attrs.get('city','') + loc.street = attrs.get('street','') loc.parish = attrs.get('parish','') loc.state = attrs.get('state','') loc.county = attrs.get('county','') diff --git a/src/GrampsDb/_WriteXML.py b/src/GrampsDb/_WriteXML.py index c65a7caf9..6559dddb4 100644 --- a/src/GrampsDb/_WriteXML.py +++ b/src/GrampsDb/_WriteXML.py @@ -812,6 +812,7 @@ class XmlWriter(UpdateCallback): def build_place_title(self,loc): "Builds a title from a location" city = self.fix(loc.get_city()) + street = self.fix(loc.get_street()) parish = self.fix(loc.get_parish()) state = self.fix(loc.get_state()) country = self.fix(loc.get_country()) @@ -819,8 +820,10 @@ class XmlWriter(UpdateCallback): value = "" + if street: + value = street if city: - value = city + value = self.append_value(value,city) if parish: value = self.append_value(value,parish) if county: @@ -842,8 +845,13 @@ class XmlWriter(UpdateCallback): county = self.fix(loc.get_county()) zip_code = self.fix(loc.get_postal_code()) phone = self.fix(loc.get_phone()) + street = self.fix(loc.get_street()) + + print "*", street self.g.write(' %s' % title) - self.format_secondary_markup(message) - - checkbox = gtk.CheckButton(_("Do not display again")) - checkbox.set_active(Config.get(key)) - checkbox.connect('toggled',self.update_checkbox, key) - checkbox.show() - - align = gtk.Alignment(0.5,0.0) - align.add(checkbox) - align.show() - self.vbox.add(align) - self.set_icon(ICON) - self.show() - self.run() - self.destroy() + if not Config.get(key): + glade_xml = gtk.glade.XML(const.gladeFile, "hide_dialog", "gramps") + top = glade_xml.get_widget('hide_dialog') + dont_show = glade_xml.get_widget('dont_show') + title_label = glade_xml.get_widget('title') + title_label.set_text( + '%s' % title) + title_label.set_use_markup(True) + + glade_xml.get_widget('message').set_text(message) + + dont_show.connect('toggled',self.update_checkbox, key) + top.run() + top.destroy() def update_checkbox(self, obj, constant): Config.set(constant, obj.get_active()) diff --git a/src/RelLib/_Address.py b/src/RelLib/_Address.py index d3f1d0547..df09c87ae 100644 --- a/src/RelLib/_Address.py +++ b/src/RelLib/_Address.py @@ -55,26 +55,21 @@ class Address(SecondaryObject,PrivacyBase,SourceBase,NoteBase,DateBase, DateBase.__init__(self,source) LocationBase.__init__(self,source) - if source: - self.street = source.street - else: - self.street = "" - def serialize(self): return (PrivacyBase.serialize(self), SourceBase.serialize(self), NoteBase.serialize(self), DateBase.serialize(self), - self.city,self.state, - self.country,self.postal,self.phone,self.street) + LocationBase.serialize(self)) def unserialize(self,data): - (privacy,source_list,note,date,self.city,self.state, - self.country,self.postal,self.phone,self.street) = data - PrivacyBase.unserialize(self,privacy) - SourceBase.unserialize(self,source_list) - NoteBase.unserialize(self,note) - DateBase.unserialize(self,date) + (privacy, source_list, note, date, location) = data + + PrivacyBase.unserialize(self, privacy) + SourceBase.unserialize(self, source_list) + NoteBase.unserialize(self, note) + DateBase.unserialize(self, date) + LocationBase.unserialize(self, location) return self def get_text_data_list(self): @@ -84,9 +79,7 @@ class Address(SecondaryObject,PrivacyBase,SourceBase,NoteBase,DateBase, @return: Returns the list of all textual attributes of the object. @rtype: list """ - return [self.street] + LocationBase.get_text_data_list(self) - #return [self.street,self.city,self.state,self.country, - # self.postal,self.phone,self.get_date()] + return LocationBase.get_text_data_list(self) def get_text_data_child_list(self): """ @@ -109,11 +102,3 @@ class Address(SecondaryObject,PrivacyBase,SourceBase,NoteBase,DateBase, @rtype: list """ return self.source_list - - def set_street(self,val): - """sets the street portion of the Address""" - self.street = val - - def get_street(self): - """returns the street portion of the Address""" - return self.street diff --git a/src/RelLib/_Location.py b/src/RelLib/_Location.py index c0b66a397..596c8e994 100644 --- a/src/RelLib/_Location.py +++ b/src/RelLib/_Location.py @@ -55,17 +55,15 @@ class Location(SecondaryObject,LocationBase): LocationBase.__init__(self,source) if source: self.parish = source.parish - self.county = source.county else: self.parish = "" - self.county = "" def serialize(self): - return (LocationBase.serialize(self),self.parish,self.county) + return (LocationBase.serialize(self),self.parish) def unserialize(self,data): - (lb,self.parish,self.county) = data - LocationBase.unserialize(self,lb) + (lb, self.parish) = data + LocationBase.unserialize(self, lb) return self def get_text_data_list(self): @@ -75,7 +73,7 @@ class Location(SecondaryObject,LocationBase): @return: Returns the list of all textual attributes of the object. @rtype: list """ - return [self.parish,self.county] + LocationBase.get_text_data_list() + return [self.parish] + LocationBase.get_text_data_list() def is_empty(self): return not self.city and not self.county and not self.state and \ diff --git a/src/RelLib/_LocationBase.py b/src/RelLib/_LocationBase.py index 7670734cb..53e7173b7 100644 --- a/src/RelLib/_LocationBase.py +++ b/src/RelLib/_LocationBase.py @@ -40,23 +40,29 @@ class LocationBase: copying from the source object if it exists. """ if source: + self.street = source.street self.city = source.city + self.county = source.county self.state = source.state self.country = source.country self.postal = source.postal self.phone = source.phone else: + self.street = "" self.city = "" + self.county = "" self.state = "" self.country = "" self.postal = "" self.phone = "" def serialize(self): - return (self.city,self.state,self.country,self.postal,self.phone) + return (self.street, self.city, self.county, self.state, + self.country, self.postal, self.phone) def unserialize(self,data): - (self.city,self.state,self.country,self.postal,self.phone) = data + (self.street, self.city, self.county, self.state, self.country, + self.postal, self.phone) = data return self def get_text_data_list(self): @@ -68,6 +74,14 @@ class LocationBase: """ return [self.city,self.state,self.country,self.postal,self.phone] + def set_street(self,val): + """sets the street portion of the Location""" + self.street = val + + def get_street(self): + """returns the street portion of the Location""" + return self.street + def set_city(self,data): """sets the city name of the LocationBase object""" self.city = data diff --git a/src/ViewManager.py b/src/ViewManager.py index 08186250b..a25512f91 100644 --- a/src/ViewManager.py +++ b/src/ViewManager.py @@ -351,9 +351,9 @@ class ViewManager: _("Open the ScratchPad dialog"), self.scratchpad), ('Import', gtk.STOCK_CONVERT, _('_Import'), "i", None, self.import_data), - ('Reports', gtk.STOCK_DND_MULTIPLE, _('_Reports'), None, + ('Reports', 'gramps-reports', _('_Reports'), None, _("Open the reports dialog"), self.reports_clicked), - ('Tools', gtk.STOCK_EXECUTE, _('_Tools'), None, + ('Tools', 'gramps-tools', _('_Tools'), None, _("Open the tools dialog"), self.tools_clicked), ('EditMenu', None, _('_Edit')), ('ColumnEdit', gtk.STOCK_PROPERTIES, _('_Column Editor')), @@ -763,8 +763,8 @@ class ViewManager: self.post_load_newdb(filename,filetype) def read_recent_file(self,filename,filetype): - self.db_loader.read_file(filename,filetype) - self.post_load_newdb(filename,filetype) + if self.db_loader.read_file(filename,filetype): + self.post_load_newdb(filename,filetype) def post_load(self): # This method is for the common UI post_load, both new files @@ -789,6 +789,8 @@ class ViewManager: # This method is for UI stuff when the database has changed. # Window title, recent files, etc related to new file. + check_for_portability_problems(filetype) + self.state.db.set_save_path(filename) # Update window title @@ -821,7 +823,12 @@ class ViewManager: Config.set(Config.RECENT_FILE,filename) self.relationship = self.RelClass(self.state.db) - self.state.change_active_person(self.state.db.find_initial_person()) + + try: + self.state.change_active_person(self.state.db.find_initial_person()) + except: + pass + self.change_page(None, None) self.actiongroup.set_visible(True) @@ -1028,3 +1035,43 @@ def make_tool_callback(lst, dbstate, uistate): return lambda x: Tool.gui_tool(dbstate, uistate, lst[0], lst[1], lst[2], lst[3], lst[4], dbstate.db.request_rebuild) + +def check_for_portability_problems(filetype): + """ + Checks for the portability problem caused by the combination of + python 2.4 and bsddb. If the problem exists, issue a warning message + that the user can disable. + """ + + # check for a GRDB type and if transactions are enabled. If not, + # then we do not have any issues + + if filetype == const.app_gramps and Config.get(Config.TRANSACTIONS): + + import sys + + # Check for a version less than python 2.5. This is held in the + # sys.version_info variable + + version = (sys.version_info[0],sys.version_info[1]) + + if version < (2, 5): + QuestionDialog.MessageHideDialog( + _('Database is not portable'), + _('Your system is running an old version of python. This ' + 'prevents you from being able to copy your database to ' + 'other machines. For most people, this is not a problem.\n\n' + 'If you need to transfer the database to another machine, ' + 'export to GRAMPS Package, and import the GRAMPS Package ' + 'on the other machine.\n\nIf you feel you need to be able ' + 'to transfer this file between machines without exporting, ' + 'you need to either upgrade to version 2.5 of python, or ' + 'disable transactions in the preferences menu. Disabling ' + 'transactions will slow down your performance, and may allow ' + 'your database to become corrupted if an error occurs while ' + 'data is being saved'), + Config.PORT_WARN) + + + + diff --git a/src/glade/gramps.glade b/src/glade/gramps.glade index 875c36ef7..cd1a9d23f 100644 --- a/src/glade/gramps.glade +++ b/src/glade/gramps.glade @@ -1887,8 +1887,8 @@ 12 True - 7 - 3 + 5 + 4 False 6 12 @@ -1912,6 +1912,35 @@ False 0 + + 0 + 1 + 1 + 2 + fill + + + + + + + True + S_treet: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + city + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + 0 1 @@ -1922,6 +1951,149 @@ + + + True + True + True + True + True + 0 + + True + + False + + + 1 + 2 + 0 + 1 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 1 + 2 + + + + + + + True + True + True + True + 0 + + True + * + False + + + 3 + 4 + 1 + 2 + + + + + + + True + Church _parish: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + parish + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + Co_unty: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + county + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + + + + True @@ -1942,43 +2114,32 @@ 0 - 0 - 1 - 3 - 4 + 2 + 3 + 2 + 3 fill - + True - Co_unty: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - county - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - + True + True + True + 0 + + True + * + False - 0 - 1 + 3 + 4 2 3 - fill @@ -2005,126 +2166,9 @@ 0 1 - 5 - 6 - fill - - - - - - - True - Church _parish: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - parish - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - Church Parish: - - - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 3 4 + fill @@ -2143,9 +2187,9 @@ 1 - 3 - 5 - 6 + 2 + 3 + 4 @@ -2170,10 +2214,10 @@ 0 - 0 - 1 - 4 - 5 + 2 + 3 + 3 + 4 fill @@ -2192,10 +2236,10 @@ False - 1 - 3 - 4 - 5 + 3 + 4 + 3 + 4 @@ -2222,8 +2266,8 @@ 0 1 - 6 - 7 + 4 + 5 fill @@ -2243,9 +2287,9 @@ 1 - 3 - 6 - 7 + 2 + 4 + 5 @@ -7577,7 +7621,7 @@ GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False - 500 + 550 True False True @@ -7687,8 +7731,8 @@ 12 True - 7 - 2 + 5 + 4 False 6 12 @@ -7712,6 +7756,56 @@ False 0 + + 0 + 1 + 1 + 2 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 1 + 2 + + + + + + + True + S_treet: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + city + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + 0 1 @@ -7722,6 +7816,56 @@ + + + True + Church _parish: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + parish + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 3 + 4 + 1 + 2 + + + + True @@ -7754,6 +7898,77 @@ + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + + + + + + + True + _State: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + state + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 2 + 3 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 3 + 4 + 2 + 3 + + + + True @@ -7776,38 +7991,6 @@ Country: - - 0 - 1 - 5 - 6 - fill - - - - - - - True - _State: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - state - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - State: - - 0 1 @@ -7818,123 +8001,6 @@ - - - True - Church _parish: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - parish - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 3 - 4 - - - - True @@ -7950,8 +8016,58 @@ 1 2 - 5 - 6 + 3 + 4 + + + + + + + True + _Zip/Postal code: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + postal + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 3 + 4 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 3 + 4 + 3 + 4 @@ -8007,51 +8123,23 @@ - - True - _Zip/Postal code: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - postal - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 6 - 7 - fill - - - - - - + True True + True True True 0 True - * + False 1 - 2 - 6 - 7 + 4 + 0 + 1 @@ -12814,174 +12902,6 @@ Very High - - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - False - False - - - - True - False - 0 - - - - True - GTK_BUTTONBOX_END - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - -7 - - - - - 0 - False - True - GTK_PACK_END - - - - - - 12 - True - 3 - 3 - False - 0 - 0 - - - - True - It is possible to accidentally create multiple families with the same parents. To help avoid this problem, only the buttons to select parents are available when you create a new family. The remaining fields will become available after you attempt to select a parent. - -You should select parents before adding any new information. If you select parents that match an existing family, and your current family is empty, you will start editing the matching family. If you have already added data, you will create a duplicate family. - False - True - GTK_JUSTIFY_LEFT - True - False - 0 - 0.5 - 6 - 12 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - gtk-dialog-warning - 6 - 0.5 - 0 - 0 - 0 - - - 0 - 1 - 0 - 2 - fill - fill - - - - - - True - <span size="larger" weight="bold">Adding parents to a person</span> - False - True - GTK_JUSTIFY_LEFT - True - False - 0 - 0.5 - 6 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - expand|shrink|fill - - - - - - - True - True - Do not show this dialog again - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 1 - 3 - 2 - 3 - - - - - - - 0 - True - True - - - - - - True @@ -15209,4 +15129,170 @@ You should select parents before adding any new information. If you select paren + + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + False + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + 0 + False + True + GTK_PACK_END + + + + + + 12 + True + 3 + 3 + False + 6 + 6 + + + + True + gtk-dialog-warning + 6 + 0.5 + 0 + 0 + 0 + + + 0 + 1 + 0 + 2 + fill + fill + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + True + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + expand|shrink|fill + + + + + + + True + True + Do not show this dialog again + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 1 + 3 + 2 + 3 + + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + True + False + 0 + 0.5 + 0 + 12 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + 0 + True + True + + + + + + diff --git a/src/gramps_main.py b/src/gramps_main.py index 92378ed60..ec33fb772 100644 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -83,18 +83,20 @@ def register_stock_icons (): ('gramps-pedigree',_('Pedigree'),gtk.gdk.CONTROL_MASK,0,'')), (os.path.join(const.image_dir,'repos.png'), ('gramps-repository',_('Repositories'),gtk.gdk.CONTROL_MASK,0,'')), - (os.path.join(const.image_dir,'sources.png'), + (os.path.join(const.image_dir,'sources.svg'), ('gramps-source',_('Sources'),gtk.gdk.CONTROL_MASK,0,'')), - (os.path.join(const.image_dir,'events.png'), + (os.path.join(const.image_dir,'events.svg'), ('gramps-event',_('Events'),gtk.gdk.CONTROL_MASK,0,'')), - (os.path.join(const.image_dir,'place.png'), + (os.path.join(const.image_dir,'place.svg'), ('gramps-place',_('Places'),gtk.gdk.CONTROL_MASK,0,'')), - (os.path.join(const.image_dir,'place.png'), - ('gramps-map',_('Map'),gtk.gdk.CONTROL_MASK,0,'')), + (os.path.join(const.image_dir,'tools.svg'), + ('gramps-tools',_('Tools'),gtk.gdk.CONTROL_MASK,0,'')), + (os.path.join(const.image_dir,'reports.svg'), + ('gramps-reports',_('Reports'),gtk.gdk.CONTROL_MASK,0,'')), (os.path.join(const.image_dir,'stock_export.png'), - ('gramps-export',_('Map'),gtk.gdk.CONTROL_MASK,0,'')), + ('gramps-export',_('Export'),gtk.gdk.CONTROL_MASK,0,'')), (os.path.join(const.image_dir,'stock_notes.png'), - ('gramps-notes',_('Map'),gtk.gdk.CONTROL_MASK,0,'')), + ('gramps-notes',_('Notes'),gtk.gdk.CONTROL_MASK,0,'')), (os.path.join(const.image_dir,'stock_undo-history.png'), ('gramps-undo-history',_('Undo History'),gtk.gdk.CONTROL_MASK,0,'')), (os.path.join(const.image_dir,'stock_add-bookmark.png'), diff --git a/src/images/Makefile.am b/src/images/Makefile.am index 5da4194b7..cd021de32 100644 --- a/src/images/Makefile.am +++ b/src/images/Makefile.am @@ -52,8 +52,7 @@ map_tile_images = \ dist_pkgdata_DATA = \ bad.png\ caution.png\ - edit_sm.png\ - events.png\ + events.svg\ flist.svg\ good.png\ gramps.png\ @@ -63,14 +62,12 @@ dist_pkgdata_DATA = \ ped24.png\ person.svg\ person.png\ - place.png\ - place24.png\ + tools.svg\ + place.svg\ relation.svg\ - relation.png\ repos.png\ - repos24.png\ - sources.png\ - sources24.png\ + reports.svg\ + sources.svg\ splash.jpg\ stock_add-bookmark.png\ stock_bookmark.png\ @@ -84,7 +81,6 @@ dist_pkgdata_DATA = \ stock_lock-open.png\ stock_lock.png\ stock_notes.png\ - tools.png\ somerights20.gif \ document.png #\ $(map_tile_images) diff --git a/src/images/events.png b/src/images/events.png deleted file mode 100644 index af736c74b829f396d2794870537fbe9467dfe19d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2786 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 diff --git a/src/images/events.svg b/src/images/events.svg new file mode 100644 index 000000000..0bd33d2fa --- /dev/null +++ b/src/images/events.svg @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Calendar + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + calendar + date + time + cal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/place.svg b/src/images/place.svg new file mode 100644 index 000000000..309eff7e8 --- /dev/null +++ b/src/images/place.svg @@ -0,0 +1,980 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Globe + + + Jakub Steiner + + + + + Tuomas Kuosmanen + + + + http://jimmac.musichall.cz + + + globe + international + web + www + internet + network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/relation.png b/src/images/relation.png deleted file mode 100644 index 1cdc8fbf5c5cab50956f38dab85551b9b35ef99d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3533 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 Hu0mjfKUUEm diff --git a/src/images/reports.svg b/src/images/reports.svg new file mode 100644 index 000000000..4f95362a1 --- /dev/null +++ b/src/images/reports.svg @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Office Document + + + rich + text + document + pdf + openoffice + word + rtf + + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/sources.png b/src/images/sources.png deleted file mode 100644 index 39f85ad60a7455a533071821b8f290a39eae5fc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3290 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Addess Book + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + address + contact + book + office + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/tools.png b/src/images/tools.png deleted file mode 100644 index f3e8bfd4fcda0b765950572c2e9c4675f3aa5eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmV-y1e5!TP)|kAOHqhefi*lhkLotx&QyU=lsukZWha%06vu0Ss=jwU^*Zh5S<;D#T}1J zeClWxk|bB|uk^lNF5OZN4*(^A=yP?8{@b@iXUAogBxe~Co%A^k6w81zvgZJg0Of$V z>;GHyxw=(?GU<~MTnHiTcKZ-;4k*;8IjjLvKr;{rBIV`ftjjOZ0@VXq8Nd}G1RjqE ztJPWt>;oRs608C44|?4c6+JcwOao(Ie$hfAF-LSN#F3^$UBFX-AuUZhfYH%W{C+<+ zn+?DUC|akrz_%CM&c0Gwx&;8shRx&}^XUEU#)8wXhDHDr5Car7`cNo@*=$zbo(7`8 zWIDk!z{$4O(*rlTJr3zz^VlgXscU@)u$w#yXH z0#lM?!Lnsx8-Z_RLDdzU_$MG{V>80_OQ$&DIJU6Y-`}s^S4jaB$}h}LSDRi&RRC;~ z3aXN8J0K!cVG)bX2zT#I0SKqlse)GnTV;U8<$6Fbne%{$0W+{3C{iUG3{Iwl3*bfI z(G_}Rks`F+XpoIp2yD}WA9(9^@$%l?D#_Li@?BNiE7}K6rxTmaM$_TL=(F^!&CMn@ z6Xlc7T2yKFY2VSU1a3doPDR;9g26EFy;`U49RSXpKYxy5i-kly%D}(?N1BfV>;XEY znwA9@_EYU*&^IA2w0DWtYrl&(kAAJD<9V5PF+M&n!r_o`_uka1YoD5~rDlq9{OmQ} z*t>(y>o>UN`2+L@Qpu$169z_sN{hvU5P~Plwo$vYmJ^O+$T@TnFz7RZpSkiYuQgct z;c6G|As^P78it2Qm`}{9ehDA~OaK*T^Li9?Y$<&b%Z5@89ef+$bKw2-VW+hHbeqOq z)m-@TIzE4ZXB%E(czA@s*k4>c*`$tvIB-vP>jY3?GMR`(qIkVtMtpvpPA9+z1`UDI z@_jdZYAd*OwFjR+KuukJI{1EIMn)e8l9B|VV&kUG-k$ECsj99fmHIE8S^|no9w(&; zChqz&fqx9RW&Wpud0EhemSksLy;lRde-S}fkBiWBB|Dzmjdy4f_;{)Nwm6iyD +image/svg+xmlGo Homejakub Steinerhttp://jimmac.musichall.czhomereturngodefaultuserdirectory + + \ No newline at end of file diff --git a/src/plugins/EventCmp.py b/src/plugins/EventCmp.py index 8e50534ae..d624e6b0d 100644 --- a/src/plugins/EventCmp.py +++ b/src/plugins/EventCmp.py @@ -20,7 +20,7 @@ # $Id$ -"Analysis and Exploration/Compare individual events" +"Exploration/Compare individual events" #------------------------------------------------------------------------ #