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
|
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
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
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()]:
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
|