Add a common function to open file paths externally

This commit is contained in:
Veronica Berglyd Olsen
2023-11-23 16:43:56 +01:00
parent 4f9aab3c81
commit 30b4e5511a
4 changed files with 23 additions and 20 deletions
+14 -1
View File
@@ -33,8 +33,11 @@ from typing import Any, Literal
from pathlib import Path from pathlib import Path
from datetime import datetime from datetime import datetime
from configparser import ConfigParser from configparser import ConfigParser
from urllib.parse import urljoin
from urllib.request import pathname2url
from PyQt5.QtCore import QCoreApplication from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QCoreApplication, QUrl
from PyQt5.QtWidgets import QWidget, qApp from PyQt5.QtWidgets import QWidget, qApp
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
@@ -495,6 +498,16 @@ def getFileSize(path: Path) -> int:
return -1 return -1
def openExternalPath(path: Path) -> bool:
"""Open a path by passing it to the desktop environment."""
if Path(path).exists():
QDesktopServices.openUrl(
QUrl(urljoin("file:", pathname2url(str(path))))
)
return True
return False
# =============================================================================================== # # =============================================================================================== #
# Other Functions # Other Functions
# =============================================================================================== # # =============================================================================================== #
+2 -2
View File
@@ -45,7 +45,7 @@ from novelwriter.core.sessions import NWSessionLog
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectdata import NWProjectData
from novelwriter.common import ( from novelwriter.common import (
checkStringNone, formatInt, formatTimeStamp, hexToInt, makeFileNameSafe, minmax checkStringNone, formatInt, formatTimeStamp, getFileSize, hexToInt, makeFileNameSafe, minmax
) )
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
@@ -420,7 +420,7 @@ class NWProject:
timeStamp = formatTimeStamp(time(), fileSafe=True) timeStamp = formatTimeStamp(time(), fileSafe=True)
archName = baseDir / f"{cleanName} {timeStamp}.zip" archName = baseDir / f"{cleanName} {timeStamp}.zip"
if self._storage.zipIt(archName, compression=2): if self._storage.zipIt(archName, compression=2):
size = formatInt(archName.stat().st_size) size = formatInt(getFileSize(archName))
if doNotify: if doNotify:
SHARED.info( SHARED.info(
self.tr("Created a backup of your project of size {0}B.").format(size), self.tr("Created a backup of your project of size {0}B.").format(size),
+3 -6
View File
@@ -27,15 +27,14 @@ import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from pathlib import Path from pathlib import Path
from urllib.parse import urljoin
from urllib.request import pathname2url
from PyQt5.QtCore import QUrl, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QUrl, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QMenuBar, QAction from PyQt5.QtWidgets import QMenuBar, QAction
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget
from novelwriter.common import openExternalPath
from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
@@ -111,9 +110,7 @@ class GuiMainMenu(QMenuBar):
def _openUserManualFile(self) -> None: def _openUserManualFile(self) -> None:
"""Open the documentation in PDF format.""" """Open the documentation in PDF format."""
if isinstance(CONFIG.pdfDocs, Path): if isinstance(CONFIG.pdfDocs, Path):
QDesktopServices.openUrl( openExternalPath(CONFIG.pdfDocs)
QUrl(urljoin("file:", pathname2url(str(CONFIG.pdfDocs))))
)
return return
@pyqtSlot(str) @pyqtSlot(str)
+4 -11
View File
@@ -27,19 +27,17 @@ import logging
from pathlib import Path from pathlib import Path
from zipfile import ZipFile from zipfile import ZipFile
from urllib.parse import urljoin
from urllib.request import pathname2url
from PyQt5.QtGui import QCloseEvent, QDesktopServices, QTextCursor from PyQt5.QtGui import QCloseEvent, QTextCursor
from PyQt5.QtCore import QUrl, pyqtSlot from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QDialog, QDialogButtonBox, QFileDialog, QFrame, QHBoxLayout, QLabel, QDialog, QDialogButtonBox, QFileDialog, QFrame, QHBoxLayout, QLabel,
QLineEdit, QPlainTextEdit, QPushButton, QVBoxLayout, QWidget, qApp QLineEdit, QPlainTextEdit, QPushButton, QVBoxLayout, QWidget, qApp
) )
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.common import formatInt, getFileSize
from novelwriter.error import formatException from novelwriter.error import formatException
from novelwriter.common import openExternalPath, formatInt, getFileSize
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -217,12 +215,7 @@ class GuiDictionaries(QDialog):
@pyqtSlot() @pyqtSlot()
def _doOpenInstallLocation(self) -> None: def _doOpenInstallLocation(self) -> None:
"""Open the dictionary folder.""" """Open the dictionary folder."""
path = self.inPath.text() if not openExternalPath(Path(self.inPath.text())):
if Path(path).is_dir():
QDesktopServices.openUrl(
QUrl(urljoin("file:", pathname2url(path)))
)
else:
SHARED.error("Path not found.") SHARED.error("Path not found.")
return return