# # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2001-2005 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$ #------------------------------------------------------------------------- # # GTK+/GNOME modules # #------------------------------------------------------------------------- import gtk import logging log = logging.getLogger(".") #------------------------------------------------------------------------- # # GRAMPS modules # #------------------------------------------------------------------------- import ViewManager import PersonView import FamilyList import RepositoryView import GrampsDisplay import RelLib import GrampsDb import PedView import MapView import FamilyView import PlaceView import EventView import SourceView import MediaView import ArgHandler import GrampsKeys import GrampsCfg import const import Errors import PluginMgr import TipOfDay from GrampsMime import mime_type_is_defined from QuestionDialog import ErrorDialog iconpaths = [".",const.rootDir] def register_stock_icons (): import os items = [ ('person.svg',('gramps-person','Person',gtk.gdk.CONTROL_MASK,0,'')), ('relation.svg',('gramps-family','Relationships',gtk.gdk.CONTROL_MASK,0,'')), ('family48.png',('gramps-family-list','Family List',gtk.gdk.CONTROL_MASK,0,'')), ('media.svg',('gramps-media','Media',gtk.gdk.CONTROL_MASK,0,'')), ('ped24.png',('gramps-pedigree','Pedigree',gtk.gdk.CONTROL_MASK,0,'')), ('repos.png',('gramps-repository','Repositories', gtk.gdk.CONTROL_MASK,0,'')), ('sources.png',('gramps-source','Sources',gtk.gdk.CONTROL_MASK,0,'')), ('events.png',('gramps-event','Events',gtk.gdk.CONTROL_MASK,0,'')), ('place.png',('gramps-place','Places',gtk.gdk.CONTROL_MASK,0,'')), ('place.png',('gramps-map','Map',gtk.gdk.CONTROL_MASK,0,'')), ] # Register our stock items gtk.stock_add (map(lambda x: x[1],items)) # Add our custom icon factory to the list of defaults factory = gtk.IconFactory () factory.add_default () for (key,data) in items: for dirname in iconpaths: icon_file = os.path.expanduser(os.path.join(dirname,key)) if os.path.isfile(icon_file): break else: icon_file = os.path.join(iconpaths[0],'gramps.png') pixbuf = gtk.gdk.pixbuf_new_from_file (icon_file) pixbuf = pixbuf.add_alpha(True, chr(0xff), chr(0xff), chr(0xff)) # Register icon to accompany stock item if pixbuf: icon_set = gtk.IconSet (pixbuf) factory.add (data[0], icon_set) else: log.debug('failed to load GTK logo for toolbar') class Gramps: """ Main class corresponding to a running gramps process. There can be only one instance of this class per gramps application process. It may spawn several windows and control several databases. """ def __init__(self,args): try: GrampsCfg.loadConfig() self.welcome() except OSError, msg: ErrorDialog(_("Configuration error"),str(msg)) return except Errors.GConfSchemaError, val: ErrorDialog(_("Configuration error"),str(val) + _("\n\nPossibly the installation of GRAMPS " "was incomplete. Make sure the GConf schema " "of GRAMPS is properly installed.")) gtk.main_quit() return except: log.error("Error reading configuration.", exc_info=True) return if not mime_type_is_defined(const.app_gramps): ErrorDialog(_("Configuration error"), _("A definition for the MIME-type %s could not " "be found \n\nPossibly the installation of GRAMPS " "was incomplete. Make sure the MIME-types " "of GRAMPS are properly installed.") % const.app_gramps) gtk.main_quit() return register_stock_icons() state = GrampsDb.DbState() vm = ViewManager.ViewManager(state) vm.register_view(PersonView.PersonView) vm.register_view(FamilyView.FamilyView) vm.register_view(FamilyList.FamilyListView) vm.register_view(PedView.PedView) vm.register_view(EventView.EventView) vm.register_view(SourceView.SourceView) vm.register_view(PlaceView.PlaceView) vm.register_view(MediaView.MediaView) vm.register_view(MapView.MapView) vm.register_view(RepositoryView.RepositoryView) ArgHandler.ArgHandler(state,vm,args) vm.init_interface() state.db.request_rebuild() state.change_active_person(state.db.get_default_person()) # Don't show main window until ArgHandler is done. # This prevents a window from annoyingly popping up when # the command line args are sufficient to operate without it. GrampsKeys.client.notify_add("/apps/gramps/researcher", self.researcher_key_update) GrampsKeys.client.notify_add("/apps/gramps/interface/statusbar", self.statusbar_key_update) # GrampsKeys.client.notify_add("/apps/gramps/interface/toolbar", ## self.toolbar_key_update) # GrampsKeys.client.notify_add("/apps/gramps/interface/toolbar-on", # self.toolbar_on_key_update) # GrampsKeys.client.notify_add("/apps/gramps/interface/filter", # self.filter_key_update) # GrampsKeys.client.notify_add("/apps/gramps/interface/view", # self.sidebar_key_update) # GrampsKeys.client.notify_add("/apps/gramps/interface/familyview", # self.familyview_key_update) # GrampsKeys.client.notify_add("/apps/gramps/preferences/name-format", # self.familyview_key_update) # GrampsKeys.client.notify_add("/apps/gramps/preferences/date-format", # self.date_format_key_update) if GrampsKeys.get_usetips(): TipOfDay.TipOfDay(vm.uistate) ## # FIXME: THESE will have to be added (ViewManager?) ## # once bookmarks work again ## self.db.set_researcher(GrampsCfg.get_researcher()) ## self.db.connect('person-delete',self.on_remove_bookmark) ## self.db.connect('person-update',self.on_update_bookmark) def welcome(self): if GrampsKeys.get_welcome() >= 200: return glade = gtk.glade.XML(const.gladeFile,'scrollmsg') top = glade.get_widget('scrollmsg') msg = glade.get_widget('msg') msg.get_buffer().set_text( _("Welcome to the 2.0.x series of GRAMPS!\n" "\n" "This version drastically differs from the 1.0.x branch\n" "in a few ways. Please read carefully, as this may affect\n" "the way you are using the program.\n" "\n" "1. This version works with the Berkeley database backend.\n" " Because of this, changes are written to disk immediately.\n" " There is NO Save function anymore!\n" "2. The Media object files are not managed by GRAMPS.\n" " There is no concept of local objects, all objects\n" " are external. You are in charge of keeping track of\n" " your files. If you delete the image file from disk,\n" " it will be lost!\n" "3. The version control provided by previous GRAMPS\n" " versions has been removed. You may set up the versioning\n" " system on your own if you'd like, but it will have to be\n" " outside of GRAMPS.\n" "4. It is possible to directly open GRAMPS XML databases\n" " (used by previous versions) as well as GEDCOM files.\n" " However, any changes will be written to the disk when\n" " you quit GRAMPS. In case of GEDCOM files, this may lead\n" " to a data loss because some GEDCOM files contain data\n" " that does not comply with the GEDCOM standard and cannot\n" " be parsed by GRAMPS. If unsure, set up an empty grdb\n" " database (new GRAMPS format) and import GEDCOM into it.\n" " This will keep the original GEDCOM untouched.\n" "\n" "Enjoy!\n" "The GRAMPS project\n")) top.run() top.destroy() GrampsKeys.save_welcome(200) GrampsKeys.sync() def researcher_key_update(self,client,cnxn_id,entry,data): pass # self.db.set_person_id_prefix(GrampsKeys.get_person_id_prefix()) # self.db.set_family_id_prefix(GrampsKeys.get_family_id_prefix()) # self.db.set_source_id_prefix(GrampsKeys.get_source_id_prefix()) # self.db.set_object_id_prefix(GrampsKeys.get_object_id_prefix()) # self.db.set_place_id_prefix(GrampsKeys.get_place_id_prefix()) # self.db.set_event_id_prefix(GrampsKeys.get_event_id_prefix()) def statusbar_key_update(self,client,cnxn_id,entry,data): self.modify_statusbar() def toolbar_key_update(self,client,cnxn_id,entry,data): the_style = GrampsKeys.get_toolbar() if the_style == -1: self.toolbar.unset_style() else: self.toolbar.set_style(the_style)