diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 488353b3..3f2bc134 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -296,7 +296,8 @@ def _createApp(style: str) -> QApplication: """Create the app. This is done in a function to make it easier to block app creation during testing. """ - app = QApplication([CONFIG.appName, f"-style={style}"]) + app = QApplication([CONFIG.appName]) + app.setStyle(style) app.setApplicationName(CONFIG.appName) app.setApplicationVersion(__version__) app.setOrganizationDomain(__domain__) diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index a67aafa7..a2acd53f 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -28,13 +28,13 @@ import logging from PyQt6.QtCore import pyqtSlot from PyQt6.QtWidgets import ( - QAbstractItemView, QComboBox, QDialogButtonBox, QGridLayout, QLabel, - QListWidget, QListWidgetItem, QVBoxLayout, QWidget + QAbstractItemView, QDialogButtonBox, QGridLayout, QLabel, QListWidget, + QListWidgetItem, QVBoxLayout, QWidget ) from novelwriter import SHARED from novelwriter.extensions.configlayout import NColorLabel -from novelwriter.extensions.modified import NDialog +from novelwriter.extensions.modified import NComboBox, NDialog from novelwriter.extensions.switch import NSwitch from novelwriter.types import QtAccepted, QtDialogCancel, QtDialogOk, QtUserRole @@ -79,7 +79,7 @@ class GuiDocSplit(NDialog): self.listBox.setMinimumWidth(400) self.listBox.setMinimumHeight(180) - self.splitLevel = QComboBox(self) + self.splitLevel = NComboBox(self) self.splitLevel.addItem(self.tr("Split on Heading Level 1 (Partition)"), 1) self.splitLevel.addItem(self.tr("Split up to Heading Level 2 (Chapter)"), 2) self.splitLevel.addItem(self.tr("Split up to Heading Level 3 (Scene)"), 3) diff --git a/novelwriter/extensions/modified.py b/novelwriter/extensions/modified.py index 9bea4c78..4b2f663e 100644 --- a/novelwriter/extensions/modified.py +++ b/novelwriter/extensions/modified.py @@ -117,12 +117,19 @@ class NTreeView(QTreeView): class NComboBox(QComboBox): - def __init__(self, parent: QWidget | None = None) -> None: + def __init__(self, parent: QWidget | None = None, maxItems: int = 15) -> None: super().__init__(parent=parent) self.setFocusPolicy(Qt.FocusPolicy.StrongFocus) + self.setMaxVisibleItems(maxItems) + + # The style sheet disables Fusion style pop-up mode on some platforms + # and allows for scrolling of long lists of items + self.setStyleSheet("QComboBox {combobox-popup: 0;}") + return def wheelEvent(self, event: QWheelEvent) -> None: + """Only capture the mouse wheel if the widget has focus.""" if self.hasFocus(): super().wheelEvent(event) else: diff --git a/novelwriter/extensions/novelselector.py b/novelwriter/extensions/novelselector.py index ee585a0d..e3b1e93f 100644 --- a/novelwriter/extensions/novelselector.py +++ b/novelwriter/extensions/novelselector.py @@ -25,14 +25,19 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING + from PyQt6.QtCore import pyqtSignal, pyqtSlot from PyQt6.QtGui import QPalette -from PyQt6.QtWidgets import QComboBox, QWidget +from PyQt6.QtWidgets import QComboBox from novelwriter import SHARED from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass +if TYPE_CHECKING: + from PyQt6.QtWidgets import QWidget + logger = logging.getLogger(__name__) diff --git a/novelwriter/types.py b/novelwriter/types.py index fb0faebd..ead3397f 100644 --- a/novelwriter/types.py +++ b/novelwriter/types.py @@ -126,6 +126,7 @@ QtHeaderFixed = QHeaderView.ResizeMode.Fixed # Scroll Bar Policy +QtScrollAlwaysOn = Qt.ScrollBarPolicy.ScrollBarAlwaysOn QtScrollAlwaysOff = Qt.ScrollBarPolicy.ScrollBarAlwaysOff QtScrollAsNeeded = Qt.ScrollBarPolicy.ScrollBarAsNeeded