Fix active status icon and tooltip
This commit is contained in:
@@ -274,6 +274,11 @@ class nwLabels:
|
|||||||
"doc_h4": QT_TRANSLATE_NOOP("Constant", "Novel Section"),
|
"doc_h4": QT_TRANSLATE_NOOP("Constant", "Novel Section"),
|
||||||
"note": QT_TRANSLATE_NOOP("Constant", "Project Note"),
|
"note": QT_TRANSLATE_NOOP("Constant", "Project Note"),
|
||||||
}
|
}
|
||||||
|
ACTIVE_NAME = {
|
||||||
|
"checked": QT_TRANSLATE_NOOP("Constant", "Active"),
|
||||||
|
"unchecked": QT_TRANSLATE_NOOP("Constant", "Inactive"),
|
||||||
|
"noncheckable": QT_TRANSLATE_NOOP("Constant", "Not Available"),
|
||||||
|
}
|
||||||
KEY_NAME = {
|
KEY_NAME = {
|
||||||
nwKeyWords.TAG_KEY: QT_TRANSLATE_NOOP("Constant", "Tag"),
|
nwKeyWords.TAG_KEY: QT_TRANSLATE_NOOP("Constant", "Tag"),
|
||||||
nwKeyWords.POV_KEY: QT_TRANSLATE_NOOP("Constant", "Point of View"),
|
nwKeyWords.POV_KEY: QT_TRANSLATE_NOOP("Constant", "Point of View"),
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ from typing import TYPE_CHECKING, Any
|
|||||||
|
|
||||||
from PyQt5.QtGui import QIcon
|
from PyQt5.QtGui import QIcon
|
||||||
|
|
||||||
|
from novelwriter import SHARED
|
||||||
from novelwriter.common import (
|
from novelwriter.common import (
|
||||||
checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified,
|
checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified,
|
||||||
yesNo
|
yesNo
|
||||||
@@ -330,6 +331,13 @@ class NWItem:
|
|||||||
entry = self._project.data.itemImport[self._import]
|
entry = self._project.data.itemImport[self._import]
|
||||||
return entry.name, entry.icon
|
return entry.name, entry.icon
|
||||||
|
|
||||||
|
def getActiveStatus(self) -> tuple[str, QIcon]:
|
||||||
|
"""Return the relevant active status label and icon for
|
||||||
|
the current item based on its type.
|
||||||
|
"""
|
||||||
|
key = ("checked" if self._active else "unchecked") if self.isFileType() else "noncheckable"
|
||||||
|
return trConst(nwLabels.ACTIVE_NAME[key]), SHARED.theme.getIcon(key)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Checker Methods
|
# Checker Methods
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -113,18 +113,14 @@ class ProjectNode:
|
|||||||
self._cache[C_COUNT_ALIGN] = QtAlignRight
|
self._cache[C_COUNT_ALIGN] = QtAlignRight
|
||||||
|
|
||||||
# Active
|
# Active
|
||||||
if self._item.isFileType():
|
aText, aIcon = self._item.getActiveStatus()
|
||||||
if self._item.isActive:
|
self._cache[C_ACTIVE_TIP] = aText
|
||||||
self._cache[C_ACTIVE_ICON] = SHARED.theme.getIcon("checked")
|
self._cache[C_ACTIVE_ICON] = aIcon
|
||||||
else:
|
|
||||||
self._cache[C_ACTIVE_ICON] = SHARED.theme.getIcon("unchecked")
|
|
||||||
else:
|
|
||||||
self._cache[C_ACTIVE_ICON] = SHARED.theme.getIcon("noncheckable")
|
|
||||||
|
|
||||||
# Status
|
# Status
|
||||||
sText, sIcon = self._item.getImportStatus()
|
sText, sIcon = self._item.getImportStatus()
|
||||||
self._cache[C_STATUS_ICON] = sIcon
|
|
||||||
self._cache[C_STATUS_TIP] = sText
|
self._cache[C_STATUS_TIP] = sText
|
||||||
|
self._cache[C_STATUS_ICON] = sIcon
|
||||||
|
|
||||||
self.updateCount()
|
self.updateCount()
|
||||||
|
|
||||||
|
|||||||
+20
-20
@@ -515,22 +515,8 @@ class GuiProjectTree(QTreeView):
|
|||||||
self.projView = projView
|
self.projView = projView
|
||||||
|
|
||||||
# Internal Variables
|
# Internal Variables
|
||||||
# self._treeMap: dict[str, QTreeWidgetItem] = {}
|
|
||||||
# self._popAlert = None
|
|
||||||
# self._actHandle = None
|
# self._actHandle = 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
|
|
||||||
# =========
|
|
||||||
|
|
||||||
# Context Menu
|
|
||||||
# self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
|
||||||
# self.customContextMenuRequested.connect(self.openContextMenu)
|
|
||||||
|
|
||||||
# Tree Settings
|
# Tree Settings
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
|
|
||||||
@@ -551,19 +537,19 @@ class GuiProjectTree(QTreeView):
|
|||||||
# releases (see #1561) and instead use our own implementation
|
# releases (see #1561) and instead use our own implementation
|
||||||
# self.setAutoScroll(False)
|
# self.setAutoScroll(False)
|
||||||
|
|
||||||
# But don't allow drop on root level
|
|
||||||
# Due to a bug, this stops working somewhere between Qt 5.15.3
|
|
||||||
# and 5.15.8, so this is also blocked in dropEvent (see #1569)
|
|
||||||
# trRoot = self.invisibleRootItem()
|
|
||||||
# trRoot.setFlags(trRoot.flags() ^ Qt.ItemFlag.ItemIsDropEnabled)
|
|
||||||
|
|
||||||
# Set selection options
|
# Set selection options
|
||||||
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
|
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
|
||||||
self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
|
self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
|
||||||
|
|
||||||
|
# Context Menu
|
||||||
|
# self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
|
# self.customContextMenuRequested.connect(self.openContextMenu)
|
||||||
|
|
||||||
# Connect signals
|
# Connect signals
|
||||||
self.clicked.connect(self._onSingleClick)
|
self.clicked.connect(self._onSingleClick)
|
||||||
self.doubleClicked.connect(self._onDoubleClick)
|
self.doubleClicked.connect(self._onDoubleClick)
|
||||||
|
self.collapsed.connect(self._onNodeCollapsed)
|
||||||
|
self.expanded.connect(self._onNodeExpanded)
|
||||||
|
|
||||||
# Auto Scroll
|
# Auto Scroll
|
||||||
# self._scrollMargin = SHARED.theme.baseIconHeight
|
# self._scrollMargin = SHARED.theme.baseIconHeight
|
||||||
@@ -865,6 +851,20 @@ class GuiProjectTree(QTreeView):
|
|||||||
self.setExpanded(index, not self.isExpanded(index))
|
self.setExpanded(index, not self.isExpanded(index))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(QModelIndex)
|
||||||
|
def _onNodeCollapsed(self, index: QModelIndex) -> None:
|
||||||
|
"""Capture a node collapse, and pass it to the model."""
|
||||||
|
if node := self._getNode(index):
|
||||||
|
node.item.setExpanded(False)
|
||||||
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(QModelIndex)
|
||||||
|
def _onNodeExpanded(self, index: QModelIndex) -> None:
|
||||||
|
"""Capture a node expand, and pass it to the model."""
|
||||||
|
if node := self._getNode(index):
|
||||||
|
node.item.setExpanded(True)
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Internal Functions
|
# Internal Functions
|
||||||
##
|
##
|
||||||
|
|||||||
+15
-3
@@ -44,7 +44,7 @@ from novelwriter.dialogs.about import GuiAbout
|
|||||||
from novelwriter.dialogs.preferences import GuiPreferences
|
from novelwriter.dialogs.preferences import GuiPreferences
|
||||||
from novelwriter.dialogs.projectsettings import GuiProjectSettings
|
from novelwriter.dialogs.projectsettings import GuiProjectSettings
|
||||||
from novelwriter.dialogs.wordlist import GuiWordList
|
from novelwriter.dialogs.wordlist import GuiWordList
|
||||||
from novelwriter.enum import nwDocAction, nwDocInsert, nwDocMode, nwFocus, nwView
|
from novelwriter.enum import nwDocAction, nwDocInsert, nwDocMode, nwFocus, nwItemType, nwView
|
||||||
from novelwriter.gui.doceditor import GuiDocEditor
|
from novelwriter.gui.doceditor import GuiDocEditor
|
||||||
from novelwriter.gui.docviewer import GuiDocViewer
|
from novelwriter.gui.docviewer import GuiDocViewer
|
||||||
from novelwriter.gui.docviewerpanel import GuiDocViewerPanel
|
from novelwriter.gui.docviewerpanel import GuiDocViewerPanel
|
||||||
@@ -62,6 +62,7 @@ from novelwriter.tools.manuscript import GuiManuscript
|
|||||||
from novelwriter.tools.noveldetails import GuiNovelDetails
|
from novelwriter.tools.noveldetails import GuiNovelDetails
|
||||||
from novelwriter.tools.welcome import GuiWelcome
|
from novelwriter.tools.welcome import GuiWelcome
|
||||||
from novelwriter.tools.writingstats import GuiWritingStats
|
from novelwriter.tools.writingstats import GuiWritingStats
|
||||||
|
from novelwriter.types import QtModShift
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -298,10 +299,18 @@ class GuiMain(QMainWindow):
|
|||||||
self.keyReturn.setKey("Return")
|
self.keyReturn.setKey("Return")
|
||||||
self.keyReturn.activated.connect(self._keyPressReturn)
|
self.keyReturn.activated.connect(self._keyPressReturn)
|
||||||
|
|
||||||
|
self.keyShiftReturn = QShortcut(self)
|
||||||
|
self.keyShiftReturn.setKey("Shift+Return")
|
||||||
|
self.keyShiftReturn.activated.connect(self._keyPressReturn)
|
||||||
|
|
||||||
self.keyEnter = QShortcut(self)
|
self.keyEnter = QShortcut(self)
|
||||||
self.keyEnter.setKey("Enter")
|
self.keyEnter.setKey("Enter")
|
||||||
self.keyEnter.activated.connect(self._keyPressReturn)
|
self.keyEnter.activated.connect(self._keyPressReturn)
|
||||||
|
|
||||||
|
self.keyShiftEnter = QShortcut(self)
|
||||||
|
self.keyShiftEnter.setKey("Shift+Enter")
|
||||||
|
self.keyShiftEnter.activated.connect(self._keyPressReturn)
|
||||||
|
|
||||||
self.keyEscape = QShortcut(self)
|
self.keyEscape = QShortcut(self)
|
||||||
self.keyEscape.setKey("Esc")
|
self.keyEscape.setKey("Esc")
|
||||||
self.keyEscape.activated.connect(self._keyPressEscape)
|
self.keyEscape.activated.connect(self._keyPressEscape)
|
||||||
@@ -719,8 +728,11 @@ class GuiMain(QMainWindow):
|
|||||||
logger.warning("No item selected")
|
logger.warning("No item selected")
|
||||||
return
|
return
|
||||||
|
|
||||||
if tHandle:
|
if tHandle and SHARED.project.tree.checkType(tHandle, nwItemType.FILE):
|
||||||
self.openDocument(tHandle, sTitle=sTitle, changeFocus=False, doScroll=False)
|
if QApplication.keyboardModifiers() == QtModShift:
|
||||||
|
self.viewDocument(tHandle)
|
||||||
|
else:
|
||||||
|
self.openDocument(tHandle, sTitle=sTitle, changeFocus=False, doScroll=False)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user