|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a file icon provider determining the icon based on file name. |
|
8 """ |
|
9 |
|
10 import fnmatch |
|
11 |
|
12 from PyQt6.QtGui import QImageReader |
|
13 |
|
14 from eric7.EricGui import EricPixmapCache |
|
15 |
|
16 |
|
17 class EricFileIconProvider: |
|
18 """ |
|
19 Class implementing a file icon provider determining the icon based on file name. |
|
20 """ |
|
21 |
|
22 def __init__(self): |
|
23 """ |
|
24 Constructor |
|
25 """ |
|
26 |
|
27 # pixmap icon names first because some are overwritten later |
|
28 self.__iconMappings = { |
|
29 "*.{0}".format(bytes(f).decode()): "filePixmap" |
|
30 for f in QImageReader.supportedImageFormats() |
|
31 } |
|
32 |
|
33 # specific one next |
|
34 self.__iconMappings.update( |
|
35 { |
|
36 "*.sh": "lexerBash", |
|
37 "*.bash": "lexerBash", |
|
38 "*.bat": "lexerBatch", |
|
39 "*.cmd": "lexerBatch", |
|
40 "*.cpp": "lexerCPP", |
|
41 "*.cxx": "lexerCPP", |
|
42 "*.cc": "lexerCPP", |
|
43 "*.c": "lexerCPP", |
|
44 "*.hpp": "lexerCPP", |
|
45 "*.hh": "lexerCPP", |
|
46 "*.h": "lexerCPP", |
|
47 "*.cs": "lexerCsharp", |
|
48 "CMakeLists.txt": "lexerCMake", |
|
49 "*.cmake": "lexerCMake", |
|
50 "*.cmake.in": "lexerCMake", |
|
51 "*.ctest": "lexerCMake", |
|
52 "*.ctest.in": "lexerCMake", |
|
53 "*.css": "lexerCSS", |
|
54 "*.qss": "lexerCSS", |
|
55 "*.d": "lexerD", |
|
56 "*.di": "lexerD", |
|
57 "*.diff": "lexerDiff", |
|
58 "*.patch": "lexerDiff", |
|
59 "*.html": "lexerHTML", |
|
60 "*.htm": "lexerHTML", |
|
61 "*.asp": "lexerHTML", |
|
62 "*.shtml": "lexerHTML", |
|
63 "*.php": "lexerHTML", |
|
64 "*.php3": "lexerHTML", |
|
65 "*.php4": "lexerHTML", |
|
66 "*.php5": "lexerHTML", |
|
67 "*.phtml": "lexerHTML", |
|
68 "*.docbook": "lexerHTML", |
|
69 "*.ui": "fileDesigner", |
|
70 "*.ts": "fileLinguist", |
|
71 "*.qm": "fileLinguist2", |
|
72 "*.qrc": "fileResource", |
|
73 "*.kid": "lexerHTML", |
|
74 "*.java": "lexerJava", |
|
75 "*.js": "lexerJavaScript", |
|
76 "*.lua": "lexerLua", |
|
77 "*makefile": "lexerMakefile", |
|
78 "Makefile*": "lexerMakefile", |
|
79 "*.mak": "lexerMakefile", |
|
80 "*.pl": "lexerPerl", |
|
81 "*.pm": "lexerPerl", |
|
82 "*.ph": "lexerPerl", |
|
83 "*.pov": "lexerPovray", |
|
84 "*.properties": "lexerProperties", |
|
85 "*.ini": "lexerProperties", |
|
86 "*.inf": "lexerProperties", |
|
87 "*.reg": "lexerProperties", |
|
88 "*.cfg": "lexerProperties", |
|
89 "*.cnf": "lexerProperties", |
|
90 "*.rc": "lexerProperties", |
|
91 "*.py": "lexerPython3", |
|
92 "*.pyw": "lexerPython3", |
|
93 "*.py3": "lexerPython3", |
|
94 "*.pyw3": "lexerPython3", |
|
95 "*.pyx": "lexerCython", |
|
96 "*.pxd": "lexerCython", |
|
97 "*.pxi": "lexerCython", |
|
98 "*.ptl": "lexerPython3", |
|
99 "*.rb": "lexerRuby", |
|
100 "*.rbw": "lexerRuby", |
|
101 "*.sql": "lexerSQL", |
|
102 "*.tex": "lexerTeX", |
|
103 "*.sty": "lexerTeX", |
|
104 "*.aux": "lexerTeX", |
|
105 "*.toc": "lexerTeX", |
|
106 "*.idx": "lexerTeX", |
|
107 "*.vhd": "lexerVHDL", |
|
108 "*.vhdl": "lexerVHDL", |
|
109 "*.tcl": "lexerTCL", |
|
110 "*.tk": "lexerTCL", |
|
111 "*.f": "lexerFortran", |
|
112 "*.for": "lexerFortran", |
|
113 "*.f90": "lexerFortran", |
|
114 "*.f95": "lexerFortran", |
|
115 "*.f2k": "lexerFortran", |
|
116 "*.dpr": "lexerPascal", |
|
117 "*.dpk": "lexerPascal", |
|
118 "*.pas": "lexerPascal", |
|
119 "*.dfm": "lexerPascal", |
|
120 "*.inc": "lexerPascal", |
|
121 "*.pp": "lexerPascal", |
|
122 "*.ps": "lexerPostScript", |
|
123 "*.xml": "lexerXML", |
|
124 "*.xsl": "lexerXML", |
|
125 "*.svg": "fileSvg", |
|
126 "*.xsd": "lexerXML", |
|
127 "*.xslt": "lexerXML", |
|
128 "*.dtd": "lexerXML", |
|
129 "*.rdf": "lexerXML", |
|
130 "*.xul": "lexerXML", |
|
131 "*.yaml": "lexerYAML", |
|
132 "*.yml": "lexerYAML", |
|
133 "*.m": "lexerMatlab", |
|
134 "*.m.matlab": "lexerMatlab", |
|
135 "*.m.octave": "lexerOctave", |
|
136 "*.e4c": "lexerXML", |
|
137 "*.e4d": "lexerXML", |
|
138 "*.e4k": "fileShortcuts", |
|
139 "*.e4m": "fileMultiProject", |
|
140 "*.e4p": "fileProject", |
|
141 "*.e4q": "lexerXML", |
|
142 "*.e4s": "lexerXML", |
|
143 "*.e4t": "lexerXML", |
|
144 "*.e5d": "lexerXML", |
|
145 "*.e5g": "fileUML", |
|
146 "*.e5k": "fileShortcuts", |
|
147 "*.e5m": "fileMultiProject", |
|
148 "*.e5p": "fileProject", |
|
149 "*.e5q": "lexerXML", |
|
150 "*.e5s": "lexerXML", |
|
151 "*.e5t": "lexerXML", |
|
152 "*.e6d": "lexerXML", |
|
153 "*.e6k": "fileShortcuts", |
|
154 "*.e6m": "fileMultiProject", |
|
155 "*.e6p": "fileProject", |
|
156 "*.e6q": "lexerXML", |
|
157 "*.e6s": "lexerXML", |
|
158 "*.e6t": "lexerXML", |
|
159 "*.ecj": "lexerJSON", |
|
160 "*.edj": "lexerJSON", |
|
161 "*.egj": "fileUML", |
|
162 "*.ehj": "lexerJSON", |
|
163 "*.ekj": "fileShortcuts", |
|
164 "*.emj": "fileMultiProject", |
|
165 "*.epj": "fileProject", |
|
166 "*.eqj": "lexerJSON", |
|
167 "*.esj": "lexerJSON", |
|
168 "*.etj": "lexerJSON", |
|
169 "*.ethj": "lexerJSON", |
|
170 "*.po": "lexerGettext", |
|
171 "*.coffee": "lexerCoffeeScript", |
|
172 "*.json": "lexerJSON", |
|
173 "*.md": "lexerMarkdown", |
|
174 "*.toml": "lexerProperties", |
|
175 "Pipfile": "lexerProperties", |
|
176 "poetry.lock": "lexerProperties", |
|
177 "*.pdf": "pdfviewer", |
|
178 } |
|
179 ) |
|
180 |
|
181 def fileIcon(self, name): |
|
182 """ |
|
183 Public method to get an icon for the given file name. |
|
184 |
|
185 @param name file name |
|
186 @type str |
|
187 @return icon |
|
188 @rtype QIcon |
|
189 """ |
|
190 for pat in self.__iconMappings: |
|
191 if fnmatch.fnmatch(name, pat): |
|
192 return EricPixmapCache.getIcon(self.__iconMappings[pat]) |
|
193 else: |
|
194 return EricPixmapCache.getIcon("fileMisc") |
|
195 |
|
196 def fileIconName(self, name): |
|
197 """ |
|
198 Public method to get an icon name for the given file name. |
|
199 |
|
200 @param name file name |
|
201 @type str |
|
202 @return icon name |
|
203 @rtype str |
|
204 """ |
|
205 for pat in self.__iconMappings: |
|
206 if fnmatch.fnmatch(name, pat): |
|
207 return self.__iconMappings[pat] |
|
208 else: |
|
209 return "fileMisc" |