diff --git a/ChangeLog b/ChangeLog index 58bcae30d..b45867d22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2008-01-08 Benny Malengier + Peter Landgren + * src/DbManager.py: rename check, issue 1562, 1569 + 2008-01-09 Gary Burton * src/DisplayModels/_NoteModel.py: * src/Selectors/_SelectNote.py: diff --git a/src/DbManager.py b/src/DbManager.py index cf9506a61..68ba104ff 100644 --- a/src/DbManager.py +++ b/src/DbManager.py @@ -192,8 +192,8 @@ class CLIDbManager: name_file.write(title) name_file.close() - self.current_names.append(title) - + self.current_names.append((title, new_path, path_name, _("Never"), 0, + False, "")) return new_path, title def _create_new_db(self, title=None): @@ -317,17 +317,20 @@ class DbManager(CLIDbManager): def __selection_changed(self, selection): """ - Called with the selection is changed in the TreeView. What we - are trying to detect is the selection or unselection of a row. + Called when the selection is changed in the TreeView. + """ + self.__update_buttons(selection) + + def __update_buttons(self, selection): + """ + What we are trying to detect is the selection or unselection of a row. When a row is unselected, the Open, Rename, and Remove buttons are set insensitive. If a row is selected, the rename and remove buttons are disabled, and the Open button is disabled if the row represents a open database. """ - # Get the current selection store, node = selection.get_selected() - if not node: self.connect.set_sensitive(False) self.rename.set_sensitive(False) @@ -335,12 +338,11 @@ class DbManager(CLIDbManager): self.repair.hide() self.remove.set_sensitive(False) else: - is_rev = len(self.model.get_path(node)) > 1 self.rcs.set_label(RCS_BUTTON[is_rev]) self.rename.set_sensitive(True) - + if store.get_value(node, STOCK_COL) == gtk.STOCK_OPEN: self.connect.set_sensitive(False) if RCS_FOUND: @@ -384,6 +386,8 @@ class DbManager(CLIDbManager): render.set_property('editable', True) render.set_property('ellipsize', pango.ELLIPSIZE_END) render.connect('edited', self.__change_name) + render.connect('editing-canceled', self.__stop_edit) + render.connect('editing-started', self.__start_edit) self.column = gtk.TreeViewColumn(_('Family tree name'), render, text=NAME_COL) self.column.set_sort_column_id(NAME_COL) @@ -429,6 +433,22 @@ class DbManager(CLIDbManager): self.model.append(node, data) self.dblist.set_model(self.model) + def existing_name(self, name, skippath=None): + """ + Returns true if a name is present in the model already. + If skippath given, the name of skippath is not considered + """ + iter = self.model.get_iter_first() + while (iter): + path = self.model.get_path(iter) + if path == skippath: + continue + itername = self.model.get_value(iter, NAME_COL) + if itername.strip() == name.strip(): + return True + iter = self.model.iter_next(iter) + return False + def run(self): """ Runs the dialog, returning None if nothing has been chosen, @@ -481,7 +501,18 @@ class DbManager(CLIDbManager): except IOError: return - def __change_name(self, text, path, new_text): + def __stop_edit(self, *args): + self.__update_buttons(self.selection) + + def __start_edit(self, *args): + """ + Do no allow to click Load while changing name, to force users to finish + the action of renaming. Hack around the fact that clicking button + sends a 'editing-canceled' signal loosing the new name + """ + self.connect.set_sensitive(False) + + def __change_name(self, renderer_sel, path, new_text): """ Changes the name of the database. This is a callback from the column, which has been marked as editable. @@ -489,19 +520,15 @@ class DbManager(CLIDbManager): If the new string is empty, do nothing. Otherwise, renaming the database is simply changing the contents of the name file. """ - if len(new_text) > 0 and text != new_text: - if len(path) > 1 : - self.__rename_revision(path, new_text) - else: - """ - Check in recent_files.xml if there is another database - or Family Tree with the same name as new_text. - """ - if RecentFiles.check_if_recent(new_text): - QuestionDialog.ErrorDialog(_("Family Tree exists already")) - + if len(new_text) > 0: + node = self.model.get_iter(path) + old_text = self.model.get_value(node, NAME_COL) + if not old_text.strip() == new_text.strip(): + if len(path) > 1 : + self.__rename_revision(path, new_text) else: self.__rename_database(path, new_text) + self.__update_buttons(self.selection) def __rename_revision(self, path, new_text): """ @@ -539,8 +566,14 @@ class DbManager(CLIDbManager): """ Renames the database by writing the new value to the name.txt file """ + new_text = new_text.strip() node = self.model.get_iter(path) filename = self.model.get_value(node, FILE_COL) + if self.existing_name(new_text, skippath=path): + QuestionDialog.ErrorDialog( + _("Could not rename the Family Tree."), + _("Family Tree already exists, choose a unique name.")) + return try: name_file = open(filename, "r") old_text=name_file.read() @@ -749,13 +782,14 @@ class DbManager(CLIDbManager): new database. Catch OSError and IOError and display a warning message. """ + self.new.set_sensitive(False) try: self._create_new_db() except (OSError, IOError), msg: QuestionDialog.ErrorDialog(_("Could not create family tree"), str(msg)) + self.new.set_sensitive(True) - def _create_new_db(self, title=None): """ Create a new database, append to model @@ -776,7 +810,6 @@ class DbManager(CLIDbManager): Handle the reception of drag data """ drag_value = selection.data - print drag_value fname = None type = None title = None