Add a common function to open file paths externally
This commit is contained in:
+14
-1
@@ -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
|
||||||
# =============================================================================================== #
|
# =============================================================================================== #
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user