Compare commits
278 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1c241125d7 | |||
| e81c82fcc0 | |||
| 7d91f4fae8 | |||
| 78a74cae5c | |||
| 5039ad10f0 | |||
| 926bb60650 | |||
| 314484cf84 | |||
| ae0a039216 | |||
| 296e8ca562 | |||
| 4e6a06bfac | |||
| 5ff70a665e | |||
| c0a0c1d302 | |||
| e71115af1b | |||
| 5828dd3aa8 | |||
| 273a5f986f | |||
| 00032f0cad | |||
| 1ed6103a41 | |||
| ea2c71d238 | |||
| 6605d868cb | |||
| 7a57c8584e | |||
| 46a509ee1d | |||
| 1aad1d6be0 | |||
| 104808cf8f | |||
| 8a34d98fb5 | |||
| c42f714393 | |||
| d8ba31cc29 | |||
| f9bb9e5e73 | |||
| ed0b50e9b8 | |||
| 19acd368c0 | |||
| 9de644bf1d | |||
| bdd70dec1c | |||
| 2a26ca6c5c | |||
| f675fc1114 | |||
| 143df8d42c | |||
| d71a36b240 | |||
| 085d1ee095 | |||
| cc2f803b86 | |||
| 9c34e17bd9 | |||
| 136bdd015a | |||
| e0b56f65ef | |||
| 089d028e8f | |||
| 6e4ce84396 | |||
| 0930c0041f | |||
| ef0492e0ff | |||
| e1a71dcd34 | |||
| 6895594cdc | |||
| 45f82f1ec5 | |||
| c26fcf6d56 | |||
| 2701d51b62 | |||
| 9683a9e9eb | |||
| d03e9e6553 | |||
| 0f8b77b706 | |||
| a2244c6ab4 | |||
| 2eccc6c4ce | |||
| 815596a88d | |||
| 98fdeaeb6b | |||
| 4d57633006 | |||
| 9c3450531b | |||
| 2a35887da7 | |||
| b34e088fe7 | |||
| 189cc853b2 | |||
| 1d3d002490 | |||
| eb34416727 | |||
| 52842f8200 | |||
| 646afece89 | |||
| 45adb70330 | |||
| 4ac02a4ca0 | |||
| ffe417f43e | |||
| dc50b14ed3 | |||
| 35f5426a33 | |||
| 8ff85415e8 | |||
| be1980e39a | |||
| 93bd200ea0 | |||
| 906e46b0a5 | |||
| 51324b182f | |||
| 4b8d25083b | |||
| 7ef450515c | |||
| cb5fb2ed27 | |||
| b4eae781f8 | |||
| c5c5889a42 | |||
| fe2a36c580 | |||
| e3538e8a8b | |||
| 475e78669b | |||
| f022597545 | |||
| 672bffe620 | |||
| 70e453f031 | |||
| 8a4b9c7ee0 | |||
| e86f796cf7 | |||
| 436487072a | |||
| a2a68c64f7 | |||
| c9d9925965 | |||
| 4b8ca4a824 | |||
| 57a367e8c4 | |||
| 9ff34f2934 | |||
| 88f5fbeb9e | |||
| 42cf24205b | |||
| 36c03a0a53 | |||
| cf264e8d89 | |||
| ab056c8ac5 | |||
| cc1f5b734a | |||
| ac21380b60 | |||
| 706437f57d | |||
| ab0dfc8d68 | |||
| 4cb4d912fe | |||
| 315ddd6ffd | |||
| 60ff2584fb | |||
| d2363249b9 | |||
| b70adcb74a | |||
| f63385ac4b | |||
| d9cc3d3b0e | |||
| ccbf763ac4 | |||
| 111c245297 | |||
| 359d277423 | |||
| 1a0784b154 | |||
| b02e1fe467 | |||
| 8fe31528cf | |||
| 38b5b8ec54 | |||
| 8d57884b5b | |||
| 69e7501acc | |||
| 385c10a068 | |||
| d99adb8bd4 | |||
| 74995c0994 | |||
| 14ccc01acb | |||
| 542450bf6d | |||
| b381f2dd8b | |||
| 25f9ea64fc | |||
| c1b65d8cbe | |||
| 89a5d3fcda | |||
| 38addcedb3 | |||
| 6c0fdb27d6 | |||
| 3e5a7fe970 | |||
| cf88fef1e8 | |||
| 94f28daf03 | |||
| bd8c08596b | |||
| d43ff61913 | |||
| 307bed5e44 | |||
| e7cf8fe70c | |||
| c390a0f490 | |||
| 8cc86bd153 | |||
| 2cd23356b4 | |||
| 03579aa4a1 | |||
| 7f9686ba8d | |||
| f827fff712 | |||
| 27648255c0 | |||
| f0b022564b | |||
| 2727044bc7 | |||
| 04bc04896b | |||
| 44d8c31bc9 | |||
| 1c4e91e891 | |||
| 09caa90530 | |||
| 68a0a0d087 | |||
| e5701e9641 | |||
| e2e75559c2 | |||
| c489c8ec34 | |||
| 8e11d1bd64 | |||
| 5c71a35aea | |||
| a99196dde5 | |||
| 7c71e098f1 | |||
| db04225e83 | |||
| 40686d50ef | |||
| 66b0d389c7 | |||
| 4ff5d6460e | |||
| 77c530f5ed | |||
| db138e646c | |||
| bef5ed6386 | |||
| dadb588d83 | |||
| 55a20ab1e3 | |||
| 71e2077805 | |||
| b151f17117 | |||
| 3b5e3cbe6e | |||
| 55c7becb68 | |||
| 643ffcb479 | |||
| 218ea80d2b | |||
| 2d27ada429 | |||
| 9cf8a940f9 | |||
| 80ace16550 | |||
| 4ffce0b915 | |||
| a16bc2de9c | |||
| ce9723eec8 | |||
| 24df17cc2f | |||
| 6b50f932db | |||
| 3781e75d60 | |||
| 4396a09081 | |||
| 3e19b099f8 | |||
| 254a605543 | |||
| f16772c393 | |||
| 415a843be9 | |||
| 82646d0d67 | |||
| db352c5c4c | |||
| ac62a978e0 | |||
| d0a83dd39c | |||
| 53b415c0d0 | |||
| 2f4767fd6f | |||
| d230948c6a | |||
| a8de78c452 | |||
| 0e3c3cdbdd | |||
| bff873f174 | |||
| 417d379726 | |||
| 88115561cc | |||
| 563ffe22b4 | |||
| 3f70f716c4 | |||
| 25fbf57219 | |||
| eebcd5c8a2 | |||
| 20917e4b09 | |||
| a166ed9ca4 | |||
| 492a40b5b4 | |||
| 516d716b83 | |||
| de8efc9d12 | |||
| 079abd1df3 | |||
| 42a56bf31b | |||
| 236261e2db | |||
| 7fa12faed2 | |||
| 032051c093 | |||
| ad961132eb | |||
| c248767c1d | |||
| 8497e8c4b2 | |||
| 05da780166 | |||
| 03ab81e2d1 | |||
| 205529f448 | |||
| 10c62800ef | |||
| 61625e2a9b | |||
| b8b61521d8 | |||
| a1402552e2 | |||
| 4722ce2e7f | |||
| b86bbf44d1 | |||
| 49f53a1fe7 | |||
| 1c8cc6e33f | |||
| 040c9010d2 | |||
| c9a19a5954 | |||
| bda98e7b1e | |||
| c035dd3df4 | |||
| 2de3ea43c3 | |||
| 939eb423a6 | |||
| 0fe8bd5e4a | |||
| acb7f3cded | |||
| d84109f435 | |||
| e84bf70347 | |||
| d6f7cfcd20 | |||
| a9640f327f | |||
| 80be25adae | |||
| 1030d1627e | |||
| d2ffb0484a | |||
| 7b6dede9ea | |||
| e4061d605c | |||
| 4afc4933c2 | |||
| 14ed0c4d16 | |||
| 1a8c73212e | |||
| 18ef02d424 | |||
| 85b4c25d02 | |||
| e0b44ff355 | |||
| 9a00d5533d | |||
| d349f247ea | |||
| f44e84f054 | |||
| 0a7b8fb6ee | |||
| 85914babdf | |||
| 448986875b | |||
| b81f80bace | |||
| 12ed5deb24 | |||
| e6d35b8cbd | |||
| 84055c01dc | |||
| b475c47994 | |||
| f9ebdaadc3 | |||
| 9478468977 | |||
| 01baffae32 | |||
| 4fd6b0f7c4 | |||
| 84318f6ee1 | |||
| 54fdf3ef8a | |||
| 9740e7fc0c | |||
| b0b64b0b5c | |||
| 57ed1d7cb8 | |||
| 21e4d8e5ad | |||
| 3d249cfa01 | |||
| 9d858d7167 | |||
| 081b2a4ed2 | |||
| 49f7137577 | |||
| 8732b1e237 | |||
| 10f47d73ad | |||
| 778e87971f |
@@ -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
|
||||
|
||||
@@ -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%;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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.
|
||||
.
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 "archive.zip"
|
||||
Test relative path link: relative file path to "archive.tgz"
|
||||
|
||||
Thumbnail for "1897_expeditionsmannschaft_rio_a":
|
||||
__THUMB_O0010__
|
||||
Image "AntoineClaudet":
|
||||
__MEDIA_O0011__
|
||||
Thumbnail for "1897_expeditionsmannschaft_rio_a" with link:
|
||||
__THUMB_O0010__
|
||||
Image "AntoineClaudet" 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
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',
|
||||
}
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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."),
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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']))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
@@ -195,4 +195,6 @@ def create_checksum(full_path):
|
||||
md5sum = hashlib.md5(media_file.read()).hexdigest()
|
||||
except IOError:
|
||||
md5sum = ''
|
||||
except UnicodeEncodeError:
|
||||
md5sum = ''
|
||||
return md5sum
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]+"..."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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':
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user