def build_gui(self): """ Build the GUI interface. """ tip = _('Right-click on a row to edit the selected event' ' or the related place.') self.set_tooltip(tip) top = Gtk.TreeView() top.set_hover_selection(True) titles = [ ( '', NOSORT, 50, ), (_('Type'), 1, 100), (_('Description'), 2, 250), (_('Date'), 3, 160), ('', NOSORT, 50), (_('Place'), 4, 300), (_('Id'), 5, 80), (_('Latitude'), 6, 130), (_('Longitude'), 7, 130), ] self.model = ListModel(top, titles, right_click=self.menu_edit) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to view a quick report showing ' 'all people with the selected attribute.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [(_('Key'), 1, 100), (_('Value'), 2, 100)] self.model = ListModel(top, titles, event_func=self.display_report) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected event.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [('', NOSORT, 50,), (_('Date'), 1, 200), (_('Place'), 2, 200)] self.model = ListModel(top, titles, event_func=self.edit_event) return top
def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate self.label = _("Associations state tool") tool.Tool.__init__(self, dbstate, options_class, name) if uistate: ManagedWindow.__init__(self, uistate, [], self.__class__) stats_list = [] relationship = get_relationship_calculator() rel = "" plist = dbstate.db.get_person_handles(sort_handles=True) for handle in plist: person = dbstate.db.get_person_from_handle(handle) name1 = name_displayer.display(person) refs = person.get_person_ref_list() if refs: for ref in person.serialize()[-1]: (a, b, c, two, value) = ref person2 = dbstate.db.get_person_from_handle(two) name2 = name_displayer.display(person2) rel = relationship.get_one_relationship( dbstate.db, person2, person) stats_list.append((name1, value, name2, rel)) if uistate: titles = [ (_('Name'), 0, 200), (_('Type of link'), 1, 200), (_('Of'), 2, 200), (_('Relationship Calculator'), 2, 200), ] treeview = Gtk.TreeView() model = ListModel(treeview, titles) for entry in stats_list: model.add(entry, entry[0]) window = Gtk.Window() window.set_default_size(1000, 600) s = Gtk.ScrolledWindow() s.add(treeview) window.add(s) window.show_all() self.set_window(window, None, self.label) self.show() else: print('\t%s' * 4 % ('Name', 'Type of link', 'Of', 'RelCal')) print() for entry in stats_list: print('\t%s' * 4 % entry)
def build_gui(self): """ Build the GUI interface. """ top = Gtk.TreeView() titles = [ (_('Type'), 1, 100), (_('Name'), 2, 100), ('', 3, 1), #hidden column for the handle ('', 4, 1) ] #hidden column for non-localized object type self.model = ListModel(top, titles, event_func=self.cb_double_click) return top
def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate self.label = _("Gender Statistics tool") tool.Tool.__init__(self, dbstate, options_class, name) stats_list = [] for name, value in dbstate.db.genderStats.stats.items(): stats_list.append((name, ) + value + ( _GENDER[dbstate.db.genderStats.guess_gender(name)], )) if uistate: ManagedWindow.__init__(self, uistate, [], self.__class__) titles = [(_('Name'), 0, 100), (_('Male'), 1, 70, INTEGER), (_('Female'), 2, 70, INTEGER), (_('Unknown'), 3, 90, INTEGER), (_('Guess'), 4, 70)] treeview = Gtk.TreeView() model = ListModel(treeview, titles) for entry in sorted(stats_list): model.add(entry, entry[0]) s = Gtk.ScrolledWindow() s.add(treeview) dialog = Gtk.Dialog() dialog.add_button(_('_Close'), Gtk.ResponseType.CLOSE) dialog.connect('response', self._response) dialog.vbox.pack_start(s, expand=True, fill=True, padding=0) self.set_window(dialog, None, self.label) self.setup_configs('interface.dumpgenderstats', 420, 300) self.show() else: if len(_('Name')) < 16: print( '%s%s%s' % (_('Name'), " " * (16 - len(_('Name'))), _('Male')), '\t%s' * 3 % (_('Female'), _('Unknown'), _('Guess'))) else: print( _('Name'), '\t%s' * 4 % (_('Male'), _('Female'), _('Unknown'), _('Guess'))) print() for entry in sorted(stats_list): if len(entry[0]) < 16: print( '%s%s%s' % (entry[0], " " * (16 - len(entry[0])), entry[1]), '\t%s' * 3 % (entry[2:])) else: print(entry[0], '\t%s' * 4 % (entry[1:]))
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected place.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [('', 0, 50), (_('Name'), 1, 300), (_('Type'), 2, 150), (_('Date'), 5, 250), (_('ID'), 4, 100), ('', NOSORT, 50)] self.model = ListModel(top, titles, list_mode="tree", event_func=self.edit_place) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected source/citation.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [('', NOSORT, 50,), (_('Source/Citation'), 1, 350), (_('Author'), 2, 200), (_('Publisher'), 3, 150)] self.model = ListModel(top, titles, list_mode="tree", event_func=self.invoke_editor) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected participant.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [('', NOSORT, 50,), (_('Name'), 1, 250), (_('Role'), 2, 80), (_('Birth Date'), 3, 100), ('', 3, 100), (_('Spouses'), 4, 200)] self.model = ListModel(top, titles, event_func=self.edit_person) return top
def build_gui(self): """ Build the GUI interface. """ top = Gtk.HBox() self.photo = Photo() self.photo.show() view = Gtk.TreeView() titles = [(_('Object'), 1, 250)] self.model = ListModel(view, titles, list_mode="tree", select_func=self.row_selected) top.pack_start(view, True, True, 0) top.pack_start(self.photo, True, False, 5) top.show_all() return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected child.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [( '', NOSORT, 50, ), (_('Child'), 1, 250), (_('Birth Date'), 3, 100), ('', 3, 100), (_('Death Date'), 5, 100), ('', 5, 100)] self.model = ListModel(top, titles, event_func=self.edit_person) return top
def build_gui(self): """ Build the GUI interface. """ self.view = Gtk.TreeView() self.view.set_tooltip_column(3) titles = [(_('Name'), 0, 230), (_('Birth'), 2, 100), ('', NOSORT, 1), ('', NOSORT, 1), # tooltip ('', NOSORT, 100)] # handle self.model = ListModel(self.view, titles, list_mode="tree", event_func=self.cb_double_click, right_click=self.cb_right_click) return self.view
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the object containing the ' 'selected attribute.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [(_('Date'), 1, 100), ('', 1, 100), (_('Key'), 2, 100), (_('Value'), 3, 100), ( '', NOSORT, 50, )] self.model = ListModel(top, titles, event_func=self._display_editor) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected event.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [( '', NOSORT, 50, ), (_('Type'), 1, 100), (_('Date'), 3, 100), ('', 3, 100), (_('Age'), 4, 35), (_('Where Born'), 5, 160), (_('Condition'), 6, 75), (_('Occupation'), 7, 160), (_('Residence'), 8, 160)] self.model = ListModel(top, titles, event_func=self.edit_event) return top
def build_gui(self): """ Build the GUI interface. """ tip = _('Double-click on a row to edit the selected event.') self.set_tooltip(tip) top = Gtk.TreeView() titles = [( '', NOSORT, 50, ), (_('Type'), 1, 100), (_('Description'), 2, 150), (_('Date'), 3, 100), ('', NOSORT, 50), (_('Age'), 4, 100), ('', NOSORT, 50), (_('Place'), 5, 400), (_('Main Participants'), 6, 200), (_('Role'), 7, 100)] self.model = ListModel(top, titles, event_func=self.edit_event) return top
def __init__(self, uistate, data, track): super().__init__(uistate, track, self, modal=True) self.window = Gtk.Dialog() self.set_window(self.window, None, _("Database Information")) self.setup_configs('interface.information', 600, 400) self.ok = self.window.add_button(_('_OK'), Gtk.ResponseType.OK) self.ok.connect('clicked', self.on_ok_clicked) s = Gtk.ScrolledWindow() titles = [(_('Setting'), 0, 150), (_('Value'), 1, 400)] treeview = Gtk.TreeView() model = ListModel(treeview, titles) for key, value in sorted(data.items()): model.add(( key, str(value), ), key) s.add(treeview) self.window.vbox.pack_start(s, True, True, 0) self.show()
def __init__(self, dbstate, uistate, track, the_list, the_map, callback): ManagedWindow.__init__(self,uistate,track,self.__class__) self.dellist = set() self.list = the_list self.map = the_map self.length = len(self.list) self.update = callback self.db = dbstate.db self.dbstate = dbstate self.uistate = uistate top = Glade(toplevel="mergelist") window = top.toplevel self.set_window(window, top.get_object('title'), _('Potential Merges')) self.setup_configs('interface.duplicatepeopletoolmatches', 500, 350) self.mlist = top.get_object("mlist") top.connect_signals({ "destroy_passed_object" : self.close, "on_do_merge_clicked" : self.on_do_merge_clicked, "on_help_show_clicked" : self.on_help_clicked, "on_delete_show_event" : self.close, "on_merge_ok_clicked" : self.__dummy, "on_help_clicked" : self.__dummy, "on_delete_merge_event" : self.__dummy, "on_delete_event" : self.__dummy, }) self.db.connect("person-delete", self.person_delete) mtitles = [ (_('Rating'),3,75), (_('First Person'),1,200), (_('Second Person'),2,200), ('',-1,0) ] self.list = ListModel(self.mlist,mtitles, event_func=self.on_do_merge_clicked) self.redraw() self.show()
def __init__(self, uistate, data, parent): super().__init__(uistate, [], self) self.window = Gtk.Dialog('Gramp') self.set_window(self.window, None, _("Database Information")) self.window.set_modal(True) self.ok = self.window.add_button(_('_OK'), Gtk.ResponseType.OK) self.ok.connect('clicked', self.on_ok_clicked) self.window.set_position(Gtk.WindowPosition.CENTER) self.window.set_default_size(600, 400) s = Gtk.ScrolledWindow() titles = [(_('Setting'), 0, 150), (_('Value'), 1, 400)] treeview = Gtk.TreeView() model = ListModel(treeview, titles) for key, value in sorted(data.items()): model.add(( key, str(value), ), key) s.add(treeview) self.window.vbox.pack_start(s, True, True, 0) self.show()
def build_gui(self): """ Build the GUI interface. """ self.top = Gtk.TreeView() titles = [ (_('Type'), 1, 100), (_('Name'), 2, 100), (_('Date'), 4, 200), ('sd', 4, 120), # sorted date column ('', 5, 1), #hidden column for the handle ('', 6, 1), #hidden column for non-localized object type ] self.model = ListModel(self.top, titles, event_func=self.cb_double_click) self.date_column = self.top.get_column(2) self.sdate = self.top.get_column(3) self.top.get_column(1).set_expand(True) # The name use the max # possible size return self.top
def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate self.label = _("Gender Statistics tool") tool.Tool.__init__(self, dbstate, options_class, name) if uistate: ManagedWindow.__init__(self, uistate, [], self.__class__) stats_list = [] for name, value in dbstate.db.genderStats.stats.items(): stats_list.append((name, ) + value + ( _GENDER[dbstate.db.genderStats.guess_gender(name)], )) if uistate: titles = [(_('Name'), 0, 100), (_('Male'), 1, 70, INTEGER), (_('Female'), 2, 70, INTEGER), (_('Unknown'), 3, 70, INTEGER), (_('Guess'), 4, 70)] treeview = Gtk.TreeView() model = ListModel(treeview, titles) for entry in stats_list: model.add(entry, entry[0]) window = Gtk.Window() window.set_default_size(400, 300) s = Gtk.ScrolledWindow() s.add(treeview) window.add(s) window.show_all() self.set_window(window, None, self.label) self.show() else: print('\t%s' * 5 % ('Name', 'Male', 'Female', 'Unknown', 'Guess')) print() for entry in stats_list: print('\t%s' * 5 % entry)
def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate self.label = _("Relation and distances with root") self.dbstate = dbstate FilterClass = GenericFilterFactory('Person') self.path = '.' filter = FilterClass() tool.Tool.__init__(self, dbstate, options_class, name) if uistate: window = Gtk.Window() window.set_default_size(880, 600) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) window.add(box) # dirty work-around for Gtk.HeaderBar() and FolderChooser chooser = Gtk.FileChooserDialog( _("Folder Chooser"), parent=uistate.window, action=Gtk.FileChooserAction.SELECT_FOLDER, buttons=(_('_Cancel'), Gtk.ResponseType.CANCEL, _('_Select'), Gtk.ResponseType.OK)) chooser.set_tooltip_text(_("Please, select a folder")) status = chooser.run() if status == Gtk.ResponseType.OK: # work-around 'IsADirectoryError' with self() # TypeError: invalid file: gi.FunctionInfo() self.path = chooser.get_current_folder() chooser.destroy() ManagedWindow.__init__(self, uistate, [], self.__class__) self.titles = [ (_('Rel_id'), 0, 40, INTEGER), # would be INTEGER (_('Relation'), 1, 300, str), (_('Name'), 2, 200, str), (_('up'), 3, 35, INTEGER), (_('down'), 4, 35, INTEGER), (_('Common MRA'), 5, 40, INTEGER), (_('Rank'), 6, 40, INTEGER), (_('Period'), 7, 40, str), ] treeview = Gtk.TreeView() model = ListModel(treeview, self.titles) s = Gtk.ScrolledWindow() s.add(treeview) box.pack_start(s, True, True, 0) button = Gtk.Button(label=_("Save")) button.connect("clicked", self.button_clicked) box.pack_end(button, False, True, 0) self.stats_list = [] # behavior can be different according to CPU and generation depth max_level = config.get('behavior.generation-depth') # compact and interlinked tree # single core 2.80 Ghz needs +/- 0.1 second per person if max_level >= 15: var = max_level * 0.01 elif 10 <= max_level < 15: var = max_level * 0.02 else: var = max_level * 0.025 plist = self.dbstate.db.iter_person_handles() length = self.dbstate.db.get_number_of_people() default_person = self.dbstate.db.get_default_person() if uistate: self.progress = ProgressMeter(self.label, can_cancel=True, parent=window) else: self.progress = ProgressMeter(self.label) if default_person: # rather designed for run via GUI... root_id = default_person.get_gramps_id() ancestors = rules.person.IsAncestorOf([str(root_id), True]) descendants = rules.person.IsDescendantOf([str(root_id), True]) related = rules.person.IsRelatedWith([str(root_id)]) # filtering people can be useful on some large data set # counter on filtering pass was not efficient # Not the proper solution, but a lazy one providing expected message filter.add_rule(related) self.progress.set_pass(_('Please wait, filtering...')) filtered_list = filter.apply(self.dbstate.db, plist) relationship = get_relationship_calculator() else: # TODO: provide selection widget for CLI and GUI WarningDialog(_("No default_person")) return count = 0 filtered_people = len(filtered_list) self.progress.set_pass(_('Generating relation map...'), filtered_people) if self.progress.get_cancelled(): self.progress.close() return step_one = time.clock() # init for counters for handle in filtered_list: nb = len(self.stats_list) count += 1 self.progress.step() step_two = time.clock() start = 99 if count > start: # provide a basic interface for counters need = (step_two - step_one) / count wait = need * filtered_people remain = int(wait) - int(step_two - step_one) # sorry, lazy header = _("%d/%d \n %d/%d seconds \n %d/%d \n%f|\t%f" % (count, filtered_people, remain, int(wait), nb, length, float(need), float(var))) self.progress.set_header(header) if self.progress.get_cancelled(): self.progress.close() return person = dbstate.db.get_person_from_handle(handle) timeout_one = time.clock() # for delta and timeout estimations dist = relationship.get_relationship_distance_new(dbstate.db, default_person, person, only_birth=True) timeout_two = time.clock() rank = dist[0][0] if rank == -1 or rank > max_level: # not related and ignored people continue limit = timeout_two - timeout_one expect = (limit - var) / max_level if limit > var: n = name_displayer.display(person) _LOG.debug("Sorry! '{0}' needs {1} second, \ variation = '{2}'".format(n, limit, expect)) continue else: _LOG.debug("variation = '{}'".format( limit)) # delta, see above max_level 'wall' section rel = relationship.get_one_relationship( dbstate.db, default_person, person) rel_a = dist[0][2] Ga = len(rel_a) rel_b = dist[0][4] Gb = len(rel_b) mra = 1 # m: mother; f: father if Ga > 0: for letter in rel_a: if letter == 'm': mra = mra * 2 + 1 if letter == 'f': mra = mra * 2 # design: mra gender will be often female (m: mother) if rel_a[-1] == "f" and Gb != 0: # male gender, look at spouse mra = mra + 1 name = name_displayer.display(person) # pseudo privacy; sample for DNA stuff and mapping import hashlib no_name = hashlib.sha384(name.encode() + handle.encode()).hexdigest() _LOG.info(no_name) # own internal password via handle kekule = number.get_number(Ga, Gb, rel_a, rel_b) # workaround - possible unique ID and common numbers uuid = str(uuid4()) _LOG.info("Random UUID: {}".format(uuid)) if kekule == "u": # TODO: cousin(e)s need a key kekule = 0 if kekule == "nb": # non-birth kekule = -1 try: test = int(kekule) except: # 1: related to mother; 0.x : no more girls lineage kekule = 1 period = get_timeperiod(self.dbstate.db, handle) # sometimes 'iterator' (generator) is more faster #handle_list = map(handle, filtered_list) iterator = (handle for handle in filtered_list) # experimentations; not used yet new_list = [int(kekule), int(Ga), int(Gb), int(mra), int(rank)] line = (iterator, array('b', new_list)) self.stats_list.append( (int(kekule), rel, name, int(Ga), int(Gb), int(mra), int(rank), str(period))) self.progress.close() from itertools import groupby for key, items in groupby(self.stats_list, lambda x: x[0]): for subitem in items: _LOG.info(subitem) _LOG.debug("total: {}".format(nb)) for entry in self.stats_list: if uistate: model.add(entry, entry[0]) else: print(entry) if uistate: window.show() self.set_window(window, None, self.label) self.show()
def __init__(self): Gtk.TreeView.__init__(self) self.sections = {} titles = [(_('Key'), 1, 235), (_('Value'), 2, 325)] self.model = ListModel(self, titles, list_mode="tree")