Compare commits
118
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5e53e53bc | ||
|
|
263a082afe | ||
|
|
dd9ddab849 | ||
|
|
cfa278886b | ||
|
|
1c430a6b91 | ||
|
|
b0eb712933 | ||
|
|
51a7ad9483 | ||
|
|
d6e9d62fad | ||
|
|
3bac4a1036 | ||
|
|
1995a7068c | ||
|
|
5dc06d023d | ||
|
|
d98a1857dc | ||
|
|
7da8811327 | ||
|
|
15db2dd603 | ||
|
|
97b15322d4 | ||
|
|
824bf7e40f | ||
|
|
56fa261ef2 | ||
|
|
1efab19f1e | ||
|
|
51e294f748 | ||
|
|
cb65fd93ca | ||
|
|
5b9600d835 | ||
|
|
cf80d17040 | ||
|
|
d4f906f22d | ||
|
|
d189e334d8 | ||
|
|
a48a94d872 | ||
|
|
8e5dc220dc | ||
|
|
dca2f610dc | ||
|
|
3d1833e307 | ||
|
|
aa221cc3c7 | ||
|
|
51b7d1c420 | ||
|
|
674d286f87 | ||
|
|
0161c4b917 | ||
|
|
de31a42fc8 | ||
|
|
9c508de5fd | ||
|
|
1b00d95ce4 | ||
|
|
78870decb8 | ||
|
|
1a5696eb2c | ||
|
|
269d38da2c | ||
|
|
99f77b0a88 | ||
|
|
264fdda4d0 | ||
|
|
8092b88ad4 | ||
|
|
3251e2ae88 | ||
|
|
f718c5f8b4 | ||
|
|
a96a446b47 | ||
|
|
5658411acf | ||
|
|
a4403d719e | ||
|
|
8597a10c40 | ||
|
|
d0c0045dc1 | ||
|
|
868abdc0d9 | ||
|
|
ebf88bf5c5 | ||
|
|
c3814a4e42 | ||
|
|
52fe365919 | ||
|
|
bc39dda9e7 | ||
|
|
257275f169 | ||
|
|
9e61809b17 | ||
|
|
9e2b935db1 | ||
|
|
9a386574d8 | ||
|
|
90bdb0a840 | ||
|
|
ae322dbdc8 | ||
|
|
208feceb03 | ||
|
|
32dd3a2e14 | ||
|
|
0ae51c9522 | ||
|
|
59bd9f040d | ||
|
|
df00dd1f32 | ||
|
|
ca49b56774 | ||
|
|
19f8c3561c | ||
|
|
79ff9bc216 | ||
|
|
b54672d28d | ||
|
|
6b42d71158 | ||
|
|
ac593d814d | ||
|
|
617e2212c8 | ||
|
|
ad15ef7961 | ||
|
|
406faa5603 | ||
|
|
4e0d562208 | ||
|
|
43ef686622 | ||
|
|
d59fe6b2af | ||
|
|
d677a1a785 | ||
|
|
be776d6a31 | ||
|
|
1482fedb9c | ||
|
|
00f8df60ce | ||
|
|
f31caf1ea4 | ||
|
|
8ebb4d35fa | ||
|
|
c5f2717623 | ||
|
|
e5d5cfbd3a | ||
|
|
bd5f6e4711 | ||
|
|
e15deff4ed | ||
|
|
9d906c29a2 | ||
|
|
6577d43e4e | ||
|
|
1a065485e3 | ||
|
|
009783a59a | ||
|
|
1b4f70c808 | ||
|
|
dd4a727521 | ||
|
|
ebb7111f25 | ||
|
|
86fd14613e | ||
|
|
5276461239 | ||
|
|
40f47bc22d | ||
|
|
8150403ccb | ||
|
|
b43d94ab16 | ||
|
|
849290a3b7 | ||
|
|
0b617e9fd6 | ||
|
|
6eb435142e | ||
|
|
e14ea777d5 | ||
|
|
46d73a16a0 | ||
|
|
4d2b918d39 | ||
|
|
4acfdcce52 | ||
|
|
f3b3eec211 | ||
|
|
a840566e02 | ||
|
|
f6a2199f68 | ||
|
|
dfc9dde32d | ||
|
|
50f93f54ec | ||
|
|
9cb1d96725 | ||
|
|
40013dccc3 | ||
|
|
24af1b8420 | ||
|
|
213d656df4 | ||
|
|
c09b4e96d2 | ||
|
|
a80875e00c | ||
|
|
bbdedb5097 | ||
|
|
dd0671b111 |
@@ -23,5 +23,8 @@ test/data
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
|
||||
# Glade temp files
|
||||
*~
|
||||
|
||||
+6
-6
@@ -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 ast�s and bytecode. This is loaded to
|
||||
# manipulate and analyze python ast�s 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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 *
|
||||
|
||||
@@ -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
|
||||
------------------------------------------------
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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&d=mm&r=pg" mime="unknown" description="http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&d=mm&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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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&Anna_smiths_marr_cert.jpg" mime="image/jpeg" description="Magnes&Anna_smiths_marr_cert.jpg"/>
|
||||
<file src="Magnes&Anna_smiths_marr_cert.jpg" mime="unknown" description="Magnes&Anna_smiths_marr_cert.jpg"/>
|
||||
</object>
|
||||
<object handle="_000000d8000000d8" change="1" id="O0002">
|
||||
<file src="John&Alice_smiths_marr_cert.jpg" mime="image/jpeg" description="John&Alice_smiths_marr_cert.jpg"/>
|
||||
<file src="John&Alice_smiths_marr_cert.jpg" mime="unknown" description="John&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&Anna_smiths_marr_cert.jpg Line 878: 3 OBJE
|
||||
Could not import Magnes&Anna_smiths_marr_cert.jpg Line 881: 2 OBJE
|
||||
</text>
|
||||
Could not import Magnes&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&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&Alice_smiths_marr_cert.jpg Line 905: 1 OBJE
|
||||
</text>
|
||||
Could not import John&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&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>
|
||||
|
||||
+195
-188
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -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 "Help > Gramps Mailing Lists".</_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>
|
||||
|
||||
|
||||
Vendored
-15
@@ -1,18 +1,3 @@
|
||||
gramps (5.0.2-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
* Remove ancient python version field from debian/control
|
||||
* Bump standards version, no changes required
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sun, 11 Aug 2019 14:11:35 +0200
|
||||
|
||||
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
|
||||
|
||||
Vendored
+2
-1
@@ -21,10 +21,11 @@ Build-Depends-Indep:
|
||||
python3-nose-exclude
|
||||
Build-Depends:
|
||||
debhelper (>= 11)
|
||||
Standards-Version: 4.4.0
|
||||
Standards-Version: 4.1.3
|
||||
Vcs-Git: https://github.com/gramps-project/gramps.git
|
||||
Vcs-browser: https://github.com/gramps-project/gramps/tree/maintenance/gramps50
|
||||
Homepage: https://www.gramps-project.org/
|
||||
X-Python3-Version: >= 3.2
|
||||
|
||||
Package: gramps
|
||||
Architecture: all
|
||||
|
||||
Vendored
+1
-2
@@ -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/*
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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 "Maggie"</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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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-freeze', 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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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],
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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
@@ -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'):
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -33,11 +33,9 @@ LOG = logging.getLogger(".Gramplets")
|
||||
# Gramps modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from ...gui.dbguielement import DbGUIElement
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
|
||||
|
||||
class Gramplet:
|
||||
"""
|
||||
Base class for non-graphical gramplet code.
|
||||
@@ -293,17 +291,46 @@ class Gramplet:
|
||||
"""
|
||||
The main interface for running the :meth:`main` method.
|
||||
"""
|
||||
from gi.repository import GLib
|
||||
if ((not self.active) and
|
||||
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)
|
||||
uva = self.uistate.viewmanager.active_page
|
||||
# The dashboard has no sidebar or bottombar
|
||||
if uva.bottombar:
|
||||
for gramplets in [uva.bottombar.get_children()]:
|
||||
for gramplet in gramplets:
|
||||
for i in range(gramplet.pui.gui.pane.get_n_pages()):
|
||||
child = gramplet.pui.gui.pane.get_nth_page(i)
|
||||
label = gramplet.pui.gui.pane.get_tab_label(child)
|
||||
act_grplet = (i == gramplet.pui.gui.pane.get_current_page())
|
||||
if (gramplet.title == child.get_title() and
|
||||
gramplet.title == self.gui.title and
|
||||
not label.get_freeze().get_active() and
|
||||
act_grplet):
|
||||
self._really_update()
|
||||
for gramplets in [uva.sidebar.get_children()]:
|
||||
for gramplet in gramplets:
|
||||
for i in range(gramplet.pui.gui.pane.get_n_pages()):
|
||||
child = gramplet.pui.gui.pane.get_nth_page(i)
|
||||
label = gramplet.pui.gui.pane.get_tab_label(child)
|
||||
act_grplet = (i == gramplet.pui.gui.pane.get_current_page())
|
||||
if (gramplet.title == child.get_title() and
|
||||
gramplet.title == self.gui.title and
|
||||
not label.get_freeze().get_active() and
|
||||
act_grplet):
|
||||
self._really_update()
|
||||
else:
|
||||
self._really_update()
|
||||
|
||||
def _really_update(self):
|
||||
from gi.repository import GLib
|
||||
self.dirty = False
|
||||
LOG.debug("gramplet updater: %s: running" % self.gui.title)
|
||||
if self._idle_id != 0:
|
||||
@@ -399,13 +426,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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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):
|
||||
|
||||
@@ -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])
|
||||
@@ -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
@@ -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_freeze(self, obj):
|
||||
"""
|
||||
Gramplet bar freeze/unfreeze button preference callback
|
||||
"""
|
||||
self.uistate.emit('grampletbar-freeze-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 freeze button:
|
||||
self.add_checkbox(grid,
|
||||
_("Enable freeze/unfreeze for the active gramplet"),
|
||||
row, 'interface.grampletbar-freeze', stop=3,
|
||||
extra_callback=self.cb_grampletbar_freeze)
|
||||
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
@@ -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
|
||||
|
||||
@@ -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
@@ -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-freeze-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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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):
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user