# # 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$ #for debug, remove later import sys sys.path.append("..") sys.path.append(".") sys.path.append("ObjectSelector") import os.path import gtk import gobject from gettext import gettext as _ import _Factories from _Constants import ObjectTypes from _ObjectSelectorResult import ObjectSelectorResult from DisplayState import ManagedWindow import const class _ObjectTypeWidgets(object): def __init__(self): self.frame = None self.sel_label = None self.selected_id = None self.new_button = None def show(self): self.frame.show_all() self.sel_label.show_all() self.new_button.show() def hide(self): self.frame.hide_all() self.sel_label.hide_all() self.new_button.hide() def set_selected_id(self,id): self.selected_id = id OBJECT_LIST = [ObjectTypes.PERSON, ObjectTypes.FAMILY, ObjectTypes.SOURCE, ObjectTypes.EVENT, ObjectTypes.MEDIA, ObjectTypes.PLACE, ObjectTypes.REPOSITORY] class ObjectSelectorWindow(gtk.Window,ManagedWindow): __gproperties__ = {} __gsignals__ = { 'add-object' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), } __default_border_width = 5 def __init__(self, dbstate, uistate, track, title = _("Select Object"), filter_spec = None, default_object_type = ObjectTypes.PERSON, object_list = OBJECT_LIST): # Init the display manager ManagedWindow.__init__(self,uistate,track,self) # Init the Window gtk.Window.__init__(self) self._dbstate = dbstate self._uistate = dbstate self._track = track self._object_list = object_list self._current_object_type = None # Create objects to hold the information about # each object type self._object_frames = {} for object_type in object_list: self._object_frames[object_type] = _ObjectTypeWidgets() self.set_title(title) # Selected object label new_button_box = gtk.VBox() new_button_box.show() for object_type in object_list: new_button = gtk.Button(stock=gtk.STOCK_NEW) self._object_frames[object_type].new_button = new_button new_button_box.pack_start(new_button) label = gtk.Label("Selected:") label.set_use_markup(True) label.set_alignment(xalign=0.9,yalign=0.5) label.set_padding(self.__class__.__default_border_width, self.__class__.__default_border_width) label.show() sel_frame = gtk.Frame() sel_frame.set_shadow_type(gtk.SHADOW_IN) sel_frame.set_border_width(self.__class__.__default_border_width*2) sel_label_box = gtk.HBox() sel_label_box.show() for object_type in object_list: sel_label = gtk.Label("No Selected Object") sel_label.set_alignment(xalign=0,yalign=0.5) sel_label_box.pack_start(sel_label) self._object_frames[object_type].sel_label = sel_label sel_frame.add(sel_label_box) sel_frame.show() label_box = gtk.HBox() label_box.pack_start(new_button_box,False,False) label_box.pack_start(label,False,False) label_box.pack_start(sel_frame,True,True) label_box.show() # Object select obj_label = gtk.Label("Show") obj_label.set_use_markup(True) obj_label.set_alignment(xalign=0.9,yalign=0.5) obj_label.set_padding(self.__class__.__default_border_width, self.__class__.__default_border_width) person_pixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join(const.rootDir,"person.svg")) flist_pixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join(const.rootDir,"flist.svg")) self._tool_list = gtk.ListStore(gtk.gdk.Pixbuf, str,int) d={ObjectTypes.PERSON: [person_pixbuf,'People',ObjectTypes.PERSON], ObjectTypes.FAMILY: [flist_pixbuf,'Families',ObjectTypes.FAMILY], ObjectTypes.EVENT: [person_pixbuf,'Events',ObjectTypes.EVENT]} for object_type in self._object_list: self._tool_list.append(d[object_type]) self._tool_combo = gtk.ComboBox(self._tool_list) icon_cell = gtk.CellRendererPixbuf() label_cell = gtk.CellRendererText() self._tool_combo.pack_start(icon_cell, True) self._tool_combo.pack_start(label_cell, True) self._tool_combo.add_attribute(icon_cell, 'pixbuf', 0) self._tool_combo.add_attribute(label_cell, 'text', 1) self._tool_combo.set_active(0) self._tool_combo.connect('changed', lambda c: self._set_object_type(self._tool_list.get_value(c.get_active_iter(),2))) tool_box = gtk.HBox() tool_box.pack_start(obj_label,False,False) tool_box.pack_start(self._tool_combo,False,False) # only show the object_list if there is more than # one object_type requested. if len(self._object_list) > 1: self._tool_combo.show() obj_label.show() tool_box.show() # Top box top_box = gtk.HBox() top_box.pack_start(tool_box,False,False) top_box.pack_start(label_box,True,True) top_box.show() # Create the widgets for each of the object types # Object frame box frame_box = gtk.HBox() frame_box.show() for object_type in object_list: self._object_frames[object_type].frame = \ _Factories.ObjectFrameFactory().get_frame(object_type,dbstate,uistate,filter_spec) # connect signals self._object_frames[object_type].frame.connect( 'selection-changed', lambda widget,text,handle,label: label.set_text(text), self._object_frames[object_type].sel_label) self._object_frames[object_type].frame.connect( 'selection-changed', lambda widget,text,handle,current_object: current_object.set_selected_id(handle), self._object_frames[object_type]) self._object_frames[object_type].frame.connect( 'selection-changed', self.on_selection_changed) self._object_frames[object_type].frame.connect( 'add-object', self.on_add) self._object_frames[object_type].new_button.connect( 'clicked', self._object_frames[object_type].frame.new_object) frame_box.pack_start(self._object_frames[object_type].frame,True,True) # Bottom buttons self._add_button = gtk.Button(stock=gtk.STOCK_ADD) self._add_button.set_sensitive(False) self._add_button.show() self._add_button.connect("clicked", self.on_add) cancel_button = gtk.Button(stock=gtk.STOCK_CANCEL) cancel_button.show() cancel_button.connect_object("clicked", gtk.Widget.destroy, self) bottom_button_bar = gtk.HButtonBox() bottom_button_bar.set_layout(gtk.BUTTONBOX_SPREAD) bottom_button_bar.set_spacing(self.__class__.__default_border_width/2) bottom_button_bar.set_border_width(self.__class__.__default_border_width) bottom_button_bar.add(cancel_button) bottom_button_bar.add(self._add_button) bottom_button_bar.show() box = gtk.VBox() box.pack_start(top_box,False,False) box.pack_start(frame_box,True,True) box.pack_start(bottom_button_bar,False,False) box.show() align = gtk.Alignment() align.set_padding(self.__class__.__default_border_width, self.__class__.__default_border_width, self.__class__.__default_border_width, self.__class__.__default_border_width) align.set(0.5,0.5,1,1) align.add(box) align.show() self.add(align) self._set_object_type(default_object_type) self.set_default_size(700,300) self.show() def _set_object_type(self,selected_object_type): # enable selected object type self._object_frames[selected_object_type].show() # disable all the others [ self._object_frames[object_type].hide() for object_type in self._object_list if object_type != selected_object_type] # Set the object selector list to the selected object type # this is required because we may be asked to set the object type # without the use selecting it explicitly from the list. store = self._tool_list it = store.get_iter_first() while it: if store.get(it, 2)[0] == selected_object_type: break it = store.iter_next(it) if it != None: self._tool_combo.set_active_iter(it) self._current_object_type = selected_object_type # Set the add button sensitivity if self._object_frames[selected_object_type].selected_id: self._add_button.set_sensitive(True) else: self._add_button.set_sensitive(False) def get_result(self): result = ObjectSelectorResult() result.set_object_type(self._current_object_type) result.set_gramps_id(self._object_frames[self._current_object_type].selected_id) return result def on_add(self,button=None): self.emit('add-object',self.get_result()) def on_selection_changed(self,widget,text,handle): if handle: self._add_button.set_sensitive(True) else: self._add_button.set_sensitive(False) if gtk.pygtk_version < (2,8,0): gobject.type_register(ObjectSelectorWindow) if __name__ == "__main__": import GrampsDb import ViewManager import const import logging import sys,os.path form = logging.Formatter(fmt="%(relativeCreated)d: %(levelname)s: %(filename)s: line %(lineno)d: %(message)s") stderrh = logging.StreamHandler(sys.stderr) stderrh.setFormatter(form) stderrh.setLevel(logging.DEBUG) # everything. l = logging.getLogger() l.setLevel(logging.DEBUG) l.addHandler(stderrh) def cb(d): pass state = GrampsDb.DbState() vm = ViewManager.ViewManager(state) db = GrampsDb.gramps_db_factory(const.app_gramps)() db.load(os.path.realpath(sys.argv[1]), cb, # callback "w") class D: pass dbstate = D() dbstate.db = db w = ObjectSelectorWindow(dbstate=dbstate, uistate=vm.uistate, default_object_type = ObjectTypes.PERSON, object_list=[ObjectTypes.PERSON,ObjectTypes.FAMILY]) w.show() w.connect("destroy", gtk.main_quit) def add(w,results): print str(results) w.connect('add-object',add) gtk.main()