1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from __future__ import annotations
from enum import Enum, auto
from PySide6.QtWidgets import (QMessageBox)
from PySide6.QtCore import (QFileInfo, QMimeDatabase, QTimer)
from txtviewer.txtviewer import TxtViewer
from jsonviewer.jsonviewer import JsonViewer
from pdfviewer.pdfviewer import PdfViewer
from imageviewer.imageviewer import ImageViewer
class DefaultPolicy(Enum):
NeverDefault = auto()
DefaultToTxtViewer = auto()
DefaultToCustomViewer = auto()
class ViewerFactory:
def __init__(self, displayWidget, mainWindow,
policy=DefaultPolicy.NeverDefault):
self._viewers = {}
self._defaultViewer = None
self._defaultWarning = True
self._defaultPolicy = policy
self._displayWidget = displayWidget
self._mainWindow = mainWindow
self._mimeTypes = []
for v in [PdfViewer(), JsonViewer(), TxtViewer(), ImageViewer()]:
self._viewers[v.viewerName()] = v
if v.isDefaultViewer():
self._defaultViewer = v
def defaultPolicy(self):
return self._defaultPolicy
def setDefaultPolicy(self, policy):
self._defaultPolicy = policy
def defaultWarning(self):
return self._defaultWarning
def setDefaultWarning(self, on):
self._defaultWarning = on
def viewer(self, file):
info = QFileInfo(file)
db = QMimeDatabase()
mimeType = db.mimeTypeForFile(info)
viewer = self.viewerForMimeType(mimeType)
if not viewer:
print(f"Mime type {mimeType.name()} not supported.")
return None
viewer.init(file, self._displayWidget, self._mainWindow)
return viewer
def viewerNames(self, showDefault=False):
if not showDefault:
return self._viewers.keys()
list = []
for name, viewer in self._viewers.items():
if ((self._defaultViewer and viewer.isDefaultViewer())
or (not self._defaultViewer and name == "TxtViewer")):
name += "(default)"
list.append(name)
return list
def viewers(self):
return self._viewers.values()
def findViewer(self, viewerName):
for viewer in self.viewers():
if viewer.viewerName() == viewerName:
return viewer
print(f"Plugin {viewerName} not loaded.")
return None
def viewerForMimeType(self, mimeType):
for viewer in self.viewers():
for type in viewer.supportedMimeTypes():
if mimeType.inherits(type):
return viewer
viewer = self.defaultViewer()
if self._defaultWarning:
mbox = QMessageBox()
mbox.setIcon(QMessageBox.Warning)
name = mimeType.name()
viewer_name = viewer.viewerName()
m = f"Mime type {name} not supported. Falling back to {viewer_name}."
mbox.setText(m)
mbox.setStandardButtons(QMessageBox.Ok)
QTimer.singleShot(8000, mbox.close)
mbox.exec()
return viewer
def defaultViewer(self):
if self._defaultPolicy == DefaultPolicy.NeverDefault:
return None
if self._defaultPolicy == DefaultPolicy.DefaultToCustomViewer and self._defaultViewer:
return self._defaultViewer
return self.findViewer("TxtViewer")
def supportedMimeTypes(self):
if not self._mimeTypes:
for viewer in self.viewers():
self._mimeTypes.extend(viewer.supportedMimeTypes())
return self._mimeTypes
|