Compare commits

..
118 Commits
Author SHA1 Message Date
SNoiraud d48dcc9c5f FR10850 V1: Refresh button in the gramplet bar.
Fixes #10850

This is the first method to avoid reloading gramplet automaticaly.
2018-10-31 20:30:44 +01:00
prculley 263a082afe Merge in changes from Gramps50 2018-10-29 09:32:35 -05:00
Richard ClayandNick Hall dd9ddab849 In personsidebarfilter, search on each part of name
Instead of requiring that the entire search string matches a single one of the Person's names, the function will require that each word in the search string matches any of the Person's name fields.

Fixes #7950
2018-10-20 21:30:20 +01:00
Malte RenkenandNick Hall cfa278886b RelGraphReport: Add an option to omit "irrelevant" family nodes 2018-10-12 20:58:04 +01:00
MJBMZandNick Hall 1c430a6b91 Replace rounded corners checkbox by dropdown
It now allows rounded corners to be set more explicitly for
different genders (None/Male/Female/Both).
2018-10-12 20:25:51 +01:00
jose1711andNick Hall b0eb712933 Do not use hyphen for living persons in hourglass graph 2018-10-12 19:36:42 +01:00
Jgon6andNick Hall 51a7ad9483 Include death anniversaries as an option in the birthdays report
Added the optional ability to list the anniversry of peoples deaths in
the birthday and anniversary report

