Compare commits

...

114 Commits

Author SHA1 Message Date
Jérôme Rapinat 13c58292e3 ready for alpha4
svn: r21222
2013-01-26 08:54:27 +00:00
Jérôme Rapinat 5d8e37807c 0005088: Narrated Web Site Report sort order different Windows vs Linux. Initial commit to resolve the issues on Linux and Mac (provided in both cases PyICU is installed). Windows still needs to be tested, and there may still be some other uses of strxfrm (or strcoll) that need to be fixed; by kulath, see rev21175
svn: r21221
2013-01-26 08:42:40 +00:00
Jérôme Rapinat 5feda5f56c do not need to translate webapp yet
svn: r21220
2013-01-25 15:27:29 +00:00
Doug Blank 5d46ae352d 6364: dead people are shown as alive in narrated web page export
svn: r21218
2013-01-25 12:51:05 +00:00
Mirko Leonhäuser 4c622a7b0f updated german translation
svn: r21217
2013-01-24 20:38:19 +00:00
Jérôme Rapinat 7e7ae7c42b update french translation, new template after checking missing references, Note: there is some webapp strings on template.
svn: r21216
2013-01-24 17:38:40 +00:00
Nick Hall 0e172acd4c 6307: Use untranslated string in filter
svn: r21215
2013-01-24 16:47:36 +00:00
Nick Hall c221c1076a 6360: Fix to work with new model
svn: r21213
2013-01-24 16:28:58 +00:00
Jérôme Rapinat b2ae97c544 typo
svn: r21211
2013-01-24 15:45:34 +00:00
Jérôme Rapinat 38f29ece86 listing missing references
svn: r21209
2013-01-24 15:34:21 +00:00
Erik De Richter 383bd9548a updated dutch translation
svn: r21208
2013-01-24 14:01:07 +00:00
Benny Malengier 97a37439d2 6288: crash: no attribute 'require_version' - better fix
svn: r21206
2013-01-24 08:44:52 +00:00
Jérôme Rapinat 3ba99eb0b0 update french translation
svn: r21205
2013-01-23 19:05:47 +00:00
John Ralls 1e02a60f14 [Bug #6361] try to run soundex tool
Updated for python3

svn: r21204
2013-01-22 22:22:48 +00:00
Mirko Leonhäuser a5ffbb5e08 Fixed one small german translation error
svn: r21202
2013-01-22 21:44:08 +00:00
Gary Burton c36181d024 Bug #6255. Do not use TextIOWrapper when running python2.
svn: r21200
2013-01-22 20:54:34 +00:00
Erik De Richter d91be2fd0b updated dutch translation
svn: r21193
2013-01-22 09:01:44 +00:00
Erik De Richter b23699d9ce updated dutch translation
svn: r21192
2013-01-22 08:19:18 +00:00
Erik De Richter 313dcb77c2 updated dutch translation
svn: r21191
2013-01-21 22:51:38 +00:00
Jérôme Rapinat 348fa98341 "grampletview" is now "dashboardview"
svn: r21190
2013-01-21 15:58:18 +00:00
Peter Landgren 7ac6856b60 Updated translation.
svn: r21185
2013-01-21 14:20:48 +00:00
Erik De Richter e60ffbf83b updated dutch translation
svn: r21183
2013-01-21 08:55:39 +00:00
Gary Burton 5735799057 Bug #6255. Wrap gzip files with TextIOWrapper to allow them to be read as text.
svn: r21176
2013-01-20 17:15:35 +00:00
John Ralls 0446b7405d Add goocanvas-2.0 to gramps dependencies
svn: r21172
2013-01-19 21:46:15 +00:00
Erik De Richter 7be387e8fd updated nl translation
svn: r21167
2013-01-18 19:25:21 +00:00
Nick Hall f0cc7f35d6 Use public interface of Gtk.TreeModel in listview code
svn: r21166
2013-01-18 18:53:38 +00:00
Nick Hall b7d5bed60a 6353: Fix error when setting colours
svn: r21164
2013-01-18 18:25:06 +00:00
Nick Hall c56fb05d1c Remove handle and tooltip columns from models
svn: r21162
2013-01-18 00:04:18 +00:00
Nick Hall 64a8895df9 Tidy up bookmark code
svn: r21161
2013-01-18 00:03:48 +00:00
Nick Hall afefbeedf8 Allow icons as column headings in listviews
svn: r21160
2013-01-17 23:52:07 +00:00
Nick Hall 64ca5d105f 1765: Add private column to views
svn: r21159
2013-01-17 23:51:48 +00:00
Nick Hall 1d3a687c0c 6333: Display optional close button in gramplet bar tabs
svn: r21141
2013-01-17 00:02:38 +00:00
Nick Hall fb56547589 6331: Fix spelling mistakes
svn: r21138
2013-01-15 21:07:16 +00:00
Benny Malengier e91a06dc1b 6338: NotImplementedError on Export a View to a spreadsheet from the People Category
svn: r21135
2013-01-15 19:48:54 +00:00
Nick Hall 096e57e36a Add family filter to match twins
svn: r21133
2013-01-15 18:28:11 +00:00
Benny Malengier 44ea1b0fa8 6330: Can't download ans install addons
svn: r21130
2013-01-15 10:59:06 +00:00
Benny Malengier 3c75de2327 Filter was not working, we need to query global variable when we need it, not once at start
svn: r21128
2013-01-15 10:18:28 +00:00
Benny Malengier ca287ac12e factor out double handle2internal
svn: r21126
2013-01-15 08:49:08 +00:00
Benny Malengier bb392985f0 6329: Crazy citations after XML import of bacuo from Gramps 3.4.3
svn: r21124
2013-01-15 08:43:16 +00:00
Benny Malengier 0625ed8109 6326: Running Export View crashes with 'tuple' object has no attribute 'get_indices'
svn: r21119
2013-01-14 18:57:33 +00:00
Doug Blank 5824a674d6 Changes for 1.6 svn
svn: r21118
2013-01-14 18:40:17 +00:00
Paul Franklin ee7ef78f6d more absolute addressing, not relative
svn: r21116
2013-01-14 18:26:19 +00:00
Doug Blank 6a287a6018 Rename Gramplet View to Dashboard View
svn: r21113
2013-01-14 11:50:32 +00:00
John Ralls 92ba36c349 Fix typo in GI_TYPELIB_PATH
svn: r21111
2013-01-13 21:07:03 +00:00
John Ralls 54fd78c12a Include gi typelibs in bundle
svn: r21109
2013-01-13 20:38:56 +00:00
John Ralls adb8a084a4 Build Graphviz with pango and freetype support
Otherwise it can't output PDFs.
Also update Boost to 1.52.0



svn: r21108
2013-01-13 20:38:27 +00:00
Erik De Richter c133edec8e updated dutch translation
svn: r21105
2013-01-13 19:57:22 +00:00
Nick Hall d3f8f73180 Updates to navigation sidebar
svn: r21104
2013-01-13 17:28:18 +00:00
Benny Malengier c081c5f6f5 6288: crash: no attribute 'require_version'
svn: r21099
2013-01-13 16:50:34 +00:00
Mirko Leonhäuser 41b4634d52 updated german translation
svn: r21095
2013-01-13 02:55:15 +00:00
John Ralls 26ac4a6856 Add lib/girepository folder to bundle
Also Pango environment to find modules


svn: r21094
2013-01-13 02:10:26 +00:00
Andre Marcelo Varenga d4cd826b6f Updating pt_BR translation
svn: r21093
2013-01-13 01:09:01 +00:00
Paul Franklin bd65cfcbea 6229: bug when creating a book reports
svn: r21091
2013-01-13 01:07:47 +00:00
Benny Malengier 8bf43ccabb 6315: Inserting action group 'Bookmarks' into UI manager which already has a group with this name
svn: r21086
2013-01-12 22:20:32 +00:00
Benny Malengier faac8fef8a 6318: Mention in the README that RCS is an optional package
svn: r21084
2013-01-12 15:00:36 +00:00
Benny Malengier 1f825771b5 6321: installed rcs and tried to make an archive
svn: r21082
2013-01-12 14:48:37 +00:00
Nick Hall e677f40cab 6306: Remove focus from the help button in detached gramplet windows
svn: r21081
2013-01-12 00:03:31 +00:00
Benny Malengier f9305d9e7f 6310: Warning dialog "No Home Person" should be helpful and more descriptive
svn: r21078
2013-01-11 22:50:42 +00:00
Benny Malengier 80625063a0 6291: No Text report, with output format ODF, is created
svn: r21076
2013-01-11 22:32:02 +00:00
Nick Hall 5923610e80 6312: Fix Dashboard category icon
svn: r21075
2013-01-11 22:11:07 +00:00
Nick Hall 904dd024c6 6307: Bug fixes for To Do gramplets
svn: r21072
2013-01-11 19:24:01 +00:00
Benny Malengier a4abc9f26a fix error from fix encoding issue for python 3
svn: r21069
2013-01-11 17:20:00 +00:00
Nick Hall f4e6ffb4be 6307: Improved ToDo gramplets
svn: r21068
2013-01-11 16:19:24 +00:00
Benny Malengier 385641f092 fix home button issue in python3
svn: r21065
2013-01-11 15:18:00 +00:00
Benny Malengier e292eb0400 6290: No Text report with output format PDF is created
6292: No Text report, with output format Print... , is created.


svn: r21063
2013-01-11 14:51:26 +00:00
Doug Blank af953dec7c Check for outdated const.py file
svn: r21062
2013-01-11 13:49:54 +00:00
Doug Blank 9a6f472ffd Return correct field types for media path, desc, and mime
svn: r21060
2013-01-11 13:22:43 +00:00
Doug Blank c572259d25 Media Description not reported, typo
svn: r21058
2013-01-11 13:19:46 +00:00
Benny Malengier e613f02469 fix encoding issue for python 3
svn: r21056
2013-01-11 13:04:50 +00:00
Doug Blank 722f0f7589 Need to log in to run reports
svn: r21054
2013-01-10 19:19:33 +00:00
John Ralls 2255acaa62 Updates fro gramps-4.0.0-alpha3
svn: r21052
2013-01-10 18:10:08 +00:00
Doug Blank cac68a4110 Gramps Version number now includes svn
svn: r21051
2013-01-10 17:43:28 +00:00
Nick Hall 599fe33470 6312: Rename Gramplets category to Dashboard
svn: r21049
2013-01-10 10:57:57 +00:00
Nick Hall 222525e035 6309: Wrap text in empty gramplet bar tab
svn: r21047
2013-01-09 19:55:06 +00:00
Benny Malengier 94d452d63c 6311: Export assistant to export a GEDCOM fail
svn: r21044
2013-01-09 10:20:19 +00:00
Benny Malengier b30220b72b 6311: Export assistant to export a GEDCOM fails
svn: r21043
2013-01-09 10:12:23 +00:00
Nick Hall 1604af190d Update .gitignore
svn: r21041
2013-01-08 21:56:44 +00:00
Nick Hall 711aba5272 Update MANIFEST.in
svn: r21040
2013-01-08 21:56:34 +00:00
Nick Hall 2aa9aa1f48 Fix svn revision import
svn: r21036
2013-01-08 18:33:08 +00:00
Nick Hall d62e751285 Change to absolute paths in const.py
svn: r21034
2013-01-08 17:31:57 +00:00
Benny Malengier 2553cdc642 6299: Calendar Gramplet does not display anything
6301: ImportError: No module named QuestionDialog


svn: r21031
2013-01-08 09:03:14 +00:00
Doug Blank 15e44633cf 6067: Narrative Web reports people as Living even when they have a deceased event (but without a date because it is unknown)
svn: r21030
2013-01-08 03:28:20 +00:00
Doug Blank e5194e1462 4646: reports cannot be run from the command line in a non-GUI environment
svn: r21029
2013-01-08 03:03:09 +00:00
Doug Blank af9f421d3f Removed extra else: typo
svn: r21026
2013-01-08 02:35:20 +00:00
Nick Hall a3a8444fbe Restore Makefiles removed by mistake
svn: r21025
2013-01-07 22:28:34 +00:00
Erik De Richter 3401e86c60 updated dutch translation
svn: r21023
2013-01-07 14:10:03 +00:00
Benny Malengier 4b6a95f211 fix error of revision 20699
svn: r21022
2013-01-07 09:17:30 +00:00
Benny Malengier d1765efa49 5972: GUI Crash (metaclass conflict) when some package (e.g. python-gnome2) installed
svn: r21020
2013-01-07 08:19:50 +00:00
Doug Blank 0bd44eeb84 Bugs 5972 and 6132: needed to remove python-gnome2 to run, GUI Crash (metaclass conflict) when some package (e.g. python-gnome2) installed, 6132: metaclass conflict in flatbasemodel.py
svn: r21018
2013-01-07 04:32:53 +00:00
Doug Blank 32b6b27dca typo in args error reporting
svn: r21017
2013-01-06 21:49:47 +00:00
Doug Blank 7dd022bddf display error messages correctly
svn: r21014
2013-01-06 21:40:19 +00:00
Benny Malengier 642f837658 6256: Can't create graph reports
svn: r21011
2013-01-06 21:35:34 +00:00
Doug Blank 5f24c8834c Don't show svnversion non-version response
svn: r21006
2013-01-06 00:34:12 +00:00
Jérôme Rapinat d60bbe812b new location for tips.xml, typo on path
svn: r21004
2013-01-05 14:36:49 +00:00
Jérôme Rapinat eee79d223b new location for tips.xml
svn: r21003
2013-01-05 14:24:51 +00:00
Benny Malengier ddd1aae5c3 06256: Can't create graph reports
svn: r21001
2013-01-05 13:33:03 +00:00
Benny Malengier 17824534cb 6282: Can't create text reports with RTF output format in python 3
svn: r21000
2013-01-05 13:32:12 +00:00
Nick Hall a8c1530436 6276: Fix error installing gramps.png
svn: r20998
2013-01-05 12:09:31 +00:00
Benny Malengier 47fd0cf00f 6256: Can't create graph reports
svn: r20995
2013-01-05 11:34:36 +00:00
Benny Malengier 5105b4fd44 6277: Out of index when creating textreort with PDF format
svn: r20993
2013-01-05 11:18:54 +00:00
Doug Blank 5b8d5b739a Version back to 4.0.0-alpha3; handle version number in const.py
svn: r20991
2013-01-05 02:49:54 +00:00
Nick Hall bb9601a2a0 Move images and data directories. Also svn version code from r20919.
svn: r20990
2013-01-04 23:46:24 +00:00
Paul Franklin 81e1237b3c revert accidental 20685 regression (iteritems)
svn: r20988
2013-01-04 22:58:09 +00:00
Nick Hall 236da6da81 File missed from last commit
svn: r20986
2013-01-04 22:34:09 +00:00
Nick Hall ca9f5de077 Convert filenames to lower case
svn: r20984
2013-01-04 22:28:57 +00:00
Nick Hall 36008d3abe Remove make files from svn:ignore properties
svn: r20983
2013-01-04 21:41:20 +00:00
Nick Hall 80d73f058c Remove remaining make files
svn: r20980
2013-01-04 18:08:04 +00:00
Nick Hall 8d19b0198f 6281: Rename GrampsBar to GrampletBar and move into widgets directory
svn: r20979
2013-01-04 18:06:15 +00:00
Peter Landgren 9c69c3523e Fix of divison issue. There might be more of them.
svn: r20976
2013-01-04 15:40:26 +00:00
Benny Malengier cae2814c97 6273: Detaching Gramplet in Sidebar/Bottombar views are not using full area
svn: r20973
2013-01-04 14:08:25 +00:00
Benny Malengier 421882c0e8 6270: Attempting to accidentally open Book Manager raises a Unhandled exception
svn: r20971
2013-01-04 13:28:20 +00:00
Erik De Richter 49585e1e96 updated dutch translation
svn: r20970
2013-01-03 19:45:50 +00:00
Erik De Richter 904397ff11 updated dutch translation
svn: r20968
2013-01-03 19:01:08 +00:00
Jérôme Rapinat 5aa70b08a6 we are in 2013
svn: r20966
2013-01-03 18:42:11 +00:00
463 changed files with 49568 additions and 52204 deletions
+3 -2
View File
@@ -2,11 +2,12 @@
*.py[cod]
# Distutils
MANIFEST
build/
sdist/
dist/
# Gramps
gramps/data/tips.xml
data/tips.xml
gramps/gen/const.py
gramps/plugins/lib/holidays.xml
po/.intltool-merge-cache
+5 -17
View File
@@ -11,34 +11,22 @@ include TestPlan.txt
recursive-include data *
recursive-include debian *
recursive-include docs *
recursive-include gramps *
recursive-include help *
recursive-include images *
recursive-include mac *
recursive-include po *
recursive-include gramps *
recursive-include test *
recursive-include windows *
# Remove files created in the build
exclude data/gramps.desktop
exclude data/gramps.keys
exclude data/gramps.xml
recursive-exclude data/man *.1
recursive-exclude data/man *.1.gz
exclude gramps/const.py
exclude gramps/data/tips.xml
exclude data/tips.xml
exclude gramps/gen/const.py
exclude gramps/plugins/lib/holidays.xml
exclude po/*.gmo
exclude po/.intltool-merge-cache
exclude po/stamp-it
exclude po/POTFILES
global-exclude *.pyc
global-exclude *.py~
global-exclude *.pyo
global-exclude *.bak
# Remove directories which should not be included in the distribution
prune gramps/guiQML
prune gramps/webapp
# Remove Makefiles used by autotools
global-exclude Makefile*
#prune gramps/webapp
+10 -4
View File
@@ -8,6 +8,7 @@ The following packages *MUST* be installed in order for Gramps to work:
Python 2.7 or greater, Python 3.2 or greater (python version cannot be mixed)
GTK 3.0 or greater
pygobject 3.3.2 or greater
cairo, pango, pangocairo with instrospection bindings (the gi packages)
librsvg2 (svg icon view)
xdg-utils
@@ -23,7 +24,7 @@ to your language:
The following packages are *STRONGLY RECOMMENDED* to be installed:
osmgpsmap Used to show maps in the geography view.
Without this the GeoView will not be active, see
http://gramps-project.org/wiki/index.php?title=Gramps_3.3_Wiki_Manual_-_Main_Window#Geography_Category
http://gramps-project.org/wiki/index.php?title=Gramps_4.0_Wiki_Manual_-_Main_Window#Geography_Category
The package is named osmgpsmap, osm-gps-map
or python-osmgpsmap. Or obtain it from: http://nzjrs.github.com/osm-gps-map/
GraphViz Enable creation of graphs using GraphViz engine.
@@ -38,6 +39,14 @@ The following packages are optional
enchant. A version of gtkspell with gobject introspection
is needed, so minimally version 3.0.0
rcs The GNU Revision Control System (RCS) can be used to manage
multiple revisions of your family trees. See info at
http://www.gramps-project.org/wiki/index.php?title=Gramps_4.0_Wiki_Manual_-_Manage_Family_Trees#Archiving_a_Family_Tree
Only rcs is needed, NO python bindings are required
PIL Python Image Library is needed to convert non jpg images to
jpg so as to include them in LaTeX output
ttf-freefont More font support in the reports
gir-webkit GObject introspection data of WebKit is required for the
@@ -62,9 +71,6 @@ No longer needed in 3.2:
No longer needed in 3.1:
yelp Gnome help browser. At the moment no help is shipped
Remark: There is a conflict when using python-gnome2 in Ubuntu. This is evident
with the error: TypeError: Error when calling the metaclass bases
metaclass conflict
Documentation
---------------------------------
+1 -1
View File
@@ -1,4 +1,4 @@
"UNSTABLE Gramps 4.0.0 Alpha2 release.
"UNSTABLE Gramps 4.0.0 Alpha4 release.
This is a technology preview to allow plugin writers and packagers-installer
writers to update their plugins and scripts. This release is not production
-14
View File
@@ -1,14 +0,0 @@
# This is the data/man level Makefile for Gramps
# $Id$
SUBDIRS = fr sv nl pl cs pt_BR
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-14
View File
@@ -1,14 +0,0 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/cs
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/cs/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-14
View File
@@ -1,14 +0,0 @@
# This is the data/man/fr level Makefile for Gramps
# $Id$
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/fr
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/fr/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-15
View File
@@ -1,15 +0,0 @@
# This is the data/man/nl level Makefile for Gramps
# $Id: Makefile.am 9819 2008-01-15 15:42:10Z bmcage $
mandir = @mandir@/nl
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/nl/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-14
View File
@@ -1,14 +0,0 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/pl
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/pl/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-14
View File
@@ -1,14 +0,0 @@
# This is the data/pt_BR level Makefile for Gramps
# $Id: Makefile.am 16377 2011-01-13 18:32:42Z matlas $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/pt_BR
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/pt_BR/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
-14
View File
@@ -1,14 +0,0 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/sv
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/sv/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)
+9
View File
@@ -726,6 +726,7 @@ def cl_book(database, name, book, options_str_dict):
clr.marginr, clr.margint, clr.marginb))
user = User()
rptlist = []
global_style = None
for item in book.get_item_list():
# The option values were loaded magically by the book parser.
@@ -743,6 +744,12 @@ def cl_book(database, name, book, options_str_dict):
report_class, item.option_class, user)
style_sheet = create_style_sheet(item)
rptlist.append((obj, style_sheet))
if ( item.name == 'table_of_contents' or
item.name == 'alphabetical_index' ): # ugly hack: FIXME
if global_style is None:
global_style = style_sheet
else:
global_style = create_style_sheet(item, global_style)
doc.open(clr.option_class.get_output())
doc.init()
@@ -754,6 +761,8 @@ def cl_book(database, name, book, options_str_dict):
newpage = 1
rpt.begin_report()
rpt.write_report()
if global_style:
doc.set_style_sheet(global_style)
doc.close()
#------------------------------------------------------------------------
-21
View File
@@ -1,21 +0,0 @@
# This is the src/data level Makefile for gramps
# $Id$
#
SUBDIRS =
pkgdatadir = $(datadir)/@PACKAGE@/data
dist_pkgdata_DATA = \
authors.xml \
papersize.xml \
tips.xml\
lds.xml
# Rules for files with translatable strings
# These are taken care of by the intltool
xml_in_files = tips.xml.in
xml_files = $(xml_in_files:.xml.in=.xml)
@INTLTOOL_XML_NOMERGE_RULE@
EXTRA_DIST = $(xml_in_files)
CLEANFILES = $(xml_files)
+2 -1
View File
@@ -188,7 +188,7 @@ register('interface.clipboard-height', 300)
register('interface.clipboard-width', 300)
register('interface.dont-ask', False)
register('interface.view-categories',
["Gramplets", "People", "Relationships", "Families",
["Dashboard", "People", "Relationships", "Families",
"Ancestry", "Events", "Places", "Geography", "Sources",
"Citations", "Repositories", "Media", "Notes"])
register('interface.edit-filter-width', 500)
@@ -209,6 +209,7 @@ register('interface.filter', False)
register('interface.filter-editor-width', 400)
register('interface.filter-editor-height', 350)
register('interface.fullscreen', False)
register('interface.grampletbar-close', False)
register('interface.height', 500)
register('interface.lds-height', 450)
register('interface.lds-width', 600)
+84 -46
View File
@@ -43,6 +43,7 @@ import uuid
#
#-------------------------------------------------------------------------
from .ggettext import sgettext as _
from .svn_revision import get_svn_revision
#-------------------------------------------------------------------------
#
@@ -50,11 +51,20 @@ from .ggettext import sgettext as _
#
#-------------------------------------------------------------------------
PROGRAM_NAME = "Gramps"
if "@VERSIONSTRING@" == "@" + "VERSIONSTRING" + "@":
VERSION = "4.0.0"
else:
VERSION = "@VERSIONSTRING@"
VERSION_TUPLE = (4, 0, 0)
VERSION = "@VERSIONSTRING@"
if VERSION == "@" + "VERSIONSTRING" + "@":
raise Exception("Please run 'python setup.py build'")
def get_version_tuple(v):
""" Get the numeric-dotted part of version number"""
retval = ""
for c in v:
if c.isdigit() or (c == "." and retval.count(".") <= 1):
retval += c
else:
break
return tuple(map(int, retval.split(".")))
VERSION_TUPLE = get_version_tuple(VERSION)
major_version = "%s.%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1])
#-------------------------------------------------------------------------
#
@@ -65,11 +75,11 @@ URL_HOMEPAGE = "http://gramps-project.org/"
URL_MAILINGLIST = "http://sourceforge.net/mail/?group_id=25770"
URL_BUGTRACKER = "http://bugs.gramps-project.org/bug_report_advanced_page.php"
URL_WIKISTRING = "http://gramps-project.org/wiki/index.php?title="
URL_MANUAL_PAGE = "Gramps_4.0_Wiki_Manual"
URL_MANUAL_PAGE = "Gramps_%s_Wiki_Manual" % major_version
WIKI_FAQ = "FAQ"
WIKI_KEYBINDINGS = "Gramps_4.0_Wiki_Manual_-_Keybindings"
WIKI_EXTRAPLUGINS= "4.0_Addons"
WIKI_EXTRAPLUGINS_RAWDATA = "Plugins4.0&action=raw"
WIKI_KEYBINDINGS = "Gramps_%s_Wiki_Manual_-_Keybindings" % major_version
WIKI_EXTRAPLUGINS= "%s_Addons" % major_version
WIKI_EXTRAPLUGINS_RAWDATA = "Plugins%s&action=raw" % major_version
#-------------------------------------------------------------------------
#
@@ -84,13 +94,6 @@ APP_GRAMPS_PKG = "application/x-gramps-package"
APP_GENEWEB = "application/x-geneweb"
APP_VCARD = ["text/x-vcard", "text/x-vcalendar"]
#-------------------------------------------------------------------------
#
# system paths
#
#-------------------------------------------------------------------------
LOCALE_DIR = "@LOCALE_DIR@"
#-------------------------------------------------------------------------
#
# Platforms
@@ -133,24 +136,6 @@ if sys.version_info[0] < 3:
else:
pass
#-------------------------------------------------------------------------
#
# Paths to files - assumes that files reside in the same directory as
# this one, and that the plugins directory is in a directory below this.
#
#-------------------------------------------------------------------------
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
__file__), os.pardir))
if sys.version_info[0] < 3:
# test for sys.frozen to detect a py2exe executable on Windows
if hasattr(sys, "frozen"):
ROOT_DIR = os.path.abspath(os.path.dirname(
unicode(sys.executable, sys.getfilesystemencoding())))
else:
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
unicode(__file__, sys.getfilesystemencoding())), os.pardir))
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
VERSION_DIR = os.path.join(
HOME_DIR, "gramps%s%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1]))
@@ -168,15 +153,28 @@ USER_PLUGINS = os.path.join(VERSION_DIR, "plugins")
USER_DIRLIST = (HOME_DIR, VERSION_DIR, ENV_DIR, TEMP_DIR, THUMB_DIR,
THUMB_NORMAL, THUMB_LARGE, USER_PLUGINS)
ICON = os.path.join(ROOT_DIR, "images", "gramps.png")
LOGO = os.path.join(ROOT_DIR, "images", "logo.png")
SPLASH = os.path.join(ROOT_DIR, "images", "splash.jpg")
LICENSE_FILE = os.path.join(ROOT_DIR, "COPYING")
#-------------------------------------------------------------------------
#
# Paths to python modules - assumes that the root directory is one level
# above this one, and that the plugins directory is below the root directory.
#
#-------------------------------------------------------------------------
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
__file__), os.pardir))
if sys.version_info[0] < 3:
# test for sys.frozen to detect a py2exe executable on Windows
if hasattr(sys, "frozen"):
ROOT_DIR = os.path.abspath(os.path.dirname(
unicode(sys.executable, sys.getfilesystemencoding())))
else:
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
unicode(__file__, sys.getfilesystemencoding())), os.pardir))
#VERSION += get_svn_revision(ROOT_DIR)
#
# Glade files
#
GLADE_DIR = os.path.join(ROOT_DIR, "gui", "glade")
GLADE_FILE = os.path.join(GLADE_DIR, "gramps.glade")
PERSON_GLADE = os.path.join(GLADE_DIR, "edit_person.glade")
@@ -186,29 +184,43 @@ RULE_GLADE = os.path.join(GLADE_DIR, "rule.glade")
PLUGINS_DIR = os.path.join(ROOT_DIR, "plugins")
DATA_DIR = os.path.join(ROOT_DIR, "data")
WEB_DIR = os.path.join(ROOT_DIR, 'webapp')
#SYSTEM_FILTERS = os.path.join(DATA_DIR, "system_filters.xml")
TIP_DATA = os.path.join(DATA_DIR, "tips.xml")
WEBSTUFF_DIR = os.path.join(PLUGINS_DIR, "webstuff")
WEBSTUFF_IMAGE_DIR = os.path.join(WEBSTUFF_DIR, "images")
PAPERSIZE = os.path.join(DATA_DIR, "papersize.xml")
USE_TIPS = False
USE_TIPS = False
if os.sys.platform in WINDOWS:
USE_THUMBNAILER = False
else:
USE_THUMBNAILER = True
#-------------------------------------------------------------------------
#
# Paths to data files.
#
#-------------------------------------------------------------------------
LOCALE_DIR = "@LOCALE_DIR@"
DATA_DIR = "@DATA_DIR@"
IMAGE_DIR = "@IMAGE_DIR@"
DOC_DIR = "@DOC_DIR@"
TIP_DATA = os.path.join(DATA_DIR, "tips.xml")
PAPERSIZE = os.path.join(DATA_DIR, "papersize.xml")
ICON = os.path.join(IMAGE_DIR, "gramps.png")
LOGO = os.path.join(IMAGE_DIR, "logo.png")
SPLASH = os.path.join(IMAGE_DIR, "splash.jpg")
LICENSE_FILE = os.path.join(DOC_DIR, 'COPYING')
#-------------------------------------------------------------------------
#
# About box information
#
#-------------------------------------------------------------------------
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
"© 2007-2012 The Gramps Developers"
"© 2007-2013 The Gramps Developers"
COMMENTS = _("Gramps (Genealogical Research and Analysis "
"Management Programming System) is a personal "
"genealogy program.")
@@ -313,3 +325,29 @@ LONGOPTS = [
SHORTOPTS = "O:C:i:e:f:a:p:d:c:lLhuv?s"
GRAMPS_UUID = uuid.UUID('516cd010-5a41-470f-99f8-eb22f1098ad6')
def need_to_update_const():
""" Check to see if this file is older than
setup.py or const.py.in """
this_file = os.path.join(ROOT_DIR, "gen", "const.py")
in_file = os.path.join(ROOT_DIR, "gen", "const.py.in")
setup_file = os.path.join(ROOT_DIR, "..", "setup.py")
if (os.path.exists(this_file) and
os.path.exists(in_file) and
os.path.exists(setup_file)):
this_file_time = os.path.getmtime(this_file)
in_file_time = os.path.getmtime(in_file)
setup_file_time = os.path.getmtime(setup_file)
# Is this file older than others? If so,
# need to run setup
return (this_file_time < in_file_time or
this_file_time < setup_file_time)
else:
# Can't tell because can't find the files
return False
if need_to_update_const():
print("Outdated gramps.gen.const; please run 'python setup.py build'")
+7
View File
@@ -64,6 +64,13 @@ else:
STRTYPE = str
UNITYPE = str
cuni = conv_to_unicode_direct
# handle in database is bytes, while internally Gramps wants unicode for py3
if sys.version_info[0] < 3:
handle2internal = lambda x: x
else:
handle2internal = lambda x: conv_to_unicode(x, 'utf-8')
#-------------------------------------------------------------------------
#
# Platform determination functions
+15 -1
View File
@@ -102,6 +102,17 @@ DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
# Helper functions
#
#-------------------------------------------------------------------------
def find_byte_surname(key, data):
"""
Creating a surname from raw data of a person, to use for sort and index
returns a byte string
"""
surn = __index_surname(data[3][5])
# in python 3 we work with unicode internally, but need byte function sometimes
if isinstance(surn, UNITYPE):
return surn.encode('utf-8')
return surn
def find_surname(key, data):
"""
Creating a surname from raw data of a person, to use for sort and index
@@ -127,7 +138,10 @@ def __index_surname(surn_list):
NameOriginType.PATRONYMIC, NameOriginType.MATRONYMIC]) ])
else:
surn = ""
return surn.encode('utf-8')
if sys.version_info[0] < 3:
return surn.encode('utf-8')
else:
return surn
#-------------------------------------------------------------------------
+4 -2
View File
@@ -53,6 +53,7 @@ from ..ggettext import gettext as _
# Gramps modules
#
#-------------------------------------------------------------------------
from ..constfunc import conv_to_unicode, handle2internal
from .dbconst import *
from . import BSDDBTxn
from ..errors import DbError
@@ -67,6 +68,7 @@ DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
_SIGBASE = ('person', 'family', 'source', 'event', 'media',
'place', 'repository', 'reference', 'note', 'tag', 'citation')
#-------------------------------------------------------------------------
#
# DbUndo class
@@ -315,7 +317,7 @@ class DbUndo(object):
"""
try:
if data is None:
emit(signal_root + '-delete', ([handle],))
emit(signal_root + '-delete', ([handle2internal(handle)],))
db_map.delete(handle, txn=self.txn)
else:
ex_data = db_map.get(handle, txn=self.txn)
@@ -324,7 +326,7 @@ class DbUndo(object):
else:
signal = signal_root + '-add'
db_map.put(handle, data, txn=self.txn)
emit(signal, ([handle],))
emit(signal, ([handle2internal(handle)],))
except DBERRS as msg:
self.db._log_error()
+19 -9
View File
@@ -74,13 +74,13 @@ from ..lib.researcher import Researcher
from . import (DbBsddbRead, DbWriteBase, BSDDBTxn,
DbTxn, BsddbBaseCursor, BsddbDowngradeError, DbVersionError,
DbEnvironmentError, DbUpgradeRequiredError, find_surname,
find_surname_name, DbUndoBSDDB as DbUndo)
find_byte_surname, find_surname_name, DbUndoBSDDB as DbUndo)
from .dbconst import *
from ..utils.callback import Callback
from ..utils.cast import (conv_unicode_tosrtkey, conv_dbstr_to_unicode)
from ..updatecallback import UpdateCallback
from ..errors import DbError
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE, handle2internal
_LOG = logging.getLogger(DBLOGNAME)
LOG = logging.getLogger(".citation")
@@ -163,7 +163,7 @@ KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
# Helper functions
#
#-------------------------------------------------------------------------
def find_idmap(key, data):
""" return id for association of secondary index.
returns a byte string
@@ -718,7 +718,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if not self.readonly:
assoc = [
(self.person_map, self.surnames, find_surname),
(self.person_map, self.surnames, find_byte_surname),
(self.person_map, self.id_trans, find_idmap),
(self.family_map, self.fid_trans, find_idmap),
(self.event_map, self.eid_trans, find_idmap),
@@ -857,6 +857,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def delete_primary_from_reference_map(self, handle, transaction, txn=None):
"""
Remove all references to the primary object from the reference_map.
handle should be utf-8
"""
primary_cur = self.get_reference_map_primary_cursor()
@@ -875,8 +876,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# so we need the second tuple give us a reference that we can
# combine with the primary_handle to get the main key.
main_key = (handle, pickle.loads(data)[1][1])
if sys.version_info[0] < 3:
#handle should be in python 2 str
main_key = (handle, pickle.loads(data)[1][1])
else:
#python 3 work internally with unicode
main_key = (handle.decode('utf-8'), pickle.loads(data)[1][1])
# The trick is not to remove while inside the cursor,
# but collect them all and remove after the cursor is closed
@@ -950,7 +955,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
the passed transaction.
"""
if isinstance(key, tuple):
#create a string key
#create a byte string key, first validity check in python 3!
for val in key:
if sys.version_info[0] >= 3 and isinstance(val, bytes):
raise DbError(_('An attempt is made to safe a reference key '
'which is partly bytecode, this is not allowed.\n'
'Key is %s') % str(key))
key = str(key)
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
@@ -1895,10 +1905,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
"""
if (obj_type, trans_type) in transaction:
if trans_type == TXNDEL:
handles = [handle for handle, data in
handles = [handle2internal(handle) for handle, data in
transaction[(obj_type, trans_type)]]
else:
handles = [handle for handle, data in
handles = [handle2internal(handle) for handle, data in
transaction[(obj_type, trans_type)]
if (handle, None) not in transaction[(obj_type,
TXNDEL)]]
+1
View File
@@ -111,6 +111,7 @@ class FilterList(object):
parser.parse(the_file)
the_file.close()
except (IOError, OSError):
print("IO/OSError in _filterlist.py")
pass
except SAXParseException:
print("Parser error")
+19 -10
View File
@@ -26,13 +26,17 @@
#
#-------------------------------------------------------------------------
from ...ggettext import gettext as _
import logging
LOG = logging.getLogger(".filter")
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from .. import CustomFilters
# we need global variableCustomFilters, so we need to query gramps.gen.filters
# when we need this variable, not import it at the start!
import gramps.gen.filters
from . import Rule
#-------------------------------------------------------------------------
@@ -48,31 +52,36 @@ class MatchesFilterBase(Rule):
Subclasses need to define the namespace class attribute.
"""
labels = [_('Filter name:')]
name = 'Objects matching the <filter>'
description = "Matches objects matched by the specified filter name"
category = _('General filters')
def prepare(self, db):
if CustomFilters:
filters = CustomFilters.get_filters_dict(self.namespace)
if gramps.gen.filters.CustomFilters:
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
if self.list[0] in filters:
filt = filters[self.list[0]]
for rule in filt.flist:
rule.requestprepare(db)
else:
LOG.warning(_("Can't find filter %s in the defined custom filters")
% self.list[0])
else:
LOG.warning(_("Can't find filter %s in the defined custom filters")
% self.list[0])
def reset(self):
if CustomFilters:
filters = CustomFilters.get_filters_dict(self.namespace)
if gramps.gen.filters.CustomFilters:
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
if self.list[0] in filters:
filt = filters[self.list[0]]
for rule in filt.flist:
rule.requestreset()
def apply(self, db, obj):
if CustomFilters:
filters = CustomFilters.get_filters_dict(self.namespace)
if gramps.gen.filters.CustomFilters:
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
if self.list[0] in filters:
filt = filters[self.list[0]]
return filt.check(db, obj.handle)
@@ -82,8 +91,8 @@ class MatchesFilterBase(Rule):
"""
Return the selected filter or None.
"""
if CustomFilters:
filters = CustomFilters.get_filters_dict(self.namespace)
if gramps.gen.filters.CustomFilters:
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
if self.list[0] in filters:
return filters[self.list[0]]
return None
@@ -60,6 +60,7 @@ from ._childhasnameof import ChildHasNameOf
from ._childhasidof import ChildHasIdOf
from ._changedsince import ChangedSince
from ._hastag import HasTag
from ._hastwins import HasTwins
editor_rule_list = [
AllFamilies,
@@ -89,4 +90,5 @@ editor_rule_list = [
ChildHasIdOf,
ChangedSince,
HasTag,
HasTwins,
]
@@ -0,0 +1,64 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
#-------------------------------------------------------------------------
#
# Standard Python modules
#
#-------------------------------------------------------------------------
from ....ggettext import gettext as _
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from .. import Rule
from ....lib.childreftype import ChildRefType
#-------------------------------------------------------------------------
#
# HasTwins
#
#-------------------------------------------------------------------------
class HasTwins(Rule):
"""Rule that checks for a family with twins"""
name = _('Families with twins')
description = _("Matches families with twins")
category = _('Child filters')
def apply(self, db, family):
date_list = []
for childref in family.get_child_ref_list():
if int(childref.get_mother_relation()) == ChildRefType.BIRTH:
child = db.get_person_from_handle(childref.ref)
birthref = child.get_birth_ref()
if birthref:
birth = db.get_event_from_handle(birthref.ref)
sortval = birth.get_date_object().get_sort_value()
if sortval != 0:
if sortval in date_list:
return True
else:
date_list.append(sortval)
return False
@@ -36,6 +36,7 @@ from ._matchesfilter import MatchesFilter
from ._hasnote import HasNote
from ._changedsince import ChangedSince
from ._hastag import HasTag
from ._hastype import HasType
editor_rule_list = [
AllNotes,
@@ -49,4 +50,5 @@ editor_rule_list = [
MatchesFilter,
ChangedSince,
HasTag,
HasType,
]
+57
View File
@@ -0,0 +1,57 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2002-2006 Donald N. Allingham
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
#-------------------------------------------------------------------------
#
# Standard Python modules
#
#-------------------------------------------------------------------------
from ....ggettext import gettext as _
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from ....lib.notetype import NoteType
from .. import Rule
#-------------------------------------------------------------------------
#
# HasType
#
#-------------------------------------------------------------------------
class HasType(Rule):
"""Rule that checks for a note of a particular type."""
labels = [ _('Note type:') ]
name = _('Notes with the particular type')
description = _("Matches notes with the particular type ")
category = _('General filters')
def apply(self, db, note):
if not self.list[0]:
return False
else:
specified_type = NoteType()
specified_type.set_from_xml_str(self.list[0])
return note.get_type() == specified_type
+2
View File
@@ -69,6 +69,7 @@ class NoteType(GrampsType):
REPORT_TEXT = 23 # this is used for notes used for reports
# indicate a note is html code
HTML_CODE = 24
TODO = 25
_CUSTOM = CUSTOM
_DEFAULT = GENERAL
@@ -84,6 +85,7 @@ class NoteType(GrampsType):
(CITATION, _('Citation'), "Citation"),
(REPORT_TEXT, _("Report"), "Report"),
(HTML_CODE, _("Html code"), "Html code"),
(TODO, _("To Do"), "To Do"),
]
_DATAMAPIGNORE = [
+2 -5
View File
@@ -22,12 +22,9 @@
#
try:
from ._gnomemime import get_description, get_type, mime_type_is_defined
from ._winmime import get_description, get_type, mime_type_is_defined
except:
try:
from ._winmime import get_description, get_type, mime_type_is_defined
except:
from ._pythonmime import get_description, get_type, mime_type_is_defined
from ._pythonmime import get_description, get_type, mime_type_is_defined
def base_type(val):
return val.split('/')[0]
-71
View File
@@ -1,71 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 Donald N. Allingham
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
from gi.repository import Gtk
try:
from gnomevfs import mime_get_short_list_applications, \
mime_get_description, get_mime_type, mime_get_default_application
except:
from gnome.vfs import mime_get_short_list_applications, \
mime_get_description, get_mime_type, mime_get_default_application
from ..ggettext import gettext as _
def get_description(type):
"""Return the description of the specified mime type."""
try:
return mime_get_description(type)
except:
return _("unknown")
def get_type(file):
"""Return the mime type of the specified file."""
try:
return get_mime_type(file)
except:
return _('unknown')
def mime_type_is_defined(type):
"""
Return True if a description for a mime type exists.
"""
try:
mime_get_description(type)
return True
except:
return False
#-------------------------------------------------------------------------
#
# private functions
#
#-------------------------------------------------------------------------
def _is_good_command(cmd):
"""
We don't know what to do with certain substitution values.
If we find one, skip the command.
"""
for sub in [ "%m", "%i", "%c" ]:
if cmd.find(sub) != -1:
return False
return True
+76 -22
View File
@@ -37,7 +37,7 @@ import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
from io import BytesIO
import tempfile
from subprocess import Popen, PIPE
import sys
@@ -369,7 +369,10 @@ class GVDocBase(BaseDoc, GVDoc):
BaseDoc.__init__(self, None, paper_style)
self._filename = None
self._dot = StringIO()
if sys.version_info[0] < 3:
self._dot = StringIO()
else:
self._dot = BytesIO()
self._paper = paper_style
get_option_by_name = options.menu.get_option_by_name
@@ -595,7 +598,10 @@ class GVDotDoc(GVDocBase):
if self._filename[-3:] != ".gv":
self._filename += ".gv"
dotfile = open(self._filename, "w")
if sys.version_info[0] < 3:
dotfile = open(self._filename, "w")
else:
dotfile = open(self._filename, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
@@ -630,7 +636,10 @@ class GVPsDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
@@ -647,10 +656,13 @@ class GVPsDoc(GVDocBase):
# See bug tracker issue 2815
# :cairo does not work with Graphviz 2.26.3 and later See issue 4164
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
command = 'dot -Tps:cairo -o"%s" "%s"' % (fname, tmp_dot)
dotversion = Popen(['dot', '-V'], stderr=PIPE).communicate(input=None)[1]
dotversion = str(Popen(['dot', '-V'], stderr=PIPE).communicate(input=None)[1])
# Problem with dot 2.26.3 and later and multiple pages, which gives "cairo: out of
# memory" If the :cairo is skipped for these cases it gives acceptable
# result.
@@ -685,11 +697,17 @@ class GVSvgDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the SVG file.
os.system( 'dot -Tsvg -o"%s" "%s"' % (fname, tmp_dot) )
@@ -722,11 +740,17 @@ class GVSvgzDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the SVGZ file.
os.system( 'dot -Tsvgz -o"%s" "%s"' % (fname, tmp_dot) )
@@ -759,11 +783,17 @@ class GVPngDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the PNG file.
os.system( 'dot -Tpng -o"%s" "%s"' % (fname, tmp_dot) )
@@ -796,11 +826,17 @@ class GVJpegDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the JPEG file.
os.system( 'dot -Tjpg -o"%s" "%s"' % (fname, tmp_dot) )
@@ -833,11 +869,17 @@ class GVGifDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the GIF file.
os.system( 'dot -Tgif -o"%s" "%s"' % (fname, tmp_dot) )
@@ -873,11 +915,17 @@ class GVPdfGvDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
# Covert filename to str using file system encoding.
fname = self._filename.encode(sys.getfilesystemencoding())
# Convert filename to str using file system encoding.
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
# Generate the PDF file.
os.system( 'dot -Tpdf -o"%s" "%s"' % (fname, tmp_dot) )
@@ -908,7 +956,10 @@ class GVPdfGsDoc(GVDocBase):
# Create a temporary dot file
(handle, tmp_dot) = tempfile.mkstemp(".gv" )
dotfile = os.fdopen(handle,"w")
if sys.version_info[0] < 3:
dotfile = os.fdopen(handle, "w")
else:
dotfile = os.fdopen(handle, "wb")
dotfile.write(self._dot.getvalue())
dotfile.close()
@@ -922,7 +973,7 @@ class GVPdfGsDoc(GVDocBase):
# :cairo does not work with Graphviz 2.26.3 and later See issue 4164
command = 'dot -Tps:cairo -o"%s" "%s"' % ( tmp_ps, tmp_dot )
dotversion = Popen(['dot', '-V'], stderr=PIPE).communicate(input=None)[1]
dotversion = str(Popen(['dot', '-V'], stderr=PIPE).communicate(input=None)[1])
# Problem with dot 2.26.3 and later and multiple pages, which gives "cairo: out
# of memory". If the :cairo is skipped for these cases it gives
# acceptable result.
@@ -936,7 +987,10 @@ class GVPdfGsDoc(GVDocBase):
height_pt = int( (paper_size.get_height_inches() * 72) + 0.5 )
# Convert to PDF using ghostscript
fname = self._filename.encode(sys.getfilesystemencoding())
if sys.version_info[0] < 3:
fname = self._filename.encode(sys.getfilesystemencoding())
else:
fname = self._filename
command = '%s -q -sDEVICE=pdfwrite -dNOPAUSE -dDEVICEWIDTHPOINTS=%d' \
' -dDEVICEHEIGHTPOINTS=%d -sOutputFile="%s" "%s" -c quit' \
% ( _GS_CMD, width_pt, height_pt, fname, tmp_ps )
+3 -3
View File
@@ -448,11 +448,11 @@ class BookParser(handler.ContentHandler):
# Functions
#
#-------------------------------------------------------------------------
def create_style_sheet(item):
def create_style_sheet(item, previous_style=None):
"""
Create a style sheet for a book item.
Create a style sheet for a book item, appending any previous_style.
"""
selected_style = StyleSheet()
selected_style = StyleSheet(previous_style)
handler = item.option_class.handler
+1 -1
View File
@@ -908,7 +908,7 @@ class DocOptionHandler(_options.OptionHandler):
# First we set options_dict values based on the saved options
options = self.saved_option_list.get_options()
docgen_names = self.option_list_collection.docgen_names
for option_name, option_data in options.iteritems():
for option_name, option_data in options.items():
if ( option_name in self.options_dict and
isinstance(option_data, list) and
option_data and
+6 -2
View File
@@ -35,7 +35,7 @@ import os
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
from io import StringIO, BytesIO
#-------------------------------------------------------------------------
#
@@ -219,7 +219,11 @@ def load_addon_file(path, callback=None):
callback(_("Unable to open '%s'") % path)
return
try:
buffer = StringIO(fp.read())
content = fp.read()
if sys.version_info[0] < 3:
buffer = StringIO(content)
else:
buffer = BytesIO(content)
except:
if callback:
callback(_("Error in reading '%s'") % path)
+18 -7
View File
@@ -29,17 +29,23 @@ Provide soundex calculation
# Standard python modules
#
#-------------------------------------------------------------------------
import string
import sys
import unicodedata
if sys.version_info[0] < 3:
import string
#-------------------------------------------------------------------------
#
# constants
# constants
#
#-------------------------------------------------------------------------
IGNORE = "HW~!@#$%^&*()_+=-`[]\|;:'/?.,<>\" \t\f\v"
TABLE = string.maketrans('ABCDEFGIJKLMNOPQRSTUVXYZ',
'012301202245501262301202')
if sys.version_info[0] < 3:
TABLE = string.maketrans('ABCDEFGIJKLMNOPQRSTUVXYZ',
'012301202245501262301202')
else:
TABLE = bytes.maketrans(b'ABCDEFGIJKLMNOPQRSTUVXYZ',
b'012301202245501262301202')
from .constfunc import conv_to_unicode_direct
@@ -55,9 +61,14 @@ def soundex(strval):
conv_to_unicode_direct(strval.upper().strip())).encode('ASCII', 'ignore')
if not strval:
return "Z000"
strval = strval.encode('iso-8859-1')
str2 = strval[0]
strval = strval.translate(TABLE, IGNORE)
if sys.version_info[0] < 3:
strval = strval.encode('iso-8859-1') # Really?
str2 = strval[0]
strval = strval.translate(TABLE, IGNORE)
else:
strval = strval.decode('ASCII', 'ignore')
str2 = strval[0]
strval = strval.translate(TABLE)
if not strval:
return "Z000"
prev = strval[0]
+56
View File
@@ -0,0 +1,56 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2012 Doug Blank <doug.blank@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
import sys
import subprocess
if sys.version_info[0] < 3:
cuni = unicode
else:
def to_utf8(s):
return s.decode("utf-8")
cuni = to_utf8
def get_svn_revision(path=""):
stdout = ""
try:
p = subprocess.Popen("svnversion -n \"%s\"" % path, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate()
except:
return "" # subprocess failed
# subprocess worked
if stdout: # has output
stdout = cuni(stdout) # get a proper string
if (" " in stdout) or (stdout == "exported"):
# one of svnversion's 1.7 non-version responses:
# 'Unversioned directory'
# 'Unversioned file'
# 'Uncommitted local addition, copy or move'
# svnversion's 1.6 non-version response:
# 'exported'
return ""
else:
return "-r" + stdout
else: # no output from svnversion
return ""
+13 -5
View File
@@ -101,13 +101,16 @@ class ProbablyAlive(object):
death_date = None
birth_date = None
explain = ""
# If the recorded death year is before current year then
# things are simple.
if death_ref and death_ref.get_role().is_primary():
if death_ref:
death = self.db.get_event_from_handle(death_ref.ref)
if death and death.get_date_object().get_start_date() != Date.EMPTY:
if death and death.get_date_object().is_valid():
death_date = death.get_date_object()
elif death: # has a death event, but it is no valid:
death_date = Today() # before today
death_date.set_modifier(Date.MOD_BEFORE)
explain = _("death event without date")
# Look for Cause Of Death, Burial or Cremation events.
# These are fairly good indications that someone's not alive.
@@ -117,7 +120,12 @@ class ProbablyAlive(object):
ev = self.db.get_event_from_handle(ev_ref.ref)
if ev and ev.type.is_death_fallback():
death_date = ev.get_date_object()
explain = _("death-related evidence")
if death_date.get_start_date().is_valid():
explain = _("death-related evidence")
else:
death_date = Today() # before today
death_date.set_modifier(Date.MOD_BEFORE)
explain = _("death-related evidence without date")
# If they were born within X years before current year then
# assume they are alive (we already know they are not dead).
@@ -495,7 +503,7 @@ def probably_alive(person, db,
death += limit # add these years to death
# Finally, check to see if current_date is between dates
result = (current_date.match(birth, ">=") and
current_date.match(death, "<="))
current_date.match(death, "<<"))
if return_range:
return (result, birth, death, explain, relative)
else:
+45 -13
View File
@@ -31,8 +31,11 @@ Utility functions to cast types
# Python modules
#
#-------------------------------------------------------------------------
import os
import locale
import sys
import logging
LOG = logging.getLogger(".")
#-------------------------------------------------------------------------
#
@@ -42,19 +45,48 @@ import sys
from ..datehandler import codeset
from ..constfunc import conv_to_unicode, conv_to_unicode_direct, UNITYPE, STRTYPE
"""
strxfrm needs it's unicode argument correctly cast before used.
"""
if sys.version_info[0] < 3:
conv_unicode_tosrtkey = lambda x: locale.strxfrm(x.encode(codeset, 'replace'))
else:
conv_unicode_tosrtkey = lambda x: locale.strxfrm(x)
if codeset == 'UTF-8':
conv_str_tosrtkey = lambda x: locale.strxfrm(x)
else:
conv_str_tosrtkey = lambda x: locale.strxfrm(
conv_to_unicode(x,'UTF-8').encode(codeset, 'replace'))
try:
import PyICU
if os.environ.has_key("LC_COLLATE"):
collation = os.environ['LC_COLLATE']
else:
collation = os.environ["LANG"]
language_and_country = collation.rsplit('.', 1)[0]
if language_and_country in PyICU.Collator.getAvailableLocales().keys():
loc = language_and_country
else:
language = collation.rsplit('_', 1)[0]
if language in PyICU.Collator.getAvailableLocales().keys():
LOG.warn(_("Language and country %s not supported by ICU: "
"but language %s is supported and will be used" %
(language_and_country, language)))
loc = language
else:
LOG.warn(_("Neither Language and country %s nor language %s "
"supported by ICU: using en_GB" %
(language_and_country, language)))
loc = "en_GB"
collator = PyICU.Collator.createInstance(PyICU.Locale(loc))
# on ICU, the functions need to receive unicode
conv_unicode_tosrtkey = lambda x: collator.getCollationKey(
x).getByteArray()
conv_str_tosrtkey = lambda x: collator.getCollationKey(
x.decode("UTF-8")).getByteArray()
except:
"""
strxfrm needs it's unicode argument correctly cast before used.
"""
if sys.version_info[0] < 3:
conv_unicode_tosrtkey = lambda x: locale.strxfrm(x.encode(codeset, 'replace'))
else:
conv_unicode_tosrtkey = lambda x: locale.strxfrm(x)
if codeset == 'UTF-8':
conv_str_tosrtkey = lambda x: locale.strxfrm(x)
else:
conv_str_tosrtkey = lambda x: locale.strxfrm(
conv_to_unicode(x,'UTF-8').encode(codeset, 'replace'))
def conv_tosrtkey(value):
if isinstance(value, UNITYPE):
-1
View File
@@ -558,7 +558,6 @@ def get_referents(handle, db, primary_objects):
for primary in primary_objects:
primary_list = [item[1] for item in object_list if item[0] == primary]
the_lists = the_lists + (primary_list, )
return the_lists
def get_source_referents(source_handle, db):
+3 -3
View File
@@ -20,6 +20,6 @@
# $Id$
from .TabbedDoc import TabbedDoc
from .ODSTab import ODSTab
from .CSVTab import CSVTab
from .tabbeddoc import TabbedDoc
from .odstab import ODSTab
from .csvtab import CSVTab
@@ -32,7 +32,7 @@ import csv
# gramps modules
#
#-------------------------------------------------------------------------
from .TabbedDoc import *
from .tabbeddoc import *
class CSVTab(TabbedDoc):
@@ -35,7 +35,7 @@ from ...ggettext import gettext as _
# Gramps modules
#
#-------------------------------------------------------------------------
from .TabbedDoc import *
from .tabbeddoc import *
from ...const import PROGRAM_NAME, VERSION
from ...errors import ReportError
from ...constfunc import cuni
@@ -17,7 +17,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# docgen/TabbedDoc.py
# $Id$
#
-67
View File
@@ -1,67 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2012 Doug Blank <doug.blank@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
"""
Based on the version from Django, a Python ORM.
"""
import re
import os
from ..constfunc import cuni
def get_svn_revision(path=None):
"""
Returns the SVN revision in the form SVN-XXXX,
where XXXX is the revision number.
Returns "" if anything goes wrong, such as an unexpected
format of internal SVN files.
If path is provided, it should be a directory whose SVN info you
want to inspect. If it's not provided, this will use the directory
where this file resides.
"""
rev = None
if path is None:
path = os.path.dirname(__file__)
entries_path = '%s/.svn/entries' % path
try:
entries = open(entries_path, 'r').read()
except IOError:
pass
else:
# Versions >= 7 of the entries file are flat text. The first line is
# the version number. The next set of digits after 'dir' is the revision
if re.match('(\d+)', entries):
rev_match = re.search('\d+\s+dir\s+(\d+)', entries)
if rev_match:
rev = rev_match.groups()[0]
# Older XML versions of the file specify revision as an attribute of
# the first entries node.
else:
from xml.dom import minidom
dom = minidom.parse(entries_path)
rev = dom.getElementsByTagName('entry')[0].getAttribute('revision')
if rev:
return cuni('SVN-%s' % rev)
return cuni('')
+1 -1
View File
@@ -261,7 +261,7 @@ def get_addon_translator(filename=None, domain="addon", languages=None):
path = os.path.dirname(os.path.abspath(filename))
# Check if path is of type str. Do import and conversion if so.
# The import cannot be done at the top as that will conflict with the translation system.
if not isinstance(path, UNITYPE) == str:
if not isinstance(path, UNITYPE):
from .file import get_unicode_path_from_env_var
path = get_unicode_path_from_env_var(path)
if languages:
+4 -4
View File
@@ -239,12 +239,12 @@ def show_settings():
try:
from gi.repository import GObject
try:
gobjectver_str = '%d.%d.%d' % GObject.pygobject_version
pygobjectver_str = '%d.%d.%d' % GObject.pygobject_version
except :# any failure to 'get' the version
gobjectver_str = 'unknown version'
pygobjectver_str = 'unknown version'
except ImportError:
gobjectver_str = 'not found'
pygobjectver_str = 'not found'
try:
from gi.repository import Pango
@@ -350,7 +350,7 @@ def show_settings():
print (' python : %s' % py_str)
print (' gramps : %s' % gramps_str)
print (' gtk++ : %s' % gtkver_str)
print (' gobject : %s' % gobjectver_str)
print (' pygobject : %s' % pygobjectver_str)
print (' pango : %s' % pangover_str)
if usebsddb3:
print (' Using bsddb3')
+12
View File
@@ -42,3 +42,15 @@ class BaseSidebar(object):
Called when the active view is changed.
"""
raise NotImplementedError
def active(self, cat_num, view_num):
"""
Called when the sidebar is made visible.
"""
pass
def inactive(self):
"""
Called when the sidebar is hidden.
"""
pass
+13
View File
@@ -893,6 +893,12 @@ class GrampsPreferences(ConfigureDialog):
self.dbstate.db.name_formats = _nd.get_name_format(only_custom=True,
only_active=False)
def cb_grampletbar_close(self, obj):
"""
Gramplet bar close button preference callback
"""
self.uistate.emit('grampletbar-close-changed')
def add_formats_panel(self, configdialog):
row = 0
table = Gtk.Table(4, 4)
@@ -1058,6 +1064,13 @@ class GrampsPreferences(ConfigureDialog):
_("Show text in sidebar buttons (requires restart)"),
row, 'interface.sidebar-text', stop=3)
row += 1
# Gramplet bar close buttons:
self.add_checkbox(table,
_("Show close button in gramplet bar tabs"),
row, 'interface.grampletbar-close', stop=3,
extra_callback=self.cb_grampletbar_close)
row += 1
return _('Display'), table
def add_text_panel(self, configdialog):
+4 -1
View File
@@ -50,7 +50,7 @@ else:
import logging
LOG = logging.getLogger(".DbManager")
from gramps.gen.constfunc import win
from gramps.gen.constfunc import win, UNITYPE
if win():
_RCS_FOUND = os.system("rcs -V >nul 2>nul") == 0
if _RCS_FOUND and "TZ" not in os.environ:
@@ -798,6 +798,9 @@ def find_revisions(name):
get_next = False
if os.path.isfile(name):
for line in proc.stdout:
if sys.version_info[0] >= 3 and not isinstance(line, UNITYPE):
# we assume utf-8 ...
line = line.decode('utf-8')
match = rev.match(line)
if match:
rev_str = copy.copy(match.groups()[0])
+2 -2
View File
@@ -181,10 +181,10 @@ class ErrorDialog(Gtk.MessageDialog):
flags=Gtk.DialogFlags.MODAL,
type=Gtk.MessageType.ERROR,
buttons=Gtk.ButtonsType.CLOSE)
self.set_markup('<span weight="bold" size="larger">%s</span>' % msg1)
self.set_markup('<span weight="bold" size="larger">%s</span>' % str(msg1))
self.format_secondary_text(msg2)
self.set_icon(ICON)
self.set_title("%s - Gramps" % msg1)
self.set_title("%s - Gramps" % str(msg1))
self.show()
self.run()
self.destroy()
+1
View File
@@ -369,6 +369,7 @@ class DisplayState(Callback):
'filters-changed' : (str, ),
'filter-name-changed' : (str, UNITYPE, UNITYPE),
'nameformat-changed' : None,
'grampletbar-close-changed' : None,
}
#nav_type to message
@@ -178,7 +178,7 @@ class BackRefList(EmbeddedList):
"editor and open an editor for the citation "
"alone")
from QuestionDialog import WarningDialog
from gramps.gui.dialog import WarningDialog
WarningDialog(_("Cannot open new citation editor"),
blocked_text)
elif reftype == 'Place':
+40 -22
View File
@@ -39,16 +39,50 @@ LOG = logging.getLogger(".grampsgui")
# Miscellaneous initialization
#
#-------------------------------------------------------------------------
MIN_PYGOBJECT_VERSION = (3, 3, 2)
PYGOBJ_ERR = False
try:
#import gnome introspection, part of pygobject
import gi
giversion = gi.require_version
except:
print(_("Your version of gi (gnome-instrospection) seems to be too old. "
"You need a version which has the function 'require_version' "
"to start Gramps"))
sys.exit(0)
if not PYGOBJ_ERR:
try:
from gi.repository import GObject
if not GObject.pygobject_version >= MIN_PYGOBJECT_VERSION :
PYGOBJ_ERR = True
except:
PYGOBJ_ERR = True
if PYGOBJ_ERR:
print((_("Your pygobject version does not meet the "
"requirements. At least pygobject "
"%(major)d.%(feature)d.%(minor)d is needed to"
" start Gramps with a GUI.\n\n"
"Gramps will terminate now.") %
{'major':MIN_PYGOBJECT_VERSION[0],
'feature':MIN_PYGOBJECT_VERSION[1],
'minor':MIN_PYGOBJECT_VERSION[2]}))
sys.exit(0)
try:
gi.require_version('Gtk', '3.0')
#It is important to import Pango before Gtk, or some things start to go
#wrong in GTK3 !
from gi.repository import Pango
from gi.repository import Gtk, Gdk
except (ImportError, ValueError):
print((_("Gtk typelib not installed. Install Gnome Introspection, and "
"pygobject version 3.3.2 or later.\n\n"
print((_("Gdk, Gtk or Pango typelib not installed.\n"
"Install Gnome Introspection, and "
"pygobject version 3.3.2 or later.\n"
"Install then instrospection data for Gdk, Gtk and Pango\n\n"
"Gramps will terminate now.")))
sys.exit(0)
@@ -59,24 +93,6 @@ except ImportError:
"version of python\n\n"
"Gramps will terminate now.")))
sys.exit(0)
#-------------------------------------------------------------------------
#
# Miscellaneous initialization
#
#-------------------------------------------------------------------------
from gi.repository import GObject
MIN_PYGOBJECT_VERSION = (3, 3, 2)
if not GObject.pygobject_version >= MIN_PYGOBJECT_VERSION :
print((_("Your pygobject version does not meet the "
"requirements. At least pygobject "
"%(major)d.%(feature)d.%(minor)d is needed to"
" start Gramps with a GUI.\n\n"
"Gramps will terminate now.") %
{'major':MIN_PYGOBJECT_VERSION[0],
'feature':MIN_PYGOBJECT_VERSION[1],
'minor':MIN_PYGOBJECT_VERSION[2]}))
sys.exit(0)
#-------------------------------------------------------------------------
#
@@ -287,12 +303,14 @@ def __startgramps(errors, argparser):
from .dialog import ErrorDialog
#handle first existing errors in GUI fashion
if errors:
ErrorDialog(errors[0], errors[1])
for error in errors:
ErrorDialog(error[0], error[1])
Gtk.main_quit()
sys.exit(1)
if argparser.errors:
ErrorDialog(argparser.errors[0], argparser.errors[1])
for error in argparser.errors:
ErrorDialog(error[0], error[1])
Gtk.main_quit()
sys.exit(1)
+135 -8
View File
@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
# $Id: navigator.py 20492 2012-10-02 21:08:19Z nick-h $
"""
A module that provides pluggable sidebars. These provide an interface to
@@ -29,6 +29,7 @@ manage pages in the main Gramps window.
#
#-------------------------------------------------------------------------
from gi.repository import Gtk
from gi.repository import Gdk
#-------------------------------------------------------------------------
#
@@ -36,6 +37,38 @@ from gi.repository import Gtk
#
#-------------------------------------------------------------------------
from gramps.gen.plug import (START, END)
from .pluginmanager import GuiPluginManager
#-------------------------------------------------------------------------
#
# Constants
#
#-------------------------------------------------------------------------
UICATEGORY = '''<ui>
<menubar name="MenuBar">
<menu action="ViewMenu">
<placeholder name="ViewsInCategory">%s
</placeholder>
</menu>
</menubar>
</ui>
'''
CATEGORY_ICON = {
'Dashboard': 'gramps-gramplet',
'People': 'gramps-person',
'Relationships': 'gramps-relation',
'Families': 'gramps-family',
'Events': 'gramps-event',
'Ancestry': 'gramps-pedigree',
'Places': 'gramps-place',
'Geography': 'gramps-geo',
'Sources': 'gramps-source',
'Repositories': 'gramps-repository',
'Media': 'gramps-media',
'Notes': 'gramps-notes',
'Citations': 'gramps-citation',
}
#-------------------------------------------------------------------------
#
@@ -50,6 +83,14 @@ class Navigator(object):
self.viewmanager = viewmanager
self.pages = []
self.active_cat = None
self.active_view = None
self.ui_category = {}
self.view_toggle_actions = {}
self.cat_view_group = None
self.merge_ids = []
self.top = Gtk.VBox()
frame = Gtk.Frame()
@@ -92,6 +133,59 @@ class Navigator(object):
self.top.show()
self.top.pack_start(self.notebook, True, True, 0)
def load_plugins(self, dbstate, uistate):
"""
Load the sidebar plugins.
"""
plugman = GuiPluginManager.get_instance()
categories = []
views = {}
for cat_num, cat_views in enumerate(self.viewmanager.get_views()):
uimenuitems = ''
self.view_toggle_actions[cat_num] = []
for view_num, page in enumerate(cat_views):
if view_num == 0:
views[cat_num] = []
cat_name = page[0].category[1]
cat_icon = CATEGORY_ICON.get(page[0].category[0])
if cat_icon is None:
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 = ""
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))
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
for pdata in plugman.get_reg_sidebars():
module = plugman.load_plugin(pdata)
if not module:
print("Error loading sidebar '%s': skipping content"
% pdata.name)
continue
sidebar_class = getattr(module, pdata.sidebarclass)
sidebar_page = sidebar_class(dbstate, uistate, categories, views)
self.add(pdata.menu_label, sidebar_page, pdata.order)
def get_top(self):
"""
Return the top container widget for the GUI.
@@ -121,8 +215,37 @@ class Navigator(object):
"""
Called when a Gramps view is changed.
"""
for page in self.pages:
page[1].view_changed(cat_num, view_num)
self.active_cat = cat_num
self.active_view = view_num
# Add buttons to the menu for the different view in the category
uimanager = self.viewmanager.uimanager
if self.cat_view_group:
if self.cat_view_group in uimanager.get_action_groups():
uimanager.remove_action_group(self.cat_view_group)
list(map(uimanager.remove_ui, self.merge_ids))
if cat_num in self.ui_category:
self.cat_view_group = Gtk.ActionGroup('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)
mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num])
self.merge_ids.append(mergeid)
# Call the view_changed method for the active sidebar
sidebar = self.pages[self.notebook.get_current_page()][1]
sidebar.view_changed(cat_num, view_num)
def cb_view_clicked(self, radioaction, current, cat_num):
"""
Called when a view is selected from the menu.
"""
view_num = radioaction.get_current_value()
self.viewmanager.goto_page(cat_num, view_num)
def __menu_button_pressed(self, button, event):
"""
@@ -145,8 +268,12 @@ class Navigator(object):
"""
Called when the user has switched to a new sidebar plugin page.
"""
if self.pages:
self.title_label.set_text(self.pages[index][0])
old_page = notebook.get_current_page()
if old_page != -1:
self.pages[old_page][1].inactive()
self.pages[index][1].active(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):
"""
@@ -164,9 +291,9 @@ def cb_menu_position(menu, button):
"""
Determine the position of the popup menu.
"""
x_pos, y_pos = button.window.get_origin()
x_pos += button.allocation.x
y_pos += button.allocation.y + button.allocation.height
ret_val, x_pos, y_pos = button.get_window().get_origin()
x_pos += button.get_allocation().x
y_pos += button.get_allocation().y + button.get_allocation().height
return (x_pos, y_pos, False)
+1 -1
View File
@@ -374,7 +374,7 @@ class WriterOptionBox(object):
# Now, we can't add something that we want hidden
for n in range(5):
self.vbox_n[n].pack_start(self.up_n[n], True, True, 0)
self.vbox_n[n].pack_end(self.down_n[n])
self.vbox_n[n].pack_end(self.down_n[n], False, True, 0)
# some spacer buttons:
up = Gtk.Button()
up.set_sensitive(0)
+10
View File
@@ -892,6 +892,7 @@ class BookDialog(DocReportDialog):
self.doc = self.format(None, pstyle)
user = User()
self.rptlist = []
self.global_style = None
for item in self.book.get_item_list():
item.option_class.set_document(self.doc)
report_class = item.get_write_item()
@@ -899,6 +900,13 @@ class BookDialog(DocReportDialog):
item.option_class, user)
style_sheet = create_style_sheet(item)
self.rptlist.append((obj, style_sheet))
if ( item.name == 'table_of_contents' or
item.name == 'alphabetical_index' ): # ugly hack: FIXME
if self.global_style is None:
self.global_style = style_sheet
else:
self.global_style = create_style_sheet(item,
self.global_style)
self.doc.open(self.target_path)
def make_book(self):
@@ -915,6 +923,8 @@ class BookDialog(DocReportDialog):
if rpt:
rpt.begin_report()
rpt.write_report()
if self.global_style:
self.doc.set_style_sheet(self.global_style)
self.doc.close()
if self.open_with_app.get_active():
+11 -20
View File
@@ -179,12 +179,19 @@ class BaseSelector(ManagedWindow):
def get_selected_ids(self):
mlist = []
self.selection.selected_foreach(self.select_function,mlist)
self.selection.selected_foreach(self.select_function, mlist)
return mlist
def select_function(self,store,path,iter,id_list):
handle_column = self.get_handle_column()
id_list.append(self.model.get_value(iter, handle_column))
def first_selected(self):
""" first selected entry in the Selector tree
"""
mlist = []
self.selection.selected_foreach(self.select_function, mlist)
return mlist[0] if mlist else None
def select_function(self, store, path, iter_, id_list):
handle = store.get_handle_from_iter(iter_)
id_list.append(handle)
def run(self):
val = self.window.run()
@@ -230,10 +237,6 @@ class BaseSelector(ManagedWindow):
def get_from_handle_func2(self):
return None
def get_handle_column(self):
# return 3
assert False, "Must be defined in the subclass"
def set_show_search_bar(self, value):
"""make the search bar at the top shown
"""
@@ -245,18 +248,6 @@ class BaseSelector(ManagedWindow):
else :
self.search_bar.hide()
def begintree(self, store, path, node, sel_list):
handle_column = self.get_handle_column()
handle = store.get_value(node, handle_column)
sel_list.append(handle)
def first_selected(self):
""" first selected entry in the Selector tree
"""
mlist = []
self.selection.selected_foreach(self.begintree, mlist)
return mlist[0] if mlist else None
def column_order(self):
"""
returns a tuple indicating the column order of the model

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