Merge branch 'main' into dev

This commit is contained in:
Veronica Berglyd Olsen
2024-03-03 21:44:38 +01:00
3 changed files with 184 additions and 169 deletions
+53 -45
View File
@@ -505,10 +505,15 @@ class GuiProjectTree(QTreeWidget):
self.mainGui = projView.mainGui
# Internal Variables
self._treeMap = {}
self._treeMap: dict[str, QTreeWidgetItem] = {}
self._timeChanged = 0.0
self._popAlert = None
# Cached Translations
self.trActive = self.tr("Active")
self.trInactive = self.tr("Inactive")
self.trPermDelete = self.tr("Permanently delete {0} file(s) from Trash?")
# Build GUI
# =========
@@ -555,10 +560,6 @@ class GuiProjectTree(QTreeWidget):
trRoot = self.invisibleRootItem()
trRoot.setFlags(trRoot.flags() ^ Qt.ItemFlag.ItemIsDropEnabled)
# Cached values
self._lblActive = self.tr("Active")
self._lblInactive = self.tr("Inactive")
# Set selection options
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
@@ -902,10 +903,7 @@ class GuiProjectTree(QTreeWidget):
SHARED.info(self.tr("The Trash folder is already empty."))
return False
msgYes = SHARED.question(
self.tr("Permanently delete {0} file(s) from Trash?").format(nTrash)
)
if not msgYes:
if not SHARED.question(self.trPermDelete.format(nTrash)):
logger.info("Action cancelled by user")
return False
@@ -1052,7 +1050,7 @@ class GuiProjectTree(QTreeWidget):
if nwItem.isFileType():
iconName = "checked" if nwItem.isActive else "unchecked"
toolTip = self._lblActive if nwItem.isActive else self._lblInactive
toolTip = self.trActive if nwItem.isActive else self.trInactive
trItem.setToolTip(self.C_ACTIVE, toolTip)
else:
iconName = "noncheckable"
@@ -1129,9 +1127,8 @@ class GuiProjectTree(QTreeWidget):
"""Get the currently selected handle. If multiple items are
selected, return the first.
"""
selItem = self.selectedItems()
if selItem:
return selItem[0].data(self.C_DATA, self.D_HANDLE)
if items := self.selectedItems():
return items[0].data(self.C_DATA, self.D_HANDLE)
return None
def setSelectedHandle(self, tHandle: str | None, doScroll: bool = False) -> bool:
@@ -1143,9 +1140,8 @@ class GuiProjectTree(QTreeWidget):
if tHandle in self._treeMap:
self.setCurrentItem(self._treeMap[tHandle])
selIndex = self.selectedIndexes()
if selIndex and doScroll:
self.scrollTo(selIndex[0], QAbstractItemView.ScrollHint.PositionAtCenter)
if (indexes := self.selectedIndexes()) and doScroll:
self.scrollTo(indexes[0], QAbstractItemView.ScrollHint.PositionAtCenter)
return True
@@ -1160,10 +1156,8 @@ class GuiProjectTree(QTreeWidget):
def openContextOnSelected(self) -> bool:
"""Open the context menu on the current selected item."""
selItem = self.selectedItems()
if selItem:
pos = self.visualItemRect(selItem[0]).center()
return self._openContextMenu(pos)
if items := self.selectedItems():
return self._openContextMenu(self.visualItemRect(items[0]).center())
return False
def changedSince(self, checkTime: float) -> bool:
@@ -1746,7 +1740,7 @@ class _TreeContextMenu(QMenu):
self._item = nwItem
self._handle = nwItem.itemHandle
self._items: list[str] = []
self._items: list[NWItem] = []
logger.debug("Ready: _TreeContextMenu")
@@ -1799,13 +1793,17 @@ class _TreeContextMenu(QMenu):
return
def buildMultiSelectMenu(self, items: list[str]) -> None:
def buildMultiSelectMenu(self, handles: list[str]) -> None:
"""Build the multi-select menu."""
self._items = items
self._items = []
for tHandle in handles:
if (tItem := SHARED.project.tree[tHandle]):
self._items.append(tItem)
self._itemActive(True)
self._itemStatusImport(True)
self.addSeparator()
self._moveToTrash(True)
self._multiMoveToTrash()
return
##
@@ -1847,9 +1845,9 @@ class _TreeContextMenu(QMenu):
"""Add Active/Inactive actions."""
if multi:
mSub = self.addMenu(self.tr("Set Active to ..."))
aOne = mSub.addAction(SHARED.theme.getIcon("checked"), self.tr("Active"))
aOne = mSub.addAction(SHARED.theme.getIcon("checked"), self.projTree.trActive)
aOne.triggered.connect(lambda: self._iterItemActive(True))
aTwo = mSub.addAction(SHARED.theme.getIcon("unchecked"), self.tr("Inactive"))
aTwo = mSub.addAction(SHARED.theme.getIcon("unchecked"), self.projTree.trInactive)
aTwo.triggered.connect(lambda: self._iterItemActive(False))
else:
action = self.addAction(self.tr("Toggle Active"))
@@ -1964,10 +1962,14 @@ class _TreeContextMenu(QMenu):
return
def _moveToTrash(self, multi: bool) -> None:
def _multiMoveToTrash(self) -> None:
"""Add move to Trash action."""
action = self.addAction(self.tr("Move to Trash"))
if multi:
areTrash = [i.itemClass == nwItemClass.TRASH for i in self._items]
if all(areTrash):
action = self.addAction(self.tr("Delete Permanently"))
action.triggered.connect(self._iterPermDelete)
elif not any(areTrash):
action = self.addAction(self.tr("Move to Trash"))
action.triggered.connect(self._iterMoveToTrash)
return
@@ -1979,10 +1981,19 @@ class _TreeContextMenu(QMenu):
def _iterMoveToTrash(self) -> None:
"""Iterate through files and move them to Trash."""
if SHARED.question(self.tr("Move {0} items to Trash?").format(len(self._items))):
for tHandle in self._items:
tItem = SHARED.project.tree[tHandle]
if tItem and tItem.isFileType():
self.projTree.moveItemToTrash(tHandle, askFirst=False, flush=False)
for tItem in self._items:
if tItem.isFileType() and tItem.itemClass != nwItemClass.TRASH:
self.projTree.moveItemToTrash(tItem.itemHandle, askFirst=False, flush=False)
self.projTree.saveTreeOrder()
return
@pyqtSlot()
def _iterPermDelete(self) -> None:
"""Iterate through files and delete them."""
if SHARED.question(self.projTree.trPermDelete.format(len(self._items))):
for tItem in self._items:
if tItem.isFileType() and tItem.itemClass == nwItemClass.TRASH:
self.projTree.permDeleteItem(tItem.itemHandle, askFirst=False, flush=False)
self.projTree.saveTreeOrder()
return
@@ -2000,12 +2011,11 @@ class _TreeContextMenu(QMenu):
def _iterItemActive(self, isActive: bool) -> None:
"""Set the active status of multiple items."""
for tHandle in self._items:
tItem = SHARED.project.tree[tHandle]
for tItem in self._items:
if tItem and tItem.isFileType():
tItem.setActive(isActive)
self.projTree.setTreeItemValues(tHandle)
self.projTree._alertTreeChange(tHandle, flush=False)
self.projTree.setTreeItemValues(tItem.itemHandle)
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
return
def _changeItemStatus(self, key: str) -> None:
@@ -2017,12 +2027,11 @@ class _TreeContextMenu(QMenu):
def _iterSetItemStatus(self, key: str) -> None:
"""Change the status value for multiple items."""
for tHandle in self._items:
tItem = SHARED.project.tree[tHandle]
for tItem in self._items:
if tItem and tItem.isNovelLike():
tItem.setStatus(key)
self.projTree.setTreeItemValues(tHandle)
self.projTree._alertTreeChange(tHandle, flush=False)
self.projTree.setTreeItemValues(tItem.itemHandle)
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
return
def _changeItemImport(self, key: str) -> None:
@@ -2034,12 +2043,11 @@ class _TreeContextMenu(QMenu):
def _iterSetItemImport(self, key: str) -> None:
"""Change the status value for multiple items."""
for tHandle in self._items:
tItem = SHARED.project.tree[tHandle]
for tItem in self._items:
if tItem and not tItem.isNovelLike():
tItem.setImport(key)
self.projTree.setTreeItemValues(tHandle)
self.projTree._alertTreeChange(tHandle, flush=False)
self.projTree.setTreeItemValues(tItem.itemHandle)
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
return
def _changeItemLayout(self, itemLayout: nwItemLayout) -> None: