Compare commits

...

278 Commits

Author SHA1 Message Date
romjerome 1c241125d7 8555: Database repair tool always modify all source objects 2016-11-26 12:51:56 +01:00
romjerome e81c82fcc0 9003: Locality data in address was not imported 2015-10-27 09:48:20 +01:00
romjerome 7d91f4fae8 8188: Problem with existing selection in media reference editor
like selection box disappears when scrollbar appears

Now, do not expand bottom section (Media Object fields) by default

Wonder if we should not do that on all Reference Editors?
2015-09-24 11:07:56 +02:00
Nick Hall 78a74cae5c Make place title in GEDCOM export date dependent 2015-07-25 23:17:08 +01:00
Doug Blank 5039ad10f0 7261: Import GEDCOM file from MyHeritage, added __str__ to Attribute 2015-07-23 10:25:36 -04:00
Doug Blank 926bb60650 Merge pull request #43 from sam-m888/8702UpdateMapServicelinksOpenStreetMap
8702 Update Map Service links for OpenStreetMap
2015-07-14 07:04:24 -04:00
Doug Blank 314484cf84 Merge pull request #41 from ennoborg/maintenance/gramps41
8663: add exception for UnicodeEncodeError.
2015-07-13 23:12:01 -04:00
Enno Borgsteede ae0a039216 8663: add exception for UnicodeEncodeError. 2015-07-12 11:41:57 +02:00
kulath 296e8ca562 fix testcasegenerator AttributeError 2015-06-20 00:14:52 +02:00
kulath 4e6a06bfac 0008537: Gedcom import crashes. Fix problem when matching places with
the same name which are enclosed by different places.
2015-06-18 22:52:53 +01:00
Doug Blank 5ff70a665e Merge pull request #37 from ennoborg/maintenance/gramps41
Re-aligned check buttons in remove unused objects dialog.
2015-06-18 16:03:41 -04:00
Enno Borgsteede c0a0c1d302 Re-aligned check buttons in remove unused objects dialog. 2015-06-18 21:34:21 +02:00
kulath e71115af1b 8614: pickleupgrade.txt should not be written for python2 2015-06-18 20:25:33 +01:00
Doug Blank 5828dd3aa8 8537: Gedcom import crashes; kulath patch 2015-06-17 07:59:19 -04:00
Doug Blank 273a5f986f 8614: addresses pickleupgrade.txt issue, by kulath 2015-06-17 06:27:08 -04:00
Hivernat Emmanuel 00032f0cad 7347: fix a bug 'on mouse over' event 2015-06-12 16:37:45 +02:00
Josip 1ed6103a41 8625: Cannot open Citation references from Clip Board 2015-06-12 16:07:44 +02:00
Zdeněk Hataš ea2c71d238 fix mistake that prevent python2 to work 2015-06-07 11:10:22 +02:00
SNoiraud 6605d868cb Geography : bug 8612 : introspection problem with gtk 3.16. 2015-06-07 10:30:00 +02:00
Doug Blank 7a57c8584e 8621: Recursion Filter error 2015-06-06 19:58:41 -04:00
Zdeněk Hataš 46a509ee1d merge inflection fixes for cs lang from gramps42 branch 2015-06-06 14:14:29 +02:00
Josip 1aad1d6be0 Data Verify Tool: fix set transient parent 2015-06-05 12:13:43 +02:00
Josip 104808cf8f Relationship Calculator: fix set transient parent 2015-06-05 12:11:44 +02:00
Josip 8a34d98fb5 8619: Relationship Calculator - can't select person to relate to 2015-06-04 23:01:49 +02:00
erikdrgm c42f714393 Updated 150602 Dutch translation 2015-06-02 21:18:49 +02:00
erikdrgm d8ba31cc29 Merge branch 'maintenance/gramps41' of github.com:gramps-project/gramps into gramps41 2015-06-02 20:48:50 +02:00
Nick Hall f9bb9e5e73 8488: Use place displayer for headings 2015-05-28 19:57:54 +01:00
Nick Hall ed0b50e9b8 8487: Use place displayer to generate title in views 2015-05-28 16:31:59 +01:00
Jérôme Rapinat 19acd368c0 8583: Custom Events not shown in the filter siderbar 2015-05-26 20:51:30 +02:00
Enno Borgsteede 9de644bf1d #4161 #8548: Fix a baptism date error
https://gramps-project.org/bugs/view.php?id=8548#c41455

also reported and patched by 'hmmmpf' on #4161
2015-05-26 20:38:03 +02:00
Jérôme Rapinat bdd70dec1c 4161: Fix empty #buri fields
Still present on Geneweb 6 and 7alpha

patch by 'hmmmpf'
2015-05-26 20:36:37 +02:00
Jérôme Rapinat 2a26ca6c5c 8567: Imprecise French translation in Place dialog
'Enclosed by' was translated in French by 'Lié à'
2015-05-26 18:55:20 +02:00
Jérôme Rapinat f675fc1114 8580: "_Apply" button not translated on "Events comparison" tool 2015-05-26 18:46:44 +02:00
Doug Blank 143df8d42c Merge pull request #23 from belissent/belissent/gramps41
Modification for example.gramps database 
(custom parent relationship, notes)
2015-05-24 17:00:59 -04:00
Josip d71a36b240 8579: Creation of Narration Website report fails 2015-05-24 12:13:54 +02:00
Josip 085d1ee095 8398: lock.file with accent letter cause gramps to crash at start 2015-05-22 18:55:21 +02:00
Leonhaeuser cc2f803b86 update German translation 2015-05-17 10:30:04 +02:00
Josip 9c34e17bd9 Fix AgeStats gramplet for Python3 2015-05-16 12:51:18 +02:00
Josip 136bdd015a fix identation error of 8561#c41511 2015-05-16 06:06:14 +02:00
Josip e0b56f65ef 8561#c41511 2015-05-16 05:04:48 +02:00
Josip 089d028e8f 8562: Cannot create family lines diagram 2015-05-16 04:50:07 +02:00
Josip 6e4ce84396 Set transient parent for errorview and errorreportassistant 2015-05-16 04:19:11 +02:00
Josip 0930c0041f 8561: Problem with importing ged file from My Heritage 2015-05-16 00:32:40 +02:00
Doug Blank ef0492e0ff 8564: Recursion error when filtering for relatives 2015-05-15 18:01:59 -04:00
Josip e1a71dcd34 8497: Error on use of Ctrl-Z 2015-05-14 17:30:41 +02:00
Pierre Bélissent 6895594cdc Modification for exemple.gramps database (custom parent relationship, notes)
Modification for exemple.gramps database (custom parent relationship,
notes):
- Added custom parent relationship for I0044
- Added notes with ID: '_header1', '_footer1', '_custom1'
- Added a date for media O0010
These modifications are used for the DynamicWeb report addon tests.
2015-05-11 18:36:48 +02:00
Josip 45f82f1ec5 Workaround for broken introspection
8474: Crash after merge places
8498: Crash when attempting to add gramplet
8536: clicking on tag icon in person view causes gramps to crash
2015-05-11 17:45:42 +02:00
Josip c26fcf6d56 8445: Drag & Drop to add media: wrong handling of non-ascii characters 2015-05-07 21:04:22 +02:00
Doug Blank 2701d51b62 8541: Crash following update: addon permission issue blocks
re-starting gramps

There were two issues:

1. attempting to read a new addon file that wasn't readable
   threw an exception, aborted updating addons

2. global error catching didn't properly handle error code
   from an OSError for Python3
2015-05-05 13:44:20 -04:00
Matti Niemelä 9683a9e9eb new Finnish translation for gramps41 2015-05-05 00:37:14 -07:00
Jérôme Rapinat d03e9e6553 fix mistake on versioning (inherited from '4.1.3' release) 2015-05-03 17:41:26 +02:00
Josip 0f8b77b706 8469: GUI allows multiple Find Duplicates, then faults
Yet another case of dialog without transient parent
2015-05-03 11:32:07 +02:00
John Ralls a2244c6ab4 Update mac info for 4.1.3 release. 2015-05-02 11:53:51 -07:00
Jérôme Rapinat 2eccc6c4ce 8532: typo on the french translation
plural = single form for month(s) (moi => mois)
2015-05-02 17:02:27 +02:00
Jérôme Rapinat 815596a88d bump to 4.1.4 2015-05-02 10:51:08 +02:00
SNoiraud 98fdeaeb6b narrativeweb : bug 8528 : local variable 'body' referenced before assignment 2015-05-01 10:32:55 +02:00
Jérôme Rapinat 4d57633006 update NEWS before '4.1.3' release 2015-04-30 17:59:33 +02:00
Fabrice Arbogast 9c3450531b 8225 8311: Crash on geneweb export with python3 2015-04-30 17:26:36 +02:00
Jérôme Rapinat 2a35887da7 Don't need a date quality-month inflection in french 2015-04-29 11:08:25 +02:00
Jérôme Rapinat b34e088fe7 8522: fix a typo on commit 436487... 2015-04-29 10:55:54 +02:00
Jérôme Rapinat 189cc853b2 update translation template
was change around GEDCOM SUBM tag

update french translation
2015-04-29 10:50:30 +02:00
John Ralls 1d3d002490 Use MSWin environment variables USERPROFILE and APPDATA.
Instead of GRAMPSHOME. GRAMPSHOME is based on the assumption that
the config directory is GRAMPSHOME/gramps, and that causes the
default location for reports and backups to be ~/Library/Application Support.
The MSWin variables allow the two to be separated.

Thanks to Tim Lyons for the suggestion.

(cherry picked from commit c11c63169f)
2015-04-25 16:58:35 -07:00
kulath eb34416727 0001360: Gedcom input: SUBN and SUBM record handling
Fixed:
(a) Additional spaces beyond the first between a GEDCOM tag and the rest
of the line are not ignored.

(b) The SUBMitter name is ignored (it is overwritten by the XREF).

(c) SUBmissioN data items are not committed to the database.
2015-04-24 10:51:43 +01:00
Leonhaeuser 52842f8200 German translation typo fixes 2015-04-20 13:37:21 +02:00
Paul Franklin 646afece89 Update _datedisplay.py 2015-04-18 15:38:06 -07:00
Josip 45adb70330 fix few more dialog without parent 2015-04-18 23:00:54 +02:00
Josip 4ac02a4ca0 8128: GtkDialog mapped without a transient parent 2015-04-18 21:22:37 +02:00
Stéphane Charette ffe417f43e 8213: event columns too narrow
Web_Basic-Cypress stylesheet improvements
2015-04-18 16:12:23 +02:00
John Ralls dc50b14ed3 Fix gtk-critical error when setting mac menubar. 2015-04-17 15:14:02 -07:00
Josip 35f5426a33 Merge pull request #17 from ennoborg/maintenance/gramps41
Some terms corrected, other ones added.
2015-04-17 21:18:06 +02:00
Enno Borgsteede 8ff85415e8 Some terms corrected, other ones added. 2015-04-16 22:37:33 +02:00
Josip be1980e39a fix typo in commit 93bd200 2015-04-13 15:31:19 +02:00
Josip 93bd200ea0 8473: problem by start program 2015-04-13 01:15:17 +02:00
kulath 906e46b0a5 0002370: GEDCOM import/export round trip causes lost information
Fixed output of Adoption records so "1 ADOP" is only written once for
the person event and the adoption relationship.
2015-04-12 19:04:24 +01:00
Enno Borgsteede 51324b182f 8483: db upgrade fails, fatal damage 2015-04-12 10:44:28 -07:00
Nick Hall 4b8d25083b Merge pull request #15 from sebschub/maintenance/gramps41
Make place type in Place Reference Editor editable, add tooltip (maintenance/gramps41)
2015-04-10 19:14:24 +01:00
Paul Franklin 7ef450515c 8477: date format month/year is not well reported at editing time 2015-04-09 22:05:36 -07:00
Leonhaeuser cb5fb2ed27 typo fix in German translation 2015-04-09 21:50:01 +02:00
Sebastian Schubert b4eae781f8 Make place type in Place Reference Editor editable, add tooltip 2015-04-09 14:04:52 +02:00
Leonhaeuser c5c5889a42 update German translation 2015-04-05 00:25:50 +02:00
Jérôme Rapinat fe2a36c580 6403: add a rule for checking mapping key 2015-04-01 15:52:32 +02:00
kulath e3538e8a8b 0004412: Entering a witness to an event such as marriage
In some circumstances (after a Father's age of Mother's age) a witness
could be ignored.
2015-04-01 14:49:33 +01:00
Matt Keenan 475e78669b 8468: GuiColorOption missing avail-changed event handler 2015-03-31 10:22:35 -07:00
kulath f022597545 0008355: Gramps can't [GEDCOM] import estim. date period exported by
itself

Changed output format to DATE EST FROM TO and DATE CALC FROM TO. Also
changed in Narrative Web (which uses the same functions).
2015-03-31 10:48:44 +01:00
Paul Franklin 672bffe620 7742: bad generation of [timeline report] ODT files since 4.0.0 2015-03-30 13:29:16 -07:00
kulath 70e453f031 Fix bug in processing of Place FORM in GEDCOM import as a result of fix
for 8233.

When an unused Place was removed, PlaceImport still tried to generate
the place hierarchy. Also fixed bug in GEDCOM import where a default
PLAC FORM in the GEDCOM header was ignored.
2015-03-26 12:18:46 +00:00
Leonhaeuser 8a4b9c7ee0 update German translation 2015-03-26 02:34:43 +01:00
Jérôme Rapinat e86f796cf7 Update french translation 2015-03-25 19:51:03 +01:00
Jérôme Rapinat 436487072a xgettext prior to 0.18.3 leads to error
update template after fixing one string
2015-03-25 19:46:32 +01:00
kulath a2a68c64f7 Fix spurious generation of empty 'Alternative Name' in place.merge()
with an empty name

Bug discovered during testing of fix to 8233 (thanks, Enno for
discovering the problem and the fix).
2015-03-25 18:29:01 +00:00
Leonhaeuser c9d9925965 update German translation 2015-03-25 00:19:59 +01:00
kulath 4b8ca4a824 3082, 4439, 7134, 8279 Various fixes for GEDCOM import.
0003082: 1/4 and 1/2 ANSEL characters not supported on importing ANSEL
GEDCOM
0004439: [Info]: characters ignored on a Gedcom encoded ANSI (cp1252
West Europe, USA)
0007134: Failure importing ANSEL encoded gedcom file.
0008279: GEDCOM import fails for ANSI file incorrectly opened with the
utf8 locale

