Add a multi-select context menu and handlers
This commit is contained in:
@@ -1185,6 +1185,9 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
logger.debug("No item found")
|
logger.debug("No item found")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if len(self.selectedItems()) > 1:
|
||||||
|
return self._openMultiSelectContextMenu(clickPos, tItem)
|
||||||
|
|
||||||
ctxMenu = QMenu(self)
|
ctxMenu = QMenu(self)
|
||||||
|
|
||||||
# Trash Folder
|
# Trash Folder
|
||||||
@@ -1236,7 +1239,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
lambda n, key=key: self._changeItemStatus(tHandle, key)
|
lambda n, key=key: self._changeItemStatus(tHandle, key)
|
||||||
)
|
)
|
||||||
mStatus.addSeparator()
|
mStatus.addSeparator()
|
||||||
aManage1 = mStatus.addAction("Manage Labels ...")
|
aManage1 = mStatus.addAction(self.tr("Manage Labels ..."))
|
||||||
aManage1.triggered.connect(
|
aManage1.triggered.connect(
|
||||||
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_STATUS)
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_STATUS)
|
||||||
)
|
)
|
||||||
@@ -1249,7 +1252,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
lambda n, key=key: self._changeItemImport(tHandle, key)
|
lambda n, key=key: self._changeItemImport(tHandle, key)
|
||||||
)
|
)
|
||||||
mImport.addSeparator()
|
mImport.addSeparator()
|
||||||
aManage2 = mImport.addAction("Manage Labels ...")
|
aManage2 = mImport.addAction(self.tr("Manage Labels ..."))
|
||||||
aManage2.triggered.connect(
|
aManage2.triggered.connect(
|
||||||
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_IMPORT)
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_IMPORT)
|
||||||
)
|
)
|
||||||
@@ -1512,7 +1515,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
def _changeItemStatus(self, tHandle: str, tStatus: str) -> None:
|
def _changeItemStatus(self, tHandle: str, tStatus: str) -> None:
|
||||||
"""Set a new status value of an item."""
|
"""Set a new status value of an item."""
|
||||||
tItem = SHARED.project.tree[tHandle]
|
tItem = SHARED.project.tree[tHandle]
|
||||||
if tItem is not None:
|
if tItem and tItem.isDocumentLayout():
|
||||||
tItem.setStatus(tStatus)
|
tItem.setStatus(tStatus)
|
||||||
self.setTreeItemValues(tItem.itemHandle)
|
self.setTreeItemValues(tItem.itemHandle)
|
||||||
self._alertTreeChange(tHandle, flush=False)
|
self._alertTreeChange(tHandle, flush=False)
|
||||||
@@ -1521,7 +1524,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
def _changeItemImport(self, tHandle: str, tImport: str) -> None:
|
def _changeItemImport(self, tHandle: str, tImport: str) -> None:
|
||||||
"""Set a new importance value of an item."""
|
"""Set a new importance value of an item."""
|
||||||
tItem = SHARED.project.tree[tHandle]
|
tItem = SHARED.project.tree[tHandle]
|
||||||
if tItem is not None:
|
if tItem and tItem.isNoteLayout():
|
||||||
tItem.setImport(tImport)
|
tItem.setImport(tImport)
|
||||||
self.setTreeItemValues(tItem.itemHandle)
|
self.setTreeItemValues(tItem.itemHandle)
|
||||||
self._alertTreeChange(tHandle, flush=False)
|
self._alertTreeChange(tHandle, flush=False)
|
||||||
@@ -1828,4 +1831,87 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
##
|
||||||
|
# Multi-Select Context Menu Functions
|
||||||
|
##
|
||||||
|
|
||||||
|
def _openMultiSelectContextMenu(self, clickPos: QPoint, tItem: NWItem) -> bool:
|
||||||
|
"""Alternative menu for multiple selected items."""
|
||||||
|
ctxMenu = QMenu(self)
|
||||||
|
|
||||||
|
mActive = ctxMenu.addMenu(self.tr("Set Active to ..."))
|
||||||
|
aActive = mActive.addAction(SHARED.theme.getIcon("checked"), self.tr("Active"))
|
||||||
|
aActive.triggered.connect(lambda: self._iterItemActive(True))
|
||||||
|
aInactive = mActive.addAction(SHARED.theme.getIcon("unchecked"), self.tr("Inactive"))
|
||||||
|
aInactive.triggered.connect(lambda: self._iterItemActive(False))
|
||||||
|
|
||||||
|
if tItem.isNovelLike():
|
||||||
|
mStatus = ctxMenu.addMenu(self.tr("Set Status to ..."))
|
||||||
|
for n, (key, entry) in enumerate(SHARED.project.data.itemStatus.items()):
|
||||||
|
aStatus = mStatus.addAction(entry["icon"], entry["name"])
|
||||||
|
aStatus.triggered.connect(lambda n, key=key: self._iterSetItemStatus(key))
|
||||||
|
mStatus.addSeparator()
|
||||||
|
aManage1 = mStatus.addAction(self.tr("Manage Labels ..."))
|
||||||
|
aManage1.triggered.connect(
|
||||||
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_STATUS)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
mImport = ctxMenu.addMenu(self.tr("Set Importance to ..."))
|
||||||
|
for n, (key, entry) in enumerate(SHARED.project.data.itemImport.items()):
|
||||||
|
aImport = mImport.addAction(entry["icon"], entry["name"], )
|
||||||
|
aImport.triggered.connect(lambda n, key=key: self._iterSetItemImport(key))
|
||||||
|
mImport.addSeparator()
|
||||||
|
aManage2 = mImport.addAction(self.tr("Manage Labels ..."))
|
||||||
|
aManage2.triggered.connect(
|
||||||
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_IMPORT)
|
||||||
|
)
|
||||||
|
|
||||||
|
ctxMenu.addSeparator()
|
||||||
|
|
||||||
|
aMoveTrash = ctxMenu.addAction(self.tr("Move to Trash"))
|
||||||
|
aMoveTrash.triggered.connect(self._iterMoveToTrash)
|
||||||
|
|
||||||
|
# Show Context Menu
|
||||||
|
ctxMenu.exec_(self.viewport().mapToGlobal(clickPos))
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _iterItemActive(self, active: bool) -> None:
|
||||||
|
"""Change the active status multiple items."""
|
||||||
|
for item in self.selectedItems():
|
||||||
|
tHandle = str(item.data(self.C_DATA, self.D_HANDLE))
|
||||||
|
tItem = SHARED.project.tree[tHandle]
|
||||||
|
if tItem and tItem.isFileType():
|
||||||
|
tItem.setActive(active)
|
||||||
|
self.setTreeItemValues(tItem.itemHandle)
|
||||||
|
self._alertTreeChange(tHandle, flush=False)
|
||||||
|
return
|
||||||
|
|
||||||
|
def _iterSetItemStatus(self, tStatus: str) -> None:
|
||||||
|
"""Change the status value for multiple items."""
|
||||||
|
for item in self.selectedItems():
|
||||||
|
tHandle = str(item.data(self.C_DATA, self.D_HANDLE))
|
||||||
|
self._changeItemStatus(tHandle, tStatus)
|
||||||
|
return
|
||||||
|
|
||||||
|
def _iterSetItemImport(self, tStatus: str) -> None:
|
||||||
|
"""Change the importance value for multiple items."""
|
||||||
|
for item in self.selectedItems():
|
||||||
|
tHandle = str(item.data(self.C_DATA, self.D_HANDLE))
|
||||||
|
self._changeItemImport(tHandle, tStatus)
|
||||||
|
return
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def _iterMoveToTrash(self) -> None:
|
||||||
|
"""Iterate through files and move them to Trash."""
|
||||||
|
items = self.selectedItems()
|
||||||
|
if SHARED.question(self.tr("Move {0} items to Trash?").format(len(items))):
|
||||||
|
for item in self.selectedItems():
|
||||||
|
tHandle = str(item.data(self.C_DATA, self.D_HANDLE))
|
||||||
|
tItem = SHARED.project.tree[tHandle]
|
||||||
|
if tItem and tItem.isFileType():
|
||||||
|
self.moveItemToTrash(tHandle, askFirst=False, flush=False)
|
||||||
|
self.saveTreeOrder()
|
||||||
|
return
|
||||||
|
|
||||||
# END Class GuiProjectTree
|
# END Class GuiProjectTree
|
||||||
|
|||||||
Reference in New Issue
Block a user