Resolves #3540
2018-10-12 19:19:59 +01:00
Jgon6andNick Hall d6e9d62fad Add an option to show years in the birthday report
Added an option to the birthday report that allows for the year of birth
(or in the case of a wedding it's year) to be printed in the report.

Resolves #5948
2018-10-12 19:19:59 +01:00
Jgon6andNick Hall 3bac4a1036 Added symbols to the birthdays report showing the type of event
Issue #3540
2018-10-12 19:19:59 +01:00
Jgon6andNick Hall 1995a7068c Birthday report dead indicator now user defineable
Fixed the birthday report so the dead icon is able to be set within the
options window
2018-10-12 19:19:59 +01:00
Jgon6andNick Hall 5dc06d023d Indicate if a person is dead in the birthdays report
Added a text option to have a string that will show after a persons name
in the birthday and anniversary report. This works for both birthdays
and anniversaries.

Issue #3540
2018-10-12 19:19:43 +01:00
SNoiraudandNick Hall d98a1857dc Make relationships optional in narrative web
Fixes #10454
2018-10-12 18:46:39 +01:00
Paul Franklin 7da8811327 Setting the year as an ordinal number in Croatian
With this commit, the "master" version of the Statistics Chart
report will show a year as an ordinal number in Croatian.

So our translators will have until 5.1.0 is released to translate
the two new strings, in all the supported gramps languages.

Issue #10822
2018-10-07 23:45:40 -07:00
prculleyandNick Hall 15db2dd603 Disable OSX specific menu items, added in 'Gramps' menu 2018-10-07 16:49:12 +01:00
prculleyandNick Hall 97b15322d4 Add config option to use Toolbar Text 2018-10-07 16:49:12 +01:00
prculleyandNick Hall 824bf7e40f Geps044 - Replace deprecated Gtk.UIManager, Gtk.Actions etc. 2018-10-07 16:49:12 +01:00
milotypeandNick Hall 56fa261ef2 Better typography in graph reports
Replace hyphen with en-dash.
2018-10-07 16:16:19 +01:00
Robin van der VlietandSam Manzi 1efab19f1e Esperanto Translation Update eo.po (#660)
Made a lot of corrections and other stylistic improvements to the Esperanto file.
2018-09-27 11:21:15 +10:00
prculley 51e294f748 Fix up bad translation files after merge 2018-08-09 10:54:12 -05:00
Leonhaeuserandprculley cb65fd93ca Reviewed German translation Thanks to bmendl 2018-08-09 10:35:49 -05:00
niemematandprculley 5b9600d835 Fix translation in Finnish 2018-08-09 10:35:15 -05:00
John Rallsandprculley cf80d17040 File copy doesn't work if the glob can match directories. 2018-08-09 10:35:14 -05:00
John Rallsandprculley d4f906f22d Install the docs/gramps directory in the bundle.
Fixes bug #10705.
2018-08-09 10:35:14 -05:00
niemematandprculley d189e334d8 Fix and updated translation in Finnish 2018-08-09 10:35:14 -05:00
Ross Gammonandprculley a48a94d872 Update the Debian changelog after the 5.0.0 release 2018-08-09 10:35:13 -05:00
John Rallsandprculley 8e5dc220dc Release Gramps-5.0.0 on Mac. 2018-08-09 10:35:13 -05:00
Nick Hallandprculley dca2f610dc Bump to 5.0.1 2018-08-09 10:34:31 -05:00
Nick Hallandprculley 3d1833e307 Release Gramps 5.0.0 2018-08-09 10:33:57 -05:00
Nick Hallandprculley aa221cc3c7 Update Changelog and NEWS files 2018-08-09 10:33:19 -05:00
Nick Hallandprculley 51b7d1c420 Update translation template for new release 2018-08-09 10:30:58 -05:00
niemematandprculley 674d286f87 Fix translation in Finnish 2018-08-09 10:30:58 -05:00
John Rallsandprculley 0161c4b917 Correct binary test logic for primary mask.
state & get_primary_mask(another) tested (state & (primary | other)),
which will be true if state matches *either* primary *or* other, but
what is wanted in a not-negated test is state matching all bits of
(primary | other). match_primary_mask does that.

On the other hand there are also cases of "not state & (primary | other)".
no_match_primary_mask handles that, returning true if state matches none
 of the bits in (primary | other).

Fixes #10646.
2018-08-09 10:30:57 -05:00
prculley de31a42fc8 Fix BaseSelector to avoid long delay before display on large trees
Fixes #10634
2018-08-09 10:30:57 -05:00
SNoiraudandprculley 9c508de5fd Export options > Gui alignment issue
Fixes #10576
2018-08-09 10:30:57 -05:00
niemematandprculley 1b00d95ce4 New fix translation in Finnish 2018-08-09 10:30:57 -05:00
Espen Bergandprculley 78870decb8 Revised Norwegian bokmål 2018-08-09 10:30:56 -05:00
Espen Bergandprculley 1a5696eb2c Revised Norwegian bokmål 2018-08-09 10:30:24 -05:00
niemematandprculley 269d38da2c Fix translation in Finnish 2018-08-09 10:27:26 -05:00
Nick Hallandprculley 99f77b0a88 Fix dialog button order on non-Mac systems
Resolves #10585.
2018-08-09 10:27:25 -05:00
De Tranandprculley 264fdda4d0 Fix and update Vietnamese translation
Resolves #10681.
2018-08-09 10:27:24 -05:00
Sveinn í Felliandprculley 8092b88ad4 Update Icelandic translation 2018-08-09 10:12:17 -05:00
jose1711andprculley 3251e2ae88 Fix and update Slovak translation 2018-08-09 10:09:53 -05:00
jose1711andprculley f718c5f8b4 Fix typo in translation 2018-08-09 10:09:53 -05:00
niemematandprculley a96a446b47 Fix translation in Finnish 2018-08-09 10:09:53 -05:00
niemematandprculley 5658411acf Fix translation in Finnish 2018-08-09 10:09:53 -05:00
niemematandprculley a4403d719e Fix translation in Finnish 2018-08-09 10:09:52 -05:00
Luigi Toscanoandprculley 8597a10c40 Update Italian translation 2018-08-09 10:09:52 -05:00
Nick Hallandprculley d0c0045dc1 Update English (British) translation 2018-08-09 10:09:52 -05:00
De Tranandprculley 868abdc0d9 Update Vietnamese translation 2018-08-09 10:08:37 -05:00
Kaj Mikkelsenandprculley ebf88bf5c5 Update Danish translation 2018-08-09 10:08:35 -05:00
Lajos Nemesériandprculley c3814a4e42 Update Hungarian translation 2018-08-09 10:07:53 -05:00
John Ralls 52fe365919 Switch included moduleset to gitlab.gnome.org.
Fixes bug #10733.
2018-08-09 07:21:18 -07:00
prculley bc39dda9e7 Use msgcat merged po files instead of git merge versions 2018-07-13 07:35:36 -05:00
prculley 257275f169 Merge from gramps50 2018-07-12 11:10:22 -05:00
Espen Berg 9e61809b17 Received revised Norsk Nynorsk from Sigmund Lorentsen 2018-05-01 2018-05-17 21:30:15 +02:00
Espen Berg 9e2b935db1 revised Norwegian bokmål 2018-05-17 21:28:34 +02:00
Nick Hall 9a386574d8 Revert "Clone event w/o references (2nd pass, part B)"
This reverts commit 208feceb03.

Changes requested in the PR not made.  Such a change requires
discussion on the list first.
2018-05-12 23:09:27 +01:00
Nick Hall 90bdb0a840 Revert "Embedded Clone Event w. references (2nd pass, part A)"
This reverts commit ae322dbdc8.

Changes requested in the PR not made.  Such a change requires
discussion on the list first.
2018-05-12 22:59:52 +01:00
Alois Poettker ae322dbdc8 Embedded Clone Event w. references (2nd pass, part A) 2018-04-23 11:00:26 +02:00
Alois Poettker 208feceb03 Clone event w/o references (2nd pass, part B)
Feature request #9604

This functionality in the Event list doubles an event with all the tags, citations, media, attributes and notes, but without the references. Its like an event addition, but with default values.
2018-04-23 11:00:26 +02:00
Paulo Henrique MoraesandSam Manzi 32dd3a2e14 [pt_BR]Translation updates and corrections (#582)
- Portuguese (Brazil)
2018-03-15 11:26:59 +11:00
Jgon6andNick Hall 0ae51c9522 Changed behavior of "Look up with Map Services"
Removed the section that looked up by city, and country from the Map
Services lookup for Google and Open Street Map.

Resolves #9486
2018-03-03 17:35:51 +00:00
Nick Hall 59bd9f040d Merge branch 'gramps50' 2018-03-03 17:29:32 +00:00
Paulo Henrique MoraesandGitHub df00dd1f32 Brazilian portuguese update 2018-02-23 14:58:38 -03:00
niememat ca49b56774 Update finnish translation 2018-02-20 18:22:28 +02:00
Nick Hall 19f8c3561c Merge branch 'gramps50' 2018-02-09 00:13:43 +00:00
Serge NoiraudandGitHub 79ff9bc216 Geocoding: associate a lat/lon to a place name (#515)
* Geocoding: associate a lat/lon to a place name

Fixes #09642

* Some cleanup

* update README.md

* Remove url from message dialog
2018-01-18 09:11:51 +01:00
prculleyandNick Hall b54672d28d Leak (Uncollected Objects); allow user to cancel long screen update 2018-01-08 19:22:27 +00:00
mb06csandGitHub 6b42d71158 endoflinereport.py: sort generation during output 2018-01-06 13:32:43 +01:00
Paweł TomkielandNick Hall ac593d814d fixing polish places translations 2018-01-04 23:07:42 +00:00
Nick Hall 617e2212c8 new gramps.pot translation template 2018-01-04 22:59:31 +00:00
Nick Hall ad15ef7961 Merge branch 'gramps50' 2018-01-03 21:32:14 +00:00
niememat 406faa5603 Update finnish translation 2017-11-25 10:44:45 +02:00
Serge NoiraudandGitHub 4e0d562208 Various Feature Requests in Narrative Web (#468)
Issue #06772
2017-11-23 09:40:52 +01:00
Serge NoiraudandGitHub 43ef686622 Narrative Web Feature requests : (#466)
Sort "Surname" web page by given name and birth date.
Surname list doesn't use default name format

Fixes #05315, #08067
2017-11-23 09:39:12 +01:00
Serge NoiraudandGitHub d59fe6b2af Display Lat/Lon optionally on places list page (#467)
Fixes #05382
2017-11-23 09:37:47 +01:00
Serge NoiraudandGitHub d677a1a785 Add extra page to narrativeweb. (#465)
Fixes #02630
2017-11-23 09:36:13 +01:00
Leonhaeuser be776d6a31 updated German date handler: added some missing Latin month names and some old German month names 2017-10-05 21:34:23 +02:00
Nick Hall 1482fedb9c Merge branch 'gramps50' 2017-09-23 17:08:52 +01:00
Sam Manzi 00f8df60ce Revert "Tidy up mocking code (#438)[First commit]"
This reverts commit 8ebb4d35fa.
2017-09-23 07:50:48 +10:00
Jonathan BiegertandPaul Franklin f31caf1ea4 enable Graphviz node port selection, optionable (p.r. 456)
This enables the headport and tailport attributes for all edges in
the Graphviz file. The default (off) value makes the arrows between
persons and/or family nodes attach their ends to the respective node
at any position. When this option is selected, the position facing
the node on the other side of the arrow is always chosen.
2017-09-17 17:20:23 -07:00
Nick HallandSam Manzi 8ebb4d35fa Tidy up mocking code (#438)[First commit] 2017-09-17 11:03:39 +10:00
Serge NoiraudandSam Manzi c5f2717623 Gramps 'Views' are not named in the window header (#448)
Resolves #001675
2017-09-12 10:05:46 +10:00
Serge NoiraudandSam Manzi e5d5cfbd3a Allow Home person to be set in Relationship and Pedigree view (#446)
Resolves #0001970
2017-09-01 10:41:24 +10:00
Sebastian SchubertandNick Hall bd5f6e4711 example.gramps: add some non-primary participants to events
The following additional participants were added:
Death of Garner, Anderson:
* Page, Elizabeth (Witness)
* Farmer, Miranda Keziah (Witness)
* Page, David (Informant)

Birth of Thornton, James Arthur:
* Jankowski, Margaret Jane "Maggie" (Witness)
* Garner, Raymond E. (Informant)

Marriage of Garner, Lewis Anderson and Martel, Luella Jacques:
* Garner, Robert W. (Witness)
* Martel, Henry (Witness)
* Page, Robert (Clergy)
* Blanco, L. J. (Clergy)
2017-08-08 12:41:54 +01:00
Leonhaeuser e15deff4ed synced with gramps 50 2017-08-03 20:46:41 +02:00
romjerome 9d906c29a2 update french translation 2017-08-01 12:20:05 +02:00
romjerome 6577d43e4e merge forward (working release steps on gramps42) 2017-08-01 12:03:46 +02:00
Alois PoettkerandNick Hall 1a065485e3 Extend Pro-Gen importer II
Adapted to Pro-Gen test fix, expanded functionality and fixed
minor bugs.
2017-07-27 19:05:52 +01:00
schooncandNick Hall 009783a59a Add pycharm dir to .gitignore 2017-07-27 18:23:55 +01:00
Nick Hall 1b4f70c808 Fix permissions on leak gramplet 2017-07-27 18:18:53 +01:00
niememat dd4a727521 Update finnish translation 2017-07-27 09:48:08 +03:00
Paul CulleyandSam Manzi ebb7111f25 An improved Leak (Uncollected Objects) Gramplet (#345)
* Improved leak detector (debugging tool)

* Fix DummyDb so it garbage collector can reclaim it after close

* Fix leak gramplet so pop-ups use correct transient parent
2017-07-27 12:15:38 +10:00
Nick Hall 86fd14613e Merge branch 'gramps50' 2017-07-25 21:45:37 +01:00
Alois PoettkerandNick Hall 5276461239 Tidy up code 2017-07-18 18:25:29 +01:00
Alois PoettkerandNick Hall 40f47bc22d Delete multiple events 2017-07-18 18:20:55 +01:00
Nick Hall 8150403ccb Revert "Simplify import plugin unit tests"
This works with python 3.6 but not with 3.4.

This reverts commit b43d94ab16.
2017-07-18 16:57:55 +01:00
Nick Hall b43d94ab16 Simplify import plugin unit tests 2017-07-18 16:15:01 +01:00
Nick Hall 849290a3b7 Fix Pro-Gen unit test 2017-07-18 00:06:30 +01:00
Leonhaeuser 0b617e9fd6 update German translation
Fix #0010131
2017-07-15 00:23:00 +02:00
Lajos Nemesériandromjerome 6eb435142e Update Hungarian translation 2017-07-08 13:34:34 +02:00
Alois PoettkerandNick Hall e14ea777d5 Extend Pro-Gen importer functionality 2017-07-02 23:16:10 +01:00
Paul Franklin 46d73a16a0 add verify.py rules: match same birth or death date as marriage date
Issue #2583
2017-07-02 13:37:17 -07:00
Fedik 4d2b918d39 Update Ukrainian translation 2017-07-02 17:23:56 +03:00
romjerome 4acfdcce52 update french translation 2017-06-30 09:20:12 +02:00
arnaullvandNick Hall f3b3eec211 Updated catalan translation to latest template 2017-06-26 22:06:29 +01:00
niememat a840566e02 Update fix finnish translation 2017-06-24 19:33:00 +03:00
Nick Hall f6a2199f68 Merge branch 'gramps50' 2017-06-22 17:47:33 +01:00
Nick Hall dfc9dde32d Merge branch 'gramps50' 2017-06-15 16:44:15 +01:00
Zdeněk Hataš 50f93f54ec czech translation update 2017-06-05 11:49:50 +02:00
Nick Hall 9cb1d96725 Merge branch 'gramps50' 2017-06-03 22:20:03 +01:00
Nick Hall 40013dccc3 Merge branch 'gramps50' 2017-06-02 23:53:56 +01:00
Serge NoiraudandGitHub 24af1b8420 8200: Person Relatives Tab should use the type from the relationship (#396)
* 8200: Person Relatives Tab should use the type from the relationship

* 8200: Flag variables as there are now two variables.
2017-06-02 20:07:31 +02:00
Serge NoiraudandGitHub 213d656df4 10049: tabs reorganization in narrative web. (#406) 2017-06-02 13:20:21 +02:00
Nick Hall c09b4e96d2 Remove trailing whitespace 2017-05-23 19:52:19 +01:00
Nick Hall a80875e00c Update Travis for gramps51 2017-05-23 19:51:24 +01:00
Nick Hall bbdedb5097 Update a few missed version numbers 2017-05-23 19:49:23 +01:00
Nick Hall dd0671b111 Bump all version numbers to 5.1 2017-05-23 18:30:29 +01:00
293 changed files with 132426 additions and 93167 deletions
+3
View File
@@ -23,5 +23,8 @@ test/data
Thumbs.db
ehthumbs.db
# IDE
.idea/
# Glade temp files
*~
+6 -6
View File
@@ -72,7 +72,7 @@ install:
# by the automatic git checkout.
# Download Sean Ross-Ross's Pure Python module containing a framework to
# manipulate and analyze python asts and bytecode. This is loaded to
# manipulate and analyze python asts and bytecode. This is loaded to
# /home/travis/build/gramps-project/gramps/meta
# FIXME: This should be loaded from the release directory at
# https://pypi.python.org/pypi/meta
@@ -95,11 +95,11 @@ before_script:
# set GRAMPS_RESOURCES for locale, data,image and documentation
- export GRAMPS_RESOURCES=.
# Install addons
- mkdir -p ~/.gramps/gramps50/plugins/
- wget https://github.com/gramps-project/addons/raw/master/gramps50/download/CliMerge.addon.tgz
- tar -C ~/.gramps/gramps50/plugins -xzf CliMerge.addon.tgz
- wget https://github.com/gramps-project/addons/raw/master/gramps50/download/ExportRaw.addon.tgz
- tar -C ~/.gramps/gramps50/plugins -xzf ExportRaw.addon.tgz
- mkdir -p ~/.gramps/gramps51/plugins/
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/CliMerge.addon.tgz
- tar -C ~/.gramps/gramps51/plugins -xzf CliMerge.addon.tgz
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/ExportRaw.addon.tgz
- tar -C ~/.gramps/gramps51/plugins -xzf ExportRaw.addon.tgz
script:
# Ignore the virtualenv entirely. Use nosetests3, python3 (3.4.0) and coverage
-2
View File
@@ -64,8 +64,6 @@ Martin Hawlisch martin.hawlisch@gmx.de
Nick Hall nick__hall@hotmail.com
Paul Culley paulr2787@gmail.com
Peter Landgren peter.talken@telia.com
Raphael Ackermann raphael.ackermann@gmail.com
+148 -432
View File
@@ -1,527 +1,243 @@
2019-08-08 prculley <paulr2787@gmail.com>
2018-07-24 Nick Hall <nick-h@gramps-project.org>
* AUTHORS, ChangeLog, FAQ, NEWS, po/ChangeLog, po/gramps.pot:
Prepare for Release 5.0.2
* setup.py: Update development status for new release
2019-08-08 Paul Culley <paulr2787@gmail.com>
2018-07-24 Nick Hall <nick-h@gramps-project.org>
* gramps/gen/plug/_gramplet.py: Fix some Gramplets not updating
during tree changes after db change. (#865) Fixes #11234
* po/gramps.pot: Update translation template for new release
2019-08-08 Paul Culley <paulr2787@gmail.com>
2018-07-22 niememat <niememat@gmail.com>
* gramps/plugins/gramplet/events.py: Fix Events Grampslet for bad
sort order on dates/ages (#867) Fixes #7616
* po/fi.po: Fix translation in Finnish
2019-08-08 Paul Culley <paulr2787@gmail.com>
2018-07-01 John Ralls <jralls@ceridwen.us>
* gramps/gui/editors/displaytabs/backreflist.py,
gramps/gui/editors/displaytabs/backrefmodel.py: Fix References Tab
to update on Deletes of items when editor is open (#864) Fixes #11231
* gramps/gui/clipboard.py,
gramps/gui/editors/displaytabs/buttontab.py,
gramps/gui/editors/displaytabs/surnametab.py,
gramps/gui/filters/_searchbar.py,
gramps/gui/filters/sidebar/_sidebarfilter.py, gramps/gui/utils.py,
gramps/gui/views/navigationview.py,
gramps/gui/widgets/grampletpane.py,
gramps/gui/widgets/interactivesearchbox.py,
gramps/gui/widgets/multitreeview.py,
gramps/gui/widgets/styledtexteditor.py: Correct binary test logic
for primary mask. state & get_primary_mask(another) tested (state & (primary |
other)), which will be true if state matches *either* primary *or*
other, but what is wanted in a not-negated test is state matching
all bits of (primary | other). match_primary_mask does that. On the other hand there are also cases of "not state & (primary |
other)". no_match_primary_mask handles that, returning true if
state matches none of the bits in (primary | other). Fixes #10646.
2019-08-08 Paul Culley <paulr2787@gmail.com>
2018-06-21 prculley <paulr2787@gmail.com>
* data/tests/imp_notetest_dfs.gramps,
gramps/plugins/lib/libgedcom.py: Fix GEDCOM import for better
support of TMG (#861) Fixes #11224
* gramps/gui/glade/baseselector.glade,
gramps/gui/selectors/baseselector.py: Fix BaseSelector to avoid long
delay before display on large trees Fixes #10634
2019-08-07 Paul Culley <paulr2787@gmail.com>
2018-05-06 SNoiraud <serge.noiraud@laposte.net>
* gramps/gui/editors/__init__.py: Fix Edit Link 'New' button to work
(#863) Fixes #11225
* gramps/gui/plug/export/_exportoptions.py: Export options > Gui
alignment issue Fixes #10576
2019-08-07 Paul Culley <paulr2787@gmail.com>
2018-07-22 niememat <niememat@gmail.com>
* data/tests/exp_sample_ged.ged, data/tests/imp_sample.ged,
data/tests/imp_sample.gramps,
gramps/plugins/export/exportgedcom.py,
gramps/plugins/lib/libgedcom.py: Fix GEDCOM importer to properly
handle multiple surnames per 5.5.1 (#862) Fixes #11228
* po/fi.po: New fix translation in Finnish
2019-08-01 Serge Noiraud <Serge.Noiraud@laposte.net>
2018-07-22 Espen Berg <espenbe@gmail.com>
* gramps/plugins/webreport/common.py,
gramps/plugins/webreport/place.py: Narrative web: Sort problem with
places. (#854) * Narrative web: Sort problem with places. Fixes #10868. Places list is not sorted depending on the selected language. If you start gramps in english or another language then try to
generated a narrative web report in another language, the navigation
alphabet is incorrect. This is true for the place list and the
person list. The problem was related to pyICU. * Narrative web: some pylint improvement.
* po/nb.po: Revised Norwegian bokmål
2019-08-01 Paul Culley <paulr2787@gmail.com>
2018-07-22 Espen Berg <espenbe@gmail.com>
* gramps/gui/navigator.py, gramps/gui/viewmanager.py: Fix Navigator
sidebar so can change view type with proper resize (#853) Fixes #6422, #11164
* po/nb.po: Revised Norwegian bokmål
2019-07-31 Paul Culley <paulr2787@gmail.com>
2018-07-22 niememat <niememat@gmail.com>
* gramps/gui/views/treemodels/flatbasemodel.py: fix crash when using
sidebar filter and merging in another view (#858) Fixes #11089, #11064, #11134
* po/fi.po: Fix translation in Finnish
2019-07-31 Paul Culley <paulr2787@gmail.com>
2018-07-21 Nick Hall <nick-h@gramps-project.org>
* gramps/plugins/drawreport/ancestortree.py,
gramps/plugins/lib/librecurse.py: Fix AncestorTree so add siblings
to center person works (#852) Fixes #11215
* gramps/gui/glade/editplace.glade,
gramps/gui/glade/editplaceref.glade: Fix dialog button order on
non-Mac systems Resolves #10585.
2019-07-31 Paul Culley <paulr2787@gmail.com>
2018-07-21 De Tran <trande@gmail.com>
* gramps/gen/config.py, gramps/gen/plug/docgen/graphdoc.py,
gramps/grampsapp.py, gramps/gui/configure.py: Fix graphs on Windows
for font selection not working (#849) Fixes #11212
* po/vi.po: Fix and update Vietnamese translation Resolves #10681.
2019-07-31 Paul Culley <paulr2787@gmail.com>
2018-07-21 Sveinn í Felli <sv1@fellsnet.is>
* gramps/plugins/db/dbapi/dbapi.py: Fix dbapi reindex_reference_maps
tool to properly close transaction (#847) Fixes #11195
* po/is.po: Update Icelandic translation
2019-07-10 Paul Culley <paulr2787@gmail.com>
2018-05-10 jose1711 <jose1711@gmail.com>
* gramps/gui/widgets/selectionwidget.py: Fix zoom via mouse wheel in
media event editor selectionwidget (#835) also fixes zooming with scroll bars always present Fixes #11198
* po/sk.po: Fix and update Slovak translation
2019-03-20 vantu5z <vantu5z@mail.ru>
2018-05-11 jose1711 <jose1711@gmail.com>
* po/ru.po: update Russian translation
* gramps/plugins/rel/rel_cs.py: Fix typo in translation
2019-06-14 Mattkmmr <49940207+Mattkmmr@users.noreply.github.com>
2018-07-20 niememat <niememat@gmail.com>
* gramps/plugins/gramplet/metadataviewer.py: Fix metadataviewer.py
(#823) Fix so that metadata is actually detected and displayed (signal was
not getting detected).
* po/fi.po: Fix translation in Finnish
2019-06-12 niememat <niememat@gmail.com>
2018-07-20 niememat <niememat@gmail.com>
* po/fi.po: Update finnish translation
* po/fi.po: Fix translation in Finnish
2019-06-11 John Ralls <jralls@ceridwen.us>
2018-07-18 niememat <niememat@gmail.com>
* mac/gramps.modules: Fix graphviz and exiv2 download URLs.
* po/fi.po: Fix translation in Finnish
2019-06-11 John Ralls <jralls@ceridwen.us>
2018-07-15 Luigi Toscano <luigi.toscano@tiscali.it>
* mac/gramps.modules: Update dependency versions and download paths.
* po/it.po: Update Italian translation
2019-06-10 Serge Noiraud <Serge.Noiraud@laposte.net>
2018-07-13 Nick Hall <nick-h@gramps-project.org>
* gramps/gen/utils/place.py, gramps/gen/utils/test/place_test.py,
gramps/plugins/view/geoplaces.py: Avoid comma in a lat/lon entry
field. (#812) * Avoid comma in a lat/lon entry field. * Be more precise on the tooltip text. * conv_lat_lon should not accept comma in lat/lon * Tests failed with comma in lat/lon * geoplaces fails to center if bad lat/lon
* po/en_GB.po: Update English (British) translation
2019-06-10 Serge Noiraud <Serge.Noiraud@laposte.net>
2018-07-13 De Tran <trande@gmail.com>
* gramps/gui/editors/displaytabs/surnametab.py,
gramps/gui/widgets/monitoredwidgets.py: Avoid invalid characters in
the entry field (#811) In this patch: 1 - If you copy/paste strings from another application, you can add CR, LF, TAB and other special characters. I remove
them. 2 - suppress all leading and trailing spaces for these
entry field.
* po/vi.po: Update Vietnamese translation
2019-06-10 milotype <43657314+milotype@users.noreply.github.com>
2018-07-13 Kaj Mikkelsen <kmi@vgdata.dk>
* po/hr.po: Update Croatian translation (#824)
* po/da.po: Update Danish translation
2019-06-09 Paul Culley <paulr2787@gmail.com>
2018-07-13 Lajos Nemeséri <nemeseril@gmail.com>
* gramps/gui/displaystate.py, gramps/gui/views/listview.py: Fix
crash for multiple deletes in one transaction (#814) Fixes #11117
* po/hu.po: Update Hungarian translation
2019-06-10 Ed Bennett <pyedward@swansea.ac.uk>
2018-07-07 Fedik <getthesite@gmail.com>
* gramps/gen/relationship.py, po/ar.po, po/bg.po, po/br.po,
po/ca.po, po/cs.po, po/da.po, po/de.po, po/el.po, po/en_GB.po,
po/eo.po, po/es.po, po/fi.po, po/fr.po, po/ga.po, po/he.po,
po/hr.po, po/hu.po, po/is.po, po/it.po, po/ja.po, po/lt.po,
po/mk.po, po/nb.po, po/nl.po, po/nn.po, po/pl.po, po/pt_BR.po,
po/pt_PT.po, po/ro.po, po/ru.po, po/sk.po, po/sl.po, po/sq.po,
po/sr.po, po/sr_Latn.po, po/sv.po, po/ta.po, po/tr.po, po/uk.po,
po/vi.po, po/zh_CN.po, po/zh_HK.po, po/zh_TW.po: Adjust translation
strings for unmarried partners to give correct text in English
(#818) Fixes #11109
* po/uk.po: Update Ukrainian translation for Gramps
2019-05-07 John Ralls <jralls@ceridwen.us>
2018-07-05 RossGammon <upstream@the-gammons.net>
* mac/gramps.modules: Disable vala for gexiv2, it breaks
introspection.
* debian/changelog, debian/copyright,
debian/patches/hardcoded_path_person_rules_test.patch,
debian/patches/series: Update Debian directory after Gramps
5.0.0-rc1 release. (#634)
2019-01-05 caigner <github@sys-admin.at>
2018-07-02 Leonhaeuser <mirko@leonhaeuser.de>
* gramps/gui/views/navigationview.py, po/ar.po, po/bg.po, po/br.po,
po/ca.po, po/cs.po, po/da.po, po/de.po, po/el.po, po/en_GB.po,
po/eo.po, po/es.po, po/fi.po, po/fr.po, po/ga.po, po/gramps.pot,
po/he.po, po/hr.po, po/hu.po, po/is.po, po/it.po, po/ja.po,
po/lt.po, po/mk.po, po/nb.po, po/nl.po, po/nn.po, po/pl.po,
po/pt_BR.po, po/pt_PT.po, po/ro.po, po/ru.po, po/sk.po, po/sl.po,
po/sq.po, po/sr.po, po/sr_Latn.po, po/sv.po, po/ta.po, po/tr.po,
po/uk.po, po/vi.po, po/zh_CN.po, po/zh_HK.po, po/zh_TW.po: changed
'Edit ->Set Home Person' to 'Edit -> Set Home Person'
* po/de.po: Fix not matching translation csv import/export
2019-04-14 système <romjerome@users.noreply.github.com>
* po/fr.po: typo on french translation
2019-04-13 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/lib/libgedcom.py: Fix failure after Gedcom import
if missing objects were found (#807) Fixes #11082
2019-03-26 John Ralls <jralls@ceridwen.us>
* gramps/gen/utils/maclocale.py: [maclocale] Fix none type has no
len(). Fixes #11075
2019-03-17 Paul Culley <paulr2787@gmail.com>
* data/tests/imp_sample.gramps, gramps/plugins/lib/libgedcom.py: Fix
Gedcom import so it doesn't create completely empty Birth events
(#799) Fixes #10145 Note: a completely empty birth event is removed by Check and Repair;
this is wrong in that sometimes we know a person is born, but not
date/place. In Gedcom this is indicated by "1 BIRT Y" lines. So this PR adds a description to the birth event. This is not an
issue for other event types, the C&R tool sees the non-default type
and leaves it alone, but birth is the default type.
2019-03-17 milotype <43657314+milotype@users.noreply.github.com>
* po/hr.po: Update Croatian translation (#803) update with current maint50 pot file
2019-03-16 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/view/relview.py: Fix Relationship view so ages are
according to Preferences (#798) Fixes #11040
2019-03-16 Paul Culley <paulr2787@gmail.com>
* gramps/gui/editors/displaytabs/personeventembedlist.py: Fix Person
Editor Events to properly update during external changes (#797) like Event delete or update. Fixes #11051 Looks like someone simply forgot to register the handles with the
callman... I checked other similar cases and did not see any other issues.
2019-03-16 Paul Culley <paulr2787@gmail.com>
* data/tests/exp_sample_ged.ged,
data/tests/imp_FTM_16dec2015a-mod1.gramps,
data/tests/imp_MediaTest.gramps, data/tests/imp_sample.gramps,
gramps/plugins/export/exportgedcom.py,
gramps/plugins/lib/libgedcom.py: Gedcom fixes for mime and finding
media (#795) * Fix Gedcom import/export for more comprehensive mime types Fixes #11041 * Fix Gedcom import to better find media files Issue #11041 * Fix Gedcom test files for media mime and error location message
2019-03-17 Serge Noiraud <Serge.Noiraud@laposte.net>
* gramps/plugins/lib/maps/geography.py: Unhandled exception in
Geography editor (#793) Fixes #11048 better pylint score remove unused code
2019-03-16 Paul Culley <paulr2787@gmail.com>
* gramps/gen/filters/rules/person/_relationshippathbetween.py: Fix
relationshippathbetween filter rule when parent is missing (#792) Fixes #11049 Another HandleError issue, this one hidden by the raw except. Filter
rule just did not work if a family in the path had a missing parent.
2019-03-16 Paul Culley <paulr2787@gmail.com>
* gramps/gen/plug/docgen/graphdoc.py: Fix Graphs that use graphdoc
pdf via Ghostscript with multi-page (#791) for poor font rendering of some characters (thanks to Ken Sharp) Fixes #11047
2019-03-16 Paul Culley <paulr2787@gmail.com>
* example/gramps/data.gramps, example/gramps/example.gramps: Fix
example gramps files so media is found (#785) Fixes #11015 On Windows the location of the example files is "c:\program
files\grampsaio64-5.0.1\share\doc\gramps\example\gramps". On my Ubuntu install from the .deb file these files are in
"/usr/share/doc/gramps/example/gramps" Since the default GRAMPS_RESOURCES value for each system is the
'share', to find the media files we need to append
"/doc/gramps/example/gramps" to have the example files work
properly.
2019-03-16 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/tool/finddupes.py: fix finddupes tool when run from
Match Threshold screen again (#790) after merge. Avoids HandleError because potentials dict is not
cleared. Fixes #11044
2019-01-17 vantu5z <vantu5z@mail.ru>
* po/ru.po: update Russian translation
2019-02-27 Bernard Banko <beernarrd@gmail.com>
* po/sl.po: Slovenian translation correction
2019-02-16 système <romjerome@users.noreply.github.com>
* po/fr.po: update french translation
2019-02-14 système <romjerome@users.noreply.github.com>
* po/fr.po: update (partial) french translation
2019-02-14 système <romjerome@users.noreply.github.com>
* po/fr.po: merge with last template
2019-02-14 système <romjerome@users.noreply.github.com>
* po/fr.po: bug 10841: Typos in the French translation
2019-02-14 système <romjerome@users.noreply.github.com>
* po/fr.po: fix a typo
2019-02-13 Paul Culley <paulr2787@gmail.com>
* data/tests/imp_MediaTest.gramps, gramps/plugins/lib/libgedcom.py:
Fix Gedcom import for multiple notes on OBJE (MULTIMEDIA_LINK)
(#782) Fixes #10277
2019-02-13 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/db/dbapi/dbapi.py,
gramps/plugins/importer/importxml.py: Deal with SQLite db corrupted
by None name mapping (#784) Fixes #11011
2019-02-13 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/importer/importxml.py: Fix XML import to add tags
to Events, Sources, Places, Repos, Cits (#780) Fixes #11004
2019-02-13 Paul Culley <paulr2787@gmail.com>
* gramps/gui/editors/displaytabs/eventembedlist.py,
gramps/gui/editors/displaytabs/personrefembedlist.py,
gramps/gui/editors/displaytabs/placerefembedlist.py,
gramps/gui/editors/editcitation.py,
gramps/gui/editors/editevent.py,
gramps/gui/editors/editeventref.py,
gramps/gui/editors/editfamily.py, gramps/gui/editors/editperson.py:
Fix for delete of a ref'd primary obj while editing an added obj.
(#779) Also fixed to update the ref'd obj on changes from outside the
editor. Fixes #10999, #11000, #11001, #11002
2019-02-13 Paul Culley <paulr2787@gmail.com>
* gramps/gen/filters/_genericfilter.py,
gramps/gui/views/treemodels/treebasemodel.py: Fix Place Tree view
when using enclosed by sidebar filter (#764) the filter was incorrectly using a standard place cursor instead of
the tree cursor. Fixes #10948
2019-02-10 Bernard Banko <beernarrd@gmail.com>
* po/sl.po: Slovenian language update
2019-02-10 Luigi Toscano <luigi.toscano@tiscali.it>
* po/it.po: Italian translation updates - restore few strings from the welcome Gramplet that got lost after the split of a messages in smaller messages; - fix few errors.
2019-02-10 Luigi Toscano <luigi.toscano@tiscali.it>
* po/it.po: Refresh the Italian po file
2019-02-02 Paul Culley <paulr2787@gmail.com>
* gramps/gui/editors/editfamily.py: Fix EditFamily for adding a
child to single parent family with (#777) Surname guessing set to combination. Fixes #10997
2019-01-22 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/drawreport/descendtree.py: Fix Descendent Tree
report for crash when person has multiple (#773) families and one of them doesn't have a spouse. Fixes #10983, #10971, #10661
2019-01-22 Leonhaeuser <mirko@leonhaeuser.de>
* po/de.po: Update German translation
2019-01-21 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/db/dbapi/dbapi.py: Fix Name editor crash after
clearing a group_as name on dbapi dbs (#771) Fixes #10981
2019-01-22 Serge Noiraud <Serge.Noiraud@laposte.net>
* gramps/gen/merge/mergefamilyquery.py,
gramps/gui/merge/mergecitation.py, gramps/gui/merge/mergeevent.py,
gramps/gui/merge/mergefamily.py, gramps/gui/merge/mergemedia.py,
gramps/gui/merge/mergenote.py, gramps/gui/merge/mergeperson.py,
gramps/gui/merge/mergeplace.py,
gramps/gui/merge/mergerepository.py,
gramps/gui/merge/mergesource.py,
gramps/plugins/test/db_undo_and_signals_test.py: We should stay on
the selected item in list views: (#770) Fixes #10966 When we try to merge two objects, we should stay on the selected row
in list views. This problem occurs for persons, families, events,
places, sources, citations, repositories, media and notes. Another problem: In case we select the first family and select the
gramps_id of the second family, the new gramps_id is ignored:
problem in MergeFamilyQuery
2019-01-21 Paul Culley <paulr2787@gmail.com>
* gramps/plugins/graph/gvrelgraph.py: Fix Relationship Graph; extra
people when using filters & subgraphs (#769) subgraph option wasn't checking parents against filtered results Fixes #10947
2019-01-22 Christian Aigner <github@sys-admin.at>
* po/de.po: [German] Change Text on Settings -> Colour (#767) * Unified the labels. The overall appearance looks now a bit cleaner. * Fixed a grammatical bug (das -> dass)
2019-01-21 Paul Culley <paulr2787@gmail.com>
* gramps/gen/display/place.py: fix Place Format Editor file
save/load for difficult names (#766) Fixes #10949
2019-01-22 Serge Noiraud <Serge.Noiraud@laposte.net>
* gramps/plugins/graph/gvfamilylines.py: Not all place types appears
on family lines Graph (#763)
2019-01-22 Christian Aigner <github@sys-admin.at>
* po/de.po: Corrections in 'Tip of Day'; changed 'Schlussnotizen' to
'Quellennachweis' (#753)
2019-01-12 vantu5z <vantu5z@mail.ru>
* po/ru.po: update Russian translation
2019-01-12 Sam Manzi <manzi.sam@gmail.com>
* gramps/plugins/tool/sortevents.py: Remember location of Sort
Events Tool (#750) Issue #9795
2019-01-11 Zdeněk Hataš <zdenek.hatas@gmail.com>
2018-07-02 Zdeněk Hataš <zdenek.hatas@gmail.com>
* po/cs.po: Update Czech translation
2019-01-05 Paul Culley <paulr2787@gmail.com>
2018-07-02 Pier Luigi Cinquantini <plcinquantini@gmail.com>
* gramps/gui/editors/editmedia.py: Fix Media editor when using
double click the preview of added media (#752) Fixes #10923
* po/eo.po: Update Esperanto translation
2019-01-05 Leonhaeuser <mirko@leonhaeuser.de>
2018-07-01 niememat <niememat@gmail.com>
* po/de.po: update German translation
* po/fi.po: Fix translation in Finnish
2019-01-05 niememat <niememat@gmail.com>
2018-06-30 Paulo Henrique Paiva de Moraes <paulohpmoraes@gmail.com>
* po/fi.po: Fix and updated translation in Finnish
* po/pt_BR.po: Update Brazilian Portuguese translation
2019-01-04 P Ekholm <par.ekholm@pekholm.se>
2018-06-30 vantu5z <vantu5z@mail.ru>
* po/sv.po: Update Swedish translation
* po/ru.po: update Russian translation substantially just merge with
latest template
2019-01-02 prculley <paulr2787@gmail.com>
2018-06-29 Nick Hall <nick-h@gramps-project.org>
* po/gramps.pot: Update gramps.pot
* po/ar.po, po/bg.po, po/br.po, po/ca.po, po/cs.po, po/da.po,
po/de.po, po/el.po, po/en_GB.po, po/eo.po, po/es.po, po/fi.po,
po/fr.po, po/ga.po, po/he.po, po/hr.po, po/hu.po, po/is.po,
po/it.po, po/ja.po, po/lt.po, po/mk.po, po/nb.po, po/nl.po,
po/nn.po, po/pl.po, po/pt_BR.po, po/pt_PT.po, po/ro.po, po/sk.po,
po/sl.po, po/sq.po, po/sr.po, po/sr_Latn.po, po/sv.po, po/ta.po,
po/tr.po, po/uk.po, po/vi.po, po/zh_CN.po, po/zh_HK.po, po/zh_TW.po:
Merge translation files with the latest template
2019-01-01 prculley <paulr2787@gmail.com>
2018-06-21 Paul Culley <paulr2787@gmail.com>
* po/gramps.pot: Revert "update gramps.pot", the update_po.py
doesn't work with glade files on Windows This reverts commit fcfecef459b37cbba0c61ae18f19f93363124980.
* gramps/gui/filters/sidebar/_sidebarfilter.py: Fix Custom filter
update when created via sidebar (#630) Fixes #10620 Adding a filter via the sidebar editor originally only updated the
current view, other associated views did not see the new filter.
First noticed in People views. This causes the 'filters-changed' to
be emitted which updates all associated view.
2019-01-01 prculley <paulr2787@gmail.com>
2018-06-21 Paul Culley <paulr2787@gmail.com>
* po/gramps.pot: update gramps.pot
* gramps/gui/widgets/grampletpane.py: Fix Gramplet configure
(View/Configure) for large options (#629) When a Gramplet uses a BooleanListOption with a lot of entries,
along with other options, all the options take on the size of the
large BooleanListOption, which doesn't work well at all.
2019-01-01 prculley <paulr2787@gmail.com>
2018-06-22 Serge Noiraud <Serge.Noiraud@laposte.net>
* po/update_po.py: Fix update_po.py to run on Windows
* gramps/plugins/drawreport/statisticschart.py: Statistics Charts
crashes with IndexError (#627) Fixes #010626 In statistics charts, get_month is only localized and the calendar
is unused. If we have an Extra (Sansculottides) month in the french
republican calendar (index 13), we have this IndexError because the
gregorian calendar is always used and contains only 12 values.
2018-12-31 caigner <github@sys-admin.at>
2018-06-10 John Ralls <jralls@ceridwen.us>
* po/de.po: German translation corrections
* mac/gramps.accel: [Mac] Change accel for Undo History. So that it doesn't conflict with a system binding for hiding the
window. Fixes #10619.
2018-12-30 Leonhaeuser <mirko@leonhaeuser.de>
2018-06-09 Paul Culley <paulr2787@gmail.com>
* po/de.po: update German translation
* gramps/gui/plug/_guioptions.py: Fix Family Lines/Family Colors
picker for bad transient parent (#625) Fixes #10623
2018-12-29 Serge Noiraud <Serge.Noiraud@laposte.net>
2018-06-09 Paul Culley <paulr2787@gmail.com>
* gramps/gui/editors/editplace.py,
gramps/gui/editors/editplaceref.py: Avoid leading and trailing
spaces when copy/paste (#747) coordinates from a map provider. Fixes #10937
* gramps/gen/db/utils.py: Fix import_as_dict to utilize user
gramps_id prefixes (#626) Issue #10622 Found when comparing dbs with large prefixes 'I%05d'; using database
differences or import_merge addons.
2018-12-28 John Ralls <jralls@ceridwen.us>
2018-06-09 Paul Culley <paulr2787@gmail.com>
* gramps/gui/widgets/fanchart.py,
gramps/plugins/docgen/cairodoc.py,
gramps/plugins/lib/maps/messagelayer.py,
gramps/plugins/view/pedigreeview.py: Set correct font resolution for
Mac when drawing text directly to cairo. (#745) Fixes #0010924
* gramps/plugins/db/bsddb/write.py: Fix error when opening bsddb db
in read-only mode (#624) Fixes #10615 BSDDB had errors when trying to open in read-only mode.
2018-12-28 Pär Ekholm <pelle.ekh@koping.net>
2018-06-09 Paul Culley <paulr2787@gmail.com>
* po/sv.po: Add some untranslated strings in po/sv.po
* gramps/gen/db/generic.py: Fix dbapi dbs for closeing read-only db
crash (#623) Fixes #10613 The sqlite (and other dbapi dbs) tried to save their metadata on a
close operation, which doesn't work for read-only dbs.
2018-12-28 vantu5z <vantu5z@mail.ru>
2018-06-09 Paul Culley <paulr2787@gmail.com>
* po/ru.po: update Russian translation
* gramps/gui/viewmanager.py: Fix menus when operating with read-only
db (#622) Fixes #10614 An earlier attempt to deal with closed dbs messed up the read-only
ActionGroup settings. This corrects that situation.
2018-12-26 prculley <paulr2787@gmail.com>
2018-06-02 Sam Manzi <manzi.sam@gmail.com>
* po/da.po: remove crlf line endings on da.po
* gramps/gen/proxy/living.py: Fix Name formats to show all parts
(#608) Fixes #10420 Allows reports to use the name format specified by the user.
2018-12-24 John Ralls <jralls@ceridwen.us>
2018-06-01 Paul Culley <paulr2787@gmail.com>
* mac/gramps_launcher.py: Remove extraneous setting of
GTK_IM_MODULE_FILE. Fixes #10929
* gramps/gui/dbloader.py, gramps/gui/plug/_guioptions.py,
gramps/gui/viewmanager.py: Fix dialogs for crash when canceling via
'x' (#620) * Fix import dialog for crash when canceling via 'x' Fixes #10607 * Fix 'Make Backup' dialog for crash on 'x' close Issue #10607 * Fix Family Lines/Family Colors/add dialog crash on close with 'x' Issue #10607
2018-12-22 Zdeněk Hataš <zdenek.hatas@gmail.com>
2018-05-28 niememat <niememat@gmail.com>
* po/cs.po: Update Czech translation
* po/fi.po: Fix translation in Finnish
2018-12-21 RossGammon <upstream@the-gammons.net>
2018-05-20 John Ralls <jralls@ceridwen.us>
* debian/changelog, debian/copyright: Update debian files after
5.0.1 release (#744)
* mac/Info.plist, mac/gramps.modules: Release 5.0.0-rc1 on Mac.
2018-12-20 prculley <paulr2787@gmail.com>
2018-05-20 John Ralls <jralls@ceridwen.us>
* gramps/gen/const.py, gramps/version.py: Bump to 5.0.2
* mac/gramps.modules: Remove obsolete omeat-python-modules
dependencies.
2018-11-15 Pär Ekholm <pelle.ekh@koping.net>
2018-05-20 prculley <paulr2787@gmail.com>
* po/sv.po: Update po/sv.po - all strings complete
2018-11-14 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-14 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-13 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-12 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-11 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-10 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-09 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-08 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-08 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-08 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-08 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-07 Pär Ekholm <pelle.ekh@koping.net>
* po/sv.po: Update po/sv.po
2018-11-07 Pär Ekholm <pelle.ekh@koping.net>
* Update po/sv.po
* Bump to v5.0.0-rc2
+4 -4
View File
@@ -133,7 +133,7 @@ Gramps is a [http://en.wikipedia.org/wiki/Gtk GTK] application. Gramps needs to
The Linux Genealogy CD can function as a live CD that you boot directly from. You can then run Linux and Gramps off the CD, even if your computer is entirely Windows.
An Windows installer is available for 32 and 64 bit versions of windows from Windows versions 7 through 10. As with all other support, we do do our best to solve windows related problems.
An experimental Windows installer is available, however we do not have the manpower to offer support for Windows. A windows mailing list is available however and we do do our best to solve windows related problems.
8. Does it work with the Mac?
@@ -145,7 +145,7 @@ This present version of Gramps (2.2.x) does not appear to have been ported by th
9. What are the Minimum Specs to run Gramps?
We would recommend at least an 800x600 video display. For Gramps 5.x, Gramps can run quite efficiently on a 3GB memory system. A system with that much RAM should be able to hold more than 200,000 people. Disk space requirements for databases are however considerably larger, with a typical database being several megabytes in size. For 120.000 people you must consider already 530Mb for the database. Pictures are stored on disk separately, so a large harddisk is necessary.
We would recommend at least an 800x600 video display. For Gramps 2.0, the memory requirements have been reduced, and Gramps can run quite efficiently on a 256MB system, holding considerably more people. A system with 512MB should be able to hold around 200,000 people. Disk space requirements for databases are however considerably larger, with a typical database being several megabytes in size. For 120.000 people you must consider already 530Mb for the database. Pictures are stored on disk separately, so a large harddisk is necessary.
==Preferences==
@@ -181,7 +181,7 @@ The nice thing about standards is that there never is a shortage of them. Gramps
15. How do I import data from another genealogy program into Gramps?
The best way is to create a new gramps database file, and select the import option in the file menu. Here you select the GEDCOM you generated with the other program, and import it.
The best way is to create a new gramps database file (.grdb), and select the import option in the file menu. Here you select the GEDCOM you generated with the other program, and import it.
16. Can I install Gramps on a Linux Web Server and use it via a web browser? This would enable my relations worldwide to access and update it.
@@ -315,7 +315,7 @@ gramps-devel@lists.sf.net :-)
The next best thing would be to submit a good bug report. This can be done in
one of the two ways: (1) send your report to gramps-bugs@lists.sf.net
or (2) file your report with the bug tracker system at
https://gramps-project.org/bugs/ (this function is also
http://bugs.gramps-project.org (this function is also
available by selecting "Help->Report a bug" from gramps main menu).
A good bug report would include:
+1 -3
View File
@@ -1,5 +1,5 @@
include ChangeLog
include AUTHORS
include ChangeLog
include COPYING
include FAQ
include Gramps.py
@@ -10,11 +10,9 @@ include RELEASE_NOTES
include TODO
include CONTRIBUTING
include TestPlan.txt
recursive-include bash *
recursive-include data *
recursive-include debian *
recursive-include docs *
recursive-include example *
recursive-include gramps *
recursive-include help *
recursive-include images *
+8 -1734
View File
File diff suppressed because it is too large Load Diff
+13 -1
View File
@@ -11,7 +11,7 @@ Requirements
The following packages **MUST** be installed in order for Gramps to work:
* **Python** 3.2 or greater - The programming language used by Gramps. https://www.python.org/
* **GTK** 3.10 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/
* **GTK** 3.12 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/
* **pygobject** 3.12 or greater - Python Bindings for GLib/GObject/GIO/GTK+ https://wiki.gnome.org/Projects/PyGObject
The following three packages with GObject Introspection bindings (the gi packages)
@@ -103,6 +103,18 @@ The following packages are optional:
More font support in the reports
* **geocodeglib**
A library use to associate a geographical position (latitude, longitude)
to a place name. This is used if you already have osmgpsmap installed.
If installed, when you add or link a place from the map, you have a red line
at the end of the table for selection.
Debian, Ubuntu, ... : gir1.2-geocodeglib-1.0
Fedora, Redhat, ... : geocode-glib
openSUSE : geocode-glib
ArchLinux : geocode-glib
...
Optional packages required by Third-party Addons
------------------------------------------------
+2 -2
View File
@@ -109,7 +109,6 @@ p#description {
a {
color: black;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
text-decoration: underline;
@@ -451,7 +450,8 @@ div#families table.attrlist td.ColumnType {
----------------------------------------------------- */
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.8em 0.5em;
+1 -1
View File
@@ -1093,6 +1093,7 @@ div.Residence table.infolist tr td {
margin: 0;
float: left;
width: 130px;
height: 150px;
text-align: center;
}
#indivgallery div.thumbnail a {
@@ -1101,7 +1102,6 @@ div.Residence table.infolist tr td {
padding: 0;
text-decoration: none;
cursor: pointer;
word-wrap: break-word;
}
#indivgallery div.thumbnail a img {
padding: 0;
+2 -2
View File
@@ -109,7 +109,6 @@ p#description {
a {
color: black;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
background-color: #9DBF9D;
@@ -501,7 +500,8 @@ div#families table.attrlist td.ColumnType {
----------------------------------------------------- */
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.8em 0.5em;
+2 -2
View File
@@ -110,7 +110,6 @@ p#description {
a {
color: black;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
background-color: #E0E0E9
@@ -494,7 +493,8 @@ div#families table.attrlist td.ColumnType {
----------------------------------------------------- */
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.8em 0.5em;
+2 -2
View File
@@ -110,7 +110,6 @@ p#description {
a {
color: #36220B;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
background-color: #FFE09F
@@ -494,7 +493,8 @@ div#families table.attrlist td.ColumnType {
----------------------------------------------------- */
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.8em 0.5em;
+2 -2
View File
@@ -110,7 +110,6 @@ p#description {
a {
color: black;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
background-color: #EAEEF4
@@ -494,7 +493,8 @@ div#families table.attrlist td.ColumnType {
----------------------------------------------------- */
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.8em 0.5em;
+3 -2
View File
@@ -119,7 +119,6 @@ h4 {
a {
color: #7D5925;
text-decoration: none;
word-wrap: break-word;
}
a[href]:hover, a[href]:active {
background-color: #FFFFE7;
@@ -437,7 +436,8 @@ div#families table.fixed_subtables table.eventlist th:last-child {
}
#indivgallery .thumbnail {
float: left;
width: 130px;
max-width: 130px;
max-height: 150px;
font-size: smaller;
text-align: center;
margin: 0.5em;
@@ -533,6 +533,7 @@ div#map_canvas {
table.calendar {
table-layout: fixed;
empty-cells: show;
width: 950px;
margin: 0px auto;
background: url(../images/Web_Mainz_Mid.png) #FFF2C6 repeat;
}
+3 -3
View File
@@ -736,7 +736,7 @@ table.download {
width:100%;
}
table.download img {
float:none;
float:center;
}
table.download thead tr th {
text-align:center;
@@ -933,6 +933,7 @@ div#Addresses table.infolist tr td a, div#Addresses table.infolist tr td p a {
margin:0;
float:left;
width:130px;
height:150px;
text-align:center;
}
#indivgallery .thumbnail a {
@@ -940,7 +941,6 @@ div#Addresses table.infolist tr td a, div#Addresses table.infolist tr td p a {
margin:0;
padding:0;
background:none;
word-wrap: break-word;
}
#indivgallery .thumbnail a img {
margin:0;
@@ -1097,7 +1097,7 @@ div#pedigree {
margin-right: 10px;
}
#footer p#copyright img {
margin-right: 10px;
margin-right: 10px[
}
#user_footer {
width: 70%;
+722 -501
View File
File diff suppressed because it is too large Load Diff
+10 -14
View File
@@ -1,12 +1,12 @@
0 HEAD
1 SOUR Gramps
2 VERS 5.0.2
2 VERS 5.0.0-alpha2
2 NAME Gramps
1 DATE 31 JUL 2019
2 TIME 10:58:33
1 DATE 1 SEP 2017
2 TIME 12:10:38
1 SUBM @SUBM@
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
1 COPR Copyright (c) 2019 Alex Roitman,,,.
1 COPR Copyright (c) 2017 Alex Roitman,,,.
1 GEDC
2 VERS 5.5.1
2 FORM LINEAGE-LINKED
@@ -786,7 +786,11 @@
3 ADOP BOTH
1 FAMC @F0005@
2 PEDI adopted
1 OBJE @O0000@
1 OBJE
2 FORM jpeg
2 TITL Michael O'Toole 2015-11
2 FILE c:\grampsaio64-5.0.0\share\gramps\tests\O0.jpg
2 NOTE @N0019@
1 NOTE @N0007@
1 CHAN
2 DATE 18 JUN 2016
@@ -885,7 +889,7 @@
0 @I0046@ INDI
1 NAME Tom /Von Tester y tested/
2 GIVN Tom
2 SPFX Von
2 SPFX Von,
2 SURN Tester y, tested
2 NICK TesterNickname
1 SEX M
@@ -1419,12 +1423,4 @@
0 @N0017@ NOTE A citation Note Source text
0 @N0018@ NOTE Another Citation Note
0 @N0019@ NOTE A bad photo for sure
0 @O0000@ OBJE
1 FILE c:\users\prc\workspace\grampsm\main\data\tests\O0.jpg
2 FORM jpg
2 TITL Michael O'Toole 2015-11
1 NOTE @N0019@
1 CHAN
2 DATE 29 OCT 2016
3 TIME 15:23:37
0 TRLR
+27 -38
View File
@@ -3,41 +3,41 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2019-03-13" version="5.0.2"/>
<created date="2016-08-29" version="5.0.0-alpha1"/>
<researcher>
</researcher>
</header>
<events>
<event handle="_0000000500000005" change="1" id="E0000">
<event handle="_0000000500000005" change="1472500305" id="E0000">
<type>Birth</type>
<dateval val="1816"/>
<place hlink="_0000000700000007"/>
<citationref hlink="_0000000600000006"/>
</event>
<event handle="_0000000800000008" change="1" id="E0001">
<event handle="_0000000800000008" change="1472500305" id="E0001">
<type>Residence</type>
<dateval val="1850"/>
<place hlink="_0000000a0000000a"/>
<citationref hlink="_0000000900000009"/>
</event>
<event handle="_0000000b0000000b" change="1" id="E0002">
<event handle="_0000000b0000000b" change="1472500305" id="E0002">
<type>Death</type>
<datestr val="1850/1860"/>
<place hlink="_0000000c0000000c"/>
</event>
<event handle="_0000000f0000000f" change="1" id="E0003">
<event handle="_0000000f0000000f" change="1472500305" id="E0003">
<type>Marriage</type>
<dateval val="1841" type="about"/>
<place hlink="_0000001000000010"/>
</event>
<event handle="_0000001100000011" change="1" id="E0004">
<event handle="_0000001100000011" change="1472500305" id="E0004">
<type>Marriage</type>
<dateval val="1847-08"/>
<place hlink="_0000001200000012"/>
</event>
</events>
<people>
<person handle="_0000000100000001" change="1" id="I0278">
<person handle="_0000000100000001" change="1472500305" id="I0278">
<gender>M</gender>
<name type="Birth Name">
<first>Andrew</first>
@@ -54,13 +54,13 @@
</person>
</people>
<families>
<family handle="_0000000d0000000d" change="1" id="F0073">
<family handle="_0000000d0000000d" change="1472500305" id="F0073">
<rel type="Married"/>
<father hlink="_0000000100000001"/>
<eventref hlink="_0000000f0000000f" role="Family"/>
<childref hlink="_0000000100000001"/>
</family>
<family handle="_0000000e0000000e" change="1" id="F0074">
<family handle="_0000000e0000000e" change="1472500305" id="F0074">
<rel type="Married"/>
<father hlink="_0000000100000001"/>
<eventref hlink="_0000001100000011" role="Family"/>
@@ -68,19 +68,19 @@
</family>
</families>
<citations>
<citation handle="_0000000400000004" change="1" id="C0000">
<citation handle="_0000000400000004" change="1472500305" id="C0000">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
<sourceref hlink="_0000000200000002"/>
</citation>
<citation handle="_0000000600000006" change="1" id="C0001">
<citation handle="_0000000600000006" change="1472500305" id="C0001">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
<sourceref hlink="_0000000200000002"/>
</citation>
<citation handle="_0000000900000009" change="1" id="C0002">
<citation handle="_0000000900000009" change="1472500305" id="C0002">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
@@ -88,7 +88,7 @@
</citation>
</citations>
<sources>
<source handle="_0000000200000002" change="1" id="S0029">
<source handle="_0000000200000002" change="1472500305" id="S0029">
<stitle>1850 United States Federal Census</stitle>
<sauthor>Ancestry.com</sauthor>
<spubinfo>Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date: 2009;</spubinfo>
@@ -96,43 +96,42 @@
</source>
</sources>
<places>
<placeobj handle="_0000000700000007" change="1" id="P0000" type="Unknown">
<placeobj handle="_0000000700000007" change="1472500305" id="P0000" type="Unknown">
<ptitle>Tennessee, USA</ptitle>
<pname value="Tennessee, USA"/>
</placeobj>
<placeobj handle="_0000000a0000000a" change="1" id="P0001" type="Unknown">
<placeobj handle="_0000000a0000000a" change="1472500305" id="P0001" type="Unknown">
<ptitle>District 14, Cape Girardeau, Missouri, USA</ptitle>
<pname value="District 14, Cape Girardeau, Missouri, USA"/>
</placeobj>
<placeobj handle="_0000000c0000000c" change="1" id="P0002" type="Unknown">
<placeobj handle="_0000000c0000000c" change="1472500305" id="P0002" type="Unknown">
<ptitle>Bollinger Co. MO</ptitle>
<pname value="Bollinger Co. MO"/>
</placeobj>
<placeobj handle="_0000001000000010" change="1" id="P0003" type="Unknown">
<placeobj handle="_0000001000000010" change="1472500305" id="P0003" type="Unknown">
<ptitle>Union Co.?, IL</ptitle>
<pname value="Union Co.?, IL"/>
</placeobj>
<placeobj handle="_0000001200000012" change="1" id="P0004" type="Unknown">
<placeobj handle="_0000001200000012" change="1472500305" id="P0004" type="Unknown">
<ptitle>Wayne, Missouri, United States</ptitle>
<pname value="Wayne, Missouri, United States"/>
</placeobj>
</places>
<objects>
<object handle="_0000000300000003" change="1" id="M159">
<object handle="_0000000300000003" change="1472500305" id="M159">
<file src="1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="1850 United States Federal Census"/>
<noteref hlink="_0000001400000014"/>
<noteref hlink="_0000001500000015"/>
</object>
<object handle="_0000001600000016" change="1" id="M158">
<file src="/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg"/>
<noteref hlink="_0000001700000017"/>
<object handle="_0000001600000016" change="1472500305" id="M158">
<file src="D:/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="D:\Users\PRC\Downloads\1850 United States Federal Census(11)-1.jpg"/>
</object>
<object handle="_0000001800000018" change="1" id="M157">
<object handle="_0000001700000017" change="1472500305" id="M157">
<file src="http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&amp;d=mm&amp;r=pg" mime="unknown" description="http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&amp;d=mm&amp;r=pg"/>
</object>
</objects>
<repositories>
<repository handle="_0000001300000013" change="1" id="R0001">
<repository handle="_0000001300000013" change="1472500305" id="R0001">
<rname>Ancestry.com</rname>
<type>Library</type>
<address>
@@ -141,26 +140,16 @@
</repository>
</repositories>
<notes>
<note handle="_0000001400000014" change="1" id="N0000" type="Media Note">
<text>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248 </text>
<note handle="_0000001400000014" change="1472500305" id="N0000" type="Media Note">
<text>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</text>
</note>
<note handle="_0000001500000015" change="1" id="N0001" type="GEDCOM import">
<note handle="_0000001500000015" change="1472500305" id="N0001" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M159:
Could not import 1850 United States Federal Census(11)-1.jpg Line 70: 1 FILE 1850 United States Federal Census(11)-1.jpg
</text>
Could not import 1850 United States Federal Census(11)-1.jpg Line 70: 1 FILE 1850 United States Federal Census(11)-1.jpg</text>
<style name="fontface" value="Monospace">
<range start="0" end="200"/>
</style>
</note>
<note handle="_0000001700000017" change="1" id="N0002" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M158:
Could not import D:\Users\PRC\Downloads\1850 United States Federa Line 75: 1 FILE D:\Users\PRC\Downloads\1850 United States Federal Census(11)-1.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="223"/>
</style>
</note>
</notes>
</database>
+4 -5
View File
@@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2019-03-05" version="5.0.2"/>
<created date="2017-05-30" version="5.0.0-alpha1"/>
<researcher>
</researcher>
</header>
@@ -66,10 +66,9 @@
<object handle="_0000000300000003" change="1" id="O0000">
<file src="test_emb_55.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5"/>
<noteref hlink="_0000000200000002"/>
<noteref hlink="_0000000b0000000b"/>
</object>
<object handle="_0000000400000004" change="548708291" id="M1">
<file src="" mime="image/jpeg" description="Multimedia link to linked form v5.5 blob"/>
<file src="" mime="" description="Multimedia link to linked form v5.5 blob"/>
<attribute type="REFN" value="Ref12345M1">
<noteref hlink="_0000001200000012"/>
</attribute>
@@ -118,7 +117,7 @@
<citationref hlink="_0000002700000027"/>
</object>
<object handle="_0000000c0000000c" change="1" id="O0002">
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="text/html" description="Multimedia link embedded form v5.5 URL"/>
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="unknown" description="Multimedia link embedded form v5.5 URL"/>
<noteref hlink="_0000000b0000000b"/>
</object>
<object handle="_0000000d0000000d" change="1" id="M7">
@@ -130,7 +129,7 @@
<noteref hlink="_0000002900000029"/>
</object>
<object handle="_0000001500000015" change="1" id="M2">
<file src="" mime="image/jpeg" description="2nd blob Multimedia link to linked form v5.5 blob"/>
<file src="" mime="" description="2nd blob Multimedia link to linked form v5.5 blob"/>
<noteref hlink="_0000001600000016"/>
</object>
</objects>
+48 -61
View File
@@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2019-07-30" version="5.0.2"/>
<created date="2016-10-23" version="5.0.0-alpha1"/>
<researcher>
<resname>John A. Tester</resname>
</researcher>
@@ -26,23 +26,27 @@
<type>Death</type>
<noteref hlink="_0000001600000016"/>
</event>
<event handle="_0000002700000027" change="1" id="E0003">
<event handle="_0000001e0000001e" change="1" id="E0003">
<type>Who knows OBJE REFN TYPE</type>
<description>REFN</description>
</event>
<event handle="_0000002700000027" change="1" id="E0004">
<type>Birth</type>
<dateval val="1901-06-15"/>
</event>
<event handle="_0000002800000028" change="1" id="E0004">
<event handle="_0000002800000028" change="1" id="E0005">
<type>Death</type>
<dateval val="1975-07-05"/>
</event>
<event handle="_0000002e0000002e" change="1" id="E0005">
<event handle="_0000002e0000002e" change="1" id="E0006">
<type>Birth</type>
<dateval val="1922-06-15"/>
</event>
<event handle="_0000002f0000002f" change="1" id="E0006">
<event handle="_0000002f0000002f" change="1" id="E0007">
<type>Death</type>
<dateval val="1994-07-05"/>
</event>
<event handle="_0000003b0000003b" change="1" id="E0007">
<event handle="_0000003b0000003b" change="1" id="E0008">
<type>TEST</type>
<description>family</description>
</event>
@@ -57,11 +61,10 @@
<eventref hlink="_0000000f0000000f" role="Primary"/>
<eventref hlink="_0000001000000010" role="Primary"/>
<eventref hlink="_0000001500000015" role="Primary"/>
<eventref hlink="_0000001e0000001e" role="Primary"/>
<objref hlink="_0000001f0000001f"/>
<attribute type="RIN" value="123456 Person"/>
<attribute type="REFN" value="98765 for PERSON">
<noteref hlink="_0000001e0000001e"/>
</attribute>
<attribute type="REFN" value="98765 for PERSON"/>
<url href="http://homepages.rootsweb.com/~pmcbride/gedcom/55gctoc.htm" type="Web Home" description="GEDCOM 5.5 documentation web site"/>
<parentin hlink="_0000001700000017"/>
<noteref hlink="_0000001800000018"/>
@@ -267,8 +270,7 @@
Line ignored as not understood Line 18: 2 TEST Header Note
Empty note ignored Line 19: 1 NOTE
Skipped subordinate line Line 20: 2 TEST Empty Note
</text>
Skipped subordinate line Line 20: 2 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="327"/>
</style>
@@ -286,8 +288,7 @@ Skipped subordinate line Line 20:
Line ignored as not understood Line 26: 2 TEST Submission Note
Empty note ignored Line 27: 1 NOTE
Skipped subordinate line Line 28: 2 TEST Empty Note
Line ignored as not understood Line 29: 1 TEST submission
</text>
Line ignored as not understood Line 29: 1 TEST submission</text>
<style name="fontface" value="Monospace">
<range start="0" end="425"/>
</style>
@@ -299,8 +300,7 @@ Tag recognized but not supported Line 32:
Tag recognized but not supported Line 33: 1 REFN Submission Note REFN
Skipped subordinate line Line 34: 2 TYPE Submission Note REFN TYPE
Tag recognized but not supported Line 35: 1 SOUR Submission note source
Line ignored as not understood Line 39: 1 TEST on XREF Note
</text>
Line ignored as not understood Line 39: 1 TEST on XREF Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="586"/>
</style>
@@ -318,8 +318,7 @@ Line ignored as not understood Line 39:
Line ignored as not understood Line 43: 2 TEST Submitter Note
Empty note ignored Line 44: 1 NOTE
Skipped subordinate line Line 45: 2 TEST Empty Note
Line ignored as not understood Line 46: 1 TEST Submitter
</text>
Line ignored as not understood Line 46: 1 TEST Submitter</text>
<style name="fontface" value="Monospace">
<range start="0" end="460"/>
</style>
@@ -361,10 +360,7 @@ Line ignored as not understood Line 46:
<note handle="_0000001d0000001d" change="979250406" id="N0018" type="Media Note">
<text>Media xref note</text>
</note>
<note handle="_0000001e0000001e" change="1" id="N0019" type="REFN-TYPE">
<text>Who knows OBJE REFN TYPE</text>
</note>
<note handle="_0000002100000021" change="1" id="N0020" type="GEDCOM import">
<note handle="_0000002100000021" change="1" id="N0019" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0001:
Empty note ignored Line 54: 2 NOTE
@@ -386,14 +382,12 @@ Empty note ignored Line 85:
Skipped subordinate line Line 86: 3 TEST Empty Note
Line ignored as not understood Line 88: 3 TEST 123456 Note
Empty note ignored Line 90: 2 NOTE
Skipped subordinate line Line 91: 3 TEST Empty Note
Line ignored as not understood Line 94: 2 TEST REFN
</text>
Skipped subordinate line Line 91: 3 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="2101"/>
<range start="0" end="2009"/>
</style>
</note>
<note handle="_0000002200000022" change="1" id="N0021" type="GEDCOM import">
<note handle="_0000002200000022" change="1" id="N0020" type="GEDCOM import">
<text>Records not imported into NOTE Gramps ID N0018:
Tag recognized but not supported Line 103: 1 RIN 123456
@@ -402,89 +396,85 @@ Skipped subordinate line Line 105:
Tag recognized but not supported Line 109: 2 NOTE Note on a change on a note!!!
Skipped subordinate line Line 110: 3 CHAN
Skipped subordinate line Line 111: 4 DATE 2001-01-11
Skipped subordinate line Line 112: 5 TIME 16:00:06
</text>
Skipped subordinate line Line 112: 5 TIME 16:00:06</text>
<style name="fontface" value="Monospace">
<range start="0" end="741"/>
</style>
</note>
<note handle="_0000002300000023" change="1" id="N0022" type="REFN-TYPE">
<note handle="_0000002300000023" change="1" id="N0021" type="REFN-TYPE">
<text>Who knows REFN TYPE</text>
</note>
<note handle="_0000002500000025" change="1" id="N0023" type="GEDCOM import">
<note handle="_0000002500000025" change="1" id="N0022" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M1:
Could not import photo.jpg Line 114: 1 FILE photo.jpg
</text>
Could not import photo.jpg Line 114: 1 FILE photo.jpg</text>
<style name="fontface" value="Monospace">
<range start="0" end="164"/>
</style>
</note>
<note handle="_0000002900000029" change="979250406" id="N0024" type="Person Note">
<note handle="_0000002900000029" change="979250406" id="N0023" type="Person Note">
<text>Family Spouse reference Note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000002b0000002b" change="1" id="N0025" type="GEDCOM import">
<note handle="_0000002b0000002b" change="1" id="N0024" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0002:
Empty note ignored Line 132: 2 NOTE
Skipped subordinate line Line 133: 3 TEST Empty Note
</text>
Skipped subordinate line Line 133: 3 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="248"/>
</style>
</note>
<note handle="_0000002d0000002d" change="979250406" id="N0026" type="General">
<note handle="_0000002d0000002d" change="979250406" id="N0025" type="General">
<text>Name note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000003100000031" change="1" id="N0027" type="LDS Note">
<note handle="_0000003100000031" change="1" id="N0026" type="LDS Note">
<text>Place note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000003400000034" change="1" id="N0028" type="LDS Note">
<note handle="_0000003400000034" change="1" id="N0027" type="LDS Note">
<text>LDS xref note</text>
</note>
<note handle="_0000003600000036" change="979250406" id="N0029" type="Association Note">
<note handle="_0000003600000036" change="979250406" id="N0028" type="Association Note">
<text>Association link note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000003800000038" change="1" id="N0030" type="GEDCOM import">
<note handle="_0000003800000038" change="1" id="N0029" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0003:
Empty note ignored Line 141: 2 NOTE
Skipped subordinate line Line 142: 3 TEST Empty Note
Line ignored as not understood Line 163: 3 TEST Accociation note
Empty note ignored Line 167: 2 NOTE
Skipped subordinate line Line 168: 3 TEST Empty Note
</text>
Skipped subordinate line Line 168: 3 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="538"/>
</style>
</note>
<note handle="_0000003900000039" change="979250406" id="N0031" type="General">
<note handle="_0000003900000039" change="979250406" id="N0030" type="General">
<text>Just for association</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000003e0000003e" change="1" id="N0032" type="Family Note">
<note handle="_0000003e0000003e" change="1" id="N0031" type="Family Note">
<text>Family xref note</text>
</note>
<note handle="_0000003f0000003f" change="979250406" id="N0033" type="Family Note">
<note handle="_0000003f0000003f" change="979250406" id="N0032" type="Family Note">
<text>Family note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004000000040" change="1" id="N0034" type="Citation">
<note handle="_0000004000000040" change="1" id="N0033" type="Citation">
<text>Citation Data Note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004100000041" change="1" id="N0035" type="Source text">
<note handle="_0000004100000041" change="1" id="N0034" type="Source text">
<text>A sample text from a source of this family</text>
</note>
<note handle="_0000004200000042" change="979250406" id="N0036" type="Citation">
<note handle="_0000004200000042" change="979250406" id="N0035" type="Citation">
<text>A note this citation is on the FAMILY record.</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004400000044" change="1" id="N0037" type="GEDCOM import">
<note handle="_0000004400000044" change="1" id="N0036" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0001:
Line ignored as not understood Line 183: 2 TEST Family Note
@@ -492,44 +482,41 @@ Empty note ignored Line 187:
Skipped subordinate line Line 188: 2 TEST Empty Note
Line ignored as not understood Line 190: 2 TEST citation
Line ignored as not understood Line 194: 3 TEST Citation Data
Line ignored as not understood Line 196: 4 TEST Citation Data Note
</text>
Line ignored as not understood Line 196: 4 TEST Citation Data Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="645"/>
</style>
</note>
<note handle="_0000004600000046" change="979250406" id="N0038" type="Repository Reference Note">
<note handle="_0000004600000046" change="979250406" id="N0037" type="Repository Reference Note">
<text>A short note about the repository link.</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004700000047" change="979250406" id="N0039" type="Source Note">
<note handle="_0000004700000047" change="979250406" id="N0038" type="Source Note">
<text>note embedded in the SOURCE Record</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004800000048" change="1" id="N0040" type="GEDCOM import">
<note handle="_0000004800000048" change="1" id="N0039" type="GEDCOM import">
<text>Records not imported into SOUR (source) Gramps ID S0001:
Line ignored as not understood Line 206: 1 TEST source
Empty note ignored Line 208: 2 NOTE
Skipped subordinate line Line 209: 3 TEST Empty Note
Empty note ignored Line 214: 1 NOTE
Skipped subordinate line Line 215: 2 TEST Empty Note
</text>
Skipped subordinate line Line 215: 2 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="524"/>
</style>
</note>
<note handle="_0000004900000049" change="1" id="N0041" type="Repository Note">
<note handle="_0000004900000049" change="1" id="N0040" type="Repository Note">
<text>Repository Note</text>
<tagref hlink="_0000000500000005"/>
</note>
<note handle="_0000004a0000004a" change="1" id="N0042" type="GEDCOM import">
<note handle="_0000004a0000004a" change="1" id="N0041" type="GEDCOM import">
<text>Records not imported into REPO (repository) Gramps ID R0002:
Line ignored as not understood Line 223: 1 TEST Repo
Empty note ignored Line 224: 1 NOTE
Skipped subordinate line Line 225: 2 TEST Empty Note
</text>
Skipped subordinate line Line 225: 2 TEST Empty Note</text>
<style name="fontface" value="Monospace">
<range start="0" end="340"/>
</style>
+2 -2
View File
@@ -50,9 +50,9 @@
0 @I0@ INDI
1 NAME Anna /Hansdotter/
2 GIVN Anna
2 SURN Hansdotter, Smith
2 SPFX Vrow, huh
2 SURN Hansdotter
2 SPFX Vrow
2 SURN Smith
2 _AKA Anna Smith
2 _AKA Hanna
2 NOTE Hans daughter? N0000
+19 -34
View File
@@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2019-07-31" version="5.0.2"/>
<created date="2016-10-24" version="5.0.0-alpha1"/>
<researcher>
<resname>Alex Roitman,,,</resname>
<resaddr>Not Provided</resaddr>
@@ -163,7 +163,6 @@
</event>
<event handle="_0000005500000055" change="1" id="E0026">
<type>Birth</type>
<description>No Date Information</description>
</event>
<event handle="_0000005600000056" change="1" id="E0027">
<type>Death</type>
@@ -617,8 +616,7 @@
<gender>F</gender>
<name type="Birth Name">
<first>Anna</first>
<surname prefix="Vrow">Hansdotter</surname>
<surname prim="0">Smith</surname>
<surname prefix="Vrow">Smith</surname>
<noteref hlink="_0000001100000011"/>
</name>
<name alt="1" type="Also Known As">
@@ -1458,13 +1456,13 @@
<noteref hlink="_000000f9000000f9"/>
</object>
<object handle="_000000d1000000d1" change="1" id="O0001">
<file src="Magnes&amp;Anna_smiths_marr_cert.jpg" mime="image/jpeg" description="Magnes&amp;Anna_smiths_marr_cert.jpg"/>
<file src="Magnes&amp;Anna_smiths_marr_cert.jpg" mime="unknown" description="Magnes&amp;Anna_smiths_marr_cert.jpg"/>
</object>
<object handle="_000000d8000000d8" change="1" id="O0002">
<file src="John&amp;Alice_smiths_marr_cert.jpg" mime="image/jpeg" description="John&amp;Alice_smiths_marr_cert.jpg"/>
<file src="John&amp;Alice_smiths_marr_cert.jpg" mime="unknown" description="John&amp;Alice_smiths_marr_cert.jpg"/>
</object>
<object handle="_000000f1000000f1" change="1" id="O0003">
<file src="Attic_photo.jpg" mime="image/jpeg" description="Attic_photo.jpg"/>
<file src="Attic_photo.jpg" mime="unknown" description="Attic_photo.jpg"/>
</object>
</objects>
<repositories>
@@ -1508,8 +1506,7 @@
<note handle="_0000000100000001" change="1" id="N0000" type="GEDCOM import">
<text>Records not imported into HEAD (header):
GEDCOM FORM not supported Line 14: 2 FORM NOT LINEAGE-LINKED
</text>
GEDCOM FORM not supported Line 14: 2 FORM NOT LINEAGE-LINKED</text>
<style name="fontface" value="Monospace">
<range start="0" end="148"/>
</style>
@@ -1517,8 +1514,7 @@ GEDCOM FORM not supported Line 14:
<note handle="_0000000200000002" change="1" id="N0001" type="GEDCOM import">
<text>Records not imported into SUBM (Submitter): (@SUBM@) Alex Roitman,,,:
Line ignored as not understood Line 23: 2 NOTE No address provided (note not supported)
</text>
Line ignored as not understood Line 23: 2 NOTE No address provided (note not supported)</text>
<style name="fontface" value="Monospace">
<range start="0" end="199"/>
</style>
@@ -1527,8 +1523,7 @@ Line ignored as not understood Line 23:
<text>Records not imported into FAM (family) Gramps ID F0003:
Line ignored as not understood Line 46: 2 SOUR Not really allowed here
Filename omitted Line 48: 1 OBJE
</text>
Filename omitted Line 48: 1 OBJE</text>
<style name="fontface" value="Monospace">
<range start="0" end="256"/>
</style>
@@ -1567,8 +1562,7 @@ Filename omitted Line 48:
<text>Records not imported into INDI (individual) Gramps ID I0016:
Warn: ADDR overwritten Line 204: 3 ADR1 456 Main St again
ADDR element ignored '459 Main St.' Line 202: 2 ADDR 459 Main St., The Village, San Francisco, CA, USA
</text>
ADDR element ignored '459 Main St.' Line 202: 2 ADDR 459 Main St., The Village, San Francisco, CA, USA</text>
<style name="fontface" value="Monospace">
<range start="0" end="304"/>
</style>
@@ -1579,8 +1573,7 @@ ADDR element ignored '459 Main St.' Line 202:
<note handle="_0000004700000047" change="1" id="N0014" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0018:
Tag recognized but not supported Line 245: 2 TYPE first generaton
</text>
Tag recognized but not supported Line 245: 2 TYPE first generaton</text>
<style name="fontface" value="Monospace">
<range start="0" end="165"/>
</style>
@@ -1611,8 +1604,7 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo
<note handle="_000000cf000000cf" change="1" id="N0021" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0010:
Tag recognized but not supported Line 863: 2 _STAT
</text>
Tag recognized but not supported Line 863: 2 _STAT</text>
<style name="fontface" value="Monospace">
<range start="0" end="146"/>
</style>
@@ -1621,8 +1613,7 @@ Tag recognized but not supported Line 863:
<text>Records not imported into FAM (family) Gramps ID F0011:
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 878: 3 OBJE
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 881: 2 OBJE
</text>
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 881: 2 OBJE</text>
<style name="fontface" value="Monospace">
<range start="0" end="233"/>
</style>
@@ -1630,8 +1621,7 @@ Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 8
<note handle="_000000d9000000d9" change="1" id="N0023" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0012:
Could not import John&amp;Alice_smiths_marr_cert.jpg Line 905: 1 OBJE
</text>
Could not import John&amp;Alice_smiths_marr_cert.jpg Line 905: 1 OBJE</text>
<style name="fontface" value="Monospace">
<range start="0" end="145"/>
</style>
@@ -1639,8 +1629,7 @@ Could not import John&amp;Alice_smiths_marr_cert.jpg Line 9
<note handle="_000000e4000000e4" change="1" id="N0024" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0008:
Tag recognized but not supported Line 1005: 1 ADDR 123 Main st, Grantville, Virginia, USA
</text>
Tag recognized but not supported Line 1005: 1 ADDR 123 Main st, Grantville, Virginia, USA</text>
<style name="fontface" value="Monospace">
<range start="0" end="183"/>
</style>
@@ -1664,8 +1653,7 @@ Tag recognized but not supported Line 1005:
<text>Records not imported into SOUR (source) Gramps ID S0003:
Tag recognized but not supported Line 1045: 1 DATA
Skipped subordinate line Line 1046: 2 AGNC NYC Public Library
</text>
Skipped subordinate line Line 1046: 2 AGNC NYC Public Library</text>
<style name="fontface" value="Monospace">
<range start="0" end="252"/>
</style>
@@ -1681,8 +1669,7 @@ Skipped subordinate line Line 1046:
REFN ignored Line 1075: 3 REFN blah blah
Skipped subordinate line Line 1076: 4 TYPE who knows
Could not import Attic_photo.jpg Line 1079: 3 OBJE
</text>
Could not import Attic_photo.jpg Line 1079: 3 OBJE</text>
<style name="fontface" value="Monospace">
<range start="0" end="344"/>
</style>
@@ -1690,8 +1677,7 @@ Could not import Attic_photo.jpg Line 1079:
<note handle="_000000f6000000f6" change="1" id="N0034" type="GEDCOM import">
<text>Records not imported into Top Level:
Unknown tag Line 1106: 0 XXX an unknown token at level 0
</text>
Unknown tag Line 1106: 0 XXX an unknown token at level 0</text>
<style name="fontface" value="Monospace">
<range start="0" end="152"/>
</style>
@@ -1699,13 +1685,12 @@ Unknown tag Line 1106:
<note handle="_000000f8000000f8" change="1" id="N0035" type="GEDCOM import">
<text>Records not imported into Top Level:
Unknown tag Line 1109: 1 @X1@ XXX and unknown token xref definition
</text>
Unknown tag Line 1109: 1 @X1@ XXX and unknown token xref definition</text>
<style name="fontface" value="Monospace">
<range start="0" end="163"/>
</style>
</note>
<note handle="_000000f9000000f9" change="1564588949" id="N0036" type="General">
<note handle="_000000f9000000f9" change="1477325896" id="N0036" type="General">
<text>Objects referenced by this note were missing in a file imported on 12/25/1999 12:00:00 AM.</text>
</note>
</notes>
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -57,7 +57,7 @@
<_tip number="29"><b>Show All Checkbutton</b><br/>When adding an existing person as a spouse, the list of people shown is filtered to display only people who could realistically fit the role (based on dates in the database). In case Gramps is wrong in making this choice, you can override the filter by checking the Show All checkbutton.</_tip>
<_tip number="31"><b>Improving Gramps</b><br/>Users are encouraged to request enhancements to Gramps. Requesting an enhancement can be done either through the gramps-users or gramps-devel mailing lists, or by going to https://gramps-project.org/bugs/ and creating a Feature Request. Filing a Feature Request is preferred but it can be good to discuss your ideas on the email lists.</_tip>
<_tip number="31"><b>Improving Gramps</b><br/>Users are encouraged to request enhancements to Gramps. Requesting an enhancement can be done either through the gramps-users or gramps-devel mailing lists, or by going to http://bugs.gramps-project.org and creating a Feature Request. Filing a Feature Request is preferred but it can be good to discuss your ideas on the email lists.</_tip>
<_tip number="32"><b>Gramps Mailing Lists</b><br/>Want answers to your questions about Gramps? Check out the gramps-users email list. Many helpful people are on the list, so you're likely to get an answer quickly. If you have questions related to the development of Gramps, try the gramps-devel list. You can see the lists by selecting &quot;Help &gt; Gramps Mailing Lists&quot;.</_tip>
@@ -91,7 +91,7 @@
<_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 https://gramps-project.org/bugs/</_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>
<_tip number="51"><b>The Gramps Homepage</b><br/>The Gramps homepage is at http://gramps-project.org/</_tip>
-7
View File
@@ -1,10 +1,3 @@
gramps (5.0.1-1) unstable; urgency=medium
* New release
* Update copyright file
-- Ross Gammon <rossgammon@debian.org> Thu, 20 Dec 2018 20:41:23 +0100
gramps (5.0.0-1) unstable; urgency=medium
* New Gramps release
+1 -2
View File
@@ -64,7 +64,7 @@ Copyright: 2000-2007, Alex Roitman
2011, Helge Herz
2011, 2013 John Ralls
2011, 2016 Matt Keenan
2011-2018, Paul Franklin
2011-2017, Paul Franklin
2012, lcc
2012, 2014, Mathieu MD
2012, Nicolas Adenis-Lamarre
@@ -86,7 +86,6 @@ Copyright: 2000-2007, Alex Roitman
2016, Tom Samstag
2017, Mindaugas Baranauskas
2017, Robert Carnell
2018, Robin van der Vliet
License: GPL-2+
Files: debian/*
+1 -1
View File
@@ -15,7 +15,7 @@
<resphone>(555)123-4567</resphone>
<resemail>anyone@someplace.com</resemail>
</researcher>
<mediapath>{GRAMPS_RESOURCES}/doc/gramps/example/gramps</mediapath>
<mediapath>{GRAMPS_RESOURCES}/example/gramps</mediapath>
</header>
<tags>
<tag handle="_c7642d9389b54417e8b" change="1370206720" name="tag1" color="#000000000000" priority="0"/>
+39 -14
View File
@@ -3,11 +3,11 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2018-03-08" version="5.0.0"/>
<created date="2017-08-08" version="5.1.0"/>
<researcher>
<resname>Alex Roitman,,,</resname>
</researcher>
<mediapath>{GRAMPS_RESOURCES}/doc/gramps/example/gramps</mediapath>
<mediapath>{GRAMPS_RESOURCES}/example/gramps</mediapath>
</header>
<name-formats>
<format number="-1" name="SURNAME, Given (Common)" fmt_str="SURNAME, given (common)" active="1"/>
@@ -951,7 +951,7 @@
<place hlink="_L3WJQCD3US67V2CNZT"/>
<description>Birth of Garner, Anderson</description>
</event>
<event handle="_a5af0eb7dfb557da07e" change="1284030599" id="E0179">
<event handle="_a5af0eb7dfb557da07e" change="1502187535" id="E0179">
<type>Death</type>
<dateval val="1887-04-07"/>
<place hlink="_AKFKQC2N4SM243HCTN"/>
@@ -6262,7 +6262,7 @@
<dateval val="1842-06-28"/>
<description>Death of Moreno, Joseph McDowell</description>
</event>
<event handle="_a5af0ec45b25c630e03" change="1284030608" id="E1179">
<event handle="_a5af0ec45b25c630e03" change="1502187451" id="E1179">
<type>Birth</type>
<dateval val="1911-07-12"/>
<description>Birth of Thornton, James Arthur</description>
@@ -15003,7 +15003,7 @@
<type>Marriage</type>
<description>Marriage of Johnson, Henry and Sparks, Catherine</description>
</event>
<event handle="_a5af0ed5df832ee65c1" change="1328026859" id="E2815">
<event handle="_a5af0ed5df832ee65c1" change="1502187371" id="E2815">
<type>Marriage</type>
<dateval val="1875-04-01"/>
<place hlink="_RF5KQCNJRQY8OGTX2H"/>
@@ -18649,7 +18649,7 @@
<parentin hlink="_F4CKQCJZ24JRE9Z889"/>
<citationref hlink="_c140d2472c91aad494f"/>
</person>
<person handle="_14LKQCYZJEAXTS3XX" change="1185438865" id="I1376">
<person handle="_14LKQCYZJEAXTS3XX" change="1502187492" id="I1376">
<gender>F</gender>
<name type="Birth Name">
<first>Elizabeth</first>
@@ -18657,6 +18657,7 @@
</name>
<eventref hlink="_a5af0ebb003796f79a0" role="Primary"/>
<eventref hlink="_a5af0ebb0143dab99ff" role="Primary"/>
<eventref hlink="_a5af0eb7dfb557da07e" role="Witness"/>
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
<parentin hlink="_I4LKQCOAGPFH4R90A7"/>
<citationref hlink="_c140d24731407d57b3c"/>
@@ -19904,7 +19905,7 @@
<childof hlink="_IO5KQC6H0Q6Y517LR9"/>
<citationref hlink="_c140d24a1fd2319b703"/>
</person>
<person handle="_35WJQC1B7T7NPV8OLV" change="1284030051" id="I0106">
<person handle="_35WJQC1B7T7NPV8OLV" change="1502187260" id="I0106">
<gender>M</gender>
<name type="Birth Name">
<first>Robert W.</first>
@@ -19913,6 +19914,11 @@
<eventref hlink="_a5af0eb74ac73f86aa7" role="Primary"/>
<eventref hlink="_a5af0eb74ba358391ae" role="Primary"/>
<eventref hlink="_a5af0eb74c852f7c633" role="Primary"/>
<eventref hlink="_a5af0ed5df832ee65c1" role="Witness">
<attribute type="Age" value="23">
<citationref hlink="_c140dafeb317af2fd79"/>
</attribute>
</eventref>
<childof hlink="_X3WJQCSF48F6809142"/>
<parentin hlink="_8OUJQCUVZ0XML7BQLF"/>
<citationref hlink="_c140d24a27e19bb381a"/>
@@ -21991,13 +21997,14 @@
<childof hlink="_GCDKQCHI74ZPMI5GDJ"/>
<citationref hlink="_c140d24f3f8704aa41b"/>
</person>
<person handle="_6G0KQC2UXYC66XDDC2" change="1185438865" id="I0363">
<person handle="_6G0KQC2UXYC66XDDC2" change="1502187537" id="I0363">
<gender>F</gender>
<name type="Birth Name">
<first>Miranda Keziah</first>
<surname>Farmer</surname>
</name>
<eventref hlink="_a5af0ec7a76244d962d" role="Primary"/>
<eventref hlink="_a5af0eb7dfb557da07e" role="Witness"/>
<childof hlink="_8NVJQCGMJTCL7E6ZDV"/>
<citationref hlink="_c140d24f439709d3118"/>
</person>
@@ -22989,7 +22996,7 @@
<parentin hlink="_FBVJQCFBI50TW78O49"/>
<citationref hlink="_c140d2522702664ec52"/>
</person>
<person handle="_8CLKQCT97PJOGREJ7W" change="1185438865" id="I1387">
<person handle="_8CLKQCT97PJOGREJ7W" change="1502187387" id="I1387">
<gender>M</gender>
<name type="Birth Name">
<first>Robert</first>
@@ -22997,6 +23004,11 @@
</name>
<eventref hlink="_a5af0ebb3737a6ad088" role="Primary"/>
<eventref hlink="_a5af0ebb39b441e9607" role="Primary"/>
<eventref hlink="_a5af0ed5df832ee65c1" role="Clergy">
<attribute type="Age" value="23">
<citationref hlink="_c140dafeb317af2fd79"/>
</attribute>
</eventref>
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
<parentin hlink="_H6LKQCWVIFNRNGHFVH"/>
<citationref hlink="_c140d2522d804491375"/>
@@ -23803,7 +23815,7 @@
<childof hlink="_5DBKQCVAB0XMBEW8R9"/>
<citationref hlink="_c140d25425874b0b827"/>
</person>
<person handle="_9HUJQC6ONNW8SMSKGQ" change="1185438865" id="I0038">
<person handle="_9HUJQC6ONNW8SMSKGQ" change="1502187526" id="I0038">
<gender>M</gender>
<name type="Birth Name">
<first>David</first>
@@ -23812,6 +23824,7 @@
<eventref hlink="_a5af0ec7eb514c52fbf" role="Primary"/>
<eventref hlink="_a5af0ec7ec844213b55" role="Primary"/>
<eventref hlink="_a5af0ec7ed61c743fc8" role="Primary"/>
<eventref hlink="_a5af0eb7dfb557da07e" role="Informant"/>
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
<parentin hlink="_3HUJQCK4DH582YUTZG"/>
<citationref hlink="_c140d2542c764516f13"/>
@@ -24506,7 +24519,7 @@
<parentin hlink="_8NVJQCGMJTCL7E6ZDV"/>
<citationref hlink="_c140d2560004fad8df6"/>
</person>
<person handle="_ANLKQCQSQNE5LDZMRC" change="1185438865" id="I1402">
<person handle="_ANLKQCQSQNE5LDZMRC" change="1502187434" id="I1402">
<gender>F</gender>
<name type="Birth Name">
<first>Margaret Jane &quot;Maggie&quot;</first>
@@ -24514,6 +24527,7 @@
</name>
<eventref hlink="_a5af0ebb7d47a006ee2" role="Primary"/>
<eventref hlink="_a5af0ebb7e54e14970f" role="Primary"/>
<eventref hlink="_a5af0ec45b25c630e03" role="Witness"/>
<childof hlink="_VDLKQCQQ1ADTJG1D1F"/>
<parentin hlink="_SNLKQCD0VNJ627062Y"/>
<citationref hlink="_c140d25607213be35da"/>
@@ -24882,13 +24896,18 @@
<parentin hlink="_JFYJQCG2KLRQN835JD"/>
<citationref hlink="_c140d256e3403ba129d"/>
</person>
<person handle="_B3BKQCSV0G3NKSKWDX" change="1185438865" id="I0880">
<person handle="_B3BKQCSV0G3NKSKWDX" change="1502187344" id="I0880">
<gender>F</gender>
<name type="Birth Name">
<first>L. J.</first>
<surname>Blanco</surname>
</name>
<eventref hlink="_a5af0ed2cf617169903" role="Primary"/>
<eventref hlink="_a5af0ed5df832ee65c1" role="Clergy">
<attribute type="Age" value="23">
<citationref hlink="_c140dafeb317af2fd79"/>
</attribute>
</eventref>
<childof hlink="_1BVJQCNTFAGS8273LJ"/>
<citationref hlink="_c140d256ec4306a51ca"/>
</person>
@@ -31930,7 +31949,7 @@
<childof hlink="_UDMKQC5D3A2PXPUGNC"/>
<citationref hlink="_c140d266ec93334f40f"/>
</person>
<person handle="_MG5KQC6ZKSVO4A63G2" change="1328026883" id="I0624">
<person handle="_MG5KQC6ZKSVO4A63G2" change="1502187451" id="I0624">
<gender>M</gender>
<name type="Birth Name">
<first>Raymond E.</first>
@@ -31938,6 +31957,7 @@
</name>
<eventref hlink="_a5af0ece8bd1125a1a9" role="Primary"/>
<eventref hlink="_a5af0ece8d15511ddf9" role="Primary"/>
<eventref hlink="_a5af0ec45b25c630e03" role="Informant"/>
<childof hlink="_9OUJQCBOHW9UEK9CNV"/>
<citationref hlink="_c140d266f0d5d178784"/>
</person>
@@ -32336,7 +32356,7 @@
<parentin hlink="_F4CKQCJZ24JRE9Z889"/>
<citationref hlink="_c140d267ccb7aef0cd0"/>
</person>
<person handle="_N4DKQCPEMZ7OO62O7J" change="1185438865" id="I0975">
<person handle="_N4DKQCPEMZ7OO62O7J" change="1502187308" id="I0975">
<gender>M</gender>
<name type="Birth Name">
<first>Henry</first>
@@ -32345,6 +32365,11 @@
<eventref hlink="_a5af0ed483738d4ed1e" role="Primary"/>
<eventref hlink="_a5af0ed484a144d229b" role="Primary"/>
<eventref hlink="_a5af0ed48605fb6b9eb" role="Primary"/>
<eventref hlink="_a5af0ed5df832ee65c1" role="Witness">
<attribute type="Age" value="23">
<citationref hlink="_c140dafeb317af2fd79"/>
</attribute>
</eventref>
<parentin hlink="_7PUJQC4PPS4EDIVMYE"/>
<citationref hlink="_c140d267d2128356d8e"/>
</person>
+1 -1
View File
@@ -382,7 +382,7 @@ class ArgHandler:
self.open = db_path
self.__open_action()
else:
sys.exit(_("Error: cannot open '%s'") % self.open_gui)
sys.exit(1)
return db_path
# if not open_gui, parse any command line args. We can only have one
+8 -3
View File
@@ -155,7 +155,7 @@ register('behavior.translator-needed', True)
register('behavior.use-tips', False)
register('behavior.welcome', 100)
register('behavior.web-search-url', 'http://google.com/#&q=%(text)s')
register('behavior.addons-url', "https://raw.githubusercontent.com/gramps-project/addons/master/gramps50")
register('behavior.addons-url', "https://raw.githubusercontent.com/gramps-project/addons/master/gramps51")
register('database.backend', 'bsddb')
register('database.compress-backup', True)
@@ -196,6 +196,7 @@ register('interface.view-categories',
register('interface.filter', False)
register('interface.fullscreen', False)
register('interface.grampletbar-close', False)
register('interface.grampletbar-refresh', False)
register('interface.ignore-gexiv2', False)
register('interface.ignore-pil', False)
register('interface.ignore-osmgpsmap', False)
@@ -217,17 +218,20 @@ register('interface.sidebar-text', True)
register('interface.size-checked', False)
register('interface.statusbar', 1)
register('interface.toolbar-on', True)
register('interface.toolbar-text', False)
register('interface.view', True)
register('interface.surname-box-height', 150)
register('interface.treemodel-cache-size', 1000)
register('paths.recent-export-dir', USER_HOME)
register('paths.recent-export-dir', '')
register('paths.recent-file', '')
register('paths.recent-import-dir', USER_HOME)
register('paths.recent-import-dir', '')
register('paths.report-directory', USER_HOME)
register('paths.website-directory', USER_HOME)
register('paths.website-cms-uri', '')
register('paths.website-cal-uri', '')
register('paths.website-extra-page-uri', '')
register('paths.website-extra-page-name', '')
register('paths.quick-backup-directory', USER_HOME)
register('paths.quick-backup-filename',
"%(filename)s_%(year)d-%(month)02d-%(day)02d.%(extension)s")
@@ -236,6 +240,7 @@ register('preferences.quick-backup-include-mode', False)
register('preferences.date-format', 0)
register('preferences.calendar-format-report', 0)
register('preferences.cprefix', 'C%04d')
register('preferences.alternate-fonthandler', False)
register('preferences.default-source', False)
register('preferences.tag-on-import', False)
register('preferences.tag-on-import-format', _("Imported %Y/%m/%d %H:%M:%S"))
+1
View File
@@ -139,6 +139,7 @@ git_revision = get_git_revision(ROOT_DIR).replace('\n', '')
if sys.platform == 'win32' and git_revision == "":
git_revision = get_git_revision(os.path.split(ROOT_DIR)[1])
VERSION += git_revision
#VERSION += "-1"
#
# Glade files
+11 -10
View File
@@ -22,7 +22,6 @@
#
# Croatian version 2008 by Josip
# Croatian version 2018 by Milo
"""
Croatian-specific classes for parsing and displaying dates.
@@ -52,15 +51,13 @@ from ._datehandler import register_datehandler
#-------------------------------------------------------------------------
class DateParserHR(DateParser):
modifier_to_int = {
'prije' : Date.MOD_BEFORE,
'prije' : Date.MOD_BEFORE,
'pr. ' : Date.MOD_BEFORE,
'poslije' : Date.MOD_AFTER,
'po. ' : Date.MOD_AFTER,
'nakon' : Date.MOD_AFTER,
'na. ' : Date.MOD_AFTER,
'oko' : Date.MOD_ABOUT,
'okolo' : Date.MOD_ABOUT,
'ok. ' : Date.MOD_ABOUT,
'poslije' : Date.MOD_AFTER,
'po. ' : Date.MOD_AFTER,
'okolo' : Date.MOD_ABOUT,
'ok. ' : Date.MOD_ABOUT,
}
quality_to_int = {
@@ -78,6 +75,10 @@ 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,
#~ })
# match 'Day. MONTH year.' format with or without dots
self._text2 = re.compile(r'(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*\.?$'
@@ -146,5 +147,5 @@ class DateDisplayHR(DateDisplay):
#
#-------------------------------------------------------------------------
register_datehandler(
('hr_HR', 'hr', 'HR', 'croatian', 'Croatian', 'hrvatski', ('%d. %m. %Y.',)),
('hr_HR', 'hr', 'HR', 'croatian', 'Croatian', 'hrvatski', ('%d.%m.%Y.',)),
DateParserHR, DateDisplayHR)
-10
View File
@@ -132,11 +132,6 @@ class DateDisplayRU(DateDisplay):
inflect, long_months)
elif date_val[1] == 0: # month is zero but day is not (see 8477)
return self.display_iso(date_val)
elif not hasattr(long_months[date_val[1]], 'f'): # not a Lexeme
return "{day:d} {long_month} {year}".format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
else:
return "{day:d} {long_month.f[Р]} {year}".format(
day = date_val[0],
@@ -156,11 +151,6 @@ class DateDisplayRU(DateDisplay):
inflect, short_months)
elif date_val[1] == 0: # month is zero but day is not (see 8477)
return self.display_iso(date_val)
elif not hasattr(short_months[date_val[1]], 'f'): # not a Lexeme
return "{day:d} {short_month} {year}".format(
day = date_val[0],
short_month = short_months[date_val[1]],
year = year)
else:
return "{day:d} {short_month.f[Р]} {year}".format(
day = date_val[0],
+2 -1
View File
@@ -216,8 +216,9 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
"""
Create a new DummyDb instance.
"""
DbReadBase.__init__(self)
Callback.__init__(self)
self.basedb = None
self.__feature = {} # {"feature": VALUE, ...}
self.db_is_open = False
self.readonly = True
self.name_formats = []
-1
View File
@@ -2461,5 +2461,4 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
enclosed_by = ""
for placeref in place.get_placeref_list():
enclosed_by = placeref.ref
break
return enclosed_by
+15 -21
View File
@@ -54,6 +54,11 @@ class PlaceFormat:
self.street = street
self.reverse = reverse
def to_xml(self):
return (' <format name="%s" levels="%s" language="%s" '
'street="%s" reverse="%s"/>\n' %
(self.name, self.levels, self.language,
self.street, self.reverse))
#-------------------------------------------------------------------------
#
@@ -66,13 +71,10 @@ class PlaceDisplay:
self.place_formats = []
self.default_format = config.get('preferences.place-format')
if os.path.exists(PLACE_FORMATS):
try:
self.load_formats()
return
except BaseException:
print(_("Error in '%s' file: cannot load.") % PLACE_FORMATS)
pf = PlaceFormat(_('Full'), ':', '', 0, False)
self.place_formats.append(pf)
self.load_formats()
else:
pf = PlaceFormat(_('Full'), ':', '', 0, False)
self.place_formats.append(pf)
def display_event(self, db, event, fmt=-1):
if not event:
@@ -162,20 +164,12 @@ class PlaceDisplay:
dom.unlink()
def save_formats(self):
doc = xml.dom.minidom.Document()
place_formats = doc.createElement('place_formats')
doc.appendChild(place_formats)
for fmt in self.place_formats:
node = doc.createElement('format')
place_formats.appendChild(node)
node.setAttribute('name', fmt.name)
node.setAttribute('levels', fmt.levels)
node.setAttribute('language', fmt.language)
node.setAttribute('street', str(fmt.street))
node.setAttribute('reverse', str(fmt.reverse))
with open(PLACE_FORMATS, 'w', encoding='utf-8') as f_d:
doc.writexml(f_d, addindent=' ', newl='\n', encoding='utf-8')
with open(PLACE_FORMATS, 'w') as fd:
fd.write('<?xml version="1.0" encoding="utf-8"?>\n')
fd.write('<place_formats>\n')
for fmt in self.place_formats:
fd.write(fmt.to_xml())
fd.write('</place_formats>\n')
def _get_offset(value, index):
if index is not None and value.startswith('p'):
-3
View File
@@ -62,9 +62,6 @@ class FilterParser(handler.ContentHandler):
self.namespace = attrs['type']
else:
self.namespace = "generic"
if self.namespace == 'MediaObject':
# deals with older custom filters
self.namespace = 'Media'
elif tag == "filter":
self.f = GenericFilterFactory(self.namespace)()
self.f.set_name(attrs['name'])
+12 -27
View File
@@ -124,9 +124,6 @@ class GenericFilter:
def get_cursor(self, db):
return db.get_person_cursor()
def get_tree_cursor(self, db):
return db.get_person_cursor()
def make_obj(self):
return Person()
@@ -136,15 +133,13 @@ class GenericFilter:
def get_number(self, db):
return db.get_number_of_people()
def check_func(self, db, id_list, task, user=None, tupleind=None,
tree=False):
def check_func(self, db, id_list, task, user=None, tupleind=None):
final_list = []
if user:
user.begin_progress(_('Filter'), _('Applying ...'),
self.get_number(db))
if id_list is None:
with (self.get_tree_cursor(db) if tree else
self.get_cursor(db)) as cursor:
with self.get_cursor(db) as cursor:
for handle, data in cursor:
person = self.make_obj()
person.unserialize(data)
@@ -167,15 +162,14 @@ class GenericFilter:
user.end_progress()
return final_list
def check_and(self, db, id_list, user=None, tupleind=None, tree=False):
def check_and(self, db, id_list, user=None, tupleind=None):
final_list = []
flist = self.flist
if user:
user.begin_progress(_('Filter'), _('Applying ...'),
self.get_number(db))
if id_list is None:
with (self.get_tree_cursor(db) if tree else
self.get_cursor(db)) as cursor:
with self.get_cursor(db) as cursor:
for handle, data in cursor:
person = self.make_obj()
person.unserialize(data)
@@ -200,17 +194,14 @@ class GenericFilter:
user.end_progress()
return final_list
def check_or(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.or_test, user, tupleind,
tree=False)
def check_or(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.or_test, user, tupleind)
def check_one(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.one_test, user, tupleind,
tree=False)
def check_one(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.one_test, user, tupleind)
def check_xor(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.xor_test, user, tupleind,
tree=False)
def check_xor(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.xor_test, user, tupleind)
def xor_test(self, db, person):
test = False
@@ -240,7 +231,7 @@ class GenericFilter:
def check(self, db, handle):
return self.get_check_func()(db, [handle])
def apply(self, db, id_list=None, tupleind=None, user=None, tree=False):
def apply(self, db, id_list=None, tupleind=None, user=None):
"""
Apply the filter using db.
If id_list given, the handles in id_list are used. If not given
@@ -260,7 +251,7 @@ class GenericFilter:
m = self.get_check_func()
for rule in self.flist:
rule.requestprepare(db, user)
res = m(db, id_list, user, tupleind, tree)
res = m(db, id_list, user, tupleind)
for rule in self.flist:
rule.requestreset()
return res
@@ -324,9 +315,6 @@ class GenericCitationFilter(GenericFilter):
def get_cursor(self, db):
return db.get_citation_cursor()
def get_tree_cursor(self, db):
return db.get_citation_cursor()
def make_obj(self):
return Citation()
@@ -344,9 +332,6 @@ class GenericPlaceFilter(GenericFilter):
def get_cursor(self, db):
return db.get_place_cursor()
def get_tree_cursor(self, db):
return db.get_place_tree_cursor()
def make_obj(self):
return Place()
+1 -7
View File
@@ -28,11 +28,9 @@ Base class for filter rules.
# Standard Python modules
#
#-------------------------------------------------------------------------
import re
from ...errors import FilterError
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
import re
#-------------------------------------------------------------------------
#
@@ -90,10 +88,6 @@ class Rule:
self.match_substring = self.match_regex
self.prepare(db, user)
self.nrprepare += 1
if self.nrprepare > 20: # more references to a filter than expected
raise FilterError(_("The filter definition contains a loop."),
_("One rule references another which eventually"
" references the first."))
def prepare(self, db, user):
"""prepare so the rule can be executed efficiently"""
@@ -72,15 +72,18 @@ class IsDuplicatedAncestorOf(Rule):
f_id = fam.get_father_handle()
m_id = fam.get_mother_handle()
if m_id:
self.go_deeper(db, db.get_person_from_handle(m_id))
self.mother_side(db, db.get_person_from_handle(m_id))
if f_id:
self.go_deeper(db, db.get_person_from_handle(f_id))
self.father_side(db, db.get_person_from_handle(f_id))
def go_deeper(self, db, person):
def mother_side(self, db, person):
if person and person.handle in self.map:
self.map2.add((person.handle))
self.map.add((person.handle))
self.init_ancestor_list(db, person)
def father_side(self, db, person):
if person and person.handle in self.map:
self.map2.add((person.handle))
# the following keeps from scanning same parts of tree multiple
# times and avoids crash on tree loops.
return
self.map.add((person.handle))
self.init_ancestor_list(db, person)
@@ -75,8 +75,6 @@ class RelationshipPathBetween(Rule):
self.desc_list(child_ref.ref, map, 0)
def apply_filter(self, rank, handle, plist, pmap):
if not handle:
return
person = self.db.get_person_from_handle(handle)
if person is None:
return
+3 -4
View File
@@ -133,8 +133,7 @@ class MergeFamilyQuery:
old_handle = self.titanic.get_handle()
with DbTxn(_('Merge Family'), self.database) as trans:
# commit family in case Phoenix GrampsID, relationship has changed
self.database.commit_family(self.phoenix, trans)
if self.phoenix_fh != self.titanic_fh:
if self.phoenix_fh:
phoenix_father = self.database.get_person_from_handle(
@@ -162,8 +161,6 @@ class MergeFamilyQuery:
titanic_mother = None
self.merge_person(phoenix_mother, titanic_mother,
'mother', trans)
# Reload families from db in case the merge_person above changed
# them
self.phoenix = self.database.get_family_from_handle(new_handle)
self.titanic = self.database.get_family_from_handle(old_handle)
@@ -177,6 +174,8 @@ class MergeFamilyQuery:
self.phoenix_mh)
else:
phoenix_mother = None
self.phoenix = self.database.get_family_from_handle(new_handle)
self.titanic = self.database.get_family_from_handle(old_handle)
self.phoenix.merge(self.titanic)
self.database.commit_family(self.phoenix, trans)
for childref in self.titanic.get_child_ref_list():
+6 -11
View File
@@ -33,11 +33,10 @@ LOG = logging.getLogger(".Gramplets")
# Gramps modules
#
#------------------------------------------------------------------------
from ...gui.dbguielement import DbGUIElement
from ..const import GRAMPS_LOCALE as glocale
from gramps.gen.config import config
_ = glocale.translation.gettext
class Gramplet:
"""
Base class for non-graphical gramplet code.
@@ -298,12 +297,15 @@ class Gramplet:
not self.gui.force_update):
self.dirty = True
if self.dbstate.is_open():
#print " %s is not active" % self.gui.gname
#print(" %s is not active" % self.gui.gname)
self.update_has_data()
else:
self.set_has_data(False)
return
#print " %s is UPDATING" % self.gui.gname
#print(" %s is UPDATING" % self.gui.gname)
if (config.get('interface.grampletbar-refresh') and
self.gui.view.navigation_type() != None): # dashboard has no navtype
return # Don't update the gramplet if we are in manual refresh
self.dirty = False
LOG.debug("gramplet updater: %s: running" % self.gui.title)
if self._idle_id != 0:
@@ -399,13 +401,6 @@ class Gramplet:
if hasattr(self.gui, 'navtypes') and 'Person' in self.gui.navtypes:
self.connect_signal('Person', self._active_changed)
self.db_changed()
# Some Gramplets use DbGUIElement; and DbGUIElement needs to know if
# db is changed. However, at initialization, DbGUIElement is not yet
# initialized when _db_changed is called, thus the test for callman
if hasattr(self, "callman") and isinstance(self, DbGUIElement):
# get DbGUIElement informed if in use
self._change_db(db) # DbGUIElement method
self.update()
def _no_db(self):
+2 -2
View File
@@ -206,7 +206,7 @@ class DocBackend:
if not self.STYLETYPE_MAP or \
self.CLASSMAP != tagtype.__class__.__name__ :
self.CLASSMAP = tagtype.__class__.__name__
self.CLASSMAP == tagtype.__class__.__name__
self.STYLETYPE_MAP[tagtype.BOLD] = self.BOLD
self.STYLETYPE_MAP[tagtype.ITALIC] = self.ITALIC
self.STYLETYPE_MAP[tagtype.UNDERLINE] = self.UNDERLINE
@@ -217,7 +217,7 @@ class DocBackend:
self.STYLETYPE_MAP[tagtype.SUPERSCRIPT] = self.SUPERSCRIPT
self.STYLETYPE_MAP[tagtype.LINK] = self.LINK
if s_tag.name == tagtype.LINK:
if s_tag.name == 'Link':
return self.format_link(s_tag.value)
typeval = int(s_tag.name)
s_tagvalue = s_tag.value
+18 -5
View File
@@ -8,6 +8,7 @@
# Copyright (C) 2007 Brian G. Matherly
# Copyright (C) 2009 Benny Malengier
# Copyright (C) 2009 Gary Burton
# Copyright (C) 2017 Jonathan Biegert <azrdev@qrdn.de>
# Copyright (C) 2017 Mindaugas Baranauskas
# Copyright (C) 2017 Paul Culley
#
@@ -63,7 +64,7 @@ LOG = logging.getLogger(".graphdoc")
# Private Constants
#
#-------------------------------------------------------------------------
_FONTS = [{'name' : _("Default"), 'value' : "serif"},
_FONTS = [{'name' : _("Default"), 'value' : ""},
{'name' : _("PostScript / Helvetica"), 'value' : "Helvetica"},
{'name' : _("TrueType / FreeSans"), 'value' : "FreeSans"}]
@@ -72,6 +73,11 @@ _RANKDIR = [{'name' : _("Vertical (↓)"), 'value' : "TB"},
{'name' : _("Horizontal (→)"), 'value' : "LR"},
{'name' : _("Horizontal (←)"), 'value' : "RL"}]
_NODE_PORTS = {"TB" : ("n", "s"),
"BT" : ("s", "n"),
"LR" : ("w", "e"),
"RL" : ("e", "w")}
_PAGEDIR = [{'name' : _("Bottom, left"), 'value' : "BL"},
{'name' : _("Bottom, right"), 'value' : "BR"},
{'name' : _("Top, left"), 'value' : "TL"},
@@ -183,6 +189,10 @@ class GVOptions:
spline.set_help(_("How the lines between objects will be drawn."))
menu.add_option(category, "spline", spline)
node_ports = BooleanOption(_("Alternate line attachment"), False)
node_ports.set_help(_("Whether lines attach to nodes differently"))
menu.add_option(category, "node_ports", node_ports)
# the page direction option only makes sense when the
# number of horizontal and/or vertical pages is > 1,
# so we need to remember these 3 controls for later
@@ -409,6 +419,7 @@ class GVDocBase(BaseDoc, GVDoc):
self.vpages = get_option('v_pages').get_value()
self.usesubgraphs = get_option('usesubgraphs').get_value()
self.spline = get_option('spline').get_value()
self.node_ports = get_option('node_ports').get_value()
paper_size = paper_style.get_size()
@@ -456,6 +467,9 @@ class GVDocBase(BaseDoc, GVDoc):
' splines="%s";\n' % self.spline +
'\n' +
' edge [len=0.5 style=solid fontsize=%d];\n' % self.fontsize)
if self.node_ports:
self.write(' edge [headport=%s tailport=%s];\n'
% _NODE_PORTS[self.rankdir])
if self.fontfamily:
self.write(' node [style=filled fontname="%s" fontsize=%d];\n'
@@ -977,9 +991,8 @@ class GVPdfGsDoc(GVDocBase):
tmp_pdf_piece = "%s_%d_%d.pdf" % (tmp_ps, __x, __y)
list_of_pieces.append(tmp_pdf_piece)
# Generate Ghostscript code
command = '%s -q -dBATCH -dNOPAUSE -dSAFER '\
'-dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d '\
'-sOutputFile="%s" -sDEVICE=pdfwrite '\
command = '%s -q -dBATCH -dNOPAUSE -dSAFER -g%dx%d '\
'-sOutputFile="%s" -r72 -sDEVICE=pdfwrite '\
'-c "<</.HWMargins [%d %d %d %d] /PageOffset [%d %d]>> '\
'setpagedevice" -f "%s"' % (
_GS_CMD, width_pt + 10, height_pt + 10, tmp_pdf_piece,
@@ -989,7 +1002,7 @@ class GVPdfGsDoc(GVDocBase):
os.system(command)
# Merge pieces to single multipage PDF ;
command = '%s -q -dBATCH -dNOPAUSE '\
'-sOUTPUTFILE="%s" -sDEVICE=pdfwrite %s '\
'-sOUTPUTFILE="%s" -r72 -sDEVICE=pdfwrite %s '\
% (_GS_CMD, self._filename, ' '.join(list_of_pieces))
os.system(command)
+3 -4
View File
@@ -427,10 +427,9 @@ class ReferencedBySelectionProxyDb(ProxyDbBase):
def process_lds_ord(self, lds_ord):
""" Find all of the primary objects referred to """
fam_handle = lds_ord.get_family_handle()
if fam_handle:
fam = self.db.get_family_from_handle(fam_handle)
if fam:
self.queue_object("Family", fam_handle)
fam = self.db.get_family_from_handle(fam_handle)
if fam:
self.queue_object("Family", fam_handle)
place_handle = lds_ord.get_place_handle()
if place_handle:
+6 -6
View File
@@ -2181,18 +2181,18 @@ class RelationshipCalculator:
return trans_text("gender unknown|ex-spouse")
elif spouse_type == self.PARTNER_UNMARRIED:
if gender == MALE:
return trans_text("male,unmarried|partner")
return trans_text("unmarried|husband")
elif gender == FEMALE:
return trans_text("female,unmarried|partner")
return trans_text("unmarried|wife")
else:
return trans_text("gender unknown,unmarried|partner")
return trans_text("gender unknown,unmarried|spouse")
elif spouse_type == self.PARTNER_EX_UNMARRIED:
if gender == MALE:
return trans_text("male,unmarried|ex-partner")
return trans_text("unmarried|ex-husband")
elif gender == FEMALE:
return trans_text("female,unmarried|ex-partner")
return trans_text("unmarried|ex-wife")
else:
return trans_text("gender unknown,unmarried|ex-partner")
return trans_text("gender unknown,unmarried|ex-spouse")
elif spouse_type == self.PARTNER_CIVIL_UNION:
if gender == MALE:
return trans_text("male,civil union|partner")
+1 -2
View File
@@ -787,8 +787,7 @@ class SimpleAccess:
with self.dbase.get_person_cursor() as cursor:
# data[3] is primary_name; data[3][5][0][0] is surname
slist = sorted((data[3][5][0][0] if data[3][5] else '', key)
for key, data in cursor)
slist = sorted((data[3][5][0][0], key) for key, data in cursor)
for info in slist:
obj = self.dbase.get_person_from_handle(info[1])
+1 -1
View File
@@ -266,7 +266,7 @@ def mac_setup_localization(glocale):
LOG.debug("No supported languages found in $LANGUAGE")
if not (language and language[0]):
translations = _mac_language_list()
if translations and len(translations) > 0:
if len(translations) > 0:
language = translations
LOG.debug("Returning Translations %s", ':'.join(translations))
+7
View File
@@ -283,6 +283,13 @@ def __convert_float_val(val, typedeg="lat"):
# it is checked that degree >0, 0<= minutes <= 60,
# 0<= seconds <= 60, direction is in the directions dic.
#change , to . so that , input works in non , localization
#this is no problem, as a number like 100,000.20 cannot appear in
#lat/lon
#change XX,YY into XX.YY
if val.find(r'.') == -1:
val = val.replace(',', '.')
# format: XX.YYYY
v = __convert_using_float_repr(val)
if v is not None:
+2 -2
View File
@@ -183,10 +183,10 @@ class PlaceTest(unittest.TestCase):
def test_decimal_localization(self):
lat, lon = '50.849888888888', '2,885897222222'
self._test_formats_fail(lat, lon)
self._test_formats_success(lat, lon)
lat, lon = '89°59\'59.9999"S', '179°59\'59,9999"W'
self._test_formats_fail(lat, lon)
self._test_formats_success(lat, lon)
lat, lon = '89°59\'1.599,999"S', '179°59\'59,9999"W'
self._test_formats_fail(lat, lon)
+4 -3
View File
@@ -459,12 +459,12 @@ def run():
if argpars.need_gui():
LOG.debug("A GUI is needed, set it up")
try:
from .gui.grampsgui import startgtkloop
from .gui.grampsgui import startgramps
# no DISPLAY is a RuntimeError in an older pygtk (e.g. F14's 2.17)
except RuntimeError as msg:
error += [(_("Configuration error:"), str(msg))]
return error
startgtkloop(error, argpars)
startgramps(error, argpars)
else:
# CLI use of Gramps
argpars.print_help()
@@ -477,7 +477,8 @@ def main():
resource_path, filename = os.path.split(os.path.abspath(__file__))
resource_path, dirname = os.path.split(resource_path)
os.environ['GRAMPS_RESOURCES'] = resource_path
if win() and ('PANGOCAIRO_BACKEND' not in os.environ):
if win() and ('PANGOCAIRO_BACKEND' not in os.environ) and \
config.get('preferences.alternate-fonthandler'):
os.environ['PANGOCAIRO_BACKEND'] = "fontconfig"
errors = run()
if errors and isinstance(errors, list):
-45
View File
@@ -1,45 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# 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.
#
"""
A replacement ActionGroup that correctly loads named icons from an icon theme.
"""
from gi.repository import Gtk
class ActionGroup(Gtk.ActionGroup):
def add_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def add_toggle_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_toggle_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def add_radio_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_radio_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def fix_icon_name(self, action_list):
for action_tuple in action_list:
if action_tuple[1]:
action = self.get_action(action_tuple[0])
action.set_icon_name(action_tuple[1])
+3 -3
View File
@@ -1293,9 +1293,9 @@ class ClipboardListView:
data = [_ob.__class__.DRAG_TARGET.drag_type, _ob, None,
_ob._type, _ob._value, _ob._dbid, _ob._dbname]
contains = model_contains(model, data)
if (contains and not
if (contains and
((context.action if hasattr(context, "action") else
context.get_actions()) & Gdk.DragAction.MOVE)):
context.get_actions()) != Gdk.DragAction.MOVE)):
continue
drop_info = widget.get_dest_row_at_pos(x, y)
if drop_info:
@@ -1314,7 +1314,7 @@ class ClipboardListView:
# on self, then it moves the first, and copies the rest.
if ((context.action if hasattr(context, "action") else
context.get_actions()) & Gdk.DragAction.MOVE):
context.get_actions()) == Gdk.DragAction.MOVE):
context.finish(True, True, time)
# remember time for double drop workaround.
+21 -10
View File
@@ -49,7 +49,7 @@ from gi.repository import Pango
#-------------------------------------------------------------------------
from gramps.gen.config import config
from gramps.gen.const import GRAMPS_LOCALE as glocale
from gramps.gen.const import HOME_DIR, URL_WIKISTRING, URL_MANUAL_PAGE
from gramps.gen.const import HOME_DIR, URL_WIKISTRING
from gramps.gen.datehandler import get_date_formats
from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.name import NameDisplayError
@@ -64,7 +64,6 @@ from .managedwindow import ManagedWindow
from .widgets import MarkupLabel, BasicLabel
from .dialog import ErrorDialog, QuestionDialog2, OkDialog
from .editors.editplaceformat import EditPlaceFormat
from .display import display_help
from .glade import Glade
from gramps.gen.plug.utils import available_updates
from .plug import PluginWindows
@@ -92,9 +91,6 @@ COL_NAME = 1
COL_FMT = 2
COL_EXPL = 3
WIKI_HELP_PAGE = URL_MANUAL_PAGE + "_-_Settings"
WIKI_HELP_SEC = _('Preferences')
#-------------------------------------------------------------------------
#
#
@@ -208,8 +204,6 @@ class ConfigureDialog(ManagedWindow):
self.panel.append_page(widget, MarkupLabel(labeltitle))
def done(self, obj, value):
if value == Gtk.ResponseType.HELP:
return
if self.__on_close:
self.__on_close()
self.close()
@@ -529,9 +523,6 @@ class GrampsPreferences(ConfigureDialog):
ConfigureDialog.__init__(self, uistate, dbstate, page_funcs,
GrampsPreferences, config,
on_close=update_constants)
help_btn = self.window.add_button(_('_Help'), Gtk.ResponseType.HELP)
help_btn.connect(
'clicked', lambda x: display_help(WIKI_HELP_PAGE, WIKI_HELP_SEC))
self.setup_configs('interface.grampspreferences', 700, 450)
def add_researcher_panel(self, configdialog):
@@ -993,6 +984,12 @@ class GrampsPreferences(ConfigureDialog):
"""
self.uistate.emit('grampletbar-close-changed')
def cb_grampletbar_refresh(self, obj):
"""
Gramplet bar refresh button preference callback
"""
self.uistate.emit('grampletbar-refresh-changed')
def add_formats_panel(self, configdialog):
row = 0
grid = Gtk.Grid()
@@ -1194,6 +1191,13 @@ class GrampsPreferences(ConfigureDialog):
row, 'interface.grampletbar-close', stop=3,
extra_callback=self.cb_grampletbar_close)
row += 1
# Gramplet bar refresh button:
self.add_checkbox(grid,
_("Enable manual refresh for the active gramplet"),
row, 'interface.grampletbar-refresh', stop=3,
extra_callback=self.cb_grampletbar_refresh)
row += 1
return _('Display'), grid
def auto_title_changed(self, obj):
@@ -1359,6 +1363,13 @@ class GrampsPreferences(ConfigureDialog):
grid.set_row_spacing(6)
current_line = 0
if win():
self.add_checkbox(grid,
_('Use alternate Font handler for GUI and Reports '
'(requires restart)'),
current_line, 'preferences.alternate-fonthandler')
current_line += 1
self.add_checkbox(grid,
_('Add default source on GEDCOM import'),
current_line, 'preferences.default-source')
+28 -1
View File
@@ -303,6 +303,27 @@ class DbLoader(CLIDbLoader):
self._end_progress()
return True
#-------------------------------------------------------------------------
#
# default dir selection
#
#-------------------------------------------------------------------------
def get_default_dir():
# Suggested folder: try last open file, last import, last export,
# then home.
default_dir = os.path.dirname(config.get('paths.recent-file'))
if default_dir:
default_dir += os.path.sep
if len(default_dir)<=1:
default_dir = config.get('paths.recent-import-dir')
if len(default_dir)<=1:
default_dir = config.get('paths.recent-export-dir')
if len(default_dir)<=1:
default_dir = '~/'
else:
default_dir = "~/"
return default_dir
#-------------------------------------------------------------------------
#
# FileChooser filters: what to show in the file chooser
@@ -453,7 +474,13 @@ class GrampsImportFileDialog(ManagedWindow):
(box, type_selector) = format_maker()
import_dialog.set_extra_widget(box)
import_dialog.set_current_folder(config.get('paths.recent-import-dir'))
# Suggested folder: try last open file, import, then last export,
# then home.
default_dir = config.get('paths.recent-import-dir')
if len(default_dir)<=1:
default_dir = get_default_dir()
import_dialog.set_current_folder(default_dir)
while True:
# the import_dialog.run() makes it modal, so any change to that
# line would require the ManagedWindow.__init__ to be changed also
+2 -3
View File
@@ -26,7 +26,6 @@
import os
import webbrowser
import sys
from urllib.parse import quote
#------------------------------------------------------------------------
#
# Gramps modules
@@ -66,9 +65,9 @@ def display_help(webpage='', section=''):
if not webpage:
link = URL_WIKISTRING + URL_MANUAL_PAGE + EXTENSION
else:
link = URL_WIKISTRING + quote(webpage) + EXTENSION
link = URL_WIKISTRING + webpage + EXTENSION
if section:
link += '#' + quote(section.replace(' ', '_')).replace('%', '.')
link = link + '#' + section
display_url(link)
def display_url(link, uistate=None):
+84 -51
View File
@@ -28,6 +28,7 @@
#-------------------------------------------------------------------------
import os
from io import StringIO
import html
#-------------------------------------------------------------------------
#
@@ -65,6 +66,7 @@ from .glade import Glade
from gramps.gen.utils.db import navigation_label
from .widgets.progressdialog import ProgressMonitor, GtkProgressDialog
from .dialog import ErrorDialog
from .uimanager import ActionGroup
DISABLED = -1
@@ -116,6 +118,30 @@ class History(Callback):
if initial_person:
self.push(initial_person.get_handle())
def remove(self, handle, old_id=None):
"""
Remove a handle from the history list
"""
if old_id:
del_id = old_id
else:
del_id = handle
history_count = self.history.count(del_id)
for c in range(history_count):
self.history.remove(del_id)
self.index -= 1
mhc = self.mru.count(del_id)
for c in range(mhc):
self.mru.remove(del_id)
self.emit('mru-changed', (self.mru, ))
if self.history:
newact = self.history[self.index]
if not isinstance(newact, str):
newact = str(newact)
self.emit('active-changed', (newact,))
def push(self, handle):
"""
Pushes the handle on the history stack
@@ -205,21 +231,8 @@ class History(Callback):
Called in response to an object-delete signal.
Removes a list of handles from the history.
"""
for del_id in handle_list:
history_count = self.history.count(del_id)
for dummy in range(history_count):
self.history.remove(del_id)
self.index -= 1
mhc = self.mru.count(del_id)
for dummy in range(mhc):
self.mru.remove(del_id)
if self.history:
newact = self.history[self.index]
if not isinstance(newact, str):
newact = str(newact)
self.emit('active-changed', (newact,))
self.emit('mru-changed', (self.mru, ))
for handle in handle_list:
self.remove(handle)
def history_changed(self):
"""
@@ -235,14 +248,34 @@ class History(Callback):
#
#-------------------------------------------------------------------------
_RCT_TOP = '<ui><menubar name="MenuBar"><menu action="FileMenu"><menu action="OpenRecent">'
_RCT_BTM = '</menu></menu></menubar></ui>'
_RCT_TOP = '<placeholder id="OpenRecentMenu">'
_RCT_MENU = '''
<item>
<attribute name="action">win.%s</attribute>
<attribute name="label" translatable="no">%s</attribute>
</item>'''
_RCT_BTM = '\n </placeholder>\n'
_RCT_BAR_TOP = ('<object class="GtkMenu" id="OpenBtnMenu">\n'
'<property name="visible">True</property>\n'
'<property name="can_focus">False</property>')
_RCT_BAR = '''
<child>
<object class="GtkMenuItem">
<property name="action-name">win.%s</property>
<property name="label" translatable="yes">%s</property>
<property name="use_underline">False</property>
<property name="visible">True</property>
</object>
</child>'''
_RCT_BAR_BTM = '\n</object>\n'
from gramps.gen.recentfiles import RecentFiles
class RecentDocsMenu:
def __init__(self, uistate, state, fileopen):
self.action_group = Gtk.ActionGroup(name='RecentFiles')
self.ui_xml = []
self.action_group = ActionGroup('RecentFiles')
self.active = DISABLED
self.uistate = uistate
self.uimanager = uistate.uimanager
@@ -257,55 +290,52 @@ class RecentDocsMenu:
ErrorDialog(_('Cannot load database'), str(err),
parent=self.uistate.window)
def build(self):
buf = StringIO()
buf.write(_RCT_TOP)
def build(self, update_menu=True):
gramps_rf = RecentFiles()
count = 0
if self.active != DISABLED:
self.uimanager.remove_ui(self.active)
self.uimanager.remove_ui(self.ui_xml)
self.uimanager.remove_action_group(self.action_group)
self.action_group = Gtk.ActionGroup(name='RecentFiles')
self.active = DISABLED
actions = []
actionlist = []
menu = _RCT_TOP
bar = _RCT_BAR_TOP
rfiles = gramps_rf.gramps_recent_files
rfiles.sort(key=lambda x: x.get_time(), reverse=True)
new_menu = Gtk.Menu()
#new_menu = Gtk.Menu()
#new_menu.set_tooltip_text(_("Connect to a recent database"))
for item in rfiles:
try:
title = item.get_name()
title = html.escape(item.get_name())
filename = os.path.basename(item.get_path())
action_id = "RecentMenu%d" % count
buf.write('<menuitem action="%s"/>' % action_id)
actions.append((action_id, None, title, None, None,
make_callback(item, self.load)))
mitem = Gtk.MenuItem(label=title, use_underline=False)
mitem.connect('activate', make_callback(item, self.load))
mitem.show()
new_menu.append(mitem)
# add the menuitem for this file
menu += _RCT_MENU % (action_id, title)
# add the action for this file
actionlist.append((action_id, make_callback(item, self.load)))
# add the toolbar menuitem
bar += _RCT_BAR % (action_id, title)
except RuntimeError:
# ignore no longer existing files
_LOG.info("Ignoring the RecentItem %s (%s)" % (title, filename))
count += 1
buf.write(_RCT_BTM)
self.action_group.add_actions(actions)
self.uimanager.insert_action_group(self.action_group, 1)
self.active = self.uimanager.add_ui_from_string(buf.getvalue())
self.uimanager.ensure_update()
buf.close()
if len(rfiles) > 0:
new_menu.show()
self.uistate.set_open_recent_menu(new_menu)
menu += _RCT_BTM
bar += _RCT_BAR_BTM
self.ui_xml = [menu, bar]
self.action_group.add_actions(actionlist)
self.uimanager.insert_action_group(self.action_group)
self.active = self.uimanager.add_ui_from_string(self.ui_xml)
if update_menu:
self.uimanager.update_menu()
def make_callback(val, func):
return lambda x: func(val)
return lambda x, y: func(val)
from .logger import RotateHandler
@@ -368,6 +398,7 @@ class DisplayState(Callback):
'nameformat-changed' : None,
'placeformat-changed' : None,
'grampletbar-close-changed' : None,
'grampletbar-refresh-changed' : None,
'update-available' : (list, ),
'autobackup' : None,
}
@@ -610,17 +641,19 @@ class DisplayState(Callback):
self.status.pop(self.status_id)
if active_handle and dbstate.is_open():
if active_handle:
name, obj = navigation_label(dbstate.db, nav_type, active_handle)
# Append relationship to default person if funtionality is enabled.
if nav_type == 'Person' and config.get('interface.statusbar') > 1:
if active_handle != dbstate.db.get_default_handle():
msg = self.display_relationship(dbstate, active_handle)
if msg:
name = '%s (%s)' % (name, msg.strip())
else:
name = _('No active object')
# Append relationship to default person if funtionality is enabled.
if nav_type == 'Person' and active_handle \
and config.get('interface.statusbar') > 1:
if active_handle != dbstate.db.get_default_handle():
msg = self.display_relationship(dbstate, active_handle)
if msg:
name = '%s (%s)' % (name, msg.strip())
if not name:
name = self.NAV2MES[nav_type]
+1 -1
View File
@@ -85,7 +85,7 @@ def EditObject(dbstate, uistate, track, obj_class, prop=None, value=None, callba
LOG = logging.getLogger(".Edit")
if obj_class in EDITORS.keys():
if value is None:
obj = CLASSES[obj_class]()
obj = CLASSES[obj_class]
try:
EDITORS[obj_class](dbstate, uistate, track, obj, callback=callback)
except Exception as msg:
@@ -67,12 +67,6 @@ class BackRefList(EmbeddedList):
_('_References'), refmodel)
self._callback = callback
self.connectid = self.model.connect('row-inserted', self.update_label)
self.db_connect = []
for item in ['person', 'family', 'source', 'citation', 'event',
'media', 'place', 'repository', 'note']:
self.db_connect.append(self.dbstate.db.connect(
'%s-delete' % item, self.model.delete_row))
self.tree.set_reorderable(False)
self.track_ref_for_deletion("model")
def update_label(self, *obj):
@@ -86,8 +80,6 @@ class BackRefList(EmbeddedList):
def _cleanup_local_connects(self):
self.model.disconnect(self.connectid)
for item in self.db_connect:
self.dbstate.db.disconnect(item)
def _cleanup_on_exit(self):
# model may be destroyed already in closing managedwindow
+1 -12
View File
@@ -55,7 +55,6 @@ class BackRefModel(Gtk.ListStore):
self.sref_list = sref_list
self.count = 0
self.loading = False
self.hndl_iter = {}
self.idle = GLib.idle_add(self.load_model().__next__)
def destroy(self):
@@ -146,17 +145,7 @@ class BackRefModel(Gtk.ListStore):
# We need to use localized string in the model.
# we also need to keep class names to get the object type,
# but we don't need to show that in the view.
self.hndl_iter[ref[1]] = self.append(
row=[_(dtype), gid, name, handle, dtype])
self.append(row=[_(dtype), gid, name, handle, dtype])
yield True
self.loading = False
yield False
def delete_row(self, hndl_list):
""" Remove rows of the model based on the handles """
for hndl in hndl_list:
miter = self.hndl_iter.get(hndl, None)
if miter is not None:
self.remove(miter)
del self.hndl_iter[hndl]
@@ -211,7 +211,6 @@ class EmbeddedList(ButtonTab):
self.tree.drag_source_set_target_list(tglist)
self.tree.connect('drag_data_get', self.drag_data_get)
self.tree.connect_after('drag-begin', self.after_drag_begin)
if not self.dbstate.db.readonly:
self.tree.connect('drag_data_received', self.drag_data_received)
self.tree.connect('drag_motion', self.tree_drag_motion)
@@ -283,12 +282,6 @@ class EmbeddedList(ButtonTab):
"""
pass
def after_drag_begin(self, widget, drag_context):
"""
We want to show the icon during drag instead of the long row entry
"""
Gtk.drag_set_icon_name(drag_context, self.get_icon_name(), 0, 0)
def handle_extra_type(self, objtype, obj):
pass
@@ -131,15 +131,15 @@ class EventEmbedList(DbGUIElement, GroupEmbeddedList):
refs = self.get_data()[self._WORKGROUP]
ref_list = [eref.ref for eref in refs]
indexlist = []
last = -1
last = 0
while True:
try:
last = ref_list.index(handle, last + 1)
last = ref_list.index(handle)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup events from the object
for index in reversed(indexlist):
for index in indexlist.reverse():
del refs[index]
#now rebuild the display tab
self.rebuild_callback()
@@ -92,10 +92,6 @@ class PersonEventEmbedList(EventEmbedList):
self._data.append(family.get_event_ref_list())
self._groups.append((family_handle, self._FAMNAME,
groupname))
#we register all events that need to be tracked
for group in self._data:
self.callman.register_handles(
{'event': [eref.ref for eref in group]})
self.changed = False
return self._data
@@ -38,15 +38,13 @@ from gramps.gen.errors import WindowActiveError
from ...ddtargets import DdTargets
from .personrefmodel import PersonRefModel
from .embeddedlist import EmbeddedList, TEXT_COL, MARKUP_COL, ICON_COL
from ...dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
class PersonRefEmbedList(DbGUIElement, EmbeddedList):
class PersonRefEmbedList(EmbeddedList):
_HANDLE_COL = 4
_DND_TYPE = DdTargets.PERSONREF
@@ -71,61 +69,15 @@ class PersonRefEmbedList(DbGUIElement, EmbeddedList):
def __init__(self, dbstate, uistate, track, data):
self.data = data
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track,
_('_Associations'), PersonRefModel,
move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: person-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'person-update': self.person_change, # change to person we track
'person-delete': self.person_delete, # delete of person we track
})
self.callman.connect_all(keys=['person'])
def person_change(self, *obj):
"""
Callback method called when a tracked person changes (description
changes...)
"""
self.rebuild()
def person_delete(self, hndls):
"""
Callback method called when a tracked person is deleted.
There are two possibilities:
* a tracked non-workgroup person is deleted, just rebuilding the view
will correct this.
* a workgroup person is deleted. The person must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
ref_list = [pref.ref for pref in self.data]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup persons from the object
for index in reversed(indexlist):
del self.data[index]
#now rebuild the display tab
self.rebuild()
def get_ref_editor(self):
from .. import EditPersonRef
return EditPersonRef
def get_data(self):
self.callman.register_handles(
{'person': [pref.ref for pref in self.data]})
return self.data
def column_order(self):
@@ -40,15 +40,13 @@ from ...ddtargets import DdTargets
from .placerefmodel import PlaceRefModel
from .embeddedlist import EmbeddedList, TEXT_COL
from ...selectors import SelectorFactory
from ...dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
class PlaceRefEmbedList(DbGUIElement, EmbeddedList):
class PlaceRefEmbedList(EmbeddedList):
_HANDLE_COL = 4
_DND_TYPE = DdTargets.PLACEREF
@@ -67,57 +65,11 @@ class PlaceRefEmbedList(DbGUIElement, EmbeddedList):
self.data = data
self.handle = handle
self.callback = callback
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track,
_('Enclosed By'), PlaceRefModel,
share_button=True, move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: place-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'place-update': self.place_change, # change to place we track
'place-delete': self.place_delete, # delete of place we track
})
self.callman.connect_all(keys=['place'])
def place_change(self, *obj):
"""
Callback method called when a tracked place changes (description
changes...)
"""
self.rebuild()
def place_delete(self, hndls):
"""
Callback method called when a tracked place is deleted.
There are two possibilities:
* a tracked non-workgroup place is deleted, just rebuilding the view
will correct this.
* a workgroup place is deleted. The place must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
ref_list = [pref.ref for pref in self.data]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup places from the object
for index in reversed(indexlist):
del self.data[index]
#now rebuild the display tab
self.rebuild()
def get_data(self):
self.callman.register_handles(
{'place': [pref.ref for pref in self.data]})
return self.data
def column_order(self):
+1 -5
View File
@@ -50,9 +50,6 @@ from ...ddtargets import DdTargets
from gramps.gen.lib import Surname, NameOriginType
from ...utils import match_primary_mask, no_match_primary_mask
# table for skipping illegal control chars
INVISIBLE = dict.fromkeys(list(range(32)))
#-------------------------------------------------------------------------
#
# SurnameTab
@@ -284,8 +281,7 @@ class SurnameTab(EmbeddedList):
colnr must be the column in the model.
"""
node = self.model.get_iter(path)
text = new_text.translate(INVISIBLE).strip()
self.model.set_value(node, colnr, text)
self.model.set_value(node, colnr, new_text)
self.update()
def on_orig_edited(self, cellr, path, new_text, colnr):
-22
View File
@@ -174,8 +174,6 @@ class EditCitation(EditPrimary):
self._add_db_signal('citation-rebuild', self._do_close)
self._add_db_signal('citation-delete', self.check_for_close)
self._add_db_signal('source-delete', self.source_delete)
self._add_db_signal('source-update', self.source_update)
def _setup_fields(self):
"""
@@ -271,26 +269,6 @@ class EditCitation(EditPrimary):
author = ''
self.glade.get_object("author").set_text(author)
def source_update(self, hndls):
''' Source changed outside of dialog, update text if its ours '''
handle = self.obj.get_reference_handle()
if handle and handle in hndls:
source = self.db.get_source_from_handle(handle)
s_lbl = "%s [%s]" % (source.get_title(), source.gramps_id)
self.glade.get_object("source").set_text(s_lbl)
author = source.get_author()
self.glade.get_object("author").set_text(author)
def source_delete(self, hndls):
''' Source deleted outside of dialog, remove it if its ours'''
handle = self.obj.get_reference_handle()
if handle and handle in hndls:
self.obj.set_reference_handle(None)
self.glade.get_object("source").set_markup(
self.source_field.EMPTY_TEXT)
self.glade.get_object("author").set_text('')
self.source_field.set_button(False)
def build_menu_names(self, source):
"""
Provide the information needed by the base class to define the
-20
View File
@@ -129,8 +129,6 @@ class EditEvent(EditPrimary):
"""
self._add_db_signal('event-rebuild', self._do_close)
self._add_db_signal('event-delete', self.check_for_close)
self._add_db_signal('place-delete', self.place_delete)
self._add_db_signal('place-update', self.place_update)
def _setup_fields(self):
@@ -303,24 +301,6 @@ class EditEvent(EditPrimary):
cmp_obj = self.empty_object()
return cmp_obj.serialize(True)[1:] != self.obj.serialize()[1:]
def place_update(self, hndls):
''' Place changed outside of dialog, update text if its ours '''
handle = self.obj.get_place_handle()
if handle and handle in hndls:
place = self.db.get_place_from_handle(handle)
p_lbl = "%s [%s]" % (place.get_title(), place.gramps_id)
self.top.get_object("place").set_text(p_lbl)
def place_delete(self, hndls):
''' Place deleted outside of dialog, remove it if its ours'''
handle = self.obj.get_place_handle()
if handle and handle in hndls:
self.obj.set_place_handle(None)
self.top.get_object("place").set_markup(
self.place_field.EMPTY_TEXT)
self.place_field.set_button(False)
#-------------------------------------------------------------------------
#
# Delete Query class
-19
View File
@@ -120,8 +120,6 @@ class EditEventRef(EditReference):
"""
self._add_db_signal('event-rebuild', self.close)
self._add_db_signal('event-delete', self.check_for_close)
self._add_db_signal('place-delete', self.place_delete)
self._add_db_signal('place-update', self.place_update)
def _setup_fields(self):
@@ -281,20 +279,3 @@ class EditEventRef(EditReference):
self.update(self.source_ref,self.source)
self.close()
def place_update(self, hndls):
''' Place changed outside of dialog, update text if its ours '''
handle = self.source.get_place_handle()
if handle and handle in hndls:
place = self.db.get_place_from_handle(handle)
p_lbl = "%s [%s]" % (place.get_title(), place.gramps_id)
self.top.get_object("eer_place").set_text(p_lbl)
def place_delete(self, hndls):
''' Place deleted outside of dialog, remove it if its ours'''
handle = self.source.get_place_handle()
if handle and handle in hndls:
self.source.set_place_handle(None)
self.top.get_object("eer_place").set_markup(
self.place_field.EMPTY_TEXT)
self.place_field.set_button(False)
+7 -71
View File
@@ -80,7 +80,6 @@ from gramps.gen.utils.db import (get_birth_or_fallback, get_death_or_fallback,
from ..selectors import SelectorFactory
from gramps.gen.utils.id import create_id
from gramps.gen.const import URL_MANUAL_SECT1
from ..dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
@@ -98,8 +97,7 @@ _KP_ENTER = Gdk.keyval_from_name("KP_Enter")
_LEFT_BUTTON = 1
_RIGHT_BUTTON = 3
class ChildEmbedList(DbGUIElement, EmbeddedList):
class ChildEmbedList(EmbeddedList):
"""
The child embed list is specific to the Edit Family dialog, so it
is contained here instead of in displaytabs.
@@ -141,54 +139,9 @@ class ChildEmbedList(DbGUIElement, EmbeddedList):
Create the object, storing the passed family value
"""
self.family = family
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track, _('Chil_dren'),
ChildModel, share_button=True, move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: event-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'person-update': self.person_change, # change to person we track
'person-delete': self.person_delete, # delete of person we track
})
self.callman.connect_all(keys=['person'])
def person_change(self, *obj):
"""
Callback method called when a tracked person changes (description
changes...)
"""
self.rebuild()
def person_delete(self, hndls):
"""
Callback method called when a tracked person is deleted.
There are two possibilities:
* a tracked non-workgroup person is deleted, just rebuilding the view
will correct this.
* a workgroup person is deleted. The person must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
prefs = self.get_data()
ref_list = [pref.ref for pref in prefs]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup persons from the object
for index in reversed(indexlist):
del prefs[index]
#now rebuild the display tab
self.rebuild()
def get_popup_menu_items(self):
return [
(False, _('Edit child'), self.edit_child_button_clicked),
@@ -210,10 +163,7 @@ class ChildEmbedList(DbGUIElement, EmbeddedList):
Normally, get_data returns a list. However, we return family
object here instead.
"""
prefs = self.family.get_child_ref_list()
self.callman.register_handles(
{'person': [eref.ref for eref in prefs]})
return prefs
return self.family.get_child_ref_list()
def column_order(self):
return [(1, 13), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6),
@@ -342,11 +292,9 @@ class ChildEmbedList(DbGUIElement, EmbeddedList):
name.set_primary_surname(0)
if self.family:
father_handle = self.family.get_father_handle()
father = (self.dbstate.db.get_person_from_handle(father_handle) if
father_handle else None)
mother_handle = self.family.get_mother_handle()
mother = (self.dbstate.db.get_person_from_handle(mother_handle) if
mother_handle else None)
father = self.dbstate.db.get_person_from_handle(father_handle)
mother = self.dbstate.db.get_person_from_handle(mother_handle)
if not father and not mother:
return name
if not father:
@@ -439,11 +387,12 @@ class EditFamily(EditPrimary):
return Family()
def _local_init(self):
self.build_interface()
self.added = self.obj.handle is None
if self.added:
self.obj.handle = create_id()
self.build_interface()
self.load_data()
def _connect_db_signals(self):
@@ -463,22 +412,11 @@ class EditFamily(EditPrimary):
'event-update': self.topdata_updated, # change eg birth event fath
'event-rebuild': self.topdata_updated,
'event-delete': self.topdata_updated, # delete eg birth event fath
'person-update': self.topdata_updated, # change eg name of father
'person-delete' : self.person_delete, # mother/father deleted?
'person-update': self.topdata_updated, # change eg name of father
'person-rebuild': self._do_close,
})
self.callman.connect_all(keys=['family', 'event', 'person'])
def person_delete(self, handles):
""" This checks if mother/father is deleted, specifically when newly
added before data is saved """
for hndl in handles:
if self.obj.father_handle == hndl:
self.obj.father_handle = None
if self.obj.mother_handle == hndl:
self.obj.mother_handle = None
self.load_data()
def check_for_family_change(self, handles):
"""
Callback for family-update signal
@@ -620,8 +558,6 @@ class EditFamily(EditPrimary):
self.fbutton_del.connect('clicked', self.del_father_clicked)
self.fbutton_add.connect('clicked', self.add_father_clicked)
if self.added:
return # avoids crash on drag because not in db yet
#allow for a context menu
self.set_contexteventbox(self.top.get_object("eventboxtop"))
#allow for drag of the family object from eventboxtop
+1 -1
View File
@@ -74,7 +74,7 @@ class EditLink(ManagedWindow):
self.simple_access = SimpleAccess(self.dbstate.db)
self.callback = callback
ManagedWindow.__init__(self, uistate, track, url, modal=True)
ManagedWindow.__init__(self, uistate, track, url)
self._local_init()
self._connect_signals()
+5 -6
View File
@@ -245,13 +245,12 @@ class EditMedia(EditPrimary):
self.view_media(obj)
def view_media(self, obj):
if self.obj.handle:
ref_obj = self.dbstate.db.get_media_from_handle(self.obj.handle)
ref_obj = self.dbstate.db.get_media_from_handle(self.obj.handle)
if ref_obj:
media_path = media_path_full(self.dbstate.db,
ref_obj.get_path())
open_file_with_default_application(media_path, self.uistate)
if ref_obj:
media_path = media_path_full(self.dbstate.db,
ref_obj.get_path())
open_file_with_default_application(media_path, self.uistate)
def select_file(self, val):
self.determine_mime()
+3 -2
View File
@@ -180,7 +180,6 @@ class EditNote(EditPrimary):
self.set_window(win, None, self.get_menu_title())
self.setup_configs('interface.note', 700, 500)
vboxnote = self.top.get_object('vbox131')
notebook = self.top.get_object('note_notebook')
#recreate start page as GrampsTab
@@ -271,7 +270,9 @@ class EditNote(EditPrimary):
# create a formatting toolbar
if not self.dbstate.db.readonly:
vbox = self.top.get_object('container')
vbox.pack_start(self.texteditor.get_toolbar(), False, False, 0)
toolbar, self.action_group = self.texteditor.create_toolbar(
self.uistate.uimanager, self.window)
vbox.pack_start(toolbar, False, False, 0)
self.texteditor.set_transient_parent(self.window)
# setup initial values for textview and textbuffer
+31 -26
View File
@@ -250,8 +250,7 @@ class EditPerson(EditPrimary):
self.eventbox.connect('button-press-event',
self._image_button_press)
# allow to initiate a drag-and-drop with this person if it has a handle
if self.added:
return # Avoid HandleError if dragging an objet not in db yet
#if self.obj.get_handle():
tglist = Gtk.TargetList.new([])
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
DdTargets.PERSON_LINK.target_flags,
@@ -274,7 +273,9 @@ class EditPerson(EditPrimary):
self._add_db_signal('family-delete', self.family_change)
self._add_db_signal('family-update', self.family_change)
self._add_db_signal('family-add', self.family_change)
self._add_db_signal('event-update', self.event_updated)
self._add_db_signal('event-rebuild', self.event_updated)
self._add_db_signal('event-delete', self.event_updated)
def family_change(self, handle_list=[]):
"""
@@ -675,33 +676,33 @@ class EditPerson(EditPrimary):
EditMediaRef(self.dbstate, self.uistate, self.track,
media_obj, media_ref, self.load_photo)
def _top_contextmenu(self):
def _top_contextmenu(self, prefix):
"""
Override from base class, the menuitems and actiongroups for the top
of context menu.
"""
self.all_action = Gtk.ActionGroup(name="/PersonAll")
self.home_action = Gtk.ActionGroup(name="/PersonHome")
self.track_ref_for_deletion("all_action")
self.track_ref_for_deletion("home_action")
if self.added:
# Don't add items if not a real person yet
return '', []
self.all_action.add_actions([
('ActivePerson', None, _("Make Active Person"),
None, None, self._make_active),
])
self.home_action.add_actions([
('HomePerson', 'go-home', _("Make Home Person"),
None, None, self._make_home_person),
])
_actions = [('ActivePerson', self._make_active),
('HomePerson', self._make_home_person)]
self.all_action.set_visible(not self.added)
self.home_action.set_visible(not self.added)
ui_top_cm = (
'''
<item>
<attribute name="action">{prefix}.ActivePerson</attribute>
<attribute name="label" translatable="yes">Make Active Person'''
'''</attribute>
</item>
<item>
<attribute name="action">{prefix}.HomePerson</attribute>
<attribute name="label" translatable="yes">Make Home Person'''
'''</attribute>
</item>
'''.format(prefix=prefix))
ui_top_cm = '''
<menuitem action="ActivePerson"/>
<menuitem action="HomePerson"/>'''
return ui_top_cm, [self.all_action, self.home_action]
return ui_top_cm, _actions
def _top_drag_data_get(self, widget, context, sel_data, info, time):
if info == DdTargets.PERSON_LINK.app_id:
@@ -712,17 +713,21 @@ class EditPerson(EditPrimary):
"""
Override base class, make inactive home action if not needed.
"""
if self.added:
return
home_action = self.uistate.uimanager.get_action(self.action_group,
'HomePerson')
if (self.dbstate.db.get_default_person() and
self.obj.get_handle() ==
self.dbstate.db.get_default_person().get_handle()):
self.home_action.set_sensitive(False)
home_action.set_enabled(False)
else:
self.home_action.set_sensitive(True)
home_action.set_enabled(True)
def _make_active(self, obj):
def _make_active(self, obj, value):
self.uistate.set_active(self.obj.get_handle(), 'Person')
def _make_home_person(self, obj):
def _make_home_person(self, obj, value):
handle = self.obj.get_handle()
if handle:
self.dbstate.db.set_default_person_handle(handle)
+2 -2
View File
@@ -182,8 +182,8 @@ class EditPlace(EditPrimary):
def set_latlongitude(self, value):
try:
coma = value.index(',')
self.longitude.set_text(value[coma+1:].strip())
self.latitude.set_text(value[:coma].strip())
self.longitude.set_text(value[coma+1:])
self.latitude.set_text(value[:coma])
self.top.get_object("lat_entry").validate(force=True)
self.top.get_object("lon_entry").validate(force=True)
self.obj.set_latitude(self.latitude.get_value())
+2 -2
View File
@@ -175,8 +175,8 @@ class EditPlaceRef(EditReference):
def set_latlongitude(self, value):
try:
coma = value.index(',')
self.longitude.set_text(value[coma+1:].strip())
self.latitude.set_text(value[:coma].strip())
self.longitude.set_text(value[coma+1:])
self.latitude.set_text(value[:coma])
self.top.get_object("lat_entry").validate(force=True)
self.top.get_object("lon_entry").validate(force=True)
self.source.set_latitude(self.latitude.get_value())
+45 -25
View File
@@ -32,6 +32,7 @@ import abc
#
#-------------------------------------------------------------------------
from gi.repository import Gtk
from gi.repository.Gio import SimpleActionGroup
#-------------------------------------------------------------------------
#
@@ -49,6 +50,8 @@ from ..display import display_help
from ..dialog import SaveDialog
from gramps.gen.lib import PrimaryObject
from ..dbguielement import DbGUIElement
from ..uimanager import ActionGroup
class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
@@ -75,6 +78,7 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
self.get_from_gramps_id = get_from_gramps_id
self.contexteventbox = None
self.__tabs = []
self.action_group = None
ManagedWindow.__init__(self, uistate, track, obj)
DbGUIElement.__init__(self, self.db)
@@ -184,6 +188,8 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
self.dbstate.disconnect(self.dbstate_connect_key)
self._cleanup_connects()
self._cleanup_on_exit()
if self.action_group:
self.uistate.uimanager.remove_action_group(self.action_group)
self.get_from_handle = None
self.get_from_gramps_id = None
ManagedWindow.close(self)
@@ -283,48 +289,62 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
return False
#build the possible popup menu
self._build_popup_ui()
menu_model = self._build_popup_ui()
if not menu_model:
return False
#set or unset sensitivity in popup
self._post_build_popup_ui()
menu = self.popupmanager.get_widget('/Popup')
if menu:
menu.popup(None, None, None, None, event.button, event.time)
return True
menu = Gtk.Menu.new_from_model(menu_model)
menu.attach_to_widget(obj, None)
menu.show_all()
if Gtk.MINOR_VERSION < 22:
# ToDo The following is reported to work poorly with Wayland
menu.popup(None, None, None, None,
event.button, event.time)
else:
menu.popup_at_pointer(event)
return True
return False
def _build_popup_ui(self):
"""
Create actions and ui of context menu
If you don't need a popup, override this and return None
"""
from ..plug.quick import create_quickreport_menu
self.popupmanager = Gtk.UIManager()
#add custom actions
(ui_top, action_groups) = self._top_contextmenu()
for action in action_groups :
self.popupmanager.insert_action_group(action, -1)
prefix = str(id(self))
#get custom ui and actions
(ui_top, actions) = self._top_contextmenu(prefix)
#see which quick reports are available now:
ui_qr = ''
if self.QR_CATEGORY > -1 :
(ui_qr, reportactions) = create_quickreport_menu(self.QR_CATEGORY,
self.dbstate, self.uistate,
self.obj, track=self.track)
self.report_action = Gtk.ActionGroup(name="/PersonReport")
self.report_action.add_actions(reportactions)
self.report_action.set_visible(True)
self.popupmanager.insert_action_group(self.report_action, -1)
(ui_qr, reportactions) = create_quickreport_menu(
self.QR_CATEGORY, self.dbstate, self.uistate,
self.obj, prefix, track=self.track)
actions.extend(reportactions)
popupui = '''
<ui>
<popup name="Popup">''' + ui_top + '''
<separator/>''' + ui_qr + '''
</popup>
</ui>'''
popupui = '''<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="Popup">''' + ui_top + '''
<section>
''' + ui_qr + '''
</section>
</menu>
</interface>'''
self.popupmanager.add_ui_from_string(popupui)
builder = Gtk.Builder.new_from_string(popupui, -1)
def _top_contextmenu(self):
self.action_group = ActionGroup('EditPopup' + prefix, actions,
prefix)
act_grp = SimpleActionGroup()
self.window.insert_action_group(prefix, act_grp)
self.window.set_application(self.uistate.uimanager.app)
self.uistate.uimanager.insert_action_group(self.action_group, act_grp)
return builder.get_object('Popup')
def _top_contextmenu(self, prefix):
"""
Derived class can create a ui with menuitems and corresponding list of
actiongroups
@@ -186,8 +186,10 @@ class PersonSidebarFilter(SidebarFilter):
# if the name is not empty, choose either the regular expression
# version or the normal text match
if name:
rule = RegExpName([name], use_regex=regex)
generic_filter.add_rule(rule)
name_parts = name.split(sep=" ")
for name_part in name_parts:
rule = RegExpName([name_part], use_regex=regex)
generic_filter.add_rule(rule)
# if the id is not empty, choose either the regular expression
# version or the normal text match
@@ -206,7 +208,7 @@ class PersonSidebarFilter(SidebarFilter):
# Build an event filter if needed
if etype:
rule = HasEvent([etype, '', '', '', '', '1'], use_regex=regex)
rule = HasEvent([etype, '', '', '', '', True], use_regex=regex)
generic_filter.add_rule(rule)
# Build birth event filter if needed
+1 -1
View File
@@ -65,7 +65,6 @@
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
</object>
@@ -162,6 +161,7 @@
<action-widgets>
<action-widget response="-6">cancelbutton1</action-widget>
<action-widget response="-5">okbutton1</action-widget>
<action-widget response="-11">help</action-widget>
</action-widgets>
</object>
</interface>
-17
View File
@@ -493,23 +493,6 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button14">
<property name="label" translatable="yes">_Help</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_underline">True</property>
<signal name="clicked" handler="on_book_help_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
+1 -1
View File
@@ -159,7 +159,6 @@
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
</object>
@@ -376,6 +375,7 @@
<action-widgets>
<action-widget response="-7">cancel_btn</action-widget>
<action-widget response="-5">connect_btn</action-widget>
<action-widget response="-11">help_btn</action-widget>
</action-widgets>
</object>
</interface>
-32
View File
@@ -116,22 +116,6 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="help_btn">
<property name="label">gtk-help</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_help_btn_style_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
@@ -1767,22 +1751,6 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="help_btn_styles">
<property name="label">gtk-help</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_help_btn_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="secondary">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
+454 -75
View File
@@ -3,6 +3,7 @@
#
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2009 Benny Malengier
# Copyright (C) 2018 Paul Culley
#
# 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
@@ -50,7 +51,369 @@ _ = glocale.translation.gettext
MIN_PYGOBJECT_VERSION = (3, 12, 0)
PYGOBJ_ERR = False
MIN_GTK_VERSION = (3, 10)
MIN_GTK_VERSION = (3, 12)
UIDEFAULT = (
'''<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menubar"><section id="menubar-update">
<submenu id='m1'>
<attribute name="label" translatable="yes">_Family Trees</attribute>
<section id="ftree">
<item>
<attribute name="action">win.Open</attribute>
<attribute name="label" translatable="yes">'''
'''_Manage Family Trees</attribute>
</item>
<submenu>
<attribute name="action">win.OpenRecent</attribute>
<attribute name="label" translatable="yes">Open _Recent</attribute>
<placeholder id="OpenRecentMenu">
</placeholder>
</submenu>
<item groups='RO'>
<attribute name="action">win.Close</attribute>
<attribute name="label" translatable="yes">_Close</attribute>
</item>
</section>
<section groups='RO RW'>
<item groups='RW'>
<attribute name="action">win.Import</attribute>
<attribute name="label" translatable="yes">_Import...</attribute>
</item>
<item>
<attribute name="action">win.Export</attribute>
<attribute name="label" translatable="yes">_Export...</attribute>
</item>
<placeholder id="LocalExport">
</placeholder>
<item>
<attribute name="action">win.Backup</attribute>
<attribute name="label" translatable="yes">Make Backup...</attribute>
</item>
</section>
<section>
<item groups='RO'>
<attribute name="action">win.Abandon</attribute>
<attribute name="label" translatable="yes">'''
'''_Abandon Changes and Quit</attribute>
</item>
<placeholder groups='OSX' id='osxquit'>
<item>
<attribute name="action">app.quit</attribute>
<attribute name="label" translatable="yes">_Quit</attribute>
</item>
</placeholder>
</section>
</submenu>
<submenu id='m2' groups='RW'>
<attribute name="label" translatable="yes">_Add</attribute>
<section>
<item>
<attribute name="action">win.PersonAdd</attribute>
<attribute name="label" translatable="yes">Person</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.FamilyAdd</attribute>
<attribute name="label" translatable="yes">Family</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.EventAdd</attribute>
<attribute name="label" translatable="yes">Event</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.PlaceAdd</attribute>
<attribute name="label" translatable="yes">Place</attribute>
</item>
<item>
<attribute name="action">win.SourceAdd</attribute>
<attribute name="label" translatable="yes">Source</attribute>
</item>
<item>
<attribute name="action">win.CitationAdd</attribute>
<attribute name="label" translatable="yes">Citation</attribute>
</item>
<item>
<attribute name="action">win.RepositoryAdd</attribute>
<attribute name="label" translatable="yes">Repository</attribute>
</item>
<item>
<attribute name="action">win.MediaAdd</attribute>
<attribute name="label" translatable="yes">Media</attribute>
</item>
<item>
<attribute name="action">win.NoteAdd</attribute>
<attribute name="label" translatable="yes">Note</attribute>
</item>
</section>
</submenu>
<submenu id='m3'>
<attribute name="label" translatable="yes">_Edit</attribute>
<section groups='RW'>
<placeholder id="undo">
</placeholder>
<placeholder id="redo">
</placeholder>
<item>
<attribute name="action">win.UndoHistory</attribute>
<attribute name="label" translatable="yes">Undo History</attribute>
</item>
</section>
<section id='CommonEdit' groups='RW'>
</section>
<section id='TagMenu' groups='RW'>
</section>
<section groups='RW'>
<item>
<attribute name="action">win.Clipboard</attribute>
<attribute name="label" translatable="yes">Clip_board</attribute>
</item>
</section>
<section>
<placeholder groups='OSX' id='osxpref'>
<item>
<attribute name="action">app.preferences</attribute>
<attribute name="label" translatable="yes">'''
'''_Preferences...</attribute>
</item>
</placeholder>
<placeholder id='otheredit'>
</placeholder>
</section>
</submenu>
<submenu id='m4'>
<attribute name="label" translatable="yes">_View</attribute>
<section>
<item>
<attribute name="action">win.ConfigView</attribute>
<attribute name="label" translatable="yes">_Configure...</attribute>
</item>
<item>
<attribute name="action">win.Navigator</attribute>
<attribute name="label" translatable="yes">_Navigator</attribute>
</item>
<item>
<attribute name="action">win.Toolbar</attribute>
<attribute name="label" translatable="yes">_Toolbar</attribute>
</item>
<placeholder id='Bars'>
</placeholder>
<item>
<attribute name="action">win.Fullscreen</attribute>
<attribute name="label" translatable="yes">F_ull Screen</attribute>
</item>
</section>
<section id="ViewsInCatagory">
</section>
</submenu>
<submenu id="m5" groups='RO'>
<attribute name="label" translatable="yes">_Go</attribute>
<placeholder id="CommonGo">
</placeholder>
<section id="CommonHistory">
</section>
</submenu>
<submenu id='m6' groups='RW'>
<attribute name="label" translatable="yes">_Bookmarks</attribute>
<section id="AddEditBook">
</section>
<section id="GoToBook">
</section>
</submenu>
<submenu id='m7' groups='RO'>
<attribute name="label" translatable="yes">_Reports</attribute>
<section>
<item>
<attribute name="action">win.Books</attribute>
<attribute name="label" translatable="yes">Books...</attribute>
</item>
</section>
<section id="P_ReportsMenu">
</section>
</submenu>
<submenu id='m8' groups='RW'>
<attribute name="label" translatable="yes">_Tools</attribute>
<section id="P_ToolsMenu">
</section>
</submenu>
<submenu id='m9' groups='RO'>
<attribute name="label" translatable="yes">_Windows</attribute>
<section id="WinMenu">
</section>
</submenu>
<submenu id='m10'>
<attribute name="label" translatable="yes">_Help</attribute>
<section>
<item>
<attribute name="action">win.UserManual</attribute>
<attribute name="label" translatable="yes">_User Manual</attribute>
</item>
<item>
<attribute name="action">win.FAQ</attribute>
<attribute name="label" translatable="yes">_FAQ</attribute>
</item>
<item>
<attribute name="action">win.KeyBindings</attribute>
<attribute name="label" translatable="yes">_Key Bindings</attribute>
</item>
<item>
<attribute name="action">win.TipOfDay</attribute>
<attribute name="label" translatable="yes">Tip of the Day</attribute>
</item>
<item>
<attribute name="action">win.PluginStatus</attribute>
<attribute name="label" translatable="yes">'''
'''_Plugin Manager</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.HomePage</attribute>
<attribute name="label" translatable="yes">'''
'''Gramps _Home Page</attribute>
</item>
<item>
<attribute name="action">win.MailingLists</attribute>
<attribute name="label" translatable="yes">'''
'''Gramps _Mailing Lists</attribute>
</item>
<item>
<attribute name="action">win.ReportBug</attribute>
<attribute name="label" translatable="yes">_Report a Bug</attribute>
</item>
<item>
<attribute name="action">win.ExtraPlugins</attribute>
<attribute name="label" translatable="yes">'''
'''_Extra Reports/Tools</attribute>
</item>
</section>
<section groups='OSX'>
<item>
<attribute name="action">app.about</attribute>
<attribute name="label" translatable="yes">_About</attribute>
</item>
</section>
</submenu>
</section></menu>
<object class="GtkMenu" id="OpenBtnMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<object class="GtkToolbar" id="ToolBar">
<property name="hexpand">1</property>
<property name="toolbar-style">GTK_TOOLBAR_ICONS</property>
<style>
<class name="primary-toolbar"/>
</style>
<child>
<object class="GtkToolButton">
<property name="icon-name">gramps</property>
<property name="action-name">win.Open</property>
<property name="tooltip_text" translatable="yes">'''
'''Manage databases</property>
<property name="label" translatable="yes">_Family Trees</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<child>
<object class="GtkMenuButton">
<property name="tooltip_text" translatable="yes">'''
'''Connect to a recent database</property>
<property name="popup">OpenBtnMenu</property>
<property name="relief">GTK_RELIEF_NONE</property>
</object>
</child>
</object>
</child>
<placeholder id='CommonNavigation'>
</placeholder>
<placeholder id='BarCommonEdit'>
</placeholder>
<placeholder id='TagTool'>
</placeholder>
<child groups='RW'>
<object class="GtkToolButton" id="Clipboard">
<property name="icon-name">edit-paste</property>
<property name="action-name">win.Clipboard</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the Clipboard dialog</property>
<property name="label" translatable="yes">Clip_board</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem"/>
</child>
<child>
<object class="GtkToolButton" id="ConfigView">
<property name="icon-name">gramps-config</property>
<property name="action-name">win.ConfigView</property>
<property name="tooltip_text" translatable="yes">'''
'''Configure the active view</property>
<property name="label" translatable="yes">_Configure...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<placeholder id='ViewsInCategoryBar'>
</placeholder>
<child>
<object class="GtkSeparatorToolItem" id="sep"/>
</child>
<placeholder id="MoreButtons">
</placeholder>
<child groups='RO'>
<object class="GtkToolButton" id="Reports">
<property name="icon-name">gramps-reports</property>
<property name="action-name">win.Reports</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the reports dialog</property>
<property name="label" translatable="yes">_Reports</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton" id="Tools">
<property name="icon-name">gramps-tools</property>
<property name="action-name">win.Tools</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the tools dialog</property>
<property name="label" translatable="yes">_Tools</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<placeholder id='AfterTools'>
</placeholder>
</object>
<menu id="Popup">
</menu>
</interface>
''')
try:
#import gnome introspection, part of pygobject
@@ -235,9 +598,8 @@ class Gramps:
process. It may spawn several windows and control several databases.
"""
def __init__(self, argparser):
def __init__(self, argparser, app):
from gramps.gen.dbstate import DbState
from . import viewmanager
from .viewmanager import ViewManager
from gramps.cli.arghandler import ArgHandler
from .tipofday import TipOfDay
@@ -248,7 +610,7 @@ class Gramps:
theme.append_search_path(IMAGE_DIR)
dbstate = DbState()
self._vm = ViewManager(dbstate,
self._vm = ViewManager(app, dbstate,
config.get("interface.view-categories"))
if (lin()
@@ -256,7 +618,7 @@ class Gramps:
and not gettext.find(GTK_GETTEXT_DOMAIN)):
_display_gtk_gettext_message(parent=self._vm.window)
#_display_welcome_message(parent=self._vm.window)
_display_welcome_message(parent=self._vm.window)
_display_translator_message(parent=self._vm.window)
@@ -303,77 +665,24 @@ class Gramps:
#
#-------------------------------------------------------------------------
def __startgramps(errors, argparser):
def startgramps(errors, argparser):
"""
Main startup function started via GObject.timeout_add
First action inside the gtk loop
"""
try:
from .dialog import ErrorDialog
#handle first existing errors in GUI fashion
if errors:
for error in errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
if argparser.errors:
for error in argparser.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
# add gui logger
from .logger import RotateHandler, GtkHandler
form = logging.Formatter(
fmt="%(relativeCreated)d: %(levelname)s: "
"%(filename)s: line %(lineno)d: %(message)s")
# Create the log handlers
rot_h = RotateHandler(capacity=20)
rot_h.setFormatter(form)
# Only error and critical log records should
# trigger the GUI handler.
gtkh = GtkHandler(rotate_handler=rot_h)
gtkh.setFormatter(form)
gtkh.setLevel(logging.ERROR)
logger = logging.getLogger()
logger.addHandler(rot_h)
logger.addHandler(gtkh)
except:
#make sure there is a clean exit if there is an error in above steps
quit_now = True
exit_code = 1
LOG.error(_("\nGramps failed to start. "
"Please report a bug about this.\n"
"This could be because of an error "
"in a (third party) View on startup.\n"
"To use another view, don't load a Family Tree, "
"change view, and then load your Family Tree.\n"
"You can also change manually "
"the startup view in the gramps.ini file \n"
"by changing the last-view parameter.\n"
), exc_info=True)
# start Gramps, errors stop the gtk loop
app = GrampsApplication(errors, argparser)
try:
quit_now = False
exit_code = 0
if has_display():
Gramps(argparser)
else:
if app.run():
print(_("Gramps terminated because of no DISPLAY"))
quit_now = True
exit_code = 1
except SystemExit as err:
quit_now = True
if err.code:
exit_code = err.code
if isinstance(err.code, str):
LOG.error(err.code, exc_info=False)
else:
LOG.error("Gramps terminated with exit code: %d.", err.code,
exc_info=False)
LOG.error("Gramps terminated with exit code: %d.", err.code,
exc_info=True)
except OSError as err:
quit_now = True
exit_code = err.errno or 1
@@ -398,18 +707,88 @@ def __startgramps(errors, argparser):
), exc_info=True)
if quit_now:
#stop gtk loop and quit
Gtk.main_quit()
app.quit()
sys.exit(exit_code)
#function finished, return False to stop the timeout_add function calls
return False
def startgtkloop(errors, argparser):
"""
We start the gtk loop and run the function to start up Gramps
"""
GLib.timeout_add(100, __startgramps, errors, argparser, priority=100)
if os.path.exists(os.path.join(DATA_DIR, "gramps.accel")):
Gtk.AccelMap.load(os.path.join(DATA_DIR, "gramps.accel"))
Gtk.main()
# we do the following import here to avoid the Gtk require version warning
from .uimanager import UIManager
from gramps.gen.constfunc import is_quartz
class GrampsApplication(Gtk.Application):
def __init__(self, errors, argparser):
super().__init__(application_id="org.gramps-project.Gramps")
self.window = None
self.errors = errors
self.argparser = argparser
def do_startup(self):
Gtk.Application.do_startup(self)
self.uimanager = UIManager(self, UIDEFAULT)
if not is_quartz():
self.uimanager.show_groups = ['OSX']
self.uimanager.update_menu(init=True)
if os.path.exists(os.path.join(DATA_DIR, "gramps.accel")):
self.uimanager.load_accels(os.path.join(DATA_DIR, "gramps.accel"))
try:
from .dialog import ErrorDialog
#handle first existing errors in GUI fashion
if self.errors:
for error in self.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
if self.argparser.errors:
for error in self.argparser.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
# add gui logger
from .logger import RotateHandler, GtkHandler
form = logging.Formatter(
fmt="%(relativeCreated)d: %(levelname)s: "
"%(filename)s: line %(lineno)d: %(message)s")
# Create the log handlers
rot_h = RotateHandler(capacity=20)
rot_h.setFormatter(form)
# Only error and critical log records should
# trigger the GUI handler.
gtkh = GtkHandler(rotate_handler=rot_h)
gtkh.setFormatter(form)
gtkh.setLevel(logging.ERROR)
logger = logging.getLogger()
logger.addHandler(rot_h)
logger.addHandler(gtkh)
except:
#make sure there is a clean exit if error in above steps
exit_code = 1
LOG.error(_("\nGramps failed to start. "
"Please report a bug about this.\n"
"This could be because of an error "
"in a (third party) View on startup.\n"
"To use another view, don't load a Family Tree, "
"change view, and then load your Family Tree.\n"
"You can also change manually "
"the startup view in the gramps.ini file \n"
"by changing the last-view parameter.\n"
), exc_info=True)
#stop gtk loop and quit
self.quit()
sys.exit(exit_code)
def do_activate(self):
# We only allow a single window and raise any existing ones
if not self.window:
# Windows are associated with the application
# when the last one is closed the application shuts down
Gramps(self.argparser, self)
else:
print('Gramps is already running.')
self.window.present()
+26 -24
View File
@@ -31,7 +31,7 @@ the create/deletion of dialog windows.
#-------------------------------------------------------------------------
import os
from io import StringIO
import html
#-------------------------------------------------------------------------
#
# GNOME/GTK
@@ -49,6 +49,7 @@ from gramps.gen.const import GLADE_FILE, ICON
from gramps.gen.errors import WindowActiveError
from gramps.gen.config import config
from gramps.gen.constfunc import is_quartz
from .uimanager import ActionGroup
from .glade import Glade
#-------------------------------------------------------------------------
@@ -57,8 +58,8 @@ from .glade import Glade
#
#-------------------------------------------------------------------------
_win_top = '<ui><menubar name="MenuBar"><menu action="WindowsMenu">'
_win_btm = '</menu></menubar></ui>'
_win_top = '<section id="WinMenu">\n'
_win_btm = '</section>\n'
DISABLED = -1
#-----------------------------------------------------------------------
@@ -108,7 +109,7 @@ class GrampsWindowManager:
self.uimanager = uimanager
self.window_tree = []
self.id2item = {}
self.action_group = Gtk.ActionGroup(name='WindowManger')
self.action_group = ActionGroup(name='WindowManger')
self.active = DISABLED
self.ui = _win_top + _win_btm
@@ -125,9 +126,9 @@ class GrampsWindowManager:
"""
Enables the UI and action groups
"""
self.uimanager.insert_action_group(self.action_group, 1)
self.active = self.uimanager.add_ui_from_string(self.ui)
self.uimanager.ensure_update()
self.uimanager.insert_action_group(self.action_group)
self.active = self.uimanager.add_ui_from_string([self.ui])
self.uimanager.update_menu()
def get_item_from_track(self, track):
# Recursively find an item given track sequence
@@ -270,31 +271,35 @@ class GrampsWindowManager:
def call_back_factory(self, item):
if not isinstance(item, list):
def func(obj):
def func(*obj):
if item.window_id and self.id2item.get(item.window_id):
self.id2item[item.window_id]._present()
else:
def func(obj):
def func(*obj):
pass
return func
def generate_id(self, item):
return str(item.window_id)
return 'wm/' + str(item.window_id)
def display_menu_list(self, data, action_data, mlist):
menuitem = ('<item>\n'
'<attribute name="action">win.%s</attribute>\n'
'<attribute name="label" translatable="yes">'
'%s...</attribute>\n'
'</item>\n')
if isinstance(mlist, (list, tuple)):
i = mlist[0]
idval = self.generate_id(i)
data.write('<menu action="M:%s">' % idval)
action_data.append(("M:"+idval, None, i.submenu_label,
None, None, None))
data.write('<submenu>\n<attribute name="label"'
' translatable="yes">%s</attribute>\n' %
html.escape(i.submenu_label))
else:
i = mlist
idval = self.generate_id(i)
data.write('<menuitem action="%s"/>' % idval)
action_data.append((idval, None, i.menu_label, None, None,
self.call_back_factory(i)))
data.write(menuitem % (idval, html.escape(i.menu_label)))
action_data.append((idval, self.call_back_factory(i)))
if isinstance(mlist, (list, tuple)) and (len(mlist) > 1):
for i in mlist[1:]:
@@ -302,20 +307,17 @@ class GrampsWindowManager:
self.display_menu_list(data, action_data, i)
else:
idval = self.generate_id(i)
data.write('<menuitem action="%s"/>'
% self.generate_id(i))
action_data.append((idval, None, i.menu_label,
None, None,
self.call_back_factory(i)))
data.write(menuitem % (idval, html.escape(i.menu_label)))
action_data.append((idval, self.call_back_factory(i)))
if isinstance(mlist, (list, tuple)):
data.write('</menu>')
data.write('</submenu>\n')
def build_windows_menu(self):
if self.active != DISABLED:
self.uimanager.remove_ui(self.active)
self.uimanager.remove_action_group(self.action_group)
self.action_group = Gtk.ActionGroup(name='WindowManger')
self.action_group = ActionGroup(name='WindowManger')
action_data = []
data = StringIO()
@@ -576,8 +578,8 @@ class ManagedWindow:
self.opened = False
self._save_position(save_config=False) # the next line will save it
self._save_size()
self.uistate.gwm.close_track(self.track)
self.clean_up()
self.uistate.gwm.close_track(self.track)
# put a previously modal window back to modal, now that we are closing
if self.other_modal_window:
self.other_modal_window.set_modal(True)
+3 -3
View File
@@ -150,6 +150,9 @@ class MergeCitation(ManagedWindow):
else:
phoenix = self.citation2
titanic = self.citation1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Citation')
if self.get_widget("page_btn1").get_active() ^ use_handle1:
phoenix.set_page(titanic.get_page())
@@ -162,8 +165,5 @@ class MergeCitation(ManagedWindow):
query = MergeCitationQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Citation')
self.uistate.set_busy_cursor(False)
self.close()
+3 -3
View File
@@ -167,6 +167,9 @@ class MergeEvent(ManagedWindow):
else:
phoenix = self.ev2
titanic = self.ev1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Event')
if self.get_widget("type_btn1").get_active() ^ use_handle1:
phoenix.set_type(titanic.get_type())
@@ -182,8 +185,5 @@ class MergeEvent(ManagedWindow):
query = MergeEventQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Event')
self.uistate.set_busy_cursor(False)
self.close()
+3 -3
View File
@@ -203,6 +203,9 @@ class MergeFamily(ManagedWindow):
else:
phoenix = self.fy2
titanic = self.fy1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Family')
phoenix_fh = phoenix.get_father_handle()
phoenix_mh = phoenix.get_mother_handle()
@@ -220,9 +223,6 @@ class MergeFamily(ManagedWindow):
query = MergeFamilyQuery(self.database, phoenix, titanic,
phoenix_fh, phoenix_mh)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Family')
except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window)
+3 -3
View File
@@ -147,6 +147,9 @@ class MergeMedia(ManagedWindow):
else:
phoenix = self.mo2
titanic = self.mo1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Media')
if self.get_widget("path_btn1").get_active() ^ use_handle1:
phoenix.set_path(titanic.get_path())
@@ -160,7 +163,4 @@ class MergeMedia(ManagedWindow):
query = MergeMediaQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Media')
self.close()
+3 -3
View File
@@ -159,6 +159,9 @@ class MergeNote(ManagedWindow):
else:
phoenix = self.no2
titanic = self.no1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Note')
if self.get_widget("text_btn1").get_active() ^ use_handle1:
phoenix.set_styledtext(titanic.get_styledtext())
@@ -171,7 +174,4 @@ class MergeNote(ManagedWindow):
query = MergeNoteQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Note')
self.close()
+3 -3
View File
@@ -321,6 +321,9 @@ class MergePerson(ManagedWindow):
else:
phoenix = self.pr2
titanic = self.pr1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Person')
if self.get_widget("name_btn1").get_active() ^ use_handle1:
swapname = phoenix.get_primary_name()
@@ -344,9 +347,6 @@ class MergePerson(ManagedWindow):
"handle. We recommend that you go to Relationships "
"view and see if additional manual merging of families "
"is necessary."), parent=self.window)
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Person')
except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window)
+3 -3
View File
@@ -197,6 +197,9 @@ class MergePlace(ManagedWindow):
else:
phoenix = self.pl2
titanic = self.pl1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Place')
if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title())
@@ -215,9 +218,6 @@ class MergePlace(ManagedWindow):
query = MergePlaceQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Place')
if self.callback:
self.callback()
+3 -3
View File
@@ -140,6 +140,9 @@ class MergeRepository(ManagedWindow):
else:
phoenix = self.rp2
titanic = self.rp1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Repository')
if self.get_widget("name_btn1").get_active() ^ use_handle1:
phoenix.set_name(titanic.get_name())
@@ -150,8 +153,5 @@ class MergeRepository(ManagedWindow):
query = MergeRepositoryQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Repository')
self.uistate.set_busy_cursor(False)
self.close()
+3 -3
View File
@@ -159,6 +159,9 @@ class MergeSource(ManagedWindow):
else:
phoenix = self.src2
titanic = self.src1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Source')
if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title())
@@ -173,8 +176,5 @@ class MergeSource(ManagedWindow):
query = MergeSourceQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Source')
self.uistate.set_busy_cursor(False)
self.close()
+51 -42
View File
@@ -38,22 +38,21 @@ from gi.repository import Gdk
#-------------------------------------------------------------------------
from gramps.gen.plug import (START, END)
from .pluginmanager import GuiPluginManager
from .actiongroup import ActionGroup
from .uimanager import ActionGroup
#-------------------------------------------------------------------------
#
# Constants
#
#-------------------------------------------------------------------------
UICATEGORY = '''<ui>
<menubar name="MenuBar">
<menu action="ViewMenu">
<placeholder name="ViewsInCategory">%s
</placeholder>
</menu>
</menubar>
</ui>
'''
UICATEGORY = ''' <section id="ViewsInCatagory">
%s
</section>
'''
UICATAGORYBAR = ''' <placeholder id='ViewsInCategoryBar'>
%s
</placeholder>
'''
CATEGORY_ICON = {
'Dashboard': 'gramps-gramplet',
@@ -88,7 +87,6 @@ class Navigator:
self.active_view = None
self.ui_category = {}
self.view_toggle_actions = {}
self.cat_view_group = None
self.merge_ids = []
@@ -139,13 +137,35 @@ class Navigator:
"""
Load the sidebar plugins.
"""
menuitem = '''
<item>
<attribute name="action">win.ViewInCatagory</attribute>
<attribute name="label" translatable="yes">%s</attribute>
<attribute name="target">%d %d</attribute>
</item>
'''
baritem = '''
<child>
<object class="GtkToggleToolButton" id="bar%d">
<property name="action-name">win.ViewInCatagory</property>
<property name="action-target">'%d %d'</property>
<property name="icon-name">%s</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">%s</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
'''
plugman = GuiPluginManager.get_instance()
categories = []
views = {}
for cat_num, cat_views in enumerate(self.viewmanager.get_views()):
uimenuitems = ''
self.view_toggle_actions[cat_num] = []
uibaritems = ''
for view_num, page in enumerate(cat_views):
if view_num == 0:
@@ -156,26 +176,26 @@ class Navigator:
cat_icon = 'gramps-view'
categories.append([cat_num, cat_name, cat_icon])
pageid = 'page_%i_%i' % (cat_num, view_num)
uimenuitems += '\n<menuitem action="%s"/>' % pageid
# id, stock, button text, UI, tooltip, page
if view_num < 9:
modifier = "<PRIMARY><ALT>%d" % ((view_num % 9) + 1)
else:
modifier = ""
accel = "<PRIMARY><ALT>%d" % ((view_num % 9) + 1)
self.viewmanager.uimanager.app.set_accels_for_action(
"win.ViewInCatagory('%d %d')" % (cat_num, view_num),
[accel])
uimenuitems += menuitem % (page[0].name, cat_num, view_num)
stock_icon = page[0].stock_icon
if stock_icon is None:
stock_icon = cat_icon
self.view_toggle_actions[cat_num].append((pageid,
stock_icon,
page[0].name, modifier, page[0].name, view_num))
uibaritems += baritem % (view_num, cat_num, view_num,
stock_icon, page[0].name,
page[0].name)
views[cat_num].append((view_num, page[0].name, stock_icon))
if len(cat_views) > 1:
#allow for switching views in a category
self.ui_category[cat_num] = UICATEGORY % uimenuitems
self.ui_category[cat_num] = [UICATEGORY % uimenuitems,
UICATAGORYBAR % uibaritems]
for pdata in plugman.get_reg_sidebars():
module = plugman.load_plugin(pdata)
@@ -199,10 +219,7 @@ class Navigator:
Add a page to the sidebar for a plugin.
"""
self.pages.append((title, sidebar))
page = sidebar.get_top()
# hide for now so notebook is only size of active page
page.get_child().hide()
index = self.notebook.append_page(page, Gtk.Label(label=title))
index = self.notebook.append_page(sidebar.get_top(), Gtk.Label(label=title))
menu_item = Gtk.MenuItem(label=title)
if order == START:
@@ -232,12 +249,10 @@ class Navigator:
list(map(uimanager.remove_ui, self.merge_ids))
if cat_num in self.ui_category:
self.cat_view_group = ActionGroup(name='viewmenu')
self.cat_view_group.add_radio_actions(
self.view_toggle_actions[cat_num], value=view_num,
on_change=self.cb_view_clicked, user_data=cat_num)
self.cat_view_group.set_sensitive(True)
uimanager.insert_action_group(self.cat_view_group, 1)
action = ('ViewInCatagory', self.cb_view_clicked, '',
str(cat_num) + ' ' + str(view_num))
self.cat_view_group = ActionGroup('viewmenu', [action])
uimanager.insert_action_group(self.cat_view_group)
mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num])
self.merge_ids.append(mergeid)
@@ -248,12 +263,12 @@ class Navigator:
return
sidebar.view_changed(cat_num, view_num)
def cb_view_clicked(self, radioaction, current, cat_num):
def cb_view_clicked(self, radioaction, value):
"""
Called when a view is selected from the menu.
"""
view_num = radioaction.get_current_value()
self.viewmanager.goto_page(cat_num, view_num)
cat_num, view_num = value.get_string().split()
self.viewmanager.goto_page(int(cat_num), int(view_num))
def __menu_button_pressed(self, button, event):
"""
@@ -279,15 +294,9 @@ class Navigator:
old_page = notebook.get_current_page()
if old_page != -1:
self.pages[old_page][1].inactive()
# hide so notebook is only size of active page
notebook.get_nth_page(old_page).get_child().hide()
self.pages[index][1].active(self.active_cat, self.active_view)
notebook.get_nth_page(index).get_child().show()
notebook.queue_resize()
if self.active_view is not None:
self.pages[index][1].view_changed(self.active_cat,
self.active_view)
self.pages[index][1].view_changed(self.active_cat, self.active_view)
self.title_label.set_text(self.pages[index][0])
def cb_close_clicked(self, button):
+6 -1
View File
@@ -55,7 +55,7 @@ from gi.repository import GdkPixbuf
#
#-------------------------------------------------------------------------
from gramps.gen.const import ICON, SPLASH, GRAMPS_LOCALE as glocale
from gramps.gen.const import USER_HOME, ICON, SPLASH, GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from gramps.gen.config import config
from ...pluginmanager import GuiPluginManager
@@ -558,7 +558,12 @@ class ExportAssistant(ManagedWindow, Gtk.Assistant):
ix = self.get_selected_format_index()
ext = self.map_exporters[ix].get_extension()
# Suggested folder: try last export, then last import, then home.
default_dir = config.get('paths.recent-export-dir')
if len(default_dir)<=1:
default_dir = config.get('paths.recent-import-dir')
if len(default_dir)<=1:
default_dir = USER_HOME
if ext == 'gramps':
new_filename = os.path.join(default_dir,'data.gramps')
+31 -28
View File
@@ -63,6 +63,12 @@ from gramps.gen.plug import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY, CATEGORY_QR
from ._textbufdoc import TextBufDoc
from gramps.gen.simple import make_basic_stylesheet
MENUITEM = ('<item>\n'
'<attribute name="action">{prefix}.{action}</attribute>\n'
'<attribute name="label" translatable="yes">'
'{label}</attribute>\n'
'</item>\n')
def flatten(L):
"""
Flattens a possibly nested list. Removes None results, too.
@@ -77,7 +83,7 @@ def flatten(L):
retval.append(L)
return retval
def create_web_connect_menu(dbstate, uistate, nav_group, handle):
def create_web_connect_menu(dbstate, uistate, nav_group, handle, prefix):
"""
This functions querries the registered web connects. It collects
the connects of the requested category, which must be one of
@@ -88,12 +94,12 @@ def create_web_connect_menu(dbstate, uistate, nav_group, handle):
handle as input method. A tuple is returned, containing the ui
string of the menu, and its associated actions.
"""
top = ("<placeholder id='WebConnect'><submenu>\n"
'<attribute name="label" translatable="yes">'
'Web Connection</attribute>\n')
actions = []
ofile = StringIO()
ofile.write('<menu action="WebConnect">')
actions.append(('WebConnect', None, _("Web Connect"), None, None, None))
menu = Gtk.Menu()
menu.show()
ofile.write(top)
#select the web connects to show
showlst = []
pmgr = GuiPluginManager.get_instance()
@@ -109,16 +115,17 @@ def create_web_connect_menu(dbstate, uistate, nav_group, handle):
connections.sort(key=lambda plug: plug.name)
actions = []
for connect in connections:
ofile.write('<menuitem action="%s"/>' % connect.key)
actions.append((connect.key, None, connect.name, None, None,
connect(dbstate, uistate, nav_group, handle)))
ofile.write('</menu>')
retval = [ofile.getvalue()]
retval.extend(actions)
return retval
action = connect.key.replace(' ', '-')
ofile.write(MENUITEM.format(prefix=prefix, action=action,
label=connect.name))
callback = connect(dbstate, uistate, nav_group, handle)
actions.append((action,
lambda x, y: callback(x)))
ofile.write('</submenu></placeholder>\n')
return (ofile.getvalue(), actions)
def create_quickreport_menu(category, dbstate, uistate, handle, track=[]):
def create_quickreport_menu(category, dbstate, uistate, handle, prefix, track=[]):
""" This functions querries the registered quick reports with
quick_report_list of _PluginMgr.py
It collects the reports of the requested category, which must be one of
@@ -132,39 +139,35 @@ def create_quickreport_menu(category, dbstate, uistate, handle, track=[]):
A tuple is returned, containing the ui string of the quick report menu,
and its associated actions
"""
top = ("<submenu>\n"
'<attribute name="label" translatable="yes">'
'Quick View</attribute>\n')
actions = []
ofile = StringIO()
ofile.write('<menu action="QuickReport">')
actions.append(('QuickReport', None, _("Quick View"), None, None, None))
menu = Gtk.Menu()
menu.show()
ofile.write(top)
#select the reports to show
showlst = []
pmgr = GuiPluginManager.get_instance()
for pdata in pmgr.get_reg_quick_reports():
if pdata.supported and pdata.category == category :
#add tuple function, translated name, name, status
showlst.append(pdata)
showlst.sort(key=lambda x: x.name)
for pdata in showlst:
new_key = pdata.id.replace(' ', '-')
ofile.write('<menuitem action="%s"/>' % new_key)
actions.append((new_key, None, pdata.name, None, None,
make_quick_report_callback(pdata, category, dbstate,
uistate, handle, track=track)))
ofile.write('</menu>')
ofile.write(MENUITEM.format(prefix=prefix, action=new_key,
label=pdata.name))
actions.append((new_key, make_quick_report_callback(
pdata, category, dbstate, uistate, handle, track=track)))
ofile.write('</submenu>\n')
return (ofile.getvalue(), actions)
def make_quick_report_callback(pdata, category, dbstate, uistate, handle,
track=[]):
return lambda x: run_report(dbstate, uistate, category, handle, pdata,
track=track)
return lambda x, y: run_report(dbstate, uistate, category, handle, pdata,
track=track)
def get_quick_report_list(qv_category=None):
"""
-4
View File
@@ -344,7 +344,6 @@ class QuickTable(SimpleTable):
self.simpledoc = document
buffer = self.simpledoc.doc.buffer
text_view = self.simpledoc.doc.text_view
text_view.set_sensitive(False)
model_index = 1 # start after index
if self._sort_col:
sort_index = self._columns.index(self._sort_col)
@@ -429,6 +428,3 @@ class QuickTable(SimpleTable):
text_view.show_all()
self.simpledoc.paragraph("")
self.simpledoc.paragraph("")
while Gtk.events_pending():
Gtk.main_iteration()
text_view.set_sensitive(True)
+2 -18
View File
@@ -59,8 +59,6 @@ from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from ...listmodel import ListModel
from gramps.gen.errors import FilterError, ReportError
from gramps.gen.const import URL_MANUAL_PAGE
from ...display import display_help
from ...pluginmanager import GuiPluginManager
from ...dialog import WarningDialog, ErrorDialog, QuestionDialog2
from gramps.gen.plug.menu import PersonOption, FamilyOption
@@ -87,10 +85,6 @@ _UNSUPPORTED = _("Unsupported")
_RETURN = Gdk.keyval_from_name("Return")
_KP_ENTER = Gdk.keyval_from_name("KP_Enter")
WIKI_HELP_PAGE = URL_MANUAL_PAGE + "_-_Reports_-_part_3"
WIKI_HELP_SEC = _('Books')
GENERATE_WIKI_HELP_SEC = _('Generate_Book_dialog')
#------------------------------------------------------------------------
#
# Private Functions
@@ -179,7 +173,6 @@ class BookListDisplay:
"on_booklist_ok_clicked" : self.on_booklist_ok_clicked,
"on_booklist_delete_clicked" : self.on_booklist_delete_clicked,
"on_book_ok_clicked" : self.do_nothing,
"on_book_help_clicked" : self.do_nothing,
"destroy_passed_object" : self.do_nothing,
"on_setup_clicked" : self.do_nothing,
"on_down_clicked" : self.do_nothing,
@@ -349,8 +342,6 @@ class BookSelector(ManagedWindow):
"on_save_clicked" : self.on_save_clicked,
"on_open_clicked" : self.on_open_clicked,
"on_edit_clicked" : self.on_edit_clicked,
"on_book_help_clicked" : lambda x: display_help(WIKI_HELP_PAGE,
WIKI_HELP_SEC),
"on_book_ok_clicked" : self.on_book_ok_clicked,
"destroy_passed_object" : self.on_close_clicked,
@@ -938,10 +929,7 @@ class BookDialog(DocReportDialog):
'book', self.title, track=track)
self.options.options_dict['bookname'] = self.book.get_name()
while True:
response = self.window.run()
if response != Gtk.ResponseType.HELP:
break
response = self.window.run()
if response == Gtk.ResponseType.OK:
handler = self.options.handler
if self.book.get_paper_name() != handler.get_paper_name():
@@ -963,8 +951,7 @@ class BookDialog(DocReportDialog):
self.make_book()
except (IOError, OSError) as msg:
ErrorDialog(str(msg), parent=self.window)
if response != Gtk.ResponseType.DELETE_EVENT: # already closed
self.close()
self.close()
def setup_style_frame(self):
pass
@@ -987,9 +974,6 @@ class BookDialog(DocReportDialog):
whether the document requires table support, etc."""
self.format_menu = _BookFormatComboBox(active)
def on_help_clicked(self, *obj):
display_help(WIKI_HELP_PAGE, GENERATE_WIKI_HELP_SEC)
def make_document(self):
"""Create a document of the type requested by the user."""
user = User(uistate=self.uistate)

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