Remove renaming dialogues from sidebar ...

... in favour of in-line editing. This is simpler and more ergonomic for
the user (and the programmer) but doesn't allow for editing parents
through text input (in the case of tags and decks).
This commit is contained in:
RumovZ 2021-03-03 21:57:39 +01:00
parent bcc8a5ac3a
commit 7d3d6edb26

View file

@ -364,16 +364,9 @@ class SidebarTreeView(QTreeView):
self.setContextMenuPolicy(Qt.CustomContextMenu) self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.onContextMenu) # type: ignore self.customContextMenuRequested.connect(self.onContextMenu) # type: ignore
self.context_menus: Dict[SidebarItemType, Sequence[Tuple[str, Callable]]] = { self.context_menus: Dict[SidebarItemType, Sequence[Tuple[str, Callable]]] = {
SidebarItemType.DECK: ( SidebarItemType.DECK: ((tr(TR.ACTIONS_DELETE), self.delete_deck),),
(tr(TR.ACTIONS_RENAME), self.rename_deck), SidebarItemType.TAG: ((tr(TR.ACTIONS_DELETE), self.remove_tags),),
(tr(TR.ACTIONS_DELETE), self.delete_deck),
),
SidebarItemType.TAG: (
(tr(TR.ACTIONS_RENAME), self.rename_tag),
(tr(TR.ACTIONS_DELETE), self.remove_tags),
),
SidebarItemType.SAVED_SEARCH: ( SidebarItemType.SAVED_SEARCH: (
(tr(TR.ACTIONS_RENAME), self.rename_saved_search),
(tr(TR.ACTIONS_DELETE), self.remove_saved_searches), (tr(TR.ACTIONS_DELETE), self.remove_saved_searches),
), ),
SidebarItemType.NOTETYPE: ((tr(TR.ACTIONS_MANAGE), self.manage_notetype),), SidebarItemType.NOTETYPE: ((tr(TR.ACTIONS_MANAGE), self.manage_notetype),),
@ -1040,9 +1033,14 @@ class SidebarTreeView(QTreeView):
# idx is only None when triggering the context menu from a left click on # idx is only None when triggering the context menu from a left click on
# saved searches - perhaps there is a better way to handle that? # saved searches - perhaps there is a better way to handle that?
def show_context_menu(self, item: SidebarItem, idx: Optional[QModelIndex]) -> None: def show_context_menu(
self, item: SidebarItem, index: Optional[QModelIndex]
) -> None:
m = QMenu() m = QMenu()
if item.item_type.is_editable():
m.addAction(tr(TR.ACTIONS_RENAME), lambda: self.edit(index))
if item.item_type in self.context_menus: if item.item_type in self.context_menus:
for action in self.context_menus[item.item_type]: for action in self.context_menus[item.item_type]:
act_name = action[0] act_name = action[0]
@ -1115,13 +1113,12 @@ class SidebarTreeView(QTreeView):
lambda: set_children_expanded(False), lambda: set_children_expanded(False),
) )
def rename_deck(self, item: SidebarItem, new_name: Optional[str] = None) -> None: def rename_deck(self, item: SidebarItem, new_name: str) -> None:
deck = self.mw.col.decks.get(item.id) deck = self.mw.col.decks.get(item.id)
old_name = deck["name"] old_name = deck["name"]
new_name = new_name or getOnlyText(tr(TR.DECKS_NEW_DECK_NAME), default=old_name) new_name = re.sub(
new_name = new_name.replace('"', "") re.escape(item.name) + "$", new_name.replace("\\", r"\\"), old_name
if not new_name or new_name == old_name: )
return
self.mw.checkpoint(tr(TR.ACTIONS_RENAME_DECK)) self.mw.checkpoint(tr(TR.ACTIONS_RENAME_DECK))
try: try:
self.mw.col.decks.rename(deck, new_name) self.mw.col.decks.rename(deck, new_name)
@ -1153,18 +1150,18 @@ class SidebarTreeView(QTreeView):
self.browser.model.beginReset() self.browser.model.beginReset()
self.mw.taskman.run_in_background(do_remove, on_done) self.mw.taskman.run_in_background(do_remove, on_done)
def rename_tag(self, item: SidebarItem, new_name: str = None) -> None: def rename_tag(self, item: SidebarItem, new_name: str) -> None:
if new_name: new_name = new_name.replace(" ", "")
# call came from model; block repainting until collection is updated if new_name and new_name != item.name:
# block repainting until collection is updated
self.setUpdatesEnabled(False) self.setUpdatesEnabled(False)
self.browser.editor.saveNow(lambda: self._rename_tag(item, new_name)) self.browser.editor.saveNow(lambda: self._rename_tag(item, new_name))
def _rename_tag(self, item: SidebarItem, new_name: str = None) -> None: def _rename_tag(self, item: SidebarItem, new_name: str) -> None:
old_name = item.full_name old_name = item.full_name
new_name = new_name or getOnlyText(tr(TR.ACTIONS_NEW_NAME), default=old_name) new_name = re.sub(
if new_name == old_name or not new_name: re.escape(item.name) + "$", new_name.replace("\\", r"\\"), old_name
self.setUpdatesEnabled(True) )
return
def do_rename() -> int: def do_rename() -> int:
self.mw.col.tags.remove(old_name) self.mw.col.tags.remove(old_name)
@ -1211,9 +1208,6 @@ class SidebarTreeView(QTreeView):
def rename_notetype(self, item: SidebarItem, new_name: str) -> None: def rename_notetype(self, item: SidebarItem, new_name: str) -> None:
notetype = self.col.models.get(item.id) notetype = self.col.models.get(item.id)
new_name = new_name.replace('"', "")
if not notetype or not new_name or new_name == notetype["name"]:
return
self.mw.checkpoint(tr(TR.ACTIONS_RENAME)) self.mw.checkpoint(tr(TR.ACTIONS_RENAME))
notetype["name"] = new_name notetype["name"] = new_name
self.col.models.save(notetype) self.col.models.save(notetype)
@ -1225,12 +1219,8 @@ class SidebarTreeView(QTreeView):
def rename_template(self, item: SidebarItem, new_name: str) -> None: def rename_template(self, item: SidebarItem, new_name: str) -> None:
notetype = self.col.models.get(item._parent_item.id) notetype = self.col.models.get(item._parent_item.id)
template = notetype["tmpls"][item.id]
new_name = new_name.replace('"', "")
if not new_name or new_name == template["name"]:
return
self.mw.checkpoint(tr(TR.ACTIONS_RENAME)) self.mw.checkpoint(tr(TR.ACTIONS_RENAME))
template["name"] = new_name notetype["tmpls"][item.id]["name"] = new_name
self.col.models.save(notetype) self.col.models.save(notetype)
self.refresh( self.refresh(
lambda other: other.item_type == SidebarItemType.NOTETYPE_TEMPLATE lambda other: other.item_type == SidebarItemType.NOTETYPE_TEMPLATE
@ -1240,22 +1230,18 @@ class SidebarTreeView(QTreeView):
self.browser.model.reset() self.browser.model.reset()
def rename_node(self, item: SidebarItem, text: str) -> bool: def rename_node(self, item: SidebarItem, text: str) -> bool:
def full_new_name() -> str: new_name = text.replace('"', "")
return re.sub( if new_name and new_name != item.name:
re.escape(item.name) + "$", text.replace("\\", r"\\"), item.full_name
)
if text.replace('"', ""):
if item.item_type == SidebarItemType.DECK: if item.item_type == SidebarItemType.DECK:
self.rename_deck(item, full_new_name()) self.rename_deck(item, new_name)
elif item.item_type == SidebarItemType.SAVED_SEARCH: elif item.item_type == SidebarItemType.SAVED_SEARCH:
self.rename_saved_search(item, text) self.rename_saved_search(item, new_name)
elif item.item_type == SidebarItemType.TAG: elif item.item_type == SidebarItemType.TAG:
self.rename_tag(item, full_new_name()) self.rename_tag(item, new_name)
elif item.item_type == SidebarItemType.NOTETYPE: elif item.item_type == SidebarItemType.NOTETYPE:
self.rename_notetype(item, text) self.rename_notetype(item, new_name)
elif item.item_type == SidebarItemType.NOTETYPE_TEMPLATE: elif item.item_type == SidebarItemType.NOTETYPE_TEMPLATE:
self.rename_template(item, text) self.rename_template(item, new_name)
# renaming may be asynchronous so always return False # renaming may be asynchronous so always return False
return False return False
@ -1284,18 +1270,15 @@ class SidebarTreeView(QTreeView):
self._set_saved_searches(conf) self._set_saved_searches(conf)
self.refresh() self.refresh()
def rename_saved_search(self, item: SidebarItem, new_name: str = None) -> None: def rename_saved_search(self, item: SidebarItem, new_name: str) -> None:
old = item.name old_name = item.name
conf = self._get_saved_searches() conf = self._get_saved_searches()
try: try:
filt = conf[old] filt = conf[old_name]
except KeyError: except KeyError:
return return
new = new_name or getOnlyText(tr(TR.ACTIONS_NEW_NAME), default=old) conf[new_name] = filt
if new == old or not new: del conf[old_name]
return
conf[new] = filt
del conf[old]
self._set_saved_searches(conf) self._set_saved_searches(conf)
self.refresh( self.refresh(
lambda item: item.item_type == SidebarItemType.SAVED_SEARCH lambda item: item.item_type == SidebarItemType.SAVED_SEARCH