Fixed GEDCOM import not working properly for Python3; other problems
also corected, including fixing the inability to import Windows CP1252
coded files. Also more consistent fix for 8014. Ensured any error
messages are not lost. Fixed a few ANSEL characters that were not
translated.
2015-03-24 16:36:12 +00:00
Leonhaeuser 57a367e8c4 Fixed 0008456: Translation string missing in Not Related tool for help and close button
made _Close _Apply and _Help translateable in notrelated.glade and updated gramps.pot and de.po
2015-03-23 11:59:59 +01:00
Leonhaeuser 9ff34f2934 small fix in German translation 2015-03-21 16:56:22 +01:00
Jérôme Rapinat 88f5fbeb9e Improve TipsParse for python3 support 2015-03-20 09:24:46 +01:00
Jérôme Rapinat 42cf24205b 8103: typo, minor update 2015-03-20 09:22:49 +01:00
SNoiraud 36c03a0a53 geography: bug8450: Attempting to add a bookmark causes an error. 2015-03-19 19:32:34 +01:00
Leonhaeuser cf264e8d89 German translation fix typo 2015-03-19 19:06:57 +01:00
Jérôme Rapinat ab056c8ac5 update template, one new string\n; 8103: sidebar gramplet does not fit well into Event and Citation views\n under french locale 2015-03-19 15:55:06 +01:00
Jérôme Rapinat cc1f5b734a 8451: Fix crash on Relationships Graph report with unknown gender, related sibling label and french locale 2015-03-19 15:42:40 +01:00
Leonhaeuser ac21380b60 Fixed some errors in German translation 2015-03-19 01:42:11 +01:00
Paul Franklin 706437f57d 7155: Support creating directories in various scenarios 2015-03-18 14:02:35 -07:00
SNoiraud ab0dfc8d68 geography: bug 8450: Attempting to add a bookmark causes an error. 2015-03-17 21:16:26 +01:00
Nick Hall 4cb4d912fe 7992: Fix call to get_participant_from_event during batch transaction
During a batch transaction the secondary tables are closed.  This
causes an error when find_backlink_handles is called.  Although
not ideal, we return an empty string for participants.
2015-03-17 14:13:53 +00:00
Leonhaeuser 315ddd6ffd update German translation 2015-03-16 22:04:56 +01:00
Sveinn í Felli 60ff2584fb update Icelandic translation 2015-03-16 16:22:21 +01:00
Nick Hall d2363249b9 Convert remaining unicode literals 2015-03-15 23:48:12 +00:00
Doug Blank b70adcb74a 8435: Crash when trying to link existing place as an enclosing place using P0001 number 2015-03-15 00:36:30 -04:00
Josip f63385ac4b 8023: HTML view fails to load
support both py2 and py3 with non-ascii chars
2015-03-15 01:04:15 +01:00
Doug Blank d9cc3d3b0e 8023: HTML view fails to load; replaced file with open 2015-03-13 22:12:39 -04:00
leonhaeuser ccbf763ac4 update German translation 2015-03-13 17:41:42 +01:00
Zdeněk Hataš 111c245297 czech translation update 2015-03-13 17:30:46 +01:00
Nick Hall 359d277423 8430: Place displayer should not return None
The place displayer should return an empty string for an event
with no place.
2015-03-12 23:15:27 +00:00
Nick Hall 1a0784b154 Fix another handle type bug 2015-03-12 18:16:11 +00:00
kulath b02e1fe467 0008401: NameError in GEDCOM importer 2015-03-12 17:38:12 +00:00
Paul Franklin 8fe31528cf 8423: Python3 needs new_subpixbuf not subpixbuf 2015-03-12 10:11:11 -07:00
kulath 38b5b8ec54 0008322: Event address is lost on import, i.e. disconnected from event.
On GEDCOM import, Places are only merged if the Place Title and the
whole of the main location are identical.
2015-03-12 12:34:31 +00:00
Jérôme Rapinat 8d57884b5b 8407: gramps -i option in manpage not reflecting what happens; update french translation 2015-03-09 19:03:43 +01:00
erikdrgm 69e7501acc Update Dutch Translation 2015-03-09 10:09:38 +01:00
leonhaeuser 385c10a068 update German translation 2015-03-08 13:08:50 +01:00
Ross Gammon d99adb8bd4 8407: gramps -o option in manpage not reflecting what happens, https://bugs.launchpad.net/ubuntu/+source/gramps/+bug/1427444 2015-03-07 11:24:25 +01:00
leonhaeuser 74995c0994 fix typo 2015-03-05 21:04:07 +01:00
Anthony Fok 14ccc01acb enable python3 to run po/update_po.py 2015-03-01 09:00:12 -08:00
kulath 542450bf6d 0007824: Regression: running gramps from crontab fails 2015-03-01 16:52:08 +00:00
Anthony Fok b381f2dd8b correct incorrect tip49, new gramps.pot 2015-02-28 18:57:33 -08:00
Paul Franklin 25f9ea64fc clarify new string, new gramps.pot 2015-02-28 16:02:32 -08:00
Nick Hall c1b65d8cbe Tidy up About dialog
Use standard string for translator credits.
Add new section for contributors.
Align artwork section properly.
2015-02-28 23:01:53 +00:00
John Ralls 89a5d3fcda Some additional packaging fixups for the new dependency versions. 2015-02-28 14:47:36 -08:00
kulath 38addcedb3 0008380: tag_map is not initialized 2015-02-28 20:51:19 +00:00
John Ralls 6c0fdb27d6 Update mac build for Gramps-4.1.2 2015-02-28 09:27:05 -08:00
Jérôme Rapinat 3e5a7fe970 bump to 4.1.3 2015-02-27 17:11:59 +01:00
Jérôme Rapinat cf88fef1e8 make 4.1.2 release 2015-02-27 17:08:58 +01:00
Jérôme Rapinat 94f28daf03 updated existing Chinese translation 2015-02-27 16:23:31 +01:00
Jérôme Rapinat bd8c08596b update NEWS before 4.1.2 release 2015-02-27 16:10:57 +01:00
Anthony Fok d43ff61913 Chinese (simplified) translation update, for gramps41 2015-02-26 14:36:07 -08:00
Nick Hall 307bed5e44 Convert update addons dialog to no longer be a ManagedWindow 2015-02-26 21:30:52 +00:00
Nick Hall e7cf8fe70c Remove place title from default view columns 2015-02-26 21:17:37 +00:00
Jérôme Rapinat c390a0f490 New translation: Icelandic 2015-02-25 08:54:46 +01:00
Tim G L Lyons 8cc86bd153 import statement missing 2015-02-25 01:07:41 +00:00
kulath 2cd23356b4 8134: Fix pickle upgrade of python2 strings to python3 str
Move load of metadata (which can also have pickle upgrade errors) and
make zip backup for pickle or schema upgrade.
2015-02-24 22:41:37 +00:00
Nick Hall 03579aa4a1 Fix schema upgrade from 15 to 16 with python3 2015-02-23 19:19:57 +00:00
Paul Franklin 7f9686ba8d 8316: Family with children but no parents is lost on filtered export 2015-02-23 08:54:14 -08:00
John Ralls f827fff712 Update PyICU to 1.8
1.5 won't compile against ICU-5.4.
2015-02-22 12:50:54 -08:00
Nick Hall 27648255c0 8134: Fix pickle upgrade of python2 strings to python3 str 2015-02-22 15:23:49 +00:00
leonhaeuser f0b022564b update German translation 2015-02-22 02:09:16 +01:00
Jérôme Rapinat 2727044bc7 update french translation 2015-02-21 15:28:48 +01:00
Jérôme Rapinat 04bc04896b two new filter rules were missing on template, 'intltool-update -m' 2015-02-21 15:25:07 +01:00
Nemeséri Lajos 44d8c31bc9 Update Hungarian translation 2015-02-21 11:20:51 +01:00
leonhaeuser 1c4e91e891 update German translation 2015-02-19 01:35:48 +01:00
Nick Hall 09caa90530 Use place displayer in relationship view 2015-02-18 22:22:27 +00:00
noirauds 68a0a0d087 geography: 7149: some minor problems. 2015-02-18 18:27:05 +01:00
Jérôme Rapinat e5701e9641 typo 2015-02-18 14:10:07 +01:00
Jérôme Rapinat e2e75559c2 update french translation 2015-02-18 14:07:10 +01:00
Jérôme Rapinat c489c8ec34 update template 2015-02-18 13:56:51 +01:00
noirauds 8e11d1bd64 geographie: 7149 : Views into Geography should not always use the last option set by the user 2015-02-18 09:30:27 +01:00
noirauds 5c71a35aea geography: 7948 : Add path selector to the text entry for tile cache 2015-02-17 20:30:03 +01:00
kulath a99196dde5 0008347: GEDCOM import of embedded notes attached to media does not work 2015-02-16 22:53:34 +00:00
Jérôme Rapinat 7c71e098f1 fix typos, thank you phcook 2015-02-16 20:01:44 +01:00
leonhaeuser db04225e83 update German translation 2015-02-16 02:33:09 +01:00
noirauds 40686d50ef geography - forgot to suppress debug lines 2015-02-15 23:42:42 +01:00
noirauds 66b0d389c7 geography - new feature (8327) Moving around the map using arrow keys and possibility to zoom from keyboard/keypad with the +/- keys 2015-02-15 23:00:37 +01:00
Nick Hall 4ff5d6460e 8353: Fix default size of detached gramplet window 2015-02-12 19:36:25 +00:00
Nick Hall 77c530f5ed 8351: Allow gramplets detached from the dashboard to fill the window 2015-02-12 19:15:07 +00:00
Nick Hall db138e646c 8350: Fix spacing in export assistant file chooser 2015-02-11 22:52:37 +00:00
Nick Hall bef5ed6386 Swap description and main participants columns
Change column order introduced in #7342 due to adverse comments
on mailing list.
2015-02-11 21:26:11 +00:00
noirauds dadb588d83 geography : bug 7615 : Filter panel on geography view displays improperly 2015-02-11 21:17:19 +01:00
Nick Hall 55a20ab1e3 7930: Fix removing rows in flat list views 2015-02-09 17:26:49 +00:00
Nick Hall 71e2077805 8344: Ensure key is correct type when updating reference map 2015-02-09 15:44:32 +00:00
Zdeněk Hataš b151f17117 czech translation update 2015-02-06 14:24:30 +01:00
kulath 3b5e3cbe6e 0007014: Errors handling owner/submitter information in GEDCOM files.
Only import researcher from GEDCOM or XML if the family tree was
originally empty.
2015-02-02 18:56:56 +00:00
Nick Hall 55c7becb68 Update import to cope with missing place name and type 2015-02-02 17:45:22 +00:00
Nick Hall 643ffcb479 8233: Fix bad handle in explanation note for unknown event 2015-02-01 14:44:48 +00:00
leonhaeuser 218ea80d2b update German translation 2015-01-31 17:35:08 +01:00
Nick Hall 2d27ada429 Remove check for empty place title 2015-01-30 22:12:49 +00:00
Paul Franklin 9cf8a940f9 8320: Detailed descendent report crashes 2015-01-28 09:44:34 -08:00
leonhaeuser 80ace16550 update German translation 2015-01-28 17:36:55 +01:00
Nick Hall 4ffce0b915 7860: Update place sidebar filter 2015-01-27 23:01:33 +00:00
Nick Hall a16bc2de9c 7860: Add new place HasTitle rule 2015-01-27 23:01:32 +00:00
Nick Hall ce9723eec8 7860: Add new place HasData rule 2015-01-27 23:01:30 +00:00
Nick Hall 24df17cc2f 8058: New place reference editor
This allows standard "add" and "share" buttons to be used in the place
reference embedded list.
2015-01-27 19:36:27 +00:00
leonhaeuser 6b50f932db update German translation 2015-01-27 15:00:45 +01:00
Nick Hall 3781e75d60 8056: Activate drag and drop on "enclosed by" tab 2015-01-26 22:44:53 +00:00
Nick Hall 4396a09081 8242: Put places in data.gramps into a hierarchy 2015-01-24 19:33:30 +00:00
leonhaeuser 3e19b099f8 update German translation 2015-01-24 15:05:31 +01:00
Nick Hall 254a605543 7860: Rename "Name" to "Title" 2015-01-23 21:41:03 +00:00
Nick Hall f16772c393 8057: Remove auto-update of place titles 2015-01-23 19:52:41 +00:00
Nick Hall 415a843be9 7942: Implement place displayer 2015-01-23 19:16:16 +00:00
Nick Hall 82646d0d67 7533: Check for active person in session log gramplet 2015-01-21 23:03:36 +00:00
Nick Hall db352c5c4c 7844: Check that the mediapath is not set to None 2015-01-21 21:43:14 +00:00
Nick Hall ac62a978e0 7770: Always display main participants 2015-01-21 18:45:18 +00:00
Nick Hall d0a83dd39c 7299: Fix bug when family has no parents 2015-01-21 17:32:31 +00:00
Jérôme Rapinat 53b415c0d0 8062 8288: Keywords entry in gramps.desktop does not end with ';' 2015-01-17 16:24:22 +01:00
Espen Berg 2f4767fd6f Done with Norwegian bokmål translation 2015-01-09 20:02:53 +01:00
Espen Berg d230948c6a Some revision of Norwegian bokmål translation 2015-01-08 22:31:09 +01:00
Espen Berg a8de78c452 Some revision of Norwegian bokmål translation 2015-01-08 21:11:22 +01:00
kulath 0e3c3cdbdd 0008283: GEDCOM export does not export media attached to citations. Fix
for gramps41
2015-01-08 18:05:28 +00:00
Espen Berg bff873f174 Some revision of Norwegian bokmål translation 2015-01-07 22:16:14 +01:00
Peter Landgren 417d379726 Updated Swedish translation 2015-01-06 18:37:13 +01:00
leonhaeuser 88115561cc update German translation 2015-01-04 22:21:14 +01:00
Doug Blank 563ffe22b4 Records Gramplet uses wrong text 2015-01-03 11:00:44 -08:00
Josip 3f70f716c4 6548: 'Available Gramps Updates for Addons' window not on top 2015-01-03 17:48:57 +01:00
Doug Blank 25fbf57219 Fixes for struct tests to pass: method name changes, and removed tests for struct assignment 2015-01-03 10:35:43 -05:00
Craig Anderson eebcd5c8a2 6355: Report event attribute name is not translated 2015-01-02 09:17:32 -08:00
Jérôme Rapinat 20917e4b09 8169 8267 typo: Glib should be GLib ... 2015-01-02 12:10:18 +01:00
Jérôme Rapinat a166ed9ca4 New year... 2015-01-02 10:23:25 +01:00
Sigmund Lorentsen 492a40b5b4 Update and merge Norwegian Nynorsk translation 2015-01-02 10:22:08 +01:00
Paul Franklin 516d716b83 specify SVG font size is in points, for stupid viewers 2014-12-30 10:52:47 -08:00
Paul Franklin de8efc9d12 8240: can't disable box shadow in SVG descendant tree 2014-12-30 10:36:05 -08:00
Ondrej Krč-Jediný 079abd1df3 merge request #15 ; git clone http://git.code.sf.net/u/ondrisko/gramps ; update slovak translation 2014-12-29 18:04:22 +01:00
Josip 42a56bf31b 7851: translations don't show in many labels, buttons, and other elements, Windows only
Added fix for Python3
2014-12-28 22:16:32 +01:00
Paul Franklin 236261e2db 8257: Crash when mixed "inflected" and "non inflected" months 2014-12-24 12:34:57 -08:00
Fedir Zinchuk 7fa12faed2 Update Ukrainian translation for 4.1 2014-12-22 13:21:47 +02:00
Fedir Zinchuk 032051c093 Update Hebrew month parser, for Ukrainian dateparset 2014-12-21 19:33:09 +02:00
Fedir Zinchuk ad961132eb more string update, remove display_OLD() 2014-12-21 17:13:38 +02:00
Fedir Zinchuk c248767c1d Fix parsing for the span date in Ukrainian language, was conflict with b.c.e. string 2014-12-21 15:45:57 +02:00
Fedir Zinchuk 8497e8c4b2 use inflection for Ukrainian dates 2014-12-21 14:54:33 +02:00
Fedir Zinchuk 05da780166 Update Ukrainian translation for 4.1 2014-12-19 15:19:42 +02:00
Paul Franklin 03ab81e2d1 8148: Turkish language updates 2014-12-17 20:25:17 -08:00
Paul Franklin 205529f448 8185: Gramps freeze after defining a report stile with German cm values 2014-12-17 19:57:43 -08:00
Paul Franklin 10c62800ef 8237: descendant tree graphical report, syntax error in svg output 2014-12-17 19:39:31 -08:00
Matti Niemelä 61625e2a9b update gramps41 Finnish translation 2014-12-15 17:26:10 -08:00
kulath b8b61521d8 Fix 0008234: part (2) Various problems with
docgen.TextDoc.add_media_object part (2) for gramps41 branch
2014-12-16 00:27:32 +00:00
kulath a1402552e2 Merge branch 'maintenance/gramps41' of ssh://kulath@git.code.sf.net/p/gramps/source into maintenance/gramps41 2014-12-14 18:03:36 +00:00
kulath 4722ce2e7f Fix 0008234: Various problems with docgen.TextDoc.add_media_object part
(1) for gramps41 branch
2014-12-14 17:59:28 +00:00
Zdeněk Hataš b86bbf44d1 czech translation update 2014-12-14 12:51:31 +01:00
leonhaeuser 49f53a1fe7 fix German grammer bug [8231] 2014-12-13 22:19:31 +01:00
Paul Franklin 1c8cc6e33f cover pathological case (perhaps from privacy proxy) 2014-12-12 11:07:18 -08:00
Paul Franklin 040c9010d2 merge trunk-master Finnish translation into gramps41 2014-12-12 09:06:12 -08:00
leonhaeuser c9a19a5954 Fix German typo Bug [8226] 2014-12-12 15:36:21 +01:00
Paul Franklin bda98e7b1e make a new template (gramps41 gramps.pot) 2014-12-11 19:49:39 -08:00
Paul Franklin c035dd3df4 typo 2014-12-11 11:03:12 -08:00
Nick Hall 2de3ea43c3 8029: Suppress warnings in UndoableEntry widget
Bug 644927 - Support out parameters in signals
https://bugzilla.gnome.org/show_bug.cgi?id=644927
2014-12-10 22:25:42 +00:00
Jérôme Rapinat 939eb423a6 typo on french translation 2014-12-09 21:33:34 +01:00
Jérôme Rapinat 0fe8bd5e4a update french translation 2014-12-06 18:13:04 +01:00
Josip acb7f3cded 7865: Closing detached gramplet causes python to crash 2014-12-01 18:44:05 +01:00
Nick Hall d84109f435 7866: Crash on Ancestry.com .ged import; consistent. 2014-12-01 18:09:33 +01:00
Paul Franklin e84bf70347 ignore a zero day and its delimiter, in numerical date format 2014-11-24 17:15:01 -08:00
kulath d6f7cfcd20 Fix error in previous commit (spurious comments) 2014-11-24 18:35:34 +00:00
kulath a9640f327f 8196: Spurious spaces in CLI List Family Trees, tab delimited output.
Print statements changed to assemble the whole line before output.
2014-11-24 18:15:27 +00:00
leonhaeuser 80be25adae improved German translation 2014-11-23 23:51:36 +01:00
Josip 1030d1627e Croatian translation 2014-11-23 22:11:32 +01:00
leonhaeuser d2ffb0484a update German translation 2014-11-23 15:37:38 +01:00
Josip 7b6dede9ea 10f47d: Serbian should be ready for Windows OS and LOCALE_NAMES mapping
mapping should be on of:
'Serbian (Latin)_Bosnia and Herzegovina.1250'
'Serbian (Latin)_Serbia.1250'
'Serbian (Latin)_Serbia and Montenegro (Former).1250'
'Serbian (Cyrillic)_Bosnia and Herzegovina.1251'
'Serbian (Cyrillic)_Serbia.1251'
'Serbian (Cyrillic)_Serbia and Montenegro (Former).1251'
2014-11-23 14:14:38 +01:00
Paul Franklin e4061d605c make a new template (gramps.pot) 2014-11-22 16:20:22 -08:00
Paul Franklin 4afc4933c2 8175: date inflections in _datahandler.py 2014-11-22 16:05:04 -08:00
Paul Franklin 14ed0c4d16 8184: regression: Complete Individual report has some untranslated output 2014-11-20 10:03:55 -08:00
Paul Franklin 1a8c73212e add a few date examples (near the top of the list) 2014-11-13 10:13:47 -08:00
Zdeněk Hataš 18ef02d424 czech translation update 2014-11-10 10:34:30 +01:00
Josip 85b4c25d02 Fix esperanto duplicate message definition 2014-11-08 13:33:57 +01:00
Josip e0b44ff355 8157: ImageMetadata doesn't show metadata 2014-11-07 19:18:19 +01:00
Pier Luigi Cinquantini 9a00d5533d improvements on Esperanto translation 2014-11-06 14:54:13 +01:00
Paul Franklin d349f247ea 5150: new Event types are saved as a disordered list 2014-11-04 07:27:39 -08:00
Paul Franklin f44e84f054 new gramps41 template (gramps.pot) 2014-11-03 20:22:33 -08:00
Nick Hall 0a7b8fb6ee 7604: Fix error setting gramplet tab label 2014-11-03 21:51:24 +00:00
Jérôme Rapinat 85914babdf 8126: Warnings: deprecated Gtk properties and errors loading theme icon
Fix: database manager dialog is inconsistent for older gtk+3 versions
2014-11-02 13:49:40 +01:00
Josip 448986875b Fix typo on commit 12ed5d 2014-11-01 20:14:06 +01:00
leonhaeuser b81f80bace update German translation 2014-10-31 14:09:59 +01:00
Josip 12ed5deb24 7857: gramps fails to start with gtk+-3.13.3 (Gdk.Event(Gdk.EventType.NOTHING)
TypeError: function takes at most 0 arguments (1 given)
2014-10-31 13:40:29 +01:00
Josip e6d35b8cbd Fix: Warning: The property GtkSettings:gtk-show-unicode-menu is deprecated
and shouldn't be used anymore
2014-10-31 13:25:13 +01:00
Josip 84055c01dc Fix: The property GtkAlignment:yalign|xalign is deprecated
and shouldn't be used anymore
2014-10-31 12:16:19 +01:00
Josip b475c47994 0008126: Warnings: deprecated Gtk properties and errors loading theme icon
Fix: Error loading theme icon 'gtk-apply'
2014-10-31 09:59:01 +01:00
Josip f9ebdaadc3 croatian translation 2014-10-31 03:12:02 +01:00
leonhaeuser 9478468977 update German translation 2014-10-29 19:34:49 +01:00
Paul Franklin 01baffae32 8154: Some text not translatable in context menu fancharts (GUI) 2014-10-29 09:18:36 -07:00
Zdeněk Hataš 4fd6b0f7c4 czech translation update 2014-10-29 09:56:29 +01:00
Paul Franklin 84318f6ee1 8152: Error converting database after upgrade to Gramps 4.1.1 2014-10-28 17:01:17 -07:00
Nick Hall 54fdf3ef8a 8020: Ensure that reference map has string keys 2014-10-28 17:40:29 +00:00
John Ralls 9740e7fc0c 8140: Gramps doesn't work under Turkish locale
(cherry picked from commit 4662cf1cf94c3502ca8490f213b34d3d094e2d38)
2014-10-27 11:23:55 -07:00
Ugur Cetin b0b64b0b5c update Turkish translation (partial) 2014-10-26 15:22:58 -07:00
leonhaeuser 57ed1d7cb8 smal change in German translation 2014-10-26 19:17:23 +01:00
leonhaeuser 21e4d8e5ad update German translation 2014-10-26 10:21:14 +01:00
Jérôme Rapinat 3d249cfa01 7362 8103 typo on translations, find po -name *.po -exec sed -i'' -e 's/... 2014-10-26 07:36:41 +01:00
Jérôme Rapinat 9d858d7167 [backport]: 7362 8103: some labels fit better on citations sidebar filter (patch by Nick H.), add the new translated string on most translation files 2014-10-25 16:50:09 +02:00
Paul Franklin 081b2a4ed2 generate new template (gramps.pot) 2014-10-24 14:29:31 -07:00
John Ralls 49f7137577 Update gramps mac version to 4.1.1 2014-10-24 12:41:22 -07:00
Paul Franklin 8732b1e237 add language-warning message to setup.py 2014-10-24 12:33:56 -07:00
Jérôme Rapinat 10f47d73ad Serbian should be ready for Windows OS and LOCALE_NAMES mapping 2014-10-24 19:58:54 +02:00
Jérôme Rapinat 778e87971f bump to 4.1.2 2014-10-24 16:01:40 +02:00
292 changed files with 107482 additions and 84759 deletions
+111
View File
@@ -1,3 +1,114 @@
2015-05-01
Version 4.1.3, "Thou shalt not count to five", a maintenance release.
* Fix db upgrade failure
* GtkDialog mapped without a transient parent
* [Gedcom} SUBN and SUBM record handling
* [Gedcom] Import/export round trip causes lost information
* [Gedcom] Entering a witness to an event such as marriage might be ignored
* [Gedcom] Gramps can't import estim. date period exported by itself
* [Gedcom] 1/4 and 1/2 ANSEL characters not supported on importing ANSEL
* [Gedcom] Importing file containing multibyte UTF-8 characters fails
* [Gedcom] Import fails for ANSI file under python 3
* [Gedcom] Failure importing ANSEL encoded gedcom file.
* [Gedcom] Characters ignored on a Gedcom encoded ANSI (cp1252 West Europe, USA)
* [Gedcom] NameError in importer
* [Gedcom] Event address is lost on import, i.e. disconnected from event
* Crash on geneweb export with python3
* GuiColorOption missing avail-changed event handler
* Bad generation of [timeline report] ODT files since 4.0.0
* Fix bad handle in explanation note for unknown event
* Fix spurious generation of empty 'Alternative Name' in place.merge()
* Support creating directories in various scenarios
* Attempting to add a bookmark causes an error
* Long series of "unhandled exception" popup boxes while doing a check & repair
* Crash when trying to link existing place as an enclosing place using P0001 number
* HTML view fails to load
* Relationship Graph crashes
* Python3 needs new_subpixbuf not subpixbuf
* Regression: running gramps from crontab fails
* tag_map is not initialized
* Some labels now fit better on citations sidebar filter
* Event columns in web narrative are too narrow
* Problem by start program (launcher)
* Translation string missing in Not Related tool for help and close button
* Date format month/year is not well reported at editing time [in Italian]
* Fix unknown gender relationships handler for the french locale
* Fix a handle type bug on sidebar filter
* Tidy up About dialog
* Cleanup on some man files
* Convert some remaining unicode literals
* Fix mac menubar setting
* Enable python3 to run po/update_po.py
* Updated translations: cs, de, fr, is, nl
2015-02-28
Version 4.1.2, "That's no ordinary rabbit", a maintenance release.
* Error converting python2 utf-8 strings to python3 str when loading data from database
* Removing a parent place from a place leaves a dangling reference
* Error during checking the database
* Stubborn blank space in database won't be removed, fix removing rows in flat list views
* Database upgrade fails if default media path is not set
* Error converting database after upgrade to Gramps 4.1.1
* Error in a single place within the places section
* Entries from the add-or-choose selector of Place/Source/Media/Note cannot be dragged
* Enclosing places tab should work like other similar tabs, new place reference editor
* Association editor refuses dropped persons
* Error on opening twice an object from clipboard
* Incorrect spacing in export assistant file chooser
* New Event types are saved as a disordered list
* Always display main participants
* Place titles can now be generated on-the-fly by a place displayer, default is still to use the place title field
* GEDCOM import of embedded notes attached to media does not work
* Crash on Ancestry.com .ged import; consistent.
* Errors handling owner/submitter information in GEDCOM files.
Only import researcher from GEDCOM or XML if the family tree was originally empty.
* GEDCOM export does not export media attached to citations.
* The fanchart view crashes if max generation is set to 1 away.
* Sidebar Filters do not match placetypes in new placeview, two new filter rules (HasTitle, HasData)
* Fix bug when family has no parents
* Fix bad handle in explanation note for unknown event
* Some labels now fit better on citations sidebar filter
* Views in Geography should not always use the last option set by the user
* Request for keyboard-controlled zoom on Geography view
* Error geography view - Displaying main menu
* Configure screen needs a file selector to select directory for "offline mode" files
* Filter panel on geography view displays improperly
* Detailed descendant report crashes, bibliography (citations)
* Can't disable box shadow in SVG descendant tree
* Descendant tree graphical report, syntax error in svg output
* Regression: Complete Individual report has partially-untranslated output
* Events Page in Narrative Report not working
* Gramps freeze after defining a report style with German cm values
* Various problems with docgen.TextDoc.add_media_object
* Report event attribute name is not translated
* Records Gramplet uses wrong text
* Closing detached gramplet causes python to crash
* Cannot reduce size of gramplets detached from a gramplet bar
* Gramplets don't fill window when detached from dashboard
* ImageMetadata doesn't show metadata
* typo on GLib call, used by an addon only
* Fix error setting gramplet tab label
* Check for active person in session log gramplet
* Spurious spaces in CLI List Family Trees, tab delimited output.
Print statements changed to assemble the whole line before output.
* Gtk3 warning and custom undoableentry widget, see bugzilla_id 644927
* Warnings: deprecated Gtk properties and errors loading theme icon.
Fix: database manager dialog is inconsistent for older gtk+3 versions.
Warnings: deprecated Gtk properties and errors loading theme icon.
Fix: Error loading theme icon 'gtk-apply'
* gramps fails to start with gtk+-3.13.3
* Places in data.gramps are not in the new Place hierarchy
* Upgrade the version of some dependencies for Mac OS and Windows OS.
* Keywords entry in gramps.desktop does not work
* 'Available Gramps Updates for Addons' window not on top
* Some text not translatable in context menu fancharts
* Fix for Unit test
* date inflections in _datehandler.py, update for Ukrainian, Russian, Croatian
* Better support for Serbian and Turkish locales
* New translation: Icelandic
* Re-enable Turkish support after a major review. Thank you Uğur.
* Updated translations: cs, de, eo, fi, fr, hr, hu, it, nb, nn, ru, sk, sr, sv, uk, zh_CN
2014-10-24
Version 4.1.1, "MachineThatGoes...Ping!", a maintenance release.
* Fix custom place types in the place editor
+8
View File
@@ -248,6 +248,14 @@ table.primobjlist tr.BeginLetter td, table.primobjlist tr.BeginSurname td {
td.ColumnLetter, td.ColumnRowLabel {
font-weight: bold;
}
/* bug #8213 testing by Stephane, 2014-12-6 */
td.ColumnEvent, td.ColumnDate {
white-space: nowrap;
}
td.ColumnPlace, td.ColumnDescription {
width: 20%
}
/* end of customizations by Stephane */
td.ColumnBirth, td.ColumnDeath, td.ColumnPartner, td.ColumnParents {
font-size: 90%;
}
+1 -1
View File
@@ -8,6 +8,6 @@ Terminal=false
Type=Application
StartupNotify=true
Categories=GTK;Office;
_Keywords=Genealogy;Family History;Research;Family Tree;GEDCOM
_Keywords=Genealogy;Family History;Research;Family Tree;GEDCOM;
MimeType=application/x-gramps;application/x-gedcom;application/x-gramps-package;application/x-gramps-xml;
Exec=gramps %F
+3 -3
View File
@@ -82,9 +82,9 @@ gramps(1) @VERSION@ gramps(1)
**-i** , **--import=** *FILE*
Import data from *FILE* . If you haven't specified a database then
a temporary database is used; this is deleted when you exit
gramps.
Import data from *FILE* . If you haven't specified a database, then
an empty database is created for you called Family Tree x
(where x is an incrementing number).
When more than one input file is given, each has to be preceded
by **-i** flag. The files are imported in the specified order, i.e.
+2 -2
View File
@@ -82,8 +82,8 @@ gramps(1) @VERSION@ gramps(1)
**-i** , **--import=** *FICHIER*
Importer des données depuis un *FICHIER* . Si vous n'avez pas
spécifié de base de données alors une base de données temporaire
est utilisée; elle sera effacée quand vous quitterez gramps.
spécifié de base de données, alors une base de données vide
est utilisée.
Quand plus d'un fichier doit être importé, chacun doit être
précédé par la commande **-i** . Ces fichiers sont importés dans le
+4 -4
View File
@@ -1,4 +1,4 @@
.TH "GRAMPS" "1" "28 December 2012" "4.0" "Gramps"
.TH "GRAMPS" "1" "09 mars 2015" "4.1" "Gramps"
.SH NAME
gramps \- Gramps Documentation
.
@@ -106,8 +106,8 @@ sources, vous devez utiliser l\(aqoption d\(aqimport.
.TP
.B \fB\-i\fP , \fB\-\-import=\fP \fIFICHIER\fP
Importer des données depuis un \fIFICHIER\fP . Si vous n\(aqavez pas
spécifié de base de données alors une base de données temporaire
est utilisée; elle sera effacée quand vous quitterez gramps.
spécifié de base de données, alors une base de données vide
est utilisée.
.sp
Quand plus d\(aqun fichier doit être importé, chacun doit être
précédé par la commande \fB\-i\fP . Ces fichiers sont importés dans le
@@ -337,6 +337,6 @@ gramps(1) @VERSION@ gramps(1)
.SH AUTHOR
Jerome Rapinat
.SH COPYRIGHT
2012, Gramps project
2015, Gramps project
.\" Generated by docutils manpage writer.
.
+1 -1
View File
@@ -104,7 +104,7 @@ If no action, import or export options are given on the command line then an int
.TP
.BI \-i,\-\^\-import= " FILE"
Import data from \fIFILE\fR. If you haven't specified a database then a temporary database is used; this is deleted when you exit gramps.
Import data from \fIFILE\fR. If you haven't specified a database, then an empty database is created for you called Family Tree x (where x is an incrementing number).
.br
When more than one input file is given, each has to be preceded by \fB\-i\fR
+1 -1
View File
@@ -89,7 +89,7 @@
<_tip number="48"><b>Web Family Tree Format</b><br/>Gramps can export data to the Web Family Tree (WFT) format. This format allows a family tree to be displayed online using a single file, instead of many html files.</_tip>
<_tip number="49"><b>Making a Genealogy Website</b><br/>You can easily export your family tree to a web page. Select the entire database, family lines or selected individuals to a collection of web pages ready for upload to the World Wide Web. The Gramps project provides free hosting of websites made with Gramps.</_tip>
<_tip number="49"><b>Making a Genealogy Website</b><br/>You can easily export your family tree to a web page. Select the entire database, family lines or selected individuals to a collection of web pages ready for upload to the World Wide Web.</_tip>
<_tip number="50"><b>Reporting Bugs in Gramps</b><br/>The best way to report a bug in Gramps is to use the Gramps bug tracking system at http://bugs.gramps-project.org</_tip>
+135 -40
View File
@@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.6.0/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.6.0/">
<header>
<created date="2014-05-15" version="4.1.0"/>
<created date="2015-01-24" version="4.1.2"/>
<researcher>
<resname>Alex Roitman,,,</resname>
</researcher>
@@ -1523,80 +1523,175 @@
</source>
</sources>
<places>
<placeobj handle="_4ZLT6DVCWT9LTZRDCS" change="1198197326" id="P0003" name="Ronne" type="None">
<placeobj handle="_4ZLT6DVCWT9LTZRDCS" change="1422124381" id="P0003" name="Ronne" type="City">
<ptitle>Ronne, Bornholm, Denmark</ptitle>
<placeref hlink="_cef2428d9dd233688ea3ed3cc24"/>
</placeobj>
<placeobj handle="_61NT6D3G1JMOTO6Z7Y" change="1198197326" id="P0012" name="Grostorp" type="None">
<placeobj handle="_61NT6D3G1JMOTO6Z7Y" change="1422123855" id="P0012" name="Grostorp" type="Municipality">
<ptitle>Grostorp, Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_cef23a81ba8c837cc364895d88"/>
</placeobj>
<placeobj handle="_67MT6DB6KWOVMBAXSY" change="1198197326" id="P0002" name="San Francisco" type="None">
<ptitle>San Francisco, San Francisco Co., CA</ptitle>
<placeobj handle="_67MT6DB6KWOVMBAXSY" change="1422125128" id="P0002" name="San Francisco" type="City">
<ptitle>San Francisco, San Francisco Co., CA, USA</ptitle>
<placeref hlink="_cef24668db23c27d421f51c667d"/>
</placeobj>
<placeobj handle="_7JMT6DN2LOF54KXHTU" change="1198197326" id="P0010" name="Reno" type="None">
<ptitle>Reno, Washoe Co., NV</ptitle>
<placeobj handle="_7JMT6DN2LOF54KXHTU" change="1422125958" id="P0010" name="Reno" type="City">
<ptitle>Reno, Washoe Co., NV, USA</ptitle>
<placeref hlink="_cef2513e057732c3f27780750d"/>
</placeobj>
<placeobj handle="_A9MT6DHVWGWRP59DEV" change="1198197326" id="P0011" name="Sweden" type="None">
<placeobj handle="_A9MT6DHVWGWRP59DEV" change="1422123595" id="P0011" name="Sweden" type="Country">
<ptitle>Sweden</ptitle>
</placeobj>
<placeobj handle="_AANT6D026O5SHNUCDH" change="1198197326" id="P0015" name="Simrishamn" type="None">
<placeobj handle="_AANT6D026O5SHNUCDH" change="1422123942" id="P0015" name="Simrishamn" type="Municipality">
<ptitle>Simrishamn, Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_cef23a81ba8c837cc364895d88"/>
</placeobj>
<placeobj handle="_AKMT6DMEYZDTG9J6DS" change="1198197326" id="P0013" name="Copenhagen" type="None">
<placeobj handle="_AKMT6DMEYZDTG9J6DS" change="1422124249" id="P0013" name="Copenhagen" type="City">
<ptitle>Copenhagen, Denmark</ptitle>
<placeref hlink="_cef2418f9333e16e00f6ce2eb14"/>
</placeobj>
<placeobj handle="_BAOT6D1WY6J4O4ARRN" change="1198197326" id="P0030" name="San Ramon" type="None">
<ptitle>San Ramon, Conta Costa Co., CA</ptitle>
<placeobj handle="_BAOT6D1WY6J4O4ARRN" change="1422125198" id="P0030" name="San Ramon" type="City">
<ptitle>San Ramon, Conta Costa Co., CA, USA</ptitle>
<placeref hlink="_cef2478a94b48a58d3be6a10493"/>
</placeobj>
<placeobj handle="_DYLT6DF4DX2MNZICJ8" change="1198197326" id="P0014" name="Hoya/Jona/Hoia" type="None">
<ptitle>Hoya/Jona/Hoia, Sweden</ptitle>
<placeobj handle="_DYLT6DF4DX2MNZICJ8" change="1422126222" id="P0014" name="Hoya" type="City">
<ptitle>Hoya, Sweden</ptitle>
<alt_name>Jona</alt_name>
<alt_name>Hoia</alt_name>
<placeref hlink="_A9MT6DHVWGWRP59DEV"/>
</placeobj>
<placeobj handle="_ELNT6DS8GN8WI7Z4SO" change="1198197326" id="P0008" name="Hayward" type="None">
<ptitle>Hayward, Alameda Co., CA</ptitle>
<placeobj handle="_ELNT6DS8GN8WI7Z4SO" change="1422125073" id="P0008" name="Hayward" type="City">
<ptitle>Hayward, Alameda Co., CA, USA</ptitle>
<placeref hlink="_cef245b044820b7405a1180f298"/>
</placeobj>
<placeobj handle="_FBNT6DL92NDY0Z5SGP" change="1198197326" id="P0021" name="Santa Rosa" type="None">
<ptitle>Santa Rosa, Sonoma Co., CA</ptitle>
<placeobj handle="_FBNT6DL92NDY0Z5SGP" change="1422125294" id="P0021" name="Santa Rosa" type="City">
<ptitle>Santa Rosa, Sonoma Co., CA, USA</ptitle>
<placeref hlink="_cef24b7a76efa8b9d98d67ea5a"/>
</placeobj>
<placeobj handle="_GWNT6D12ZV06PK969X" change="1198197326" id="P0020" name="Sacramento" type="None">
<ptitle>Sacramento, Sacramento Co., CA</ptitle>
<placeobj handle="_GWNT6D12ZV06PK969X" change="1422125101" id="P0020" name="Sacramento" type="City">
<ptitle>Sacramento, Sacramento Co., CA, USA</ptitle>
<placeref hlink="_cef246117947f75e54c09680419"/>
</placeobj>
<placeobj handle="_HFNT6D12ZC0KOWY69T" change="1198197326" id="P0016" name="Fremont" type="None">
<ptitle>Fremont, Alameda Co., CA</ptitle>
<placeobj handle="_HFNT6D12ZC0KOWY69T" change="1422125018" id="P0016" name="Fremont" type="City">
<ptitle>Fremont, Alameda Co., CA, USA</ptitle>
<placeref hlink="_cef245b044820b7405a1180f298"/>
</placeobj>
<placeobj handle="_HINT6DP8JGGL0KKB8J" change="1198197326" id="P0000" name="Loderup" type="None">
<placeobj handle="_HINT6DP8JGGL0KKB8J" change="1422123879" id="P0000" name="Loderup" type="Municipality">
<ptitle>Loderup, Malmous Lan, Sweden</ptitle>
<placeref hlink="_cef23c1ee8b7da58c764e88c637"/>
</placeobj>
<placeobj handle="_IEOT6DOW3RE8AQ94HH" change="1198197326" id="P0025" name="Bí" type="None">
<placeobj handle="_IEOT6DOW3RE8AQ94HH" change="1422126043" id="P0025" name="Bí" type="Unknown">
<ptitle>Bí</ptitle>
</placeobj>
<placeobj handle="_LTNT6DKZ5CR8PZSVUS" change="1198197326" id="P0022" name="San Jose" type="None">
<ptitle>San Jose, Santa Clara Co., CA</ptitle>
<placeobj handle="_LTNT6DKZ5CR8PZSVUS" change="1422125169" id="P0022" name="San Jose" type="City">
<ptitle>San Jose, Santa Clara Co., CA, USA</ptitle>
<placeref hlink="_cef246c95c132bcf6a0255d4d17"/>
</placeobj>
<placeobj handle="_PUNT6D1XHS0DJW9QP6" change="1198197326" id="P0024" name="UC Berkeley" type="None">
<ptitle>UC Berkeley</ptitle>
<placeobj handle="_PUNT6D1XHS0DJW9QP6" change="1422125605" id="P0024" name="UC Berkeley" type="University">
<ptitle>UC Berkeley, CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_PXMT6DBL0WSBL76WD7" change="1198197326" id="P0026" name="Smestorp" type="None">
<placeobj handle="_PXMT6DBL0WSBL76WD7" change="1422123936" id="P0026" name="Smestorp" type="Municipality">
<ptitle>Smestorp, Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_cef23a81ba8c837cc364895d88"/>
</placeobj>
<placeobj handle="_QBOT6DN7UCCTZQ055" change="1198197326" id="P0029" name="Woodland" type="None">
<ptitle>Woodland, Yolo Co., CA</ptitle>
<placeobj handle="_QBOT6DN7UCCTZQ055" change="1422125399" id="P0029" name="Woodland" type="City">
<ptitle>Woodland, Yolo Co., CA, USA</ptitle>
<placeref hlink="_cef24c2e3592e759b7797f95465"/>
</placeobj>
<placeobj handle="_QJMT6DGII29FWCPX2E" change="1198197326" id="P0028" name="Ronne Bornholm" type="None">
<placeobj handle="_QJMT6DGII29FWCPX2E" change="1422124361" id="P0028" name="Ronne Bornholm" type="City">
<ptitle>Ronne Bornholm, Denmark</ptitle>
<placeref hlink="_cef2418f9333e16e00f6ce2eb14"/>
</placeobj>
<placeobj handle="_R8MT6DRIZVNRYDK0VN" change="1198197326" id="P0027" name="Tommarp" type="None">
<placeobj handle="_R8MT6DRIZVNRYDK0VN" change="1422123930" id="P0027" name="Tommarp" type="Municipality">
<ptitle>Tommarp, Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_cef23a81ba8c837cc364895d88"/>
</placeobj>
<placeobj handle="_RPMT6DTQR8J7LK98HJ" change="1198197326" id="P0019" name="Denver" type="None">
<ptitle>Denver, Denver Co., CO</ptitle>
<placeobj handle="_RPMT6DTQR8J7LK98HJ" change="1422125771" id="P0019" name="Denver" type="City">
<ptitle>Denver, Denver Co., CO, USA</ptitle>
<placeref hlink="_cef24ffc57f28a50ea65f0af645"/>
</placeobj>
<placeobj handle="_S1NT6DPOBYC1JGMR1P" change="1198197326" id="P0001" name="Sparks" type="None">
<ptitle>Sparks, Washoe Co., NV</ptitle>
<placeobj handle="_S1NT6DPOBYC1JGMR1P" change="1422125992" id="P0001" name="Sparks" type="City">
<ptitle>Sparks, Washoe Co., NV, USA</ptitle>
<placeref hlink="_cef2513e057732c3f27780750d"/>
</placeobj>
<placeobj handle="_XLNT6DUONITFPPEGVH" change="1198197326" id="P0009" name="Community Presbyterian Church" type="None">
<ptitle>Community Presbyterian Church, Danville, CA</ptitle>
<placeobj handle="_XLNT6DUONITFPPEGVH" change="1422125508" id="P0009" name="Community Presbyterian Church" type="Church">
<ptitle>Community Presbyterian Church, Danville, CA, USA</ptitle>
<placeref hlink="_cef24d930653dc59ec3a36510e4"/>
</placeobj>
<placeobj handle="_XSMT6DNISHYRCR1E78" change="1198197326" id="P0004" name="Gladsax" type="None">
<placeobj handle="_XSMT6DNISHYRCR1E78" change="1422123836" id="P0004" name="Gladsax" type="Municipality">
<ptitle>Gladsax, Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_cef23a81ba8c837cc364895d88"/>
</placeobj>
<placeobj handle="_cef23a81ba8c837cc364895d88" change="1422123677" id="P0005" name="Kristianstad Lan" type="County">
<ptitle>Kristianstad Lan, Sweden</ptitle>
<placeref hlink="_A9MT6DHVWGWRP59DEV"/>
</placeobj>
<placeobj handle="_cef23c1ee8b7da58c764e88c637" change="1422123662" id="P0006" name="Malmous Lan" type="County">
<ptitle>Malmous Lan, Sweden</ptitle>
<placeref hlink="_A9MT6DHVWGWRP59DEV"/>
</placeobj>
<placeobj handle="_cef2418f9333e16e00f6ce2eb14" change="1422124233" id="P0007" name="Denmark" type="Country">
<ptitle>Denmark</ptitle>
</placeobj>
<placeobj handle="_cef2428d9dd233688ea3ed3cc24" change="1422124337" id="P0017" name="Bornholm" type="Region">
<ptitle>Bornholm, Denmark</ptitle>
<placeref hlink="_cef2418f9333e16e00f6ce2eb14"/>
</placeobj>
<placeobj handle="_cef2438892244290ca7fb5750" change="1422124440" id="P0018" name="USA" type="Country">
<ptitle>USA</ptitle>
</placeobj>
<placeobj handle="_cef243fb5634559442323368f63" change="1422124487" id="P0023" name="CA" type="State">
<ptitle>CA, USA</ptitle>
<placeref hlink="_cef2438892244290ca7fb5750"/>
</placeobj>
<placeobj handle="_cef244224d14af0273799b281e" change="1422124514" id="P0031" name="CO" type="State">
<ptitle>CO, USA</ptitle>
<placeref hlink="_cef2438892244290ca7fb5750"/>
</placeobj>
<placeobj handle="_cef24468f6e3a984bf57967e95d" change="1422124542" id="P0032" name="NV" type="State">
<ptitle>NV, USA</ptitle>
<placeref hlink="_cef2438892244290ca7fb5750"/>
</placeobj>
<placeobj handle="_cef245b044820b7405a1180f298" change="1422124666" id="P0033" name="Alameda Co." type="County">
<ptitle>Alameda Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef246117947f75e54c09680419" change="1422124908" id="P0034" name="Sacramento Co." type="County">
<ptitle>Sacramento Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef24668db23c27d421f51c667d" change="1422124741" id="P0035" name="San Francisco Co." type="County">
<ptitle>San Francisco Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef246c95c132bcf6a0255d4d17" change="1422124781" id="P0036" name="Santa Clara Co." type="County">
<ptitle>Santa Clara Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef2478a94b48a58d3be6a10493" change="1422124860" id="P0037" name="Conta Costa Co." type="County">
<ptitle>Conta Costa Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef24b7a76efa8b9d98d67ea5a" change="1422125273" id="P0038" name="Sonoma Co." type="County">
<ptitle>Sonoma Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef24c2e3592e759b7797f95465" change="1422125420" id="P0039" name="Yolo Co." type="County">
<ptitle>Yolo Co., CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef24d930653dc59ec3a36510e4" change="1422125493" id="P0040" name="Danville" type="City">
<ptitle>Danville, CA, USA</ptitle>
<placeref hlink="_cef243fb5634559442323368f63"/>
</placeobj>
<placeobj handle="_cef24ffc57f28a50ea65f0af645" change="1422125745" id="P0041" name="Denver Co." type="County">
<ptitle>Denver Co., CO, USA</ptitle>
<placeref hlink="_cef244224d14af0273799b281e"/>
</placeobj>
<placeobj handle="_cef2513e057732c3f27780750d" change="1422125877" id="P0042" name="Washoe Co." type="County">
<ptitle>Washoe Co., NV, USA</ptitle>
<placeref hlink="_cef24468f6e3a984bf57967e95d"/>
</placeobj>
</places>
<objects>
+118 -24
View File
@@ -3,11 +3,11 @@
"http://gramps-project.org/xml/1.6.0/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.6.0/">
<header>
<created date="2014-08-06" version="4.1.0"/>
<created date="2015-05-10" version="4.1.4"/>
<researcher>
<resname>Alex Roitman,,,</resname>
</researcher>
<mediapath>/home/cristina/gramps/master/example/gramps</mediapath>
<mediapath>/home/pierre/Gramps/master/example/gramps</mediapath>
</header>
<name-formats>
<format number="-1" name="SURNAME, Given (Common)" fmt_str="SURNAME, given (common)" active="1"/>
@@ -88,9 +88,14 @@
</event>
<event handle="_a5af0eb6abd74c3d7fb" change="1284030605" id="E0013">
<type>Birth</type>
<dateval val="1592"/>
<dateval val="1592" type="about"/>
<description>Birth of Abbott, Frances</description>
</event>
<event handle="_a5af0eb6abd74c3d7fc" change="1284030605" id="E3415">
<type>Death</type>
<dateval val="1642-01" type="about"/>
<description>Death of Abbott, Frances</description>
</event>
<event handle="_a5af0eb6add73de72aa" change="1284030598" id="E0014">
<type>Birth</type>
<dateval val="1520" type="about"/>
@@ -10024,7 +10029,7 @@
</event>
<event handle="_a5af0ecd27c36369bba" change="1284030606" id="E1894">
<type>Birth</type>
<dateval val="1737-10-01"/>
<dateval val="1737-10-01" type="after"/>
<place hlink="_N04KQC5Z5IGGUBSE9X"/>
<description>Birth of Adkins, John</description>
</event>
@@ -10091,7 +10096,7 @@
</event>
<event handle="_a5af0ecd429521b5d6b" change="1284030611" id="E1906">
<type>Birth</type>
<dateval val="1763-06-20"/>
<dateval val="1763-06-20" type="before"/>
<place hlink="_TGVJQCRFKHZESR6WNB"/>
<description>Birth of Adkins, Martha</description>
</event>
@@ -11459,7 +11464,7 @@
</event>
<event handle="_a5af0ecfc7f527e0191" change="1284030617" id="E2158">
<type>Birth</type>
<dateval val="1700-10-26"/>
<dateval val="1700-10-26" type="about"/>
<place hlink="_NR6KQCSNMPJHAJEWNV"/>
<description>Birth of Adams, William</description>
</event>
@@ -11477,13 +11482,13 @@
</event>
<event handle="_a5af0ecfcf201952525" change="1284030604" id="E2161">
<type>Birth</type>
<dateval val="1717"/>
<dateval val="1717" type="after"/>
<place hlink="_YS6KQCLHBN4N6TE5JL"/>
<description>Birth of Aguilar, Eleanor</description>
</event>
<event handle="_a5af0ecfd0a47d2ae44" change="1284030604" id="E2162">
<type>Death</type>
<dateval val="1760"/>
<dateval val="1760-02" type="after"/>
<place hlink="_HMVJQCAKOUGYE0JNVI"/>
<description>Death of Aguilar, Eleanor</description>
</event>
@@ -13977,13 +13982,13 @@
</event>
<event handle="_a5af0ed405d190cc4f9" change="1284030611" id="E2624">
<type>Birth</type>
<dateval val="1665"/>
<dateval val="1665" type="before"/>
<place hlink="_LP3KQCM533F3TRBKRT"/>
<description>Birth of Aguilar, John</description>
</event>
<event handle="_a5af0ed4070703f2665" change="1284030611" id="E2625">
<type>Death</type>
<dateval val="1745"/>
<dateval val="1745-02" type="before"/>
<place hlink="_W04KQCN0SLXWA1Z46O"/>
<description>Death of Aguilar, John</description>
</event>
@@ -20255,7 +20260,7 @@
<parentin hlink="_HQ8KQCT2UX4S9I0E26"/>
<citationref hlink="_c140d24b31f74169170"/>
</person>
<person handle="_3RFKQCNKMX9HVLNSLW" change="1185438865" id="I1116">
<person handle="_3RFKQCNKMX9HVLNSLW" change="1431174900" id="I1116">
<gender>F</gender>
<name type="Birth Name">
<surname>Garner</surname>
@@ -22099,7 +22104,7 @@
<parentin hlink="_JT4KQC83ZKPOLC0UEJ"/>
<citationref hlink="_c140d24fa2503a14583"/>
</person>
<person handle="_6TFKQCUTO94WB2NHN" change="1185438865" id="I1119">
<person handle="_6TFKQCUTO94WB2NHN" change="1431174900" id="I1119">
<gender>F</gender>
<name type="Birth Name">
<first>Zelpha Josephine</first>
@@ -22690,6 +22695,7 @@
<surname>Abbott</surname>
</name>
<eventref hlink="_a5af0eb6abd74c3d7fb" role="Primary"/>
<eventref hlink="_a5af0eb6abd74c3d7fc" role="Primary"/>
<parentin hlink="_CI3KQCZZE11QOAP8G9"/>
<citationref hlink="_c140d250e5d1110c14d"/>
</person>
@@ -23907,7 +23913,7 @@
<parentin hlink="_1RUJQCCL9MVRYLMTBO"/>
<citationref hlink="_c140d254dcc234394a3"/>
</person>
<person handle="_9QFKQC54ET79K2SD57" change="1185438865" id="I1115">
<person handle="_9QFKQC54ET79K2SD57" change="1431174900" id="I1115">
<gender>F</gender>
<name type="Birth Name">
<first>Mary M.</first>
@@ -24594,7 +24600,7 @@
<parentin hlink="_4W1KQCYZD6N5M576RA"/>
<citationref hlink="_c140d2566d57b164cf5"/>
</person>
<person handle="_AWFKQCJELLUWDY2PD3" change="1284030919" id="I1123">
<person handle="_AWFKQCJELLUWDY2PD3" change="1431174900" id="I1123">
<gender>M</gender>
<name type="Birth Name">
<first>Robert F.</first>
@@ -27176,7 +27182,7 @@
<parentin hlink="_0Q3KQCBZ4421A3L5B4"/>
<citationref hlink="_c140d25c5be3120050a"/>
</person>
<person handle="_EPFKQCETTDTEL3PYIR" change="1185438865" id="I1114">
<person handle="_EPFKQCETTDTEL3PYIR" change="1431174900" id="I1114">
<gender>F</gender>
<name type="Birth Name">
<first>Mary J.</first>
@@ -28220,7 +28226,7 @@
<parentin hlink="_BWAKQCZLIWDX9ZEFED"/>
<citationref hlink="_c140d25eec45aabbd80"/>
</person>
<person handle="_GNUJQCL9MD64AM56OH" change="1328027440" id="I0044">
<person handle="_GNUJQCL9MD64AM56OH" change="1431174904" id="I0044">
<gender>M</gender>
<name type="Birth Name">
<first>Lewis Anderson</first>
@@ -28448,7 +28454,7 @@
<childof hlink="_05XJQC935HU62H3KL4"/>
<citationref hlink="_c140d25f5c448b251ca"/>
</person>
<person handle="_GYFKQCPH8Q0JDN94GR" change="1185438865" id="I1126">
<person handle="_GYFKQCPH8Q0JDN94GR" change="1431174900" id="I1126">
<gender>F</gender>
<name type="Birth Name">
<first>Anetta</first>
@@ -32099,7 +32105,7 @@
<parentin hlink="_ZA6KQC27P0I8E2JZUC"/>
<citationref hlink="_c140d2677c105a1b132"/>
</person>
<person handle="_MUFKQCMXUJ07MCDUNI" change="1185438865" id="I1121">
<person handle="_MUFKQCMXUJ07MCDUNI" change="1431174900" id="I1121">
<gender>F</gender>
<name type="Birth Name">
<first>Iola Elizabeth Betty</first>
@@ -33273,7 +33279,7 @@
<parentin hlink="_9SEKQCAAWRUCIO7A0M"/>
<citationref hlink="_c140d269f4c7c13bf87"/>
</person>
<person handle="_ORFKQC4KLWEGTGR19L" change="1185438865" id="I1117">
<person handle="_ORFKQC4KLWEGTGR19L" change="1431174900" id="I1117">
<gender>F</gender>
<name type="Birth Name">
<first>Rebecca Catharine</first>
@@ -33957,7 +33963,7 @@
<parentin hlink="_IXDKQCOYLEMDKWJZPC"/>
<citationref hlink="_c140d26b98d33ec7f15"/>
</person>
<person handle="_PXFKQCXEHJX3W1Q1IV" change="1185438865" id="I1125">
<person handle="_PXFKQCXEHJX3W1Q1IV" change="1431174900" id="I1125">
<gender>F</gender>
<name type="Birth Name">
<first>Emma A.</first>
@@ -35689,7 +35695,7 @@
<parentin hlink="_FP4KQCQQX8O84KK3IF"/>
<citationref hlink="_c140d27142a05b2d019"/>
</person>
<person handle="_SOFKQCBYAO18OWC0CS" change="1185438865" id="I1113">
<person handle="_SOFKQCBYAO18OWC0CS" change="1431174900" id="I1113">
<gender>F</gender>
<name type="Birth Name">
<first>Phebe</first>
@@ -37062,7 +37068,7 @@
<parentin hlink="_7ZWJQC8ZR4WJZE09RW"/>
<citationref hlink="_c140d276c1802ec5ac3"/>
</person>
<person handle="_UZFKQCIHVT44DC9KGH" change="1185438865" id="I1128">
<person handle="_UZFKQCIHVT44DC9KGH" change="1431174900" id="I1128">
<gender>F</gender>
<name type="Birth Name">
<first>Antoinette</first>
@@ -42054,12 +42060,12 @@
<childref hlink="_GH0KQCGPLF5J17PELU"/>
<citationref hlink="_c140d286d0e2f46fb29"/>
</family>
<family handle="_8OUJQCUVZ0XML7BQLF" change="1185438865" id="F0018">
<family handle="_8OUJQCUVZ0XML7BQLF" change="1431174900" id="F0018">
<rel type="Married"/>
<father hlink="_35WJQC1B7T7NPV8OLV"/>
<mother hlink="_46WJQCIOLQ0KOX2XCC"/>
<eventref hlink="_a5af0ed602318310d6d" role="Family"/>
<childref hlink="_GNUJQCL9MD64AM56OH"/>
<childref hlink="_GNUJQCL9MD64AM56OH" mrel="Custom relationship to mother" frel="Custom relationship to father"/>
<childref hlink="_SOFKQCBYAO18OWC0CS"/>
<childref hlink="_EPFKQCETTDTEL3PYIR"/>
<childref hlink="_9QFKQC54ET79K2SD57"/>
@@ -63922,6 +63928,94 @@ page 26 Repository:Address</text>
<range start="0" end="705"/>
</style>
</note>
<note handle="_d0436bba4ec328d3b631259a4ee" change="1431184305" id="_header1" type="General">
<text>Title for the example pages</text>
<style name="fontcolor" value="#ef2929">
<range start="0" end="27"/>
</style>
<style name="underline">
<range start="0" end="27"/>
</style>
<style name="fontface" value="Serif">
<range start="0" end="27"/>
</style>
<style name="bold">
<range start="0" end="27"/>
</style>
<style name="fontsize" value="8">
<range start="0" end="27"/>
</style>
</note>
<note handle="_d0436bcc69d6bba278bff5bc7db" change="1431184300" id="_footer1" type="General">
<text>Footer: exported by __GRAMPS_HOMEPAGE__ on __EXPORT_DATE__</text>
</note>
<note handle="_d0436be64ac277b615b79b34e72" change="1431211661" id="_custom1" type="General">
<text>Export date: __EXPORT_DATE__
GRAMPS homepage: __GRAMPS_HOMEPAGE__
GRAMPS version: __GRAMPS_VERSION__
Number of families: __NB_FAMILIES__
Number of persons: __NB_INDIVIDUALS__
Number of media objects: __NB_MEDIA__
Number of sources: __NB_SOURCES__
Number of repositories: __NB_REPOSITORIES__
Number of places: __NB_PLACES__
Search form:
__SEARCH_FORM__
Test link person: Garner von Zieliński, Lewis Anderson Sr
Test link family: Family of Warner, Allen Carl and Garner, Rita Marie
Test link source: World of the Wierd
Test link media: 1897_expeditionsmannschaft_rio_a
Test link place: Warren-Farmington Hills-Troy, MI
Test internet link: blog.codinghorror.com
Test relative path link: relative file path to &quot;archive.zip&quot;
Test relative path link: relative file path to &quot;archive.tgz&quot;
Thumbnail for &quot;1897_expeditionsmannschaft_rio_a&quot;:
__THUMB_O0010__
Image &quot;AntoineClaudet&quot;:
__MEDIA_O0011__
Thumbnail for &quot;1897_expeditionsmannschaft_rio_a&quot; with link:
__THUMB_O0010__
Image &quot;AntoineClaudet&quot; with link:
__MEDIA_O0011__
Wrong media ID:
__MEDIA_wrong id__</text>
<style name="link" value="relative://relative.archive.zip">
<range start="663" end="686"/>
</style>
<style name="link" value="gramps://Media/handle/238CGQ939HG18SS5MG">
<range start="952" end="967"/>
</style>
<style name="link" value="gramps://Media/handle/238CGQ939HG18SS5MG">
<range start="520" end="535"/>
</style>
<style name="link" value="gramps://Family/handle/48TJQCGNNIR5SJRCAK">
<range start="413" end="429"/>
</style>
<style name="link" value="gramps://Person/handle/GNUJQCL9MD64AM56OH">
<range start="355" end="371"/>
</style>
<style name="link" value="http://blog.codinghorror.com/">
<range start="621" end="639"/>
</style>
<style name="link" value="gramps://Source/handle/VUBKMQTA2XZG1V6QP8">
<range start="483" end="499"/>
</style>
<style name="link" value="gramps://Place/handle/3WTJQCB9F2MX9W98VP">
<range start="570" end="585"/>
</style>
<style name="link" value="gramps://Media/handle/Y3ARGQWE088EQRTTDH">
<range start="1002" end="1017"/>
</style>
<style name="link" value="relative://relative.archive.tgz">
<range start="724" end="747"/>
</style>
</note>
</notes>
<bookmarks>
<bookmark target="person" hlink="_AWFKQCJELLUWDY2PD3"/>
+12 -10
View File
@@ -395,7 +395,7 @@ class ArgHandler(object):
:param: climan: the manager of a CLI session
:type: :class:`.CLIManager` object
"""
# Handle the "-l" List Family Trees option.
if self.list:
print(_('List of known Family Trees in your database path\n'))
@@ -406,6 +406,7 @@ class ArgHandler(object):
% {'full_DB_path' : dirname, 'f_t_name' : name})
sys.exit(0)
# Handle the "-L" List Family Trees in detail option.
if self.list_more:
print(_('Gramps Family Trees:'))
summary_list = self.dbman.family_tree_summary()
@@ -418,25 +419,26 @@ class ArgHandler(object):
print(_(" %s: %s") % (item, summary[item]))
sys.exit(0)
# Handle the "-t" List Family Trees, tab delimited option.
if self.list_table:
print(_('Gramps Family Trees:'))
summary_list = self.dbman.family_tree_summary()
if not summary_list:
sys.exit(0)
print(_("Family Tree"), end="")
# We have to construct the line elements together, to avoid
# insertion of blank spaces when print on the same line is used
line_list = [_("Family Tree")]
for key in sorted(summary_list[0]):
if key != "Family Tree":
print("\t ", end="")
print(key, end="")
print()
if key != _("Family Tree"):
line_list += [key]
print("\t".join(line_list))
for summary in sorted(summary_list,
key=lambda sum: sum[_("Family Tree")].lower()):
print('"%s"' % summary[_("Family Tree")], end="")
line_list = [('"%s"' % summary[_("Family Tree")])]
for item in sorted(summary):
if item != _("Family Tree"):
print("\t ", end="")
print('"%s"' % summary[item], end="")
print()
line_list += [('"%s"' % summary[item])]
print("\t".join(line_list))
sys.exit(0)
self.__open_action()
+3 -1
View File
@@ -497,6 +497,8 @@ def time_val(dirpath):
if tval_mod > tval:
tval = tval_mod
last = time.strftime('%x %X', time.localtime(tval))
if sys.version_info[0] < 3:
last = last.decode(glocale.encoding)
else:
tval = 0
last = _("Never")
@@ -517,6 +519,6 @@ def find_locker_name(dirpath):
# feature request 2356: avoid genitive form
last = _("Locked by %s") % username
ifile.close()
except (OSError, IOError):
except (OSError, IOError, UnicodeDecodeError):
last = _("Unknown")
return last
+4 -1
View File
@@ -297,7 +297,10 @@ class CLIManager(object):
# apply preferred researcher if loaded file has none
res = self.dbstate.db.get_researcher()
owner = get_researcher()
if res.get_name() == "" and owner.get_name() != "":
# If the DB Owner Info is empty and
# [default] Researcher is not empty and
# database is empty, then copy default researcher to DB owner
if res.is_empty() and not owner.is_empty() and self.dbstate.db.is_empty():
self.dbstate.db.set_researcher(owner)
name_displayer.set_name_format(self.dbstate.db.name_formats)
+1 -1
View File
@@ -117,7 +117,7 @@ class User(user.User):
"""
self._fileout.write("\r100%\n")
def prompt(self, title, message, accept_label, reject_label):
def prompt(self, title, message, accept_label, reject_label, parent=None):
"""
Prompt the user with a message to select an alternative.
+2
View File
@@ -169,6 +169,7 @@ register('geography.zoom', 0)
register('geography.zoom_when_center', 12)
register('geography.show_cross', False)
register('geography.path', "")
register('geography.use-keypad', True)
register('htmlview.start-url', "http://gramps-project.org")
register('htmlview.url-handler', False)
@@ -295,6 +296,7 @@ register('preferences.hide-ep-msg', False)
register('preferences.invalid-date-format', "<b>%s</b>")
register('preferences.iprefix', 'I%04d')
register('preferences.name-format', 1)
register('preferences.place-format', 0)
register('preferences.patronimic-surname', False)
register('preferences.no-given-text', "[%s]" % _("Missing Given Name"))
register('preferences.no-record-text', "[%s]" % _("Missing Record"))
+4 -7
View File
@@ -49,7 +49,7 @@ from .constfunc import get_env_var, conv_to_unicode
#
#-------------------------------------------------------------------------
PROGRAM_NAME = "Gramps"
from ..version import VERSION, VERSION_TUPLE, major_version
from gramps.version import VERSION, VERSION_TUPLE, major_version
#-------------------------------------------------------------------------
#
# Standard GRAMPS Websites
@@ -134,8 +134,8 @@ sys.path.insert(0, ROOT_DIR)
git_revision = get_git_revision(ROOT_DIR)
if sys.platform == 'win32' and git_revision == "":
git_revision = get_git_revision(os.path.split(ROOT_DIR)[1])
#VERSION += git_revision
VERSION += "-1"
VERSION += git_revision
#VERSION += "-1"
#
# Glade files
@@ -192,7 +192,7 @@ GTK_GETTEXT_DOMAIN = 'gtk30'
#
#-------------------------------------------------------------------------
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
"© 2007-2014 The Gramps Developers"
"© 2007-2015 The Gramps Developers"
COMMENTS = _("Gramps\n (Genealogical Research and Analysis "
"Management Programming System)\n"
"is a personal genealogy program.")
@@ -215,9 +215,6 @@ DOCUMENTERS = [
'Alexander Roitman',
]
TRANSLATORS = _('TRANSLATORS: Translate this to your '
'name in your native language')
#-------------------------------------------------------------------------
#
# Constants
+3 -1
View File
@@ -221,7 +221,9 @@ class DateDisplayCZ(DateDisplay):
# this must agree with DateDisplayEn's "formats" definition
# (since no locale-specific _display_gregorian exists, here)
def display(self, date):
display = DateDisplay.display_formatted
def orig_display(self, date):
"""
Return a text string representing the date.
"""
+45 -14
View File
@@ -75,20 +75,18 @@ class DateParserHR(DateParser):
compiles regular expression strings for matching dates
"""
DateParser.init_strings(self)
#~ DateParser.calendar_to_int.update({
#~ 'персидский' : Date.CAL_PERSIAN,
#~ 'п' : Date.CAL_PERSIAN,
#~ })
_span_1 = ['od']
_span_2 = ['do']
_range_1 = ['između']
_range_2 = ['i']
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
('|'.join(_span_1), '|'.join(_span_2)),
re.IGNORECASE)
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
('|'.join(_range_1), '|'.join(_range_2)),
re.IGNORECASE)
# match 'Day. MONTH year.' format with or without dots
self._text2 = re.compile('(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*\.?$'
% self._mon_str, re.IGNORECASE)
# match Day.Month.Year.
self._numeric = re.compile(
"((\d+)[/\. ])?\s*((\d+)[/\.])?\s*(\d+)\.?$")
self._span = re.compile(
"(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)",
re.IGNORECASE)
self._jtext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'\
% self._jmon_str, re.IGNORECASE)
#-------------------------------------------------------------------------
#
@@ -104,6 +102,39 @@ class DateDisplayHR(DateDisplay):
_bce_str = "%s p.n.e."
display = DateDisplay.display_formatted
def dd_dformat01(self, date_val):
"""
numerical
"""
if date_val[3]:
return self.display_iso(date_val)
else:
if date_val[0] == date_val[1] == 0:
return str(date_val[2]) + '.'
else:
value = self._tformat.replace('%m', str(date_val[1]))
value = value.replace('%d', str(date_val[0]))
value = value.replace('%Y', str(abs(date_val[2])))
return value
def dd_dformat04(self, date_val, inflect, long_months):
"""
day month_name year
"""
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year + '.'
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
return "{day:d}. {long_month.f[G]} {year}.".format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
#-------------------------------------------------------------------------
#
+17
View File
@@ -119,6 +119,23 @@ class DateDisplayRU(DateDisplay):
display = DateDisplay.display_formatted
def dd_dformat04(self, date_val, inflect, long_months):
"""
day month_name year -- for Russian locale
"""
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
return "{day:d} {long_month.f[Р]} {year}".format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
#-------------------------------------------------------------------------
#
# Register classes
+18 -237
View File
@@ -3,7 +3,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2004-2006 Donald N. Allingham
# Copyright (C) 2013 Fedir Zinchuk <fedikw[at]gmail.com>
# Copyright (C) 2013-2014 Fedir Zinchuk <fedikw[at]gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -42,7 +42,6 @@ from ..lib.date import Date
from ._dateparser import DateParser
from ._datedisplay import DateDisplay
from ._datehandler import register_datehandler
from . import _grampslocale
#-------------------------------------------------------------------------
#
@@ -51,53 +50,10 @@ from . import _grampslocale
#-------------------------------------------------------------------------
class DateParserUK(DateParser):
"""
Convert a text string into a Date object. If the date cannot be
Convert a text string into a :class:`.Date` object. If the date cannot be
converted, the text string is assigned.
"""
month_to_int = DateParser.month_to_int
# the genitive
month_to_int["січня"] = 1
month_to_int["лютого"] = 2
month_to_int["березня"] = 3
month_to_int["квітня"] = 4
month_to_int["травня"] = 5
month_to_int["червня"] = 6
month_to_int["липня"] = 7
month_to_int["серпня"] = 8
month_to_int["вересня"] = 9
month_to_int["жовтня"] = 10
month_to_int["листопада"] = 11
month_to_int["грудня"] = 12
# some short variants of the months
month_to_int["січ."] = 1
month_to_int["січ"] = 1
month_to_int["лют."] = 2
month_to_int["лют"] = 2
month_to_int["бер."] = 3
month_to_int["бер"] = 3
month_to_int["квіт."] = 4
month_to_int["квіт"] = 4
month_to_int["трав."] = 5
month_to_int["трав"] = 5
month_to_int["черв."] = 6
month_to_int["черв"] = 6
month_to_int["лип."] = 7
month_to_int["лип"] = 7
month_to_int["серп."] = 8
month_to_int["серп"] = 8
month_to_int["вер."] = 9
month_to_int["вер"] = 9
month_to_int["жовт."] = 10
month_to_int["жовт"] = 10
month_to_int["лист."] = 11
month_to_int["лист"] = 11
month_to_int["груд."] = 12
month_to_int["груд"] = 12
# modifiers before the date
modifier_to_int = {
'перед' : Date.MOD_BEFORE,
@@ -116,89 +72,6 @@ class DateParserUK(DateParser):
'біля' : Date.MOD_ABOUT,
}
hebrew_to_int = {
"тішрі" : 1, "хешвен" : 2, "кіслев" : 3,
"тевет" : 4, "шват" : 5, "адар" : 6,
"адара" : 7, "нісан" : 8, "іяр" : 9,
"сиван" : 10, "таммуз" : 11, "ав" : 12,
"елул" : 13,
#alternative spelling
"мархешван": 2, "ве адар" : 7,
#GEDCOM months
"tsh" : 1, "csh": 5, "ksl": 3, "tvt": 4, "shv": 5, "adr": 6,
"ads" : 7, "nsn": 8, "iyr": 9, "svn":10, "tmz":11, "aav":12,
"ell":13,
}
french_to_int = {
'вандем’єр' : 1, 'брюмер' : 2,
'фрімер' : 3, 'нівоз' : 4,
'плювіоз' : 5, 'вентоз' : 6,
'жерміналь' : 7, 'флореаль' : 8,
'преріаль' : 9, 'мессідор' : 10,
'термідор' : 11, 'фрюктідор': 12,
'додатковий' : 13,
#short
'ванд' : 1, 'брюм' : 2,
'фрім' : 3, 'нів' : 4,
'плюв' : 5, 'вент' : 6,
'жерм' : 7, 'флор' : 8,
'прер' : 9, 'месс' : 10,
'терм' : 11, 'фрюкт': 12,
'дод' : 13,
#GEDCOM months
'vend' : 1, 'brum' : 2,
'frim' : 3, 'nivo' : 4,
'pluv' : 5, 'vent' : 6,
'germ' : 7, 'flor' : 8,
'prai' : 9, 'mess' : 10,
'ther' : 11, 'fruc' : 12,
'comp' : 13,
}
islamic_to_int = {
"мухаррам" : 1, "мухаррем" : 1,
"сафар" : 2, "рабі-аль-авваль" : 3,
"рабі-ассані" : 4,
"джумада-аль-уля" : 5, "джумада-аль-авваль" : 5,
"джумада-аль-ахіра" : 6, "джумада-ас-сані" : 6,
"раджаб" : 7, "шаабан" : 8,
"рамадан" : 9, "рамазан" : 9,
"шавваль" : 10, "зуль-каада" : 11,
"зуль-хіджжа" : 12,
}
persian_to_int = {
"фарвардін" : 1, "ордібехешт" : 2,
"хордад" : 3, "тир" : 4,
"мордад" : 5, "шахрівар" : 6,
"мехр" : 7, "абан" : 8,
"азар" : 9, "дей" : 10,
"бахман" : 11, "есфанд" : 12,
}
bce = ['до нашої ери', 'до н. е.', 'до н.е.']
calendar_to_int = {
'григоріанський' : Date.CAL_GREGORIAN,
'г' : Date.CAL_GREGORIAN,
'юліанський' : Date.CAL_JULIAN,
'ю' : Date.CAL_JULIAN,
'єврейський' : Date.CAL_HEBREW,
'є' : Date.CAL_HEBREW,
'ісламський' : Date.CAL_ISLAMIC,
'і' : Date.CAL_ISLAMIC,
'французький' : Date.CAL_FRENCH,
'французький республіканський': Date.CAL_FRENCH,
'французький революційний' : Date.CAL_FRENCH,
'ф' : Date.CAL_FRENCH,
'іранський' : Date.CAL_PERSIAN,
'перський' : Date.CAL_PERSIAN,
'п' : Date.CAL_PERSIAN,
'шведський' : Date.CAL_SWEDISH,
'ш' : Date.CAL_SWEDISH,
}
quality_to_int = {
'за оцінкою' : Date.QUAL_ESTIMATED,
'за оц.' : Date.QUAL_ESTIMATED,
@@ -206,6 +79,7 @@ class DateParserUK(DateParser):
'орієнтовно' : Date.QUAL_ESTIMATED,
'приблизно' : Date.QUAL_ESTIMATED,
'прибл.' : Date.QUAL_ESTIMATED,
'підраховано' : Date.QUAL_CALCULATED,
'підрах.' : Date.QUAL_CALCULATED,
'розраховано' : Date.QUAL_CALCULATED,
@@ -213,6 +87,11 @@ class DateParserUK(DateParser):
'розрах.' : Date.QUAL_CALCULATED,
}
bce = [
'до нашої ери', 'до н. е.', 'до н.е.',
'до народження Христа'
] + DateParser.bce
def init_strings(self):
"""
This method compiles regular expression strings for matching dates.
@@ -221,12 +100,19 @@ class DateParserUK(DateParser):
"""
DateParser.init_strings(self)
DateParser.hebrew_to_int.update({
'мархешван': 2,
'ве адар' : 7,
'адар бет' : 7,
'авів' : 8,
})
_span_1 = ['з', 'від']
# b.c.e. pattern also have "до" so skip "до н."
_span_2 = ['по', 'до?!\sн\.']
_span_2 = ['по', 'до(?!\s+н)']
_range_1 = ['між']
_range_2 = ['і', 'та']
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
('|'.join(_span_1), '|'.join(_span_2)),
re.IGNORECASE)
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
@@ -243,115 +129,10 @@ class DateDisplayUK(DateDisplay):
Ukrainian language date display class.
"""
# the months as the noun or as the genitive???
# as the genitive:
long_months = (
"", "січня", "лютого", "березня", "квітня",
"травня", "червня", "липня", "серпня",
"вересня", "жовтня", "листопада", "грудня"
)
# as the noun:
# long_months = (
# "", "січень", "лютий", "березень", "квітень",
# "травень", "червень", "липень", "серпень",
# "вересень", "жовтень", "листопад", "грудень"
# )
short_months = (
"", "січ.", "лют.", "бер.", "квіт.", "трав.", "черв.",
"лип.", "серп.", "вер.", "жовт.", "лист.", "груд."
)
hebrew = (
"", "тішрі", "хешвен", "кіслев", "тевет", "шват",
"адар", "адара", "нісан", "іяр", "сиван", "таммуз",
"ав", "елул"
)
french = (
'', 'вандем’єр', 'брюмер', 'фрімер', 'нівоз',
'плювіоз', 'вентоз', 'жерміналь', 'флореаль',
'преріаль', 'мессідор', 'термідор', 'фрюктідор',
'додатковий'
)
persian = (
"", "фарвардін", "ордібехешт", "хордад", "тир",
"мордад", "шахрівар", "мехр", "абан",
"азар", "дей", "бахман", "есфанд"
)
islamic = (
"", "мухаррам", "сафар", "рабі-аль-авваль",
"рабі-ассані", "джумада-аль-уля", "джумада-аль-ахіра",
"раджаб", "шаабан", "рамадан", "шавваль", "зуль-каада",
"зуль-хіджжа",
)
# Replace the previous "Numerical" by a string which
# do have an explicit meaning: "System default (format)"
_locale_tformat = _grampslocale.tformat
_locale_tformat = _locale_tformat.replace('%d', "д")
_locale_tformat = _locale_tformat.replace('%m', "м")
_locale_tformat = _locale_tformat.replace('%Y', "р")
formats = (
"рррр-мм-дд (ISO)", #0
"стандартний для системи (" + _locale_tformat + ")", #1
"місяць день, рік", #2
"міс. дд, рррр", #3
"день місяць рік", #4
"дд міс. рррр" #5
)
# this must agree with DateDisplayEn's "formats" definition
# (since no locale-specific _display_gregorian exists, here)
calendar = (
"", "юліанський", "єврейський", "французький республіканський",
"іранський", "ісламський", "шведський"
)
_mod_str = ("", "до ", "після ", "близько ", "", "", "")
_qual_str = ("", "орієнтовно ", "розрахунково ")
_bce_str = "%s до н.е."
def display(self, date):
"""
Return a text string representing the date.
"""
mod = date.get_modifier()
cal = date.get_calendar()
qual = date.get_quality()
start = date.get_start_date()
newyear = date.get_new_year()
display = DateDisplay.display_formatted
qual_str = self._qual_str[qual]
if mod == Date.MOD_TEXTONLY:
return date.get_text()
elif start == Date.EMPTY:
return ""
elif mod == Date.MOD_SPAN:
d1 = self.display_cal[cal](start)
d2 = self.display_cal[cal](date.get_stop_date())
scal = self.format_extras(cal, newyear)
return "%sз %s %s %s%s" % (qual_str, d1, 'по', d2,
scal)
elif mod == Date.MOD_RANGE:
d1 = self.display_cal[cal](start)
d2 = self.display_cal[cal](date.get_stop_date())
scal = self.format_extras(cal, newyear)
return "%s%s %s %s %s%s" % (qual_str, 'між', d1, 'та',
d2, scal)
else:
text = self.display_cal[date.get_calendar()](start)
scal = self.format_extras(cal, newyear)
return "%s%s%s%s" % (qual_str, self._mod_str[mod],
text, scal)
#-------------------------------------------------------------------------
#
+200 -100
View File
@@ -3,6 +3,8 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2004-2006 Donald N. Allingham
# Copyright (C) 2013 Vassilii Khachaturov
# Copyright (C) 2014 Paul Franklin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -65,7 +67,7 @@ class DateDisplay(object):
# such as YY.MM.DD, MM-DD-YY, or whatever your locale prefers.
# This should be the format that is used under the locale by
# strftime() for '%x'.
# You may translate this string as "Numerical", "System preferred", or similar.
# You may translate this as "Numerical", "System preferred", or similar.
_("date format|Numerical"),
# Full month name, day, year
@@ -83,10 +85,11 @@ class DateDisplay(object):
"""
.. note:: Will be overridden if a locale-specific date displayer exists.
If your localized :meth:`~_display_calendar`/:meth:`~_display_gregorian` are
overridden,you should override the whole formats list according to your own
formats, and you need not localize the format names here. This ``formats``
must agree with :meth:`~_display_calendar`/:meth:`~_display_gregorian`.
If your localized :meth:`~_display_calendar`/:meth:`~_display_gregorian`
are overridden, you should override the whole formats list according
to your own formats, and you need not localize the format names here.
This ``formats`` must agree with
:meth:`~_display_calendar`/:meth:`~_display_gregorian`.
"""
del _
@@ -182,18 +185,21 @@ class DateDisplay(object):
: _("and|{long_month} {year}"),
"before"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "before"
# If "before <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("before|{long_month} {year}"),
"after"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "after"
# If "after <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("after|{long_month} {year}"),
"about"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "about"
# If "about <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("about|{long_month} {year}"),
# TODO if no modifier, but with qual, might need to inflect in some lang.
@@ -220,12 +226,21 @@ class DateDisplay(object):
: _("and|{short_month} {year}"),
"before"
# If "before <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("before|{short_month} {year}"),
"after"
# If "after <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("after|{short_month} {year}"),
"about"
# If "about <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("about|{short_month} {year}"),
}
@@ -257,8 +272,9 @@ class DateDisplay(object):
"""
Return a text string representing the date.
(Will be overridden if a locale-specific date displayer exists.)
Disregard any format settings and use display_iso for each date.
(Will be overridden if a locale-specific date displayer exists.)
"""
mod = date.get_modifier()
cal = date.get_calendar()
@@ -374,15 +390,24 @@ class DateDisplay(object):
date_stop=d2,
nonstd_calendar_and_ny=scal)
else:
text = self.display_cal[date.get_calendar()](start,
# If there is no special inflection for "before/after/around <Month>" in your
# language, don't translate this string.
# Otherwise, translate it to the ENGLISH!!! ENGLISH!!!
# key appearing above in the FORMATS_... dict
# that maps to the special inflected format string that you need to localize.
# TODO are there languages for which the inflections for the different
# modifiers are different?!
inflect=_("before-date|") if mod != Date.MOD_NONE else "")
if mod == Date.MOD_BEFORE:
# If there is no special inflection for "before <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "before" in ENGLISH!!! ENGLISH!!!
date_type = _("before-date|")
elif mod == Date.MOD_AFTER:
# If there is no special inflection for "after <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "after" in ENGLISH!!! ENGLISH!!!
date_type = _("after-date|")
elif mod == Date.MOD_ABOUT:
# If there is no special inflection for "about <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "about" in ENGLISH!!! ENGLISH!!!
date_type = _("about-date|")
else:
date_type = ""
text = self.display_cal[cal](start, inflect=date_type)
scal = self.format_extras(cal, newyear)
return _("{date_quality}{noncompound_modifier}{date}"
"{nonstd_calendar_and_ny}").format(
@@ -398,104 +423,178 @@ class DateDisplay(object):
# Julian and Swedish date display is the same as Gregorian
_display_julian = _display_swedish = _display_gregorian
def format_long_month_year(self, month, year, inflect, long_months):
if not hasattr(long_months[1], 'f'): # not a Lexeme: no inflection
return "{long_month} {year}".format(
long_month = long_months[month], year = year)
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[month], year = year)
def format_short_month_year(self, month, year, inflect, short_months):
if not hasattr(short_months[1], 'f'): # not a Lexeme: no inflection
return "{short_month} {year}".format(
short_month = short_months[month], year = year)
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[month], year = year)
def format_long_month(self, month, inflect, long_months):
if not hasattr(long_months[1], 'f'): # not a Lexeme: no inflection
return "{long_month}".format(long_month = long_months[month])
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[month], year = '').rstrip()
def format_short_month(self, month, inflect, short_months):
if not hasattr(short_months[1], 'f'): # not a Lexeme: no inflection
return "{short_month}".format(short_month = short_months[month])
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[month], year = '').rstrip()
def dd_dformat01(self, date_val):
"""
numerical
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
if date_val[3]:
return self.display_iso(date_val)
else:
if date_val[0] == date_val[1] == 0:
return str(date_val[2])
else:
value = self._tformat.replace('%m', str(date_val[1]))
if date_val[0] == 0: # ignore the zero day and its delimiter
i_day = value.find('%d')
value = value.replace(value[i_day:i_day+3], '')
value = value.replace('%d', str(date_val[0]))
value = value.replace('%Y', str(abs(date_val[2])))
return value.replace('-', '/')
def dd_dformat02(self, date_val, inflect, long_months):
"""
month_name day, year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{long_month} {day:d}, {year}").format(
long_month = self.format_long_month(date_val[1],
inflect,
long_months),
day = date_val[0],
year = year)
def dd_dformat03(self, date_val, inflect, short_months):
"""
month_abbreviation day, year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_short_month_year(date_val[1], year,
inflect, short_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{short_month} {day:d}, {year}").format(
short_month = self.format_short_month(date_val[1],
inflect,
short_months),
day = date_val[0],
year = year)
def dd_dformat04(self, date_val, inflect, long_months):
"""
day month_name year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{day:d} {long_month} {year}").format(
day = date_val[0],
long_month = self.format_long_month(date_val[1],
inflect,
long_months),
year = year)
def dd_dformat05(self, date_val, inflect, short_months):
"""
day month_abbreviation year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_short_month_year(date_val[1], year,
inflect, short_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{day:d} {short_month} {year}").format(
day = date_val[0],
short_month = self.format_short_month(date_val[1],
inflect,
short_months),
year = year)
def _display_calendar(self, date_val, long_months, short_months = None,
inflect=""):
inflect=""):
"""
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
if short_months is None:
# Let the short formats work the same as long formats
short_months = long_months
_ = self._locale.translation.sgettext
# this one must agree with DateDisplayEn's "formats" definition
# (it may be overridden if a locale-specific date displayer exists)
year = self._slash_year(date_val[2], date_val[3])
# For partial dates, several formats reduce to just month + year.
def format_long_month_year():
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[date_val[1]],
year = year)
def format_short_month_year():
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[date_val[1]],
year = year)
if self.format == 0:
return self.display_iso(date_val)
elif self.format == 1:
# numerical
if date_val[3]:
return self.display_iso(date_val)
else:
if date_val[0] == date_val[1] == 0:
value = str(date_val[2])
else:
value = self._tformat.replace('%m', str(date_val[1]))
value = value.replace('%d', str(date_val[0]))
value = value.replace('%Y', str(abs(date_val[2])))
value = value.replace('-', '/')
value = self.dd_dformat01(date_val)
elif self.format == 2:
# month_name day, year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_long_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{long_month} {day:d}, {year}").format(
long_month = long_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat02(date_val, inflect, long_months)
elif self.format == 3:
# month_abbreviation day, year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_short_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{short_month} {day:d}, {year}").format(
short_month = short_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat03(date_val, inflect, short_months)
elif self.format == 4:
# day month_name year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_long_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{day:d} {long_month} {year}").format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
value = self.dd_dformat04(date_val, inflect, long_months)
# elif self.format == 5:
else:
# day month_abbreviation year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_short_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{day:d} {short_month} {year}").format(
short_month = short_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat05(date_val, inflect, short_months)
if date_val[2] < 0:
# TODO fix BUG 7064: non-Gregorian calendars wrongly use BCE notation for negative dates
return self._bce_str % value
@@ -532,3 +631,4 @@ class DateDisplayEn(DateDisplay):
display = DateDisplay.display_formatted
_locale = DateDisplay._locale # normally set in register_datehandler
+6 -2
View File
@@ -629,8 +629,12 @@ class DateParser(object):
else:
y = self._get_int(groups[4])
if self.dmy:
m = self._get_int(groups[3])
d = self._get_int(groups[1])
if groups[3] is None:
m = self._get_int(groups[1])
d = 0
else:
m = self._get_int(groups[3])
d = self._get_int(groups[1])
else:
m = self._get_int(groups[1])
d = self._get_int(groups[3])
+6 -1
View File
@@ -27,6 +27,7 @@ Class handling language-specific selection for date parser and displayer.
# Python modules
#
#-------------------------------------------------------------------------
import sys
import time
#-------------------------------------------------------------------------
@@ -35,6 +36,7 @@ import time
#
#-------------------------------------------------------------------------
from ..lib.date import Date
from ..const import GRAMPS_LOCALE as glocale
from . import LANG_TO_DISPLAY, LANG, parser, displayer
#--------------------------------------------------------------
@@ -94,4 +96,7 @@ def format_time(secs):
"""
t = time.localtime(secs)
d = Date(t.tm_year, t.tm_mon, t.tm_mday)
return displayer.display(d) + time.strftime(' %X', t)
if sys.version_info[0] < 3:
return displayer.display(d) + time.strftime(' %X', t).decode(glocale.encoding)
else:
return displayer.display(d) + time.strftime(' %X', t)
+1
View File
@@ -194,6 +194,7 @@ except:
'10/25/2005' : '%m/%d/%Y',
'2005/10/25' : '%Y/%m/%d',
'25.10.2005' : '%d.%m.%Y',
'25.10.2005.' : '%d.%m.%Y.',
'10.25.2005' : '%m.%d.%Y',
'2005.10.25' : '%Y.%m.%d',
}
+3 -1
View File
@@ -39,7 +39,7 @@ __all__ = (
('DBPAGE', 'DBMODE', 'DBCACHE', 'DBLOCKS', 'DBOBJECTS', 'DBUNDO',
'DBEXT', 'DBMODE_R', 'DBMODE_W', 'DBUNDOFN', 'DBLOCKFN',
'DBRECOVFN','BDBVERSFN', 'DBLOGNAME', 'DBFLAGS_O', 'DBFLAGS_R',
'DBFLAGS_D',
'DBFLAGS_D', 'SCHVERSFN', 'PCKVERSFN'
) +
('PERSON_KEY', 'FAMILY_KEY', 'SOURCE_KEY', 'CITATION_KEY',
@@ -55,6 +55,8 @@ DBUNDOFN = "undo.db" # File name of 'undo' database
DBLOCKFN = "lock" # File name of lock file
DBRECOVFN = "need_recover" # File name of recovery file
BDBVERSFN = "bdbversion.txt"# File name of Berkeley DB version file
SCHVERSFN = "schemaversion.txt"# File name of schema version file
PCKVERSFN = "pickleupgrade.txt" # Indicator that pickle has been upgrade t Python3
DBLOGNAME = ".Db" # Name of logger
DBMODE_R = "r" # Read-only access
DBMODE_W = "w" # Full Read/Write access
+13 -4
View File
@@ -444,6 +444,7 @@ class DbBsddbRead(DbReadBase, Callback):
self.citation_map = {}
self.repository_map = {}
self.note_map = {}
self.tag_map = {}
self.media_map = {}
self.event_map = {}
self.metadata = {}
@@ -1014,6 +1015,18 @@ class DbBsddbRead(DbReadBase, Callback):
"""
return self.get_number_of_records(self.tag_map)
def is_empty(self):
"""
Return true if there are no [primary] records in the database
"""
for obj_map in [self.person_map, self.family_map, self.event_map,
self.place_map, self.source_map, self.citation_map,
self.media_map, self.repository_map, self.note_map,
self.tag_map]:
if self.get_number_of_records(obj_map) > 0:
return False
return True
def all_handles(self, table):
""" return all the keys of a database table
@@ -1654,10 +1667,6 @@ class DbBsddbRead(DbReadBase, Callback):
handle = handle.encode('utf-8')
try:
return table.get(handle, txn=self.txn)
except UnicodeDecodeError:
#we need to assume we opened data in python3 saved in python2
raw = table.db.get(handle, txn=self.txn)
return pickle.loads(raw, encoding='utf-8')
except DBERRS as msg:
self.__log_error()
raise DbError(msg)
+29 -3
View File
@@ -66,6 +66,27 @@ from gramps.gui.dialog import (InfoDialog)
LOG = logging.getLogger(".upgrade")
def gramps_upgrade_pickle(self):
"""
Upgrade to python3 pickle protocol.
"""
import pickle
tables = (self.person_map, self.event_map, self.family_map, self.place_map,
self.repository_map, self.source_map, self.citation_map,
self.media_map, self.note_map, self.tag_map, self.metadata,
self.reference_map)
self.set_total(sum(map(len, tables)))
for data_map in tables:
for handle in data_map.keys():
raw = data_map.db.get(handle)
data = pickle.loads(raw, encoding='utf-8')
with BSDDBTxn(self.env, data_map) as txn:
txn.put(handle, data)
self.update()
with BSDDBTxn(self.env, self.metadata) as txn:
txn.put(b'upgraded', 'Yes')
def gramps_upgrade_17(self):
"""
Upgrade database from version 16 to 17.
@@ -252,7 +273,10 @@ def gramps_upgrade_17(self):
# Modify Media
# ---------------------------------
# Add new checksum field.
base_path = self.metadata.get(b'mediapath', '')
base_path = self.metadata.get(b'mediapath')
if base_path is None:
# Check that the mediapath is not set to None (bug #7844).
base_path = ''
for handle in self.media_map.keys():
media = self.media_map[handle]
new_media = list(media)
@@ -656,7 +680,9 @@ def gramps_upgrade_16(self):
private)
LOG.debug(" upgrade new_source %s" % [new_source])
with BSDDBTxn(self.env, self.source_map) as txn:
txn.put(str(handle), new_source)
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_source)
self.update()
LOG.debug("%d sources upgraded with %d citations in %d seconds" %
@@ -859,12 +885,12 @@ def convert_source_list_to_citation_list_16(self, source_list):
new_citation = (new_handle, new_gramps_id,
date, page, confidence, ref, note_list, new_media_list,
new_data_map, new_change, private)
citation_list.append((new_handle))
with BSDDBTxn(self.env, self.citation_map) as txn:
if isinstance(new_handle, UNITYPE):
new_handle = new_handle.encode('utf-8')
txn.put(new_handle, new_citation)
self.cmap_index += 1
citation_list.append((new_handle))
return citation_list
def gramps_upgrade_15(self):
+79 -16
View File
@@ -396,6 +396,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.brief_name = None
self.update_env_version = False
self.update_python_version = False
self.update_pickle_version = False
def catch_db_error(func):
"""
@@ -734,6 +735,26 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__check_python_version(name, force_python_upgrade)
# Check for pickle upgrade
versionpath = os.path.join(self.path, cuni(PCKVERSFN))
if sys.version_info[0] >= 3 and not os.path.isfile(versionpath) and \
not self.readonly and not self.update_pickle_version:
_LOG.debug("Make backup in case there is a pickle upgrade")
self.__make_zip_backup(name)
self.update_pickle_version = True
# Check for schema upgrade
versionpath = os.path.join(self.path, cuni(SCHVERSFN))
if os.path.isfile(versionpath):
with open(versionpath, "r") as version_file:
schema_version = int(version_file.read().strip())
else:
schema_version = 0
if not self.readonly and schema_version < _DBVERSION and \
force_schema_upgrade:
_LOG.debug("Make backup in case there is a schema upgrade")
self.__make_zip_backup(name)
# Set up database environment
self.env = db.DBEnv()
self.env.set_cachesize(0, DBCACHE)
@@ -788,7 +809,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__close_early()
raise DbVersionError(tree_vers, _MINVERSION, _DBVERSION)
self.__load_metadata()
gstats = self.metadata.get(b'gender_stats', default=None)
# Ensure version info in metadata
@@ -799,6 +819,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# New database. Set up the current version.
#self.metadata.put(b'version', _DBVERSION, txn=the_txn)
txn.put(b'version', _DBVERSION)
txn.put(b'upgraded', 'Yes')
elif b'version' not in self.metadata:
# Not new database, but the version is missing.
# Use 0, but it is likely to fail anyway.
@@ -844,7 +865,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if isinstance(version, UNITYPE):
version = version.encode('utf-8')
version_file.write(version)
_LOG.debug("Updated BDBVERSFN file to %s" % str(db.version()))
_LOG.debug("Updated bsddb version file to %s" % str(db.version()))
if self.update_python_version:
versionpath = os.path.join(name, "pythonversion.txt")
@@ -860,6 +881,21 @@ class DbBsddb(DbBsddbRead, DbWriteBase, 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.update_pickle_version:
from . import upgrade
UpdateCallback.__init__(self, callback)
upgrade.gramps_upgrade_pickle(self)
versionpath = os.path.join(name, cuni(PCKVERSFN))
with open(versionpath, "w") as version_file:
version = "Yes"
if sys.version_info[0] <3:
if isinstance(version, UNITYPE):
version = version.encode('utf-8')
version_file.write(version)
_LOG.debug("Updated pickle version file to %s" % str(version))
self.__load_metadata()
if self.need_schema_upgrade():
oldschema = self.metadata.get(b'version', default=0)
newschema = _DBVERSION
@@ -867,6 +903,14 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
(oldschema, newschema))
if force_schema_upgrade == True:
self.gramps_upgrade(callback)
versionpath = os.path.join(name, cuni(SCHVERSFN))
with open(versionpath, "w") as version_file:
version = str(_DBVERSION)
if sys.version_info[0] <3:
if isinstance(version, UNITYPE):
version = version.encode('utf-8')
version_file.write(version)
_LOG.debug("Updated schema version file to %s" % str(version))
else:
self.__close_early()
clear_lock_file(name)
@@ -936,12 +980,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# bookmarks
def meta(key):
try:
return self.metadata.get(key, default=[])
except UnicodeDecodeError:
#we need to assume we opened data in python3 saved in python2
raw = self.metadata.db.get(key, default=[])
return pickle.loads(raw, encoding='utf-8') if raw else raw
return self.metadata.get(key, default=[])
self.bookmarks.set(meta(b'bookmarks'))
self.family_bookmarks.set(meta(b'family_bookmarks'))
@@ -1235,7 +1274,11 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
existing_references = set()
primary_cur = self.get_reference_map_primary_cursor()
try:
ret = primary_cur.set(handle)
if isinstance(handle, UNITYPE):
key = handle.encode('utf-8')
else:
key = handle
ret = primary_cur.set(key)
except:
ret = None
@@ -1311,7 +1354,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
"""
if isinstance(key, tuple):
#create a string key
key = str(key)
if sys.version_info[0] >= 3:
key= str(key)
else:
key = str(tuple(k.encode('utf-8') for k in key))
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
if self.readonly or not key:
@@ -2135,10 +2181,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
handle = handle.encode('utf-8')
try:
data = data_map.get(handle, txn=self.txn)
except UnicodeDecodeError:
#we need to assume we opened data in python3 saved in python2
raw = data_map.db.get(handle, txn=self.txn)
data = pickle.loads(raw, encoding='utf-8')
except:
data = None
# under certain circumstances during a database reload,
@@ -2330,8 +2372,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
version = self.metadata.get(b'version', default=_MINVERSION)
t = time.time()
from . import upgrade
if version < 14:
upgrade.gramps_upgrade_14(self)
if version < 15:
@@ -2428,6 +2471,24 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
with open(versionpath, "w") as version_file:
version_file.write(version)
# The pickle upgrade file is not written for Python2; its contents is
# never actually examined, all that matters is whether it is present
if sys.version_info[0] >= 3:
versionpath = os.path.join(name, cuni(PCKVERSFN))
_LOG.debug("Write pickle version file to %s" % "Yes")
with open(versionpath, "w") as version_file:
version = "Yes"
version_file.write(version)
versionpath = os.path.join(name, cuni(SCHVERSFN))
_LOG.debug("Write schema version file to %s" % str(_DBVERSION))
with open(versionpath, "w") as version_file:
version = str(_DBVERSION)
if sys.version_info[0] <3:
if isinstance(version, UNITYPE):
version = version.encode('utf-8')
version_file.write(version)
self.metadata.close()
self.env.close()
@@ -2468,7 +2529,9 @@ def write_lock_file(name):
try:
user = os.getlogin()
except:
user = os.environ['USER'] #not win, don't need get_env_var
# not win, so don't need get_env_var.
# under cron getlogin() throws and there is no USER.
user = os.environ.get('USER', 'noUSER')
if host:
text = "%s@%s" % (user, host)
else:
+70
View File
@@ -0,0 +1,70 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2014 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
Class handling displaying of places.
"""
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from ..utils.location import get_location_list
try:
from ..config import config
WITH_GRAMPS_CONFIG=True
except ImportError:
WITH_GRAMPS_CONFIG=False
#-------------------------------------------------------------------------
#
# PlaceDisplay class
#
#-------------------------------------------------------------------------
class PlaceDisplay(object):
def __init__(self):
if WITH_GRAMPS_CONFIG:
self.default_format = config.get('preferences.place-format')
else:
self.default_format = 0
def display_event(self, db, event):
if not event:
return ""
place_handle = event.get_place_handle()
if place_handle:
place = db.get_place_from_handle(place_handle)
return self.display(db, place, event.get_date_object())
else:
return ""
def display(self, db, place, date=None):
if not place:
return ""
if self.default_format == 0:
return place.title
elif self.default_format == 1:
names = [item[0] for item in get_location_list(db, place, date)]
return ", ".join(names)
displayer = PlaceDisplay()
+3 -2
View File
@@ -35,6 +35,7 @@ from ...datehandler import parser
from ...lib.eventtype import EventType
from . import Rule
from ...utils.db import get_participant_from_event
from ...display.place import displayer as place_displayer
#-------------------------------------------------------------------------
#
@@ -87,8 +88,8 @@ class HasEventBase(Rule):
place_id = event.get_place_handle()
if place_id:
place = db.get_place_from_handle(place_id)
place_name = place.get_title()
if not self.match_substring(2, place_name):
place_title = place_displayer.display(db, place)
if not self.match_substring(2, place_title):
return False
else:
return False
+3 -1
View File
@@ -32,6 +32,7 @@ _ = glocale.translation.gettext
#
#-------------------------------------------------------------------------
from ....datehandler import parser
from ....display.place import displayer as place_displayer
from ....lib.eventtype import EventType
from .. import Rule
@@ -74,7 +75,8 @@ class HasData(Rule):
place_id = event.get_place_handle()
if place_id:
place = db.get_place_from_handle(place_id)
if not self.match_substring(2, place.get_title()):
place_title = place_displayer.display(db, place)
if not self.match_substring(2, place_title):
# No match
return False
else:
+3 -1
View File
@@ -32,6 +32,7 @@ _ = glocale.translation.gettext
#
#-------------------------------------------------------------------------
from ....datehandler import parser
from ....display.place import displayer as place_displayer
from ....lib.eventtype import EventType
from ....lib.eventroletype import EventRoleType
from .. import Rule
@@ -78,7 +79,8 @@ class HasBirth(Rule):
place_id = event.get_place_handle()
if place_id:
place = db.get_place_from_handle(place_id)
if not self.match_substring(1, place.get_title()):
place_title = place_displayer.display(db, place)
if not self.match_substring(1, place_title):
# No match: wrong place
continue
else:
+3 -1
View File
@@ -32,6 +32,7 @@ _ = glocale.translation.gettext
#
#-------------------------------------------------------------------------
from ....datehandler import parser
from ....display.place import displayer as place_displayer
from ....lib.eventroletype import EventRoleType
from ....lib.eventtype import EventType
from .. import Rule
@@ -78,7 +79,8 @@ class HasDeath(Rule):
place_id = event.get_place_handle()
if place_id:
place = db.get_place_from_handle(place_id)
if not self.match_substring(1, place.get_title()):
place_title = place_displayer.display(db, place)
if not self.match_substring(1, place_title):
# No match: wrong place
continue
else:
@@ -32,6 +32,7 @@ _ = glocale.translation.gettext
#
#-------------------------------------------------------------------------
from ....datehandler import parser
from ....display.place import displayer as place_displayer
from ....lib.eventtype import EventType
from .. import Rule
@@ -87,7 +88,8 @@ class HasFamilyEvent(Rule):
place_id = event.get_place_handle()
if place_id:
place = db.get_place_from_handle(place_id)
if not self.match_substring(2, place.get_title()):
place_title = place_displayer.display(db, place)
if not self.match_substring(2, place_title):
val = 0
else:
val = 0
@@ -78,22 +78,26 @@ class IsDescendantFamilyOf(Rule):
return
# Add self
self.matches.add(person.handle)
expand = [person]
for family_handle in person.get_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Add every child recursively
for child_ref in family.get_child_ref_list():
if child_ref:
self.add_matches(self.db.get_person_from_handle(child_ref.ref))
# Add spouse
if person.handle == family.get_father_handle():
spouse_handle = family.get_mother_handle()
else:
spouse_handle = family.get_father_handle()
self.matches.add(spouse_handle)
while expand:
person = expand.pop(0)
if person is None:
continue
self.matches.add(person.handle)
for family_handle in person.get_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Add every child recursively
for child_ref in family.get_child_ref_list():
if child_ref:
expand.append(self.db.get_person_from_handle(child_ref.ref))
# Add spouse
if person.handle == family.get_father_handle():
spouse_handle = family.get_mother_handle()
else:
spouse_handle = family.get_father_handle()
self.matches.add(spouse_handle)
def exclude(self):
# This removes root person and his/her spouses from the matches set
@@ -63,34 +63,42 @@ class IsRelatedWith(Rule):
return person.handle in self.relatives
def add_relative(self, person):
"""Recursive function that scans relatives and add them to self.relatives"""
if not(person) or person.handle in self.relatives:
def add_relative(self, start):
"""Non-recursive function that scans relatives and add them to self.relatives"""
if not(start):
return
# Add the relative to the list
self.relatives.append(person.handle)
expand = [start]
relatives = {}
while expand:
person = expand.pop()
# Add the relative to the list
if person is None or (person.handle in relatives):
continue
relatives[person.handle] = True
for family_handle in person.get_parent_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Check Parents
for parent_handle in (family.get_father_handle(), family.get_mother_handle()):
if parent_handle:
self.add_relative(self.db.get_person_from_handle(parent_handle))
# Check Sibilings
for child_ref in family.get_child_ref_list():
self.add_relative(self.db.get_person_from_handle(child_ref.ref))
for family_handle in person.get_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Check Spouse
for parent_handle in (family.get_father_handle(), family.get_mother_handle()):
if parent_handle:
self.add_relative(self.db.get_person_from_handle(parent_handle))
# Check Children
for child_ref in family.get_child_ref_list():
self.add_relative(self.db.get_person_from_handle(child_ref.ref))
return
for family_handle in person.get_parent_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Check Parents
for parent_handle in (family.get_father_handle(), family.get_mother_handle()):
if parent_handle:
expand.append(self.db.get_person_from_handle(parent_handle))
# Check Sibilings
for child_ref in family.get_child_ref_list():
expand.append(self.db.get_person_from_handle(child_ref.ref))
for family_handle in person.get_family_handle_list():
family = self.db.get_family_from_handle(family_handle)
if family:
# Check Spouse
for parent_handle in (family.get_father_handle(), family.get_mother_handle()):
if parent_handle:
expand.append(self.db.get_person_from_handle(parent_handle))
# Check Children
for child_ref in family.get_child_ref_list():
expand.append(self.db.get_person_from_handle(child_ref.ref))
self.relatives = list(relatives.keys())
return
+5 -2
View File
@@ -37,12 +37,14 @@ from ._hassourceof import HasSourceOf
from ._placeprivate import PlacePrivate
from ._matchesfilter import MatchesFilter
from ._hasplace import HasPlace
from ._hasdata import HasData
from ._hasnolatorlon import HasNoLatOrLon
from ._inlatlonneighborhood import InLatLonNeighborhood
from ._matcheseventfilter import MatchesEventFilter
from ._matchessourceconfidence import MatchesSourceConfidence
from ._changedsince import ChangedSince
from ._hastag import HasTag
from ._hastitle import HasTitle
editor_rule_list = [
AllPlaces,
@@ -58,10 +60,11 @@ editor_rule_list = [
PlacePrivate,
MatchesFilter,
MatchesSourceConfidence,
HasPlace,
HasData,
HasNoLatOrLon,
InLatLonNeighborhood,
MatchesEventFilter,
ChangedSince,
HasTag
HasTag,
HasTitle
]
@@ -0,0 +1,83 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2002-2006 Donald N. Allingham
# Copyright (C) 2015 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#-------------------------------------------------------------------------
#
# Standard Python modules
#
#-------------------------------------------------------------------------
from ....const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from .. import Rule
from ....lib import PlaceType
#-------------------------------------------------------------------------
#
# HasData
#
#-------------------------------------------------------------------------
class HasData(Rule):
"""
Rule that checks for a place with a particular value
"""
labels = [ _('Name:'),
_('Place type:'),
_('Code:'),
]
name = _('Places matching parameters')
description = _('Matches places with particular parameters')
category = _('General filters')
allow_regex = True
def prepare(self, dbase):
self.place_type = self.list[1]
if self.place_type:
self.place_type = PlaceType()
self.place_type.set_from_xml_str(self.list[1])
def apply(self, db, place):
if not self.match_name(place):
return False
if self.place_type and place.get_type() != self.place_type:
return False
if not self.match_substring(2, place.get_code()):
return False
return True
def match_name(self, place):
"""
Match any name in a list of names.
"""
for name in place.get_all_names():
if self.match_substring(0, name):
return True
return False
+1 -1
View File
@@ -45,7 +45,7 @@ from ....utils.location import get_locations
class HasPlace(Rule):
"""Rule that checks for a place with a particular value"""
labels = [ _('place|Name:'),
labels = [ _('Title:'),
_('Street:'),
_('Locality:'),
_('City:'),
@@ -0,0 +1,57 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2002-2006 Donald N. Allingham
# Copyright (C) 2015 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#-------------------------------------------------------------------------
#
# Standard Python modules
#
#-------------------------------------------------------------------------
from ....const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from .. import Rule
from ....display.place import displayer
#-------------------------------------------------------------------------
#
# HasTitle
#
#-------------------------------------------------------------------------
class HasTitle(Rule):
"""
Rule that checks for a place with a title
"""
labels = [_('Title:')]
name = _('Places matching a title')
description = _('Matches places with a particular title')
category = _('General filters')
allow_regex = True
def apply(self, db, place):
if not self.match_substring(0, displayer.display(db, place)):
return False
return True
+3
View File
@@ -67,6 +67,9 @@ class AttributeRoot(SecondaryObject, PrivacyBase):
self.type = None
self.value = None
def __str__(self):
return str(self.value)
def serialize(self):
"""
Convert the object to a serialized tuple of data.
+1 -1
View File
@@ -284,7 +284,7 @@ class Span(object):
fdate12p1 = self._format(self._diff(self.date1, self.date2),
dlocale).format(precision=1)
if as_age and self._diff(self.date1, self.date2)[0] > Span.ALIVE:
_repr = trans_text("less than %s years") % Span.ALIVE
_repr = trans_text("greater than %s years") % Span.ALIVE
elif self.date1.get_modifier() == Date.MOD_NONE:
if self.date2.get_modifier() == Date.MOD_NONE:
_repr = fdate12
+13 -13
View File
@@ -137,25 +137,29 @@ class EventType(GrampsType):
RETIREMENT = 43
WILL = 44
_MENU = [[_('Life Events'),
def _T_(value): # enable deferred translations (see Python docs 22.1.3.4)
return value
# _T_ is a gramps-defined keyword -- see po/update_po.py and po/genpot.sh
_MENU = [[_T_('Life Events'),
[BIRTH, BAPTISM, DEATH, BURIAL, CREMATION, ADOPT]],
[_('Family'),
[_T_('Family'),
[ENGAGEMENT, MARRIAGE, DIVORCE, ANNULMENT, MARR_SETTL, MARR_LIC,
MARR_CONTR, MARR_BANNS, DIV_FILING, MARR_ALT]],
[_('Religious'),
[_T_('Religious'),
[CHRISTEN, ADULT_CHRISTEN, CONFIRMATION, FIRST_COMMUN, BLESS,
BAR_MITZVAH, BAS_MITZVAH, RELIGION]],
[_('Vocational'),
[_T_('Vocational'),
[OCCUPATION, RETIREMENT, ELECTED, MILITARY_SERV, ORDINATION]],
[_('Academic'),
[_T_('Academic'),
[EDUCATION, DEGREE, GRADUATION]],
[_('Travel'),
[_T_('Travel'),
[EMIGRATION, IMMIGRATION, NATURALIZATION]],
[_('Legal'),
[_T_('Legal'),
[PROBATE, WILL]],
[_('Residence'),
[_T_('Residence'),
[RESIDENCE, CENSUS, PROPERTY]],
[_('Other'),
[_T_('Other'),
[CAUSE_DEATH, MED_INFO, NOB_TITLE, NUM_MARRIAGES]]]
_CUSTOM = CUSTOM
@@ -210,10 +214,6 @@ class EventType(GrampsType):
(MARR_ALT , _("Alternate Marriage"), "Alternate Marriage"),
]
def _T_(value): # enable deferred translations (see Python docs 22.1.3.4)
return value
# _T_ is a gramps-defined keyword -- see po/update_po.py and po/genpot.sh
_ABBREVIATIONS = {
BIRTH: _T_("birth abbreviation|b."),
DEATH: _T_("death abbreviation|d."),
+7
View File
@@ -289,6 +289,13 @@ class GrampsType(GrampsTypeC):
return self._CUSTOM
def get_menu(self):
"""Return the list of localized names for the menu."""
if self._MENU:
return [[_(i),s] for (i, s) in self._MENU]
return self._MENU
def get_menu_standard_xml(self):
"""Return the list of XML (english) names for the menu."""
return self._MENU
def __eq__(self, value):
+1 -1
View File
@@ -571,7 +571,7 @@ class Place(CitationBase, NoteBase, MediaBase, UrlBase, PrimaryObject):
:param acquisition: instance to merge
:type acquisition: :class:'~.place.Place
"""
if acquisition.name not in self.alt_names:
if acquisition.name and (acquisition.name not in self.alt_names):
self.alt_names.append(acquisition.name)
for addendum in acquisition.alt_names:
+7
View File
@@ -166,3 +166,10 @@ class Researcher(LocationBase):
['name', 'addr', 'locality', 'city', 'state',
'country', 'postal', 'phone', 'email']
]
def is_empty(self):
for attr in ['name', 'addr', 'locality', 'city', 'state',
'country', 'postal', 'phone', 'email']:
if getattr(self, attr) != "":
return False
return True
+3 -8
View File
@@ -91,7 +91,7 @@ class TagCheck(unittest.TestCase, BaseCheck):
class DatabaseCheck(unittest.TestCase):
maxDiff = None
def generate_test(obj):
def generate_case(obj):
"""
Dynamically generate tests and attach to DatabaseCheck.
"""
@@ -111,20 +111,15 @@ db = import_as_dict("example/gramps/example.gramps", User())
for table in db._tables.keys():
for handle in db._tables[table]["handles_func"]():
obj = db._tables[table]["handle_func"](handle)
generate_test(obj)
generate_case(obj)
class StructTest(unittest.TestCase):
def test(self):
family = db.get_family_from_gramps_id("F0001")
s = Struct(family.to_struct(), db)
self.assertEqual(s["gramps_id"], "F0001")
s["gramps_id"] = "TEST"
self.assertEqual(s["gramps_id"], "TEST")
self.assertEqual(s["father_handle.primary_name.first_name"],
self.assertEqual(s.father_handle.primary_name.first_name,
"Allen Carl")
s["father_handle.primary_name.first_name"] = "Edward"
self.assertEqual(s["father_handle.primary_name.first_name"],
"Edward")
if __name__ == "__main__":
unittest.main()
+1 -1
View File
@@ -33,7 +33,7 @@ import libxslt
from gramps.plugins.lib.libgrampsxml import GRAMPS_XML_VERSION
from ...const import ROOT_DIR, USER_PLUGINS
from ....version import VERSION
from gramps.version import VERSION
from ...lib import Name, Surname
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext
+1 -1
View File
@@ -359,7 +359,7 @@ class Gramplet(object):
"""
Resume the :meth:`main` method that has previously paused.
"""
from gi.repository import GObject, Glib
from gi.repository import GObject, GLib
self._pause = False
self._idle_id = GLib.idle_add(self._updater,
priority=GObject.PRIORITY_LOW - 10)
+11 -5
View File
@@ -42,7 +42,7 @@ import io
# GRAMPS modules
#
#-------------------------------------------------------------------------
from ...version import VERSION as GRAMPSVERSION, VERSION_TUPLE
from gramps.version import VERSION as GRAMPSVERSION, VERSION_TUPLE
from ..const import IMAGE_DIR
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
@@ -1100,10 +1100,16 @@ class PluginRegister(object):
continue
lenpd = len(self.__plugindata)
full_filename = os.path.join(dir, filename)
if sys.version_info[0] < 3:
fd = open(full_filename, "r")
else:
fd = io.open(full_filename, "r", encoding='utf-8')
try:
if sys.version_info[0] < 3:
fd = open(full_filename, "r")
else:
fd = io.open(full_filename, "r", encoding='utf-8')
except Exception as msg:
print(_('ERROR: Failed reading plugin registration %(filename)s') % \
{'filename' : filename})
print(msg)
continue
stream = fd.read()
fd.close()
if os.path.exists(os.path.join(os.path.dirname(full_filename),
+6 -7
View File
@@ -45,7 +45,6 @@ from .paragraphstyle import ParagraphStyle
from .fontstyle import FontStyle
from .tablestyle import TableStyle, TableCellStyle
from .graphicstyle import GraphicsStyle
from gramps.gen.const import GRAMPS_LOCALE as glocale
#-------------------------------------------------------------------------
#
@@ -406,17 +405,17 @@ class SheetParser(handler.ContentHandler):
elif tag == "para":
if 'description' in attrs:
self.p.set_description(attrs['description'])
self.p.set_right_margin(glocale.float(attrs['rmargin']))
self.p.set_left_margin(glocale.float(attrs['lmargin']))
self.p.set_first_indent(glocale.float(attrs['first']))
self.p.set_right_margin(float(attrs['rmargin']))
self.p.set_left_margin(float(attrs['lmargin']))
self.p.set_first_indent(float(attrs['first']))
try:
# This is needed to read older style files
# lacking tmargin and bmargin
self.p.set_top_margin(glocale.float(attrs['tmargin']))
self.p.set_bottom_margin(glocale.float(attrs['bmargin']))
self.p.set_top_margin(float(attrs['tmargin']))
self.p.set_bottom_margin(float(attrs['bmargin']))
except KeyError:
pass
self.p.set_padding(glocale.float(attrs['pad']))
self.p.set_padding(float(attrs['pad']))
self.p.set_alignment(int(attrs['align']))
self.p.set_right_border(int(attrs['rborder']))
self.p.set_header_level(int(attrs['level']))
+1 -1
View File
@@ -94,7 +94,7 @@ class Citation(object):
for n in range(1, number_of_letters):
x_ref_count -= pow(letter_count, n)
for letter in range(1, number_of_letters):
index = x_ref_count / pow(letter_count, letter) % letter_count
index = x_ref_count // pow(letter_count, letter) % letter_count
key += string.ascii_lowercase[ index ]
key = key + last_letter
self.__ref_list.append((key, source_ref))
+5 -3
View File
@@ -41,6 +41,7 @@ _ = glocale.translation.gettext
#
#------------------------------------------------------------------------
from ...datehandler import get_date
from ...display.place import displayer as place_displayer
from ...utils.file import media_path_full
from ..docgen import IndexMark, INDEX_TYPE_ALP
from ...constfunc import cuni
@@ -115,10 +116,11 @@ def roman(num):
#-------------------------------------------------------------------------
def place_name(db, place_handle):
if place_handle:
place = db.get_place_from_handle(place_handle).get_title()
place = db.get_place_from_handle(place_handle)
name = place_displayer.display(db, place)
else:
place = ""
return cuni(place)
name = ""
return cuni(name)
#-------------------------------------------------------------------------
#
+1 -1
View File
@@ -50,7 +50,7 @@ LOG = logging.getLogger(".gen.plug")
#-------------------------------------------------------------------------
from ._pluginreg import make_environment
from ..const import USER_PLUGINS
from ...version import VERSION_TUPLE
from gramps.version import VERSION_TUPLE
from . import BasePluginManager
from ..utils.configmanager import safe_eval
from ..config import config
+1
View File
@@ -80,6 +80,7 @@ class FilterProxyDb(ProxyDbBase):
person = self.db.get_person_from_handle(handle)
if person:
self.flist.update(person.get_family_handle_list())
self.flist.update(person.get_parent_family_handle_list())
def get_person_from_handle(self, handle):
"""
+8 -11
View File
@@ -31,9 +31,9 @@ from ..lib.handle import Handle
from ..datehandler import displayer
from ..utils.string import gender as gender_map
from ..utils.db import get_birth_or_fallback, get_death_or_fallback
from ..plug.report.utils import place_name
from ..display.name import displayer as name_displayer
from ..display.place import displayer as place_displayer
from ..lib import EventType
from ..config import config
from ..const import GRAMPS_LOCALE as glocale
@@ -309,8 +309,7 @@ class SimpleAccess(object):
event_handle = ref.get_reference_handle()
if event_handle:
event = self.dbase.get_event_from_handle(event_handle)
place_handle = event.get_place_handle()
return place_name(self.dbase, place_handle)
return place_displayer.display_event(self.dbase, event)
return ''
def spouse(self, person):
@@ -391,8 +390,7 @@ class SimpleAccess(object):
events = [ evnt for evnt in elist
if event.type == EventType.MARRIAGE ]
if events:
place_handle = events[0].get_place_handle()
return place_name(self.dbase, place_handle)
return place_displayer.display_event(self.dbase, events[0])
return ''
def marriage_date(self, person):
@@ -618,8 +616,7 @@ class SimpleAccess(object):
assert(event is None or isinstance(event, Event))
if event:
place_handle = event.get_place_handle()
return place_name(self.dbase, place_handle)
return place_displayer.display_event(self.dbase, event)
else:
return ''
@@ -994,9 +991,9 @@ class SimpleAccess(object):
return "%s: [%s]" % (_(object_class),
self.gid(obj))
elif isinstance(obj, Place):
place_title = place_displayer.display(self.dbase, obj)
return "%s: %s [%s]" % (_(object_class),
place_name(self.dbase,
obj.handle),
place_title,
self.gid(obj))
elif isinstance(obj, Repository):
return "%s: %s [%s]" % (_(object_class),
@@ -1044,8 +1041,8 @@ class SimpleAccess(object):
elif isinstance(obj, Citation):
return "[%s]" % (self.gid(obj))
elif isinstance(obj, Place):
return "%s [%s]" % (place_name(self.dbase,
obj.handle),
place_title = place_displayer.display(self.dbase, obj)
return "%s [%s]" % (place_title,
self.gid(obj))
elif isinstance(obj, Repository):
return "%s [%s]" % (obj.type,
+5 -4
View File
@@ -39,6 +39,7 @@ to make sure these remain in sync with the rest of the design.
from .lib import Date
from .utils.db import get_birth_or_fallback
from .display.name import displayer as _nd
from .display.place import displayer as _pd
from .const import GRAMPS_LOCALE as glocale
#-------------------------------------------------------------------------
@@ -184,7 +185,8 @@ class Sort(object):
if not a_id:
return 0
a_obj = self.database.get_place_from_handle(a_id)
return glocale.sort_key(a_obj.title)
title = _pd.display(self.database, a_obj)
return glocale.sort_key(title)
## def by_event_place(self, a_id, b_id):
## """Sort routine for comparing two events by their places. """
@@ -207,9 +209,8 @@ class Sort(object):
if not a_id:
return 0
evt_a = self.database.get_event_from_handle(a_id)
plc_a = self.database.get_place_from_handle(evt_a.get_place_handle())
plc_a_title = plc_a.title if plc_a else ""
return glocale.sort_key(plc_a_title)
title = _pd.display_event(self.database, evt_a)
return glocale.sort_key(title)
## def by_event_description(self, a_id, b_id):
## """Sort routine for comparing two events by their descriptions. """
+12 -12
View File
@@ -37,6 +37,7 @@ LOG = logging.getLogger(".gui.utils.db")
from ..lib.nameorigintype import NameOriginType
from ..lib.surname import Surname
from ..display.name import displayer as name_displayer
from ..display.place import displayer as place_displayer
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext
from ..constfunc import cuni
@@ -260,8 +261,15 @@ def get_participant_from_event(db, event_handle, all_=False):
"""
participant = ""
ellipses = False
result_list = list(db.find_backlink_handles(event_handle,
include_classes=['Person', 'Family']))
try:
result_list = list(db.find_backlink_handles(event_handle,
include_classes=['Person', 'Family']))
except:
# during a magic batch transaction find_backlink_handles tries to
# access the reference_map_referenced_map which is closed
# under those circumstances.
return ''
#obtain handles without duplicates
people = set([x[1] for x in result_list if x[0] == 'Person'])
families = set([x[1] for x in result_list if x[0] == 'Family'])
@@ -327,15 +335,7 @@ def navigation_label(db, nav_type, handle):
elif nav_type == 'Event':
obj = db.get_event_from_handle(handle)
if obj:
try:
who = get_participant_from_event(db, handle)
except:
# get_participants_from_event fails when called during a magic
# batch transaction because find_backlink_handles tries to
# access the reference_map_referenced_map which doesn't exist
# under those circumstances. Since setting the navigation_label
# is inessential, just accept this and go on.
who = ''
who = get_participant_from_event(db, handle)
desc = obj.get_description()
label = obj.get_type()
if desc:
@@ -345,7 +345,7 @@ def navigation_label(db, nav_type, handle):
elif nav_type == 'Place':
obj = db.get_place_from_handle(handle)
if obj:
label = obj.get_title()
label = place_displayer.display(db, obj)
elif nav_type == 'Source':
obj = db.get_source_from_handle(handle)
if obj:
+2
View File
@@ -195,4 +195,6 @@ def create_checksum(full_path):
md5sum = hashlib.md5(media_file.read()).hexdigest()
except IOError:
md5sum = ''
except UnicodeEncodeError:
md5sum = ''
return md5sum
+4 -3
View File
@@ -85,6 +85,7 @@ _LOCALE_NAMES = {
'he': ('Hebrew_Israel', '1255', _("Hebrew")),
'hr': ('Croatian_Croatia', '1250', _("Croatian")),
'hu': ('Hungarian_Hungary', '1250', _("Hungarian")),
'is': ('Icelandic', '1252', _("Icelandic")),
'it': ('Italian_Italy', '1252', _("Italian")),
'ja': ('Japanese_Japan', '932', _("Japanese")),
'lt': ('Lithuanian_Lithuania', '1252', _("Lithuanian")),
@@ -100,7 +101,7 @@ _LOCALE_NAMES = {
'sk': ('Slovak_Slovakia', '1250', _("Slovak"),),
'sl': ('Slovenian_Slovenia', '1250', _("Slovenian")),
'sq': ('Albanian_Albania', '1250', _("Albanian")),
'sr': ('Serbian(Cyrillic)_Serbia and Montenegro', '1251', None), #Gramps's Serbian translation is not yet ready
'sr': ('Serbian (Cyrillic)_Serbia', '1251', _("Serbian")),
'sv': ('Swedish_Sweden', '1252', _("Swedish")),
'tr': ('Turkish_Turkey', '1254', _("Turkish")),
'uk': ('Ukrainian_Ukraine', '1251', _("Ukrainian")),
@@ -207,7 +208,7 @@ class GrampsLocale(object):
self.lang = loc[0]
self.encoding = loc[1]
else:
(lang, loc) = _check_mswin_locale(lang)
(lang, loc) = _check_mswin_locale(locale.getdefaultlocale()[0])
if lang:
self.lang = lang
self.encoding = loc[1]
@@ -481,7 +482,7 @@ class GrampsLocale(object):
if not sys.platform == 'win32':
locale.bindtextdomain(self.localedomain, self.localedir)
else:
self._win_bindtextdomain(self.localedomain,
self._win_bindtextdomain(self.localedomain.encode('utf-8'),
self.localedir.encode('utf-8'))
def _init_secondary_locale(self):
+4 -13
View File
@@ -90,17 +90,14 @@ def resize_to_jpeg(source, destination, width, height, crop=None):
(start_x, start_y, end_x, end_y
) = crop_percentage_to_pixel(
img.get_width(), img.get_height(), crop)
if sys.version_info[0] < 3:
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
else:
img = img.subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
# Need to keep the ratio intact, otherwise scaled images look stretched
# if the dimensions aren't close in size
(width, height) = image_actual_size(width, height, img.get_width(), img.get_height())
scaled = img.scale_simple(int(width), int(height), GdkPixbuf.InterpType.BILINEAR)
scaled.savev(destination, "jpeg" "", "")
scaled.savev(destination, "jpeg", "", "")
#-------------------------------------------------------------------------
#
@@ -231,10 +228,7 @@ def resize_to_buffer(source, size, crop=None):
(start_x, start_y, end_x, end_y
) = crop_percentage_to_pixel(
img.get_width(), img.get_height(), crop)
if sys.version_info[0] < 3:
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
else:
img = img.subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
# Need to keep the ratio intact, otherwise scaled images look stretched
# if the dimensions aren't close in size
@@ -272,10 +266,7 @@ def resize_to_jpeg_buffer(source, size, crop=None):
) = crop_percentage_to_pixel(
img.get_width(), img.get_height(), crop)
if sys.version_info[0] < 3:
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
else:
img = img.subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
img = img.new_subpixbuf(start_x, start_y, end_x-start_x, end_y-start_y)
# Need to keep the ratio intact, otherwise scaled images look stretched
# if the dimensions aren't close in size
+2 -1
View File
@@ -38,6 +38,7 @@ from cgi import escape
from ..lib import EventType
from ..datehandler import get_date
from ..display.name import displayer as name_displayer
from ..display.place import displayer as place_displayer
from .db import (get_birth_or_fallback, get_death_or_fallback,
get_marriage_or_fallback)
@@ -121,7 +122,7 @@ class FormattingHelper(object):
text = ""
place = self.dbstate.db.get_place_from_handle(place_handle)
if place:
place_title = place.get_title()
place_title = place_displayer.display(self.dbstate.db, place)
if place_title != "":
if len(place_title) > 25:
text = place_title[:24]+"..."
+20 -23
View File
@@ -21,28 +21,34 @@
"""
Location utility functions
"""
from ..lib.date import Today
#-------------------------------------------------------------------------
#
# get_location_list
#
#-------------------------------------------------------------------------
def get_location_list(db, place):
def get_location_list(db, place, date=None):
"""
Return a list of place names for display.
"""
if date is None:
date = Today()
visited = [place.handle]
lines = [place.name]
while len(place.get_placeref_list()) > 0:
handle = place.get_placeref_list()[0].ref
if handle in visited:
lines = [(place.name, place.get_type())]
while True:
handle = None
for placeref in place.get_placeref_list():
ref_date = placeref.get_date_object()
if ref_date.is_empty() or date.match(ref_date):
handle = placeref.ref
if handle is None or handle in visited:
break
else:
visited.append(handle)
place = db.get_place_from_handle(handle)
if place is None:
break
lines.append(place.name)
visited.append(handle)
lines.append((place.name, place.get_type()))
return lines
#-------------------------------------------------------------------------
@@ -50,25 +56,16 @@ def get_location_list(db, place):
# get_main_location
#
#-------------------------------------------------------------------------
def get_main_location(db, place):
def get_main_location(db, place, date=None):
"""
Find all places in the hierarchy above the given place, and return the
result as a dictionary of place types and names.
"""
visited = [place.handle]
items = {int(place.get_type()): place.name}
while len(place.get_placeref_list()) > 0:
handle = place.get_placeref_list()[0].ref
if handle in visited:
break
else:
visited.append(handle)
place = db.get_place_from_handle(handle)
if place is None:
break
items[int(place.get_type())] = place.name
return items
return dict([(int(place_type), name)
for name, place_type
in get_location_list(db, place, date)
if not place_type.is_custom()])
#-------------------------------------------------------------------------
#
# get_locations
+3
View File
@@ -239,6 +239,9 @@ def mac_setup_localization(glocale):
coll_parts = glocale.collation.split('@')
glocale.lang = glocale.check_available_translations(coll_parts[0])
if not glocale.lang:
glocale.lang = "en_US.UTF-8"
glocale.lang = locale.normalize(glocale.lang)
if not glocale.lang.split('.')[1].lower() in ['utf8', 'utf-8']:
LOG.debug('Forcing locale encoding to UTF-8')
+9 -3
View File
@@ -29,6 +29,7 @@ Make an 'Unknown' primary object
# Python modules
#
#-------------------------------------------------------------------------
import sys
import time
import os
@@ -146,8 +147,11 @@ def make_unknown(class_arg, explanation, class_func, commit_func, transaction,
elif isinstance(obj, Tag):
if not hasattr(make_unknown, 'count'):
make_unknown.count = 1 #primitive static variable
tval = time.strftime('%x %X', time.localtime())
if sys.version_info[0] < 3:
tval = tval.decode(glocale.encoding)
obj.set_name(_("Unknown, was missing %(time)s (%(count)d)") % {
'time': time.strftime('%x %X', time.localtime()),
'time': tval,
'count': make_unknown.count})
make_unknown.count += 1
else:
@@ -165,9 +169,11 @@ def create_explanation_note(dbase):
those objects of type "Unknown" need a explanatory note. This funcion
provides such a note for import methods.
"""
tval = time.strftime('%x %X', time.localtime())
if sys.version_info[0] < 3:
tval = tval.decode(glocale.encoding)
note = Note( _('Objects referenced by this note '
'were missing in a file imported on %s.') %
time.strftime('%x %X', time.localtime()))
'were missing in a file imported on %s.') % tval)
note.set_handle(create_id())
note.set_gramps_id(dbase.find_next_note_gramps_id())
# Use defaults for privacy, format and type.
+16 -40
View File
@@ -56,7 +56,7 @@ from gi.repository import GdkPixbuf
#-------------------------------------------------------------------------
from gramps.gen.const import (AUTHORS, AUTHORS_FILE, COMMENTS, COPYRIGHT_MSG,
DOCUMENTERS, LICENSE_FILE, PROGRAM_NAME, SPLASH,
TRANSLATORS, URL_HOMEPAGE, VERSION)
URL_HOMEPAGE, VERSION)
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from gramps.gen.constfunc import get_env_var
@@ -68,14 +68,6 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
else:
import bsddb
#-------------------------------------------------------------------------
#
# Constants
#
#-------------------------------------------------------------------------
AUTHORS_HEADER = _('==== Authors ====\n')
CONTRIB_HEADER = _('\n==== Contributors ====\n')
#-------------------------------------------------------------------------
#
# GrampsAboutDialog
@@ -85,20 +77,19 @@ class GrampsAboutDialog(Gtk.AboutDialog):
"""Create an About dialog with all fields set."""
def __init__(self, parent):
"""Setup all the fields shown in the About dialog."""
GObject.GObject.__init__(self)
Gtk.AboutDialog.__init__(self)
self.set_transient_for(parent)
self.set_modal(True)
self.set_name(PROGRAM_NAME)
self.set_version(VERSION)
self.set_copyright(COPYRIGHT_MSG)
self.set_artists([
_("Much of Gramps' artwork is either from\n"
"the Tango Project or derived from the Tango\n"
"Project. This artwork is released under the\n"
"Creative Commons Attribution-ShareAlike 2.5\n"
"license.")
])
artists = _("Much of Gramps' artwork is either from\n"
"the Tango Project or derived from the Tango\n"
"Project. This artwork is released under the\n"
"Creative Commons Attribution-ShareAlike 2.5\n"
"license.")
self.set_artists(artists.split('\n'))
try:
ifile = open(LICENSE_FILE, "r")
@@ -111,12 +102,13 @@ class GrampsAboutDialog(Gtk.AboutDialog):
self.set_website_label(_('Gramps Homepage'))
self.set_website(URL_HOMEPAGE)
self.set_authors(_get_authors())
authors, contributors = _get_authors()
self.set_authors(authors)
if len(contributors) > 0:
self.add_credit_section(_('Contributions by'), contributors)
# Only set translation credits if they are translated
trans_credits = _(TRANSLATORS)
if trans_credits != TRANSLATORS:
self.set_translator_credits(trans_credits)
# TRANSLATORS: Translate this to your name in your native language
self.set_translator_credits(_("translator-credits"))
self.set_documenters(DOCUMENTERS)
self.set_logo(GdkPixbuf.Pixbuf.new_from_file(SPLASH))
@@ -232,25 +224,9 @@ def _get_authors():
parser.parse(authors_file)
authors_file.close()
authors_text = ([AUTHORS_HEADER] + authors +
[CONTRIB_HEADER] + contributors)
authors_text = [authors, contributors]
except (IOError, OSError, SAXParseException):
authors_text = AUTHORS
authors_text = [AUTHORS, []]
return authors_text
#-------------------------------------------------------------------------
#
# _show_url
#
#-------------------------------------------------------------------------
def _show_url(dialog, link, prefix):
"""Show links in About dialog."""
if prefix is not None:
link = prefix + link
display_url(link)
#TODO GTK3: is there an alternative for these:
#Gtk.about_dialog_set_url_hook(_show_url, None)
#Gtk.about_dialog_set_email_hook(_show_url, 'mailto:')
+14 -8
View File
@@ -52,6 +52,7 @@ from gramps.gen.const import IMAGE_DIR, URL_MANUAL_PAGE, GRAMPS_LOCALE as glocal
from gramps.gen.config import config
from gramps.gen.lib import NoteType
from gramps.gen.datehandler import get_date
from gramps.gen.display.place import displayer as place_displayer
from .display import display_help
from .managedwindow import ManagedWindow
from gramps.gen.const import GRAMPS_LOCALE as glocale
@@ -380,7 +381,7 @@ class ClipPlace(ClipHandleWrapper):
value = self._db.get_place_from_handle(self._handle)
if value:
self._title = value.gramps_id
self._value = value.get_title()
self._value = place_displayer.display(self._db, value)
def is_valid(self):
data = pickle.loads(self._obj)
@@ -1563,7 +1564,8 @@ class MultiTreeView(Gtk.TreeView):
def edit_obj(self, objclass, handle):
from .editors import (EditPerson, EditEvent, EditFamily, EditSource,
EditPlace, EditRepository, EditNote, EditMedia)
EditPlace, EditRepository, EditNote, EditMedia,
EditCitation)
if objclass == 'Person':
person = self.dbstate.db.get_person_from_handle(handle)
if person:
@@ -1628,6 +1630,14 @@ class MultiTreeView(Gtk.TreeView):
self.uistate, [], ref)
except WindowActiveError:
pass
elif objclass == 'Citation':
ref = self.dbstate.db.get_citation_from_handle(handle)
if ref:
try:
EditCitation(self.dbstate,
self.uistate, [], ref)
except WindowActiveError:
pass
def short(val,size=60):
if len(val) > size:
@@ -1635,12 +1645,8 @@ def short(val,size=60):
else:
return val
def place_title(db,event):
pid = event.get_place_handle()
if pid:
return db.get_place_from_handle(pid).get_title()
else:
return ''
def place_title(db, event):
return place_displayer.display_event(db, event)
def gen_del_obj(func, t):
return lambda l : func(l, t)
+47 -24
View File
@@ -97,7 +97,7 @@ class DisplayNameEditor(ManagedWindow):
def __init__(self, uistate, dbstate, track, dialog):
# Assumes that there are two methods: dialog.name_changed_check(),
# and dialog._build_custom_name_ui()
ManagedWindow.__init__(self, uistate, [], DisplayNameEditor)
ManagedWindow.__init__(self, uistate, track, DisplayNameEditor)
self.dialog = dialog
self.dbstate = dbstate
self.set_window(
@@ -136,7 +136,8 @@ UPPERCASE keyword forces uppercase. Extra parentheses, commas are removed. Other
ManagedWindow.close(self, *obj)
def build_menu_names(self, obj):
return (_(" Name Editor"), _("Preferences"))
# NameEditor is leaf of parent branch
return (_(" Name Editor"), None)
#-------------------------------------------------------------------------
@@ -188,7 +189,6 @@ class ConfigureDialog(ManagedWindow):
self.__setup_pages(configure_page_funcs)
self.window.show_all()
self.show()
def __setup_pages(self, configure_page_funcs):
@@ -231,12 +231,12 @@ class ConfigureDialog(ManagedWindow):
except TypeError:
print("WARNING: ignoring invalid value for '%s'" % constant)
ErrorDialog(_("Invalid or incomplete format definition."),
obj.get_text())
obj.get_text(), parent=self.window)
obj.set_text('<b>%s</b>')
except ValueError:
print("WARNING: ignoring invalid value for '%s'" % constant)
ErrorDialog(_("Invalid or incomplete format definition."),
obj.get_text())
obj.get_text(), parent=self.window)
obj.set_text('<b>%s</b>')
self.__config.set(constant, unicode(obj.get_text()))
@@ -770,7 +770,7 @@ class GrampsPreferences(ConfigureDialog):
# check to see if this pattern already exists
if self.__check_for_name(translation, node):
ErrorDialog(_("This format exists already."),
translation)
translation, parent=self.window)
self.edit_button.emit('clicked')
return
# else, change the name
@@ -998,6 +998,20 @@ class GrampsPreferences(ConfigureDialog):
table.attach(obox, 1, 3, row, row+1, yoptions=0)
row += 1
# Place format:
obox = Gtk.ComboBoxText()
formats = [_('Title'), _('Automatic')]
list(map(obox.append_text, formats))
active = config.get('preferences.place-format')
if active >= len(formats):
active = 0
obox.set_active(active)
obox.connect('changed', self.place_format_changed)
lwidget = BasicLabel("%s: " % _('Place format'))
table.attach(lwidget, 0, 1, row, row+1, yoptions=0)
table.attach(obox, 1, 3, row, row+1, yoptions=0)
row += 1
# Age precision:
# precision=1 for "year", 2: "year, month" or 3: "year, month, days"
obox = Gtk.ComboBoxText()
@@ -1156,7 +1170,15 @@ class GrampsPreferences(ConfigureDialog):
config.set('preferences.date-format', obj.get_active())
OkDialog(_('Change is not immediate'),
_('Changing the date format will not take '
'effect until the next time Gramps is started.'))
'effect until the next time Gramps is started.'),
parent=self.window)
def place_format_changed(self, obj):
config.set('preferences.place-format', obj.get_active())
OkDialog(_('Change is not immediate'),
_('Changing the place format will not take '
'effect until the next time Gramps is started.'),
parent=self.window)
def date_calendar_changed(self, obj):
config.set('preferences.calendar-format-report', obj.get_active())
@@ -1324,10 +1346,7 @@ class GrampsPreferences(ConfigureDialog):
return
if len(addon_update_list) > 0:
try:
PluginWindows.UpdateAddons(self.uistate, [], addon_update_list)
except WindowActiveError:
pass
PluginWindows.UpdateAddons(addon_update_list, self.window)
else:
check_types = config.get('behavior.check-for-update-types')
OkDialog(_("There are no available addons of this type"),
@@ -1371,12 +1390,13 @@ class GrampsPreferences(ConfigureDialog):
def select_mediapath(self, *obj):
f = Gtk.FileChooserDialog(
_("Select media directory"),
action=Gtk.FileChooserAction.SELECT_FOLDER,
buttons=(Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.STOCK_APPLY,
Gtk.ResponseType.OK))
title=_("Select media directory"),
parent=self.window,
action=Gtk.FileChooserAction.SELECT_FOLDER,
buttons=(Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.STOCK_APPLY,
Gtk.ResponseType.OK))
mpath = self.dbstate.db.get_mediapath()
if not mpath:
mpath = HOME_DIR
@@ -1395,12 +1415,13 @@ class GrampsPreferences(ConfigureDialog):
def select_dbpath(self, *obj):
f = Gtk.FileChooserDialog(
_("Select database directory"),
action=Gtk.FileChooserAction.SELECT_FOLDER,
buttons=(Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.STOCK_APPLY,
Gtk.ResponseType.OK))
title=_("Select database directory"),
parent=self.window,
action=Gtk.FileChooserAction.SELECT_FOLDER,
buttons=(Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.STOCK_APPLY,
Gtk.ResponseType.OK))
dbpath = config.get('behavior.database-path')
if not dbpath:
dbpath = os.path.join(HOME_DIR,'grampsdb')
@@ -1453,7 +1474,9 @@ class GrampsPreferences(ConfigureDialog):
obj.set_text(str(intval))
def build_menu_names(self, obj):
return (_('Preferences'), None)
# Preferences editor my open other dialog so let main dialog
# be leaf in branch
return (_('Preferences'), _('Preferences'))
# FIXME: is this needed?
def _set_button(self, stock):
+22 -13
View File
@@ -83,24 +83,24 @@ class DbLoader(CLIDbLoader):
self.import_info = None
def _warn(self, title, warnmessage):
WarningDialog(title, warnmessage)
WarningDialog(title, warnmessage, parent=self.uistate.window)
def _errordialog(self, title, errormessage):
"""
Show the error.
In the GUI, the error is shown, and a return happens
"""
ErrorDialog(title, errormessage)
ErrorDialog(title, errormessage, parent=self.uistate.window)
return 1
def _dberrordialog(self, msg):
import traceback
exc = traceback.format_exc()
try:
DBErrorDialog(str(msg.value))
DBErrorDialog(str(msg.value), parent=self.uistate.window)
_LOG.error(str(msg.value))
except:
DBErrorDialog(str(msg))
DBErrorDialog(str(msg), parent=self.uistate.window)
_LOG.error(str(msg) +"\n" + exc)
def _begin_progress(self):
@@ -198,7 +198,8 @@ class DbLoader(CLIDbLoader):
_("Could not open file: %s") % filename,
_('File type "%s" is unknown to Gramps.\n\n'
'Valid types are: Gramps database, Gramps XML, '
'Gramps package, GEDCOM, and others.') % extension)
'Gramps package, GEDCOM, and others.') % extension,
parent=self.uistate.window)
import_dialog.destroy()
return False
@@ -220,13 +221,15 @@ class DbLoader(CLIDbLoader):
elif os.path.isdir(filename):
ErrorDialog(
_('Cannot open file'),
_('The selected file is a directory, not a file.\n'))
_('The selected file is a directory, not a file.\n'),
parent=self.uistate.window)
return True
elif os.path.exists(filename):
if not os.access(filename, os.R_OK):
ErrorDialog(
_('Cannot open file'),
_('You do not have read access to the selected file.'))
_('You do not have read access to the selected file.'),
parent=self.uistate.window)
return True
else:
try:
@@ -236,7 +239,8 @@ class DbLoader(CLIDbLoader):
except IOError:
ErrorDialog(
_('Cannot create file'),
_('You do not have write access to the selected file.'))
_('You do not have write access to the selected file.'),
parent=self.uistate.window)
return True
return False
@@ -259,7 +263,8 @@ class DbLoader(CLIDbLoader):
_("Could not import file: %s") % filename,
_("This file incorrectly identifies its character "
"set, so it cannot be accurately imported. Please fix the "
"encoding, and import again") + "\n\n %s" % msg)
"encoding, and import again") + "\n\n %s" % msg,
parent=self.uistate.window)
except Exception:
_LOG.error("Failed to import database.", exc_info=True)
self._end_progress()
@@ -327,7 +332,8 @@ class DbLoader(CLIDbLoader):
str(msg),
_("I have made a backup,\n"
"please upgrade my Family Tree"),
_("Cancel"), self.uistate.window).run():
_("Cancel"),
parent=self.uistate.window).run():
force_schema_upgrade = True
force_bsddb_upgrade = False
force_bsddb_downgrade = False
@@ -341,7 +347,8 @@ class DbLoader(CLIDbLoader):
str(msg),
_("I have made a backup,\n"
"please upgrade my tree"),
_("Cancel"), self.uistate.window).run():
_("Cancel"),
parent=self.uistate.window).run():
force_schema_upgrade = False
force_bsddb_upgrade = True
force_bsddb_downgrade = False
@@ -355,7 +362,8 @@ class DbLoader(CLIDbLoader):
str(msg),
_("I have made a backup,\n"
"please downgrade my Family Tree"),
_("Cancel"), self.uistate.window).run():
_("Cancel"),
parent=self.uistate.window).run():
force_schema_upgrade = False
force_bsddb_upgrade = False
force_bsddb_downgrade = True
@@ -369,7 +377,8 @@ class DbLoader(CLIDbLoader):
str(msg),
_("I have made a backup,\n"
"please upgrade my Family Tree"),
_("Cancel"), self.uistate.window).run():
_("Cancel"),
parent=self.uistate.window).run():
force_schema_upgrade = False
force_bsddb_upgrade = False
force_bsddb_downgrade = False
+1 -1
View File
@@ -248,7 +248,7 @@ class DbManager(CLIDbManager):
if store.get_value(node, STOCK_COL) == Gtk.STOCK_DIALOG_ERROR:
path = conv_to_unicode(store.get_value(node, PATH_COL), 'utf8')
backup = os.path.join(path, u"person.gbkp")
backup = os.path.join(path, "person.gbkp")
self.repair.set_sensitive(os.path.isfile(backup))
else:
self.repair.set_sensitive(False)
@@ -39,6 +39,7 @@ _ = glocale.translation.gettext
#
#-------------------------------------------------------------------------
from gramps.gen.display.name import displayer as name_displayer
from gramps.gen.display.place import displayer as place_displayer
from gramps.gen.utils.db import family_name, get_participant_from_event
#-------------------------------------------------------------------------
@@ -127,7 +128,7 @@ class BackRefModel(Gtk.ListStore):
p = self.db.get_place_from_handle(ref[1])
if not p:
continue
name = p.get_title()
name = place_displayer.display(self.db, p)
gid = p.gramps_id
handle = p.handle
elif dtype == 'Repository':
+3 -6
View File
@@ -33,6 +33,7 @@ import cgi
#-------------------------------------------------------------------------
from gramps.gen.datehandler import get_date
from gramps.gen.display.name import displayer as name_displayer
from gramps.gen.display.place import displayer as place_displayer
from gramps.gen.utils.string import gender as gender_map
from gramps.gen.lib import EventType
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
@@ -120,9 +121,7 @@ class ChildModel(Gtk.ListStore):
if event_ref and event_ref.ref:
event = self.db.get_event_from_handle(event_ref.ref)
if event:
place_handle = event.get_place_handle()
if place_handle:
return self.db.get_place_from_handle(place_handle).get_title()
return place_displayer.display_event(self.db, event)
return ""
def column_death_place(self, data):
@@ -130,7 +129,5 @@ class ChildModel(Gtk.ListStore):
if event_ref and event_ref.ref:
event = self.db.get_event_from_handle(event_ref.ref)
if event:
place_handle = event.get_place_handle()
if place_handle:
return self.db.get_place_from_handle(place_handle).get_title()
return place_displayer.display_event(self.db, event)
return ""
@@ -72,7 +72,8 @@ class EventEmbedList(DbGUIElement, GroupEmbeddedList):
#index = column in model. Value =
# (name, sortcol in model, width, markup/text, weigth_col
_column_names = [
(_('Description'), EventRefModel.COL_DESCR[0], 150, TEXT_COL, -1, None),
(_('Description'), EventRefModel.COL_DESCR[0], 240, TEXT_COL,
EventRefModel.COL_FONTWEIGHT[0], None),
(_('Type'), EventRefModel.COL_TYPE[0], 120, TEXT_COL,
EventRefModel.COL_FONTWEIGHT[0], None),
(_('ID'), EventRefModel.COL_GID[0], 60, TEXT_COL, -1, None),
@@ -80,7 +81,7 @@ class EventEmbedList(DbGUIElement, GroupEmbeddedList):
(_('Place'), EventRefModel.COL_PLACE[0], 240, 0, -1, None),
(_('Role'), EventRefModel.COL_ROLE[0], 80, TEXT_COL, -1, None),
(_('Main Participants'), EventRefModel.COL_PARTIC[0], 240, TEXT_COL,
EventRefModel.COL_FONTWEIGHT[0], None),
-1, None),
None,
None,
None,
@@ -191,10 +192,10 @@ class EventEmbedList(DbGUIElement, GroupEmbeddedList):
tuples (show/noshow, model column)
"""
return ((1, 1), # type
(1, 6), # main participants
(1, 0), # description
(1, 3), # date
(1, 4), # place
(1, 0), # description
(1, 6), # main participants
(1, 12), # private
(1, 5), # role
(1, 2), # gramps id
@@ -50,6 +50,7 @@ from gramps.gen.lib import EventRoleType
from gramps.gen.datehandler import get_date, get_date_valid
from gramps.gen.config import config
from gramps.gen.utils.db import get_participant_from_event
from gramps.gen.display.place import displayer as place_displayer
#-------------------------------------------------------------------------
#
@@ -111,7 +112,7 @@ class EventRefModel(Gtk.TreeStore):
def row_group(self, index, group):
name = self.namegroup(index, len(group))
spouse = self.groups[index][2]
return ['', name, '', '', '', '', spouse, '', (index, None),
return [spouse, name, '', '', '', '', '', '', (index, None),
WEIGHT_BOLD, '', '', None]
def namegroup(self, groupindex, length):
@@ -160,17 +161,11 @@ class EventRefModel(Gtk.TreeStore):
if event_ref and event_ref.ref:
event = self.db.get_event_from_handle(event_ref.ref)
if event:
place_handle = event.get_place_handle()
if place_handle:
return self.db.get_place_from_handle(place_handle).get_title()
return place_displayer.display_event(self.db, event)
return ""
def column_participant(self, event_ref):
if int(event_ref.get_role()) not in (EventRoleType.PRIMARY,
EventRoleType.FAMILY):
return get_participant_from_event(self.db, event_ref.ref)
else:
return ""
return get_participant_from_event(self.db, event_ref.ref)
def column_age(self, event):
"""
+3 -10
View File
@@ -514,17 +514,10 @@ class GalleryTab(ButtonTab, DbGUIElement):
elif self._DND_EXTRA and mytype == self._DND_EXTRA.drag_type:
self.handle_extra_type(mytype, obj)
except pickle.UnpicklingError:
#modern file managers provide URI_LIST. For Windows split sel_data.data
if win():
files = sel_data.get_data().split('\n')
else:
files = sel_data.get_uris()
files = sel_data.get_uris()
for file in files:
if win():
d = conv_to_unicode((file.replace('\0',' ').strip()), None)
else:
d = file
protocol, site, mfile, j, k, l = urlparse(d)
protocol, site, mfile, j, k, l = urlparse(file)
if protocol == "file":
name = url2pathname(mfile)
mime = get_type(name)
+2 -9
View File
@@ -37,6 +37,7 @@ from gi.repository import Gtk
#
#-------------------------------------------------------------------------
from gramps.gen.datehandler import get_date
from gramps.gen.display.place import displayer as place_displayer
from gramps.gen.utils.lds import TEMPLES
#-------------------------------------------------------------------------
@@ -51,21 +52,13 @@ class LdsModel(Gtk.ListStore):
def __init__(self, lds_list, db):
Gtk.ListStore.__init__(self, str, str, str, str, str, bool, object)
self.db = db
for lds_ord in lds_list:
self.append(row=[
lds_ord.type2str(),
get_date(lds_ord),
lds_ord.status2str(),
TEMPLES.name(lds_ord.get_temple()),
self.column_place(lds_ord),
place_displayer.display_event(db, lds_ord),
lds_ord.get_privacy(),
lds_ord,
])
def column_place(self, lds_ord):
if lds_ord:
place_handle = lds_ord.get_place_handle()
if place_handle:
return self.db.get_place_from_handle(place_handle).get_title()
return ""
@@ -33,11 +33,13 @@ from gi.repository import GLib
# GRAMPS classes
#
#-------------------------------------------------------------------------
from gramps.gen.lib import PlaceRef
from gramps.gen.lib import Place, PlaceRef
from gramps.gen.errors import WindowActiveError
from ...dialog import ErrorDialog
from ...ddtargets import DdTargets
from .placerefmodel import PlaceRefModel
from .embeddedlist import EmbeddedList, TEXT_COL
from ...selectors import SelectorFactory
#-------------------------------------------------------------------------
#
@@ -48,6 +50,7 @@ class PlaceRefEmbedList(EmbeddedList):
_HANDLE_COL = 4
_DND_TYPE = DdTargets.PLACEREF
_DND_EXTRA = DdTargets.PLACE_LINK
#index = column in model. Value =
# (name, sortcol in model, width, markup/text, weigth_col
@@ -58,13 +61,12 @@ class PlaceRefEmbedList(EmbeddedList):
(_('Date'), 3, 150, TEXT_COL, -1, None),
]
def __init__(self, dbstate, uistate, track, data, handle, callback):
def __init__(self, dbstate, uistate, track, data, handle):
self.data = data
self.handle = handle
self.callback = callback
EmbeddedList.__init__(self, dbstate, uistate, track,
_('Enclosed By'), PlaceRefModel,
move_buttons=True)
share_button=True, move_buttons=True)
def get_data(self):
return self.data
@@ -72,34 +74,75 @@ class PlaceRefEmbedList(EmbeddedList):
def column_order(self):
return ((1, 0), (1, 1), (1, 2), (1, 3))
def get_skip_list(self, handle):
todo = [handle]
skip = [handle]
while todo:
handle = todo.pop()
for child in self.dbstate.db.find_backlink_handles(handle,
['Place']):
if child[1] not in skip:
todo.append(child[1])
skip.append(child[1])
return skip
def add_button_clicked(self, obj):
placeref = PlaceRef()
ref = PlaceRef()
place = Place()
try:
from .. import EditPlaceRef
EditPlaceRef(self.dbstate, self.uistate, self.track,
placeref, self.handle, self.add_callback)
place, ref, self.add_callback)
except WindowActiveError:
pass
def add_callback(self, name):
def add_callback(self, ref, place):
ref.ref = place.handle
data = self.get_data()
data.append(name)
data.append(ref)
self.rebuild()
GLib.idle_add(self.tree.scroll_to_cell, len(data) - 1)
def edit_button_clicked(self, obj):
placeref = self.get_selected()
if placeref:
def share_button_clicked(self, obj):
SelectPlace = SelectorFactory('Place')
sel = SelectPlace(self.dbstate, self.uistate, self.track,
skip=self.get_skip_list(self.handle))
place = sel.run()
if place:
ref = PlaceRef()
try:
from .. import EditPlaceRef
EditPlaceRef(self.dbstate, self.uistate, self.track,
placeref, self.handle, self.edit_callback)
EditPlaceRef(self.dbstate, self.uistate, self.track,
place, ref, self.add_callback)
except WindowActiveError:
pass
def edit_callback(self, name):
def edit_button_clicked(self, obj):
ref = self.get_selected()
if ref:
place = self.dbstate.db.get_place_from_handle(ref.ref)
try:
from .. import EditPlaceRef
EditPlaceRef(self.dbstate, self.uistate, self.track,
place, ref, self.edit_callback)
except WindowActiveError:
pass
def edit_callback(self, ref, place):
self.rebuild()
def post_rebuild(self, prebuildpath):
if prebuildpath is not None:
self.callback()
def handle_extra_type(self, objtype, obj):
if obj in self.get_skip_list(self.handle):
ErrorDialog(_("Place cycle detected"),
_("The place you are adding is already enclosed by "
"this place"))
return
place = self.dbstate.db.get_place_from_handle(obj)
placeref = PlaceRef()
try:
from .. import EditPlaceRef
EditPlaceRef(self.dbstate, self.uistate, self.track,
place, placeref, self.add_callback)
except WindowActiveError:
pass
+2 -1
View File
@@ -100,7 +100,8 @@ class EditEvent(EditPrimary):
return dialog_title
def get_custom_events(self):
return self.dbstate.db.get_event_types()
return sorted(self.dbstate.db.get_event_types(),
key=lambda s: s.lower())
def _local_init(self):
self.width_key = 'interface.event-width'
+1 -1
View File
@@ -94,7 +94,7 @@ class EditEventRef(EditReference):
self.add_event = self.db.add_event
def get_custom_events(self):
return self.db.get_event_types()
return sorted(self.db.get_event_types(), key=lambda s: s.lower())
def _connect_signals(self):
self.define_ok_button(self.top.get_object('ok'),self.ok_clicked)
+10 -25
View File
@@ -56,6 +56,7 @@ from ..widgets import (MonitoredEntry, PrivacyButton, MonitoredTagList,
MonitoredDataType)
from gramps.gen.errors import ValidationError
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.display.place import displayer as place_displayer
from ..dialog import ErrorDialog
from ..glade import Glade
@@ -85,7 +86,7 @@ class EditPlace(EditPrimary):
def get_menu_title(self):
if self.obj and self.obj.get_handle():
title = self.obj.get_title()
title = place_displayer.display(self.db, self.obj)
dialog_title = _('Place: %s') % title
else:
dialog_title = _('New Place')
@@ -112,8 +113,7 @@ class EditPlace(EditPrimary):
self.name = MonitoredEntry(self.top.get_object("name_entry"),
self.obj.set_name, self.obj.get_name,
self.db.readonly,
changed=self.name_changed)
self.db.readonly)
self.gid = MonitoredEntry(self.top.get_object("gid"),
self.obj.set_gramps_id,
@@ -165,14 +165,6 @@ class EditPlace(EditPrimary):
return ValidationError(_("Invalid longitude (syntax: 18\u00b09'") +
_('48.21"E, -18.2412 or -18:9:48.21)'))
def update_title(self):
new_name = ', '.join(get_location_list(self.db, self.obj))
self.top.get_object("place_title").set_text(new_name)
self.obj.set_title(new_name)
def name_changed(self, obj):
self.update_title()
def build_menu_names(self, place):
return (_('Edit Place'), self.get_menu_title())
@@ -188,8 +180,7 @@ class EditPlace(EditPrimary):
self.uistate,
self.track,
self.obj.get_placeref_list(),
self.obj.handle,
self.update_title)
self.obj.handle)
self._add_tab(notebook, self.placeref_list)
self.track_ref_for_deletion("placeref_list")
@@ -258,13 +249,6 @@ class EditPlace(EditPrimary):
self.ok_button.set_sensitive(True)
return
if self.obj.get_title().strip() == '':
msg1 = _("Cannot save location. Title not entered.")
msg2 = _("You must enter a title before saving.")
ErrorDialog(msg1, msg2)
self.ok_button.set_sensitive(True)
return
if self.obj.get_name().strip() == '':
msg1 = _("Cannot save location. Name not entered.")
msg2 = _("You must enter a name before saving.")
@@ -275,7 +259,7 @@ class EditPlace(EditPrimary):
(uses_dupe_id, id) = self._uses_duplicate_id()
if uses_dupe_id:
prim_object = self.get_from_gramps_id(id)
name = prim_object.get_title()
name = place_displayer.display(self.db, prim_object)
msg1 = _("Cannot save place. ID already exists.")
msg2 = _("You have attempted to use the existing Gramps ID with "
"value %(id)s. This value is already used by '"
@@ -287,14 +271,15 @@ class EditPlace(EditPrimary):
return
with DbTxn('', self.db) as trans:
place_title = place_displayer.display(self.db, self.obj)
if not self.obj.get_handle():
self.db.add_place(self.obj, trans)
msg = _("Add Place (%s)") % self.obj.get_title()
msg = _("Add Place (%s)") % place_title
else:
if not self.obj.get_gramps_id():
self.obj.set_gramps_id(self.db.find_next_place_gramps_id())
self.db.commit_place(self.obj, trans)
msg = _("Edit Place (%s)") % self.obj.get_title()
msg = _("Edit Place (%s)") % place_title
trans.set_description(msg)
self.close()
@@ -318,8 +303,8 @@ class DeletePlaceQuery(object):
self.event_list = event_list
def query_response(self):
with DbTxn(_("Delete Place (%s)") % self.obj.get_title(),
self.db) as trans:
place_title = place_displayer.display(self.db, self.obj)
with DbTxn(_("Delete Place (%s)") % place_title, self.db) as trans:
self.db.disable_signals()
place_handle = self.obj.get_handle()
+198 -43
View File
@@ -2,7 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2013 Nick Hall
# Copyright (C) 2015 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -24,11 +24,17 @@
# Gramps modules
#
#-------------------------------------------------------------------------
from .editsecondary import EditSecondary
from .editreference import RefTab, EditReference
from ..glade import Glade
from ..widgets import MonitoredDate
from .objectentries import PlaceEntry
from ..dialog import ErrorDialog
from ..widgets import (MonitoredDate, MonitoredEntry, MonitoredDataType,
PrivacyButton, MonitoredTagList)
from .displaytabs import (PlaceRefEmbedList, AltNameEmbedList,
LocationEmbedList, CitationEmbedList,
GalleryTab, NoteTab, WebEmbedList, PlaceBackRefList)
from gramps.gen.lib import NoteType
from gramps.gen.db import DbTxn
from gramps.gen.errors import ValidationError
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
@@ -37,63 +43,212 @@ _ = glocale.translation.gettext
# EditPlaceRef class
#
#-------------------------------------------------------------------------
class EditPlaceRef(EditSecondary):
class EditPlaceRef(EditReference):
def __init__(self, dbstate, uistate, track, placeref, handle, callback):
self.handle = handle
EditSecondary.__init__(self, dbstate, uistate, track,
placeref, callback)
def __init__(self, state, uistate, track, place, place_ref, update):
EditReference.__init__(self, state, uistate, track, place, place_ref,
update)
def _local_init(self):
self.width_key = 'interface.place-ref-width'
self.height_key = 'interface.place-ref-height'
self.top = Glade()
self.set_window(self.top.toplevel, None, _('Place Reference Editor'))
self.define_warn_box(self.top.get_object("warning"))
self.define_expander(self.top.get_object("expander"))
#self.place_name_label = self.top.get_object('place_name_label')
#self.place_name_label.set_text(_('place|Name:'))
self.share_btn = self.top.get_object('select_place')
self.add_del_btn = self.top.get_object('add_del_place')
tblref = self.top.get_object('table64')
notebook = self.top.get_object('notebook_ref')
#recreate start page as GrampsTab
notebook.remove_page(0)
self.reftab = RefTab(self.dbstate, self.uistate, self.track,
_('General'), tblref)
tblref = self.top.get_object('table62')
notebook = self.top.get_object('notebook')
#recreate start page as GrampsTab
notebook.remove_page(0)
self.primtab = RefTab(self.dbstate, self.uistate, self.track,
_('_General'), tblref)
def _connect_signals(self):
self.define_cancel_button(self.top.get_object('cancel'))
self.ok_button = self.top.get_object('ok')
self.define_ok_button(self.ok_button, self.save)
self.define_help_button(self.top.get_object('help'))
def _connect_db_signals(self):
"""
Connect any signals that need to be connected.
Called by the init routine of the base class (_EditPrimary).
"""
self._add_db_signal('place-rebuild', self.close)
self._add_db_signal('place-delete', self.check_for_close)
def build_menu_names(self, placeref):
if self.source and self.source.get_handle():
title = self.source.get_title()
submenu_label = _('Place: %s') % title
else:
submenu_label = _('New Place')
return (_('Place Reference Editor'), submenu_label)
def _setup_fields(self):
self.date_field = MonitoredDate(self.top.get_object("date_entry"),
self.top.get_object("date_stat"),
self.obj.get_date_object(),
self.source_ref.get_date_object(),
self.uistate, self.track,
self.db.readonly)
self.place_field = PlaceEntry(self.dbstate, self.uistate, self.track,
self.top.get_object("place"),
self.obj.set_reference_handle,
self.obj.get_reference_handle,
self.add_del_btn, self.share_btn,
skip=self.get_skip_list(self.handle))
self.title = MonitoredEntry(self.top.get_object("place_title"),
self.source.set_title, self.source.get_title,
self.db.readonly)
self.name = MonitoredEntry(self.top.get_object("name_entry"),
self.source.set_name, self.source.get_name,
self.db.readonly)
self.gid = MonitoredEntry(self.top.get_object("gid"),
self.source.set_gramps_id,
self.source.get_gramps_id, self.db.readonly)
self.tags = MonitoredTagList(self.top.get_object("tag_label"),
self.top.get_object("tag_button"),
self.source.set_tag_list,
self.source.get_tag_list,
self.db,
self.uistate, self.track,
self.db.readonly)
def get_skip_list(self, handle):
todo = [handle]
skip = [handle]
while todo:
handle = todo.pop()
for child in self.db.find_backlink_handles(handle, ['Place']):
if child[1] not in skip:
todo.append(child[1])
skip.append(child[1])
return skip
self.privacy = PrivacyButton(self.top.get_object("private"), self.source,
self.db.readonly)
def _connect_signals(self):
self.define_cancel_button(self.top.get_object('cancel_button'))
self.ok_button = self.top.get_object('ok_button')
self.define_ok_button(self.ok_button, self.save)
self.define_help_button(self.top.get_object('help_button'))
self.place_type = MonitoredDataType(self.top.get_object("place_type"),
self.source.set_type,
self.source.get_type,
self.db.readonly,
self.db.get_place_types())
self.code = MonitoredEntry(
self.top.get_object("code_entry"),
self.source.set_code, self.source.get_code,
self.db.readonly)
self.longitude = MonitoredEntry(
self.top.get_object("lon_entry"),
self.source.set_longitude, self.source.get_longitude,
self.db.readonly)
self.longitude.connect("validate", self._validate_coordinate, "lon")
#force validation now with initial entry
self.top.get_object("lon_entry").validate(force=True)
self.latitude = MonitoredEntry(
self.top.get_object("lat_entry"),
self.source.set_latitude, self.source.get_latitude,
self.db.readonly)
self.latitude.connect("validate", self._validate_coordinate, "lat")
#force validation now with initial entry
self.top.get_object("lat_entry").validate(force=True)
def _validate_coordinate(self, widget, text, typedeg):
if (typedeg == 'lat') and not conv_lat_lon(text, "0", "ISO-D"):
return ValidationError(_("Invalid latitude (syntax: 18\u00b09'") +
_('48.21"S, -18.2412 or -18:9:48.21)'))
elif (typedeg == 'lon') and not conv_lat_lon("0", text, "ISO-D"):
return ValidationError(_("Invalid longitude (syntax: 18\u00b09'") +
_('48.21"E, -18.2412 or -18:9:48.21)'))
def _create_tabbed_pages(self):
"""
Create the notebook tabs and inserts them into the main
window.
"""
notebook = self.top.get_object('notebook')
notebook_ref = self.top.get_object('notebook_ref')
self._add_tab(notebook, self.primtab)
self._add_tab(notebook_ref, self.reftab)
self.track_ref_for_deletion("primtab")
self.track_ref_for_deletion("reftab")
self.placeref_list = PlaceRefEmbedList(self.dbstate,
self.uistate,
self.track,
self.source.get_placeref_list(),
self.source.handle)
self._add_tab(notebook, self.placeref_list)
self.track_ref_for_deletion("placeref_list")
self.alt_name_list = AltNameEmbedList(self.dbstate,
self.uistate,
self.track,
self.source.alt_names)
self._add_tab(notebook, self.alt_name_list)
self.track_ref_for_deletion("alt_name_list")
if len(self.source.alt_loc) > 0:
self.loc_list = LocationEmbedList(self.dbstate,
self.uistate,
self.track,
self.source.alt_loc)
self._add_tab(notebook, self.loc_list)
self.track_ref_for_deletion("loc_list")
self.citation_list = CitationEmbedList(self.dbstate,
self.uistate,
self.track,
self.source.get_citation_list())
self._add_tab(notebook, self.citation_list)
self.track_ref_for_deletion("citation_list")
self.note_tab = NoteTab(self.dbstate,
self.uistate,
self.track,
self.source.get_note_list(),
notetype=NoteType.PLACE)
self._add_tab(notebook, self.note_tab)
self.track_ref_for_deletion("note_tab")
self.gallery_tab = GalleryTab(self.dbstate,
self.uistate,
self.track,
self.source.get_media_list())
self._add_tab(notebook, self.gallery_tab)
self.track_ref_for_deletion("gallery_tab")
self.web_list = WebEmbedList(self.dbstate,
self.uistate,
self.track,
self.source.get_url_list())
self._add_tab(notebook, self.web_list)
self.track_ref_for_deletion("web_list")
self.backref_list = PlaceBackRefList(self.dbstate,
self.uistate,
self.track,
self.db.find_backlink_handles(self.source.handle))
self.backref_tab = self._add_tab(notebook, self.backref_list)
self.track_ref_for_deletion("backref_list")
self.track_ref_for_deletion("backref_tab")
self._setup_notebook_tabs(notebook)
def save(self, *obj):
self.ok_button.set_sensitive(False)
if not self.obj.ref:
ErrorDialog(_("Cannot save place reference"),
_("No place selected. Please select a place "
" or cancel the edit."))
self.ok_button.set_sensitive(True)
return
if self.callback:
self.callback(self.obj)
if self.source.handle:
with DbTxn(_("Modify Place"), self.db) as trans:
self.db.commit_place(self.source, trans)
else:
if self.check_for_duplicate_id('Place'):
return
with DbTxn(_("Add Place"), self.db) as trans:
self.db.add_place(self.source, trans)
self.source_ref.ref = self.source.handle
if self.update:
self.update(self.source_ref, self.source)
self.close()
+3
View File
@@ -271,6 +271,7 @@ class EditReference(ManagedWindow, DbGUIElement):
if new_id:
old_primary = self.db.get_from_name_and_gramps_id(type, new_id)
if old_primary:
description = None
if type == 'Event':
msg1 = _("Cannot save event. ID already exists.")
description = old_primary.get_description()
@@ -280,6 +281,8 @@ class EditReference(ManagedWindow, DbGUIElement):
elif type == 'Repository':
msg1 = _("Cannot save repository. ID already exists.")
description = old_primary.get_name()
else:
msg1 = _("Cannot save item. ID already exists.")
if description:
msg2 = _("You have attempted to use the existing Gramps "
"ID with value %(id)s. This value is already "
+9 -4
View File
@@ -63,11 +63,12 @@ from gramps.gen.const import RULE_GLADE, URL_MANUAL_PAGE
from ..display import display_help
from gramps.gen.errors import WindowActiveError
from gramps.gen.lib import (AttributeType, EventType, FamilyRelType,
NameOriginType, NameType, NoteType)
NameOriginType, NameType, NoteType, PlaceType)
from gramps.gen.filters import rules
from ..autocomp import StandardCustomSelector, fill_entry
from ..selectors import SelectorFactory
from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.place import displayer as _pd
from gramps.gen.utils.db import family_name
from gramps.gen.utils.string import conf_strings
from gramps.gen.constfunc import cuni
@@ -106,6 +107,7 @@ _name2typeclass = {
_('Note type:') : NoteType,
_('Name type:') : NameType,
_('Surname origin type:'): NameOriginType,
_('Place type:') : PlaceType,
}
#-------------------------------------------------------------------------
@@ -345,7 +347,7 @@ class MyID(Gtk.Box):
name = str(event.get_type)
elif self.namespace == 'Place':
place = self.db.get_place_from_gramps_id(gramps_id)
name = place.get_title()
name = _pd.display(self.db, place)
elif self.namespace == 'Source':
source = self.db.get_source_from_gramps_id(gramps_id)
name = source.get_title()
@@ -559,6 +561,8 @@ class EditRule(ManagedWindow):
additional = self.db.get_name_types()
elif v == _('Surname origin type:'):
additional = self.db.get_origin_types()
elif v == _('Place type:'):
additional = self.db.get_place_types()
t = MySelect(_name2typeclass[v], additional)
elif v == _('Inclusive:'):
t = MyBoolean(_('Include original person'))
@@ -992,7 +996,7 @@ class ShowResults(ManagedWindow):
gid = citation.get_gramps_id()
elif self.namespace == 'Place':
place = self.db.get_place_from_handle(handle)
name = place.get_title()
name = _pd.display(self.db, place)
gid = place.get_gramps_id()
elif self.namespace == 'Media':
obj = self.db.get_object_from_handle(handle)
@@ -1024,7 +1028,8 @@ class ShowResults(ManagedWindow):
elif self.namespace == 'Citation':
sortname = self.db.get_citation_from_handle(handle).get_page()
elif self.namespace == 'Place':
sortname = self.db.get_place_from_handle(handle).get_title()
place = self.db.get_place_from_handle(handle)
sortname = _pd.display(self.db, place)
elif self.namespace == 'Media':
sortname = self.db.get_object_from_handle(handle).get_description()
elif self.namespace == 'Repository':
+3 -1
View File
@@ -56,6 +56,7 @@ from .editnote import EditNote
from ..selectors import SelectorFactory
from ..ddtargets import DdTargets
from gramps.gen.errors import WindowActiveError
from gramps.gen.display.place import displayer as place_displayer
#-------------------------------------------------------------------------
#
@@ -297,7 +298,8 @@ class PlaceEntry(ObjEntry):
return self.db.get_place_from_handle(handle)
def get_label(self, place):
return "%s [%s]" % (place.get_title(), place.gramps_id)
place_title = place_displayer.display(self.db, place)
return "%s [%s]" % (place_title, place.gramps_id)
def call_editor(self, obj=None):
if obj is None:
@@ -103,17 +103,19 @@ class CitationSidebarFilter(SidebarFilter):
self.tag.pack_start(cell, True)
self.tag.add_attribute(cell, 'text', 0)
self.add_text_entry(_('Source: ID'), self.filter_src_id)
self.add_text_entry(_('Source: Title'), self.filter_src_title)
self.add_text_entry(_('Source: Author'), self.filter_src_author)
self.add_text_entry(_('Source: Abbreviation'), self.filter_src_abbr)
self.add_text_entry(_('Source: Publication'), self.filter_src_pub)
self.add_text_entry(_('Source: Note'), self.filter_src_note)
self.add_text_entry(_('Citation: ID'), self.filter_id)
self.add_text_entry(_('Citation: Volume/Page'), self.filter_page)
self.add_text_entry(_('Citation: Date'), self.filter_date)
self.add_heading(_('Source:'))
self.add_text_entry(_('ID'), self.filter_src_id)
self.add_text_entry(_('Title'), self.filter_src_title)
self.add_text_entry(_('Author'), self.filter_src_author)
self.add_text_entry(_('Abbreviation'), self.filter_src_abbr)
self.add_text_entry(_('Publication'), self.filter_src_pub)
self.add_text_entry(_('Note'), self.filter_src_note)
self.add_heading(_('Citation:'))
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Volume/Page'), self.filter_page)
self.add_text_entry(_('Date'), self.filter_date)
self.add_entry(_('Citation: Minimum Confidence|Min. Conf.'), self.filter_conf)
self.add_text_entry(_('Citation: Note'), self.filter_note)
self.add_text_entry(_('Note'), self.filter_note)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
@@ -62,11 +62,13 @@ class EventSidebarFilter(SidebarFilter):
self.filter_event = Event()
self.filter_event.set_type((EventType.CUSTOM, ''))
self.etype = Gtk.ComboBox(has_entry=True)
self.custom_types = dbstate.db.get_event_types()
self.event_menu = widgets.MonitoredDataType(
self.etype,
self.filter_event.set_type,
self.filter_event.get_type)
self.filter_event.get_type,
custom_values=self.custom_types)
self.filter_mainparts = widgets.BasicEntry()
self.filter_date = widgets.DateEntry(uistate, [])
@@ -41,12 +41,14 @@ from gi.repository import Gtk
#
#-------------------------------------------------------------------------
from ... import widgets
from gramps.gen.lib import Place, PlaceType
from .. import build_filter_model
from . import SidebarFilter
from gramps.gen.constfunc import cuni
from gramps.gen.filters import GenericFilterFactory, rules
from gramps.gen.filters.rules.place import (RegExpIdOf, HasPlace, HasTag,
HasNoteRegexp, MatchesFilter)
from gramps.gen.filters.rules.place import (RegExpIdOf, HasData, HasTitle,
HasTag, HasNoteRegexp,
MatchesFilter)
GenericPlaceFilter = GenericFilterFactory('Place')
#-------------------------------------------------------------------------
@@ -61,14 +63,16 @@ class PlaceSidebarFilter(SidebarFilter):
self.filter_id = widgets.BasicEntry()
self.filter_title = widgets.BasicEntry()
self.filter_street = widgets.BasicEntry()
self.filter_locality = widgets.BasicEntry()
self.filter_city = widgets.BasicEntry()
self.filter_county = widgets.BasicEntry()
self.filter_state = widgets.BasicEntry()
self.filter_country = widgets.BasicEntry()
self.filter_zip = widgets.BasicEntry()
self.filter_parish = widgets.BasicEntry()
self.filter_name = widgets.BasicEntry()
self.filter_place = Place()
self.filter_place.set_type((PlaceType.CUSTOM, ''))
self.ptype = Gtk.ComboBox(has_entry=True)
self.place_menu = widgets.MonitoredDataType(
self.ptype,
self.filter_place.set_type,
self.filter_place.get_type)
self.filter_code = widgets.BasicEntry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = Gtk.CheckButton(label=_('Use regular expressions'))
@@ -92,15 +96,10 @@ class PlaceSidebarFilter(SidebarFilter):
self.tag.add_attribute(cell, 'text', 0)
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Place Name'), self.filter_title)
self.add_text_entry(_('Street'), self.filter_street)
self.add_text_entry(_('Locality'), self.filter_locality)
self.add_text_entry(_('City'), self.filter_city)
self.add_text_entry(_('County'), self.filter_county)
self.add_text_entry(_('State'), self.filter_state)
self.add_text_entry(_('Country'), self.filter_country)
self.add_text_entry(_('ZIP/Postal code'), self.filter_zip)
self.add_text_entry(_('Church parish'), self.filter_parish)
self.add_text_entry(_('Title'), self.filter_title)
self.add_text_entry(_('Name'), self.filter_name)
self.add_entry(_('Type'), self.ptype)
self.add_text_entry(_('Code'), self.filter_code)
self.add_text_entry(_('Note'), self.filter_note)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
@@ -109,37 +108,26 @@ class PlaceSidebarFilter(SidebarFilter):
def clear(self, obj):
self.filter_id.set_text('')
self.filter_title.set_text('')
self.filter_street.set_text('')
self.filter_locality.set_text('')
self.filter_city.set_text('')
self.filter_county.set_text('')
self.filter_state.set_text('')
self.filter_country.set_text('')
self.filter_zip.set_text('')
self.filter_parish.set_text('')
self.filter_name.set_text('')
self.filter_code.set_text('')
self.filter_note.set_text('')
self.ptype.get_child().set_text('')
self.tag.set_active(0)
self.generic.set_active(0)
def get_filter(self):
gid = cuni(self.filter_id.get_text()).strip()
title = cuni(self.filter_title.get_text()).strip()
street = cuni(self.filter_street.get_text()).strip()
locality = cuni(self.filter_locality.get_text()).strip()
city = cuni(self.filter_city.get_text()).strip()
county = cuni(self.filter_county.get_text()).strip()
state = cuni(self.filter_state.get_text()).strip()
country = cuni(self.filter_country.get_text()).strip()
zipc = cuni(self.filter_zip.get_text()).strip()
parish = cuni(self.filter_parish.get_text()).strip()
name = cuni(self.filter_name.get_text()).strip()
ptype = self.filter_place.get_type().xml_str()
code = cuni(self.filter_code.get_text()).strip()
note = cuni(self.filter_note.get_text()).strip()
regex = self.filter_regex.get_active()
tag = self.tag.get_active() > 0
gen = self.generic.get_active() > 0
empty = not (gid or title or street or locality or city or county or
state or country or zipc or parish or note or regex or tag
or gen)
empty = not (gid or title or name or ptype or code or note or regex
or tag or gen)
if empty:
generic_filter = None
else:
@@ -148,8 +136,11 @@ class PlaceSidebarFilter(SidebarFilter):
rule = RegExpIdOf([gid], use_regex=regex)
generic_filter.add_rule(rule)
rule = HasPlace([title, street, locality, city, county, state,
country, zipc, parish], use_regex=regex)
if title:
rule = HasTitle([title], use_regex=regex)
generic_filter.add_rule(rule)
rule = HasData([name, ptype, code], use_regex=regex)
generic_filter.add_rule(rule)
if note:
@@ -29,6 +29,7 @@ from gi.repository import Pango
from ... import widgets
from ...dbguielement import DbGUIElement
from gramps.gen.config import config
from gramps.gen.constfunc import UNITYPE
_RETURN = Gdk.keyval_from_name("Return")
_KP_ENTER = Gdk.keyval_from_name("KP_Enter")
@@ -132,6 +133,15 @@ class SidebarFilter(DbGUIElement):
self.clicked(obj)
return False
def add_heading(self, heading):
label = Gtk.Label()
label.set_text('<b>%s</b>' % heading)
label.set_use_markup(True)
label.set_alignment(0, 0.5)
self.table.attach(label, 1, 2, self.position, self.position+1,
xoptions=Gtk.AttachOptions.FILL, yoptions=0)
self.position += 1
def add_entry(self, name, widget):
if name:
self.table.attach(widgets.BasicLabel(name),
@@ -203,6 +213,9 @@ class SidebarFilter(DbGUIElement):
self.__tag_list = []
for handle in self.dbstate.db.get_tag_handles(sort_handles=True):
tag = self.dbstate.db.get_tag_from_handle(handle)
# for python3 this returns a byte object, so conversion needed
if not isinstance(handle, UNITYPE):
handle = handle.decode('utf-8')
self.__tag_list.append((tag.get_name(), handle))
self.on_tags_changed([item[0] for item in self.__tag_list])
+2 -2
View File
@@ -169,7 +169,7 @@
<object class="GtkLabel" id="label118">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_Title:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -201,7 +201,7 @@
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
+1 -1
View File
@@ -107,7 +107,7 @@
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
+2 -5
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<object class="GtkDialog" id="book">
@@ -317,8 +317,7 @@
<object class="GtkLabel" id="avail_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="opacity">0</property>
<property name="xpad">12</property>
<property name="ypad">6</property>
<property name="use_markup">True</property>
@@ -368,8 +367,6 @@
<object class="GtkLabel" id="book_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="xpad">12</property>
<property name="ypad">6</property>
<property name="use_markup">True</property>
-1
View File
@@ -2,7 +2,6 @@
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="clipboard">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Clipboard</property>
<property name="default_width">500</property>
+5 -5
View File
@@ -75,7 +75,7 @@
<object class="GtkLabel" id="name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Format _name:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -90,7 +90,7 @@
<object class="GtkLabel" id="format_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Format _definition:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -137,7 +137,7 @@
<object class="GtkLabel" id="label706">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">12</property>
<property name="ypad">6</property>
<property name="label" translatable="yes">The following conventions are used:
@@ -170,7 +170,7 @@
<object class="GtkLabel" id="example_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Example:</property>
<property name="justify">center</property>
<property name="mnemonic_widget">example_label</property>
@@ -186,7 +186,7 @@
<object class="GtkLabel" id="example_label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="use_markup">True</property>
<property name="justify">center</property>
<property name="angle">360</property>
+209 -120
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<object class="GtkDialog" id="comment">
@@ -58,7 +58,7 @@
<object class="GtkLabel" id="label714">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Version description</property>
<attributes>
<attribute name="weight" value="bold"/>
@@ -111,6 +111,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area25">
<property name="visible">True</property>
@@ -124,43 +125,36 @@
<property name="can_default">True</property>
<property name="receives_default">False</property>
<child>
<object class="GtkAlignment" id="alignment5">
<object class="GtkBox" id="box10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<property name="right_padding">2</property>
<property name="spacing">3</property>
<child>
<object class="GtkHBox" id="hbox139">
<object class="GtkImage" id="image2718">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image2718">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-close</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label710">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Close Window</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<property name="icon_name">window-close</property>
<property name="use_fallback">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label710">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Close Window</property>
<property name="use_underline">True</property>
<property name="width_chars">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
@@ -179,42 +173,35 @@
<property name="can_default">True</property>
<property name="receives_default">False</property>
<child>
<object class="GtkAlignment" id="alignment8">
<object class="GtkBox" id="box11">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<property name="spacing">3</property>
<child>
<object class="GtkHBox" id="hbox140">
<object class="GtkImage" id="image2719">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image2719">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label713">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Load Family Tree</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<property name="icon_name">document-open</property>
<property name="use_fallback">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label713">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Load Family Tree</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
@@ -234,31 +221,61 @@
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox132">
<object class="GtkBox" id="box8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox138">
<object class="GtkBox" id="box5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">10</property>
<child>
<object class="GtkVBox" id="vbox133">
<object class="GtkBox" id="box7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">10</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow88">
<object class="GtkBox" id="box4">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkTreeView" id="dblist">
<object class="GtkScrolledWindow" id="scrolledwindow88">
<property name="hscrollbar_policy">never</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1"/>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="dblist">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="msg">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">False</property>
<property name="vexpand">False</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">2</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
@@ -268,49 +285,57 @@
</packing>
</child>
<child>
<object class="GtkLabel" id="msg">
<object class="GtkBox" id="box3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox134">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkAlignment" id="alignment7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkVButtonBox" id="vbuttonbox2">
<object class="GtkButtonBox" id="buttonbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<property name="layout_style">start</property>
<child>
<object class="GtkButton" id="new">
<property name="label">gtk-new</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">document-new</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">New</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@@ -320,32 +345,92 @@
</child>
<child>
<object class="GtkButton" id="copy">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<child>
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">edit-copy</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Copy</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
<property name="single_line_mode">True</property>
<property name="angle">0.01</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="remove">
<property name="label">gtk-delete</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkBox" id="box6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">edit-delete</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="removelb">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Delete</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@@ -398,19 +483,23 @@
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
@@ -425,7 +514,7 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">0</property>
</packing>
</child>
</object>
+17 -17
View File
@@ -56,7 +56,7 @@
<object class="GtkImage" id="image2713">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="valign">1</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">6</property>
</object>
@@ -70,7 +70,7 @@
<object class="GtkLabel" id="title">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
@@ -88,7 +88,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@@ -107,7 +107,7 @@
<object class="GtkLabel" id="message">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="ypad">12</property>
<property name="wrap">True</property>
</object>
@@ -186,7 +186,7 @@
<object class="GtkImage" id="image2723">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="valign">1</property>
<property name="stock">gtk-dialog-info</property>
<property name="icon-size">6</property>
</object>
@@ -200,7 +200,7 @@
<object class="GtkLabel" id="toplabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
@@ -421,7 +421,7 @@
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="ypad">24</property>
<property name="use_markup">True</property>
@@ -441,7 +441,7 @@
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="valign">1</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">6</property>
</object>
@@ -455,7 +455,7 @@
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
@@ -475,7 +475,7 @@
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">If you check this button, all the missing media files will be automatically treated according to the currently selected option. No further dialogs will be presented for any missing media files.</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@@ -568,7 +568,7 @@
<object class="GtkLabel" id="od_label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="ypad">12</property>
<property name="use_markup">True</property>
@@ -587,7 +587,7 @@
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="valign">1</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">6</property>
</object>
@@ -601,7 +601,7 @@
<object class="GtkLabel" id="od_label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
@@ -836,7 +836,7 @@
<object class="GtkLabel" id="sd_label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">label</property>
<property name="use_markup">True</property>
@@ -855,7 +855,7 @@
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="valign">1</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">6</property>
</object>
@@ -869,7 +869,7 @@
<object class="GtkLabel" id="sd_label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
@@ -888,7 +888,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
+8 -8
View File
@@ -98,7 +98,7 @@
<object class="GtkLabel" id="label209">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_Date:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -113,7 +113,7 @@
<object class="GtkLabel" id="label210">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">St_reet:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -130,7 +130,7 @@
<object class="GtkLabel" id="label214">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">C_ity:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -162,7 +162,7 @@
<object class="GtkLabel" id="label215">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_State/County:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -181,7 +181,7 @@
<object class="GtkLabel" id="label217">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_ZIP/Postal code:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -213,7 +213,7 @@
<object class="GtkLabel" id="label216">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Cou_ntry:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -232,7 +232,7 @@
<object class="GtkLabel" id="label295">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Phon_e:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">phone</property>
@@ -406,7 +406,7 @@ Note: Use Residence Event for genealogical address data.</property>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_Locality:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">locality</property>
+2 -2
View File
@@ -90,7 +90,7 @@
<object class="GtkLabel" id="label171">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_Attribute:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -105,7 +105,7 @@
<object class="GtkLabel" id="label172">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">_Value:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
+4 -4
View File
@@ -98,7 +98,7 @@
<object class="GtkLabel" id="label653">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Relationship to _Mother:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -136,7 +136,7 @@
<object class="GtkLabel" id="label652">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Relationship to _Father:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -210,7 +210,7 @@
<object class="GtkLabel" id="label716">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Name Child:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">name</property>
@@ -224,7 +224,7 @@
<object class="GtkLabel" id="name">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
</object>
<packing>
<property name="left_attach">1</property>
+10 -10
View File
@@ -93,7 +93,7 @@
<object class="GtkLabel" id="label612">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">_Date:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -163,7 +163,7 @@
<object class="GtkLabel" id="label613">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">_Volume/Page:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -180,7 +180,7 @@
<object class="GtkLabel" id="label614">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">Con_fidence:</property>
<property name="use_underline">True</property>
<property name="justify">center</property>
@@ -242,7 +242,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">_ID:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">gid</property>
@@ -282,7 +282,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">Source:</property>
</object>
<packing>
@@ -312,7 +312,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="source">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
</object>
<packing>
<property name="expand">True</property>
@@ -379,7 +379,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">Tags:</property>
</object>
<packing>
@@ -393,7 +393,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="tag_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
</object>
<packing>
<property name="left_attach">1</property>
@@ -423,7 +423,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">Author:</property>
</object>
<packing>
@@ -437,7 +437,7 @@ Very High =Direct and primary evidence used, or by dominance of the evidence </p
<object class="GtkLabel" id="author">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
</object>
<packing>
<property name="left_attach">1</property>
+7 -7
View File
@@ -130,7 +130,7 @@
<object class="GtkLabel" id="label404">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="label" translatable="yes">Calenda_r:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">calendar_box</property>
@@ -195,7 +195,7 @@
<property name="tooltip_text" translatable="yes">Old Style/New Style</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="halign">3</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@@ -208,7 +208,7 @@
<object class="GtkLabel" id="label717">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="halign">2</property>
<property name="label" translatable="yes">Ne_w year begins: </property>
<property name="use_underline">True</property>
<property name="justify">right</property>
@@ -270,7 +270,7 @@
<object class="GtkLabel" id="label413">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">Q_uality</property>
<property name="use_underline">True</property>
@@ -306,7 +306,7 @@
<object class="GtkLabel" id="label414">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">_Type</property>
<property name="use_underline">True</property>
@@ -342,7 +342,7 @@
<object class="GtkLabel" id="label411">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">Date</property>
<attributes>
@@ -460,7 +460,7 @@
<object class="GtkLabel" id="label412">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="halign">1</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">Second date</property>
<attributes>

Some files were not shown because too many files have changed in this diff Show More