Skip to content

Commit 16f7079

Browse files
committed
Improve filtype filtering
1 parent f7d3ea8 commit 16f7079

3 files changed

Lines changed: 29 additions & 25 deletions

File tree

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@
4343
keywords=['tkinter', 'filedialog', 'filebrowser'],
4444
packages=["tkfilebrowser"],
4545
package_data={"tkfilebrowser": ["images/*"]},
46-
requires=["os", "locale", "time", "psutil", "tkinter", "math", "urllib", "babel"])
46+
requires=["os", "locale", "time", "psutil", "tkinter", "math", "urllib", "babel",
47+
"re", "subprocess"])

tkfilebrowser/__main__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def c_save_old():
5555

5656
def c_open_file():
5757
rep = askopenfilenames(parent=root, initialdir='/', initialfile='tmp',
58-
filetypes=[("Pictures", "*.png|*.jpg|*.JPG"), ("All files", "*")])
58+
# filetypes=[("Pictures", "*.png|*.jpg|*.JPG"), ("All files", "*")])
59+
filetypes=[("archive", "*.tar.*"), ("archive gzip", "*.tar.gz"), ("All files", "*")])
5960
print(rep)
6061

6162

@@ -66,7 +67,11 @@ def c_open_dir():
6667

6768
def c_save():
6869
rep = asksaveasfilename(parent=root, defaultext=".png", initialdir='/tmp', initialfile='image.png',
69-
filetypes=[("Pictures", "*.png|*.jpg|*.JPG"), ("All files", "*")])
70+
filetypes=[("Pictures", "*.png|*.jpg|*.JPG"),
71+
("PNG", "*.png"),
72+
("archive", "*.tar.*"),
73+
("archive gzip", "*.tar.gz"),
74+
("All files", "*")])
7075
print(rep)
7176

7277

tkfilebrowser/filebrowser.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@
1919
2020
Main class
2121
"""
22-
# TODO: fix filetype display for extensions like .tar.xz
23-
# TODO: improve extension change
2422

2523

2624
import psutil
25+
from re import search
2726
from subprocess import check_output
2827
from os import walk, mkdir, stat, access, W_OK
2928
from os.path import exists, join, getmtime, realpath, split, expanduser, \
@@ -183,7 +182,7 @@ def __init__(self, parent, initialdir="", initialfile="", mode="openfile",
183182
for name, exts in filetypes:
184183
if name not in self.filetypes:
185184
self.filetypes[name] = []
186-
self.filetypes[name].extend([ext.split("*")[-1].strip() for ext in exts.split("|")])
185+
self.filetypes[name] = r'%s$' % exts.strip().replace('.', '\.').replace('*', '.*')
187186
values = list(self.filetypes.keys())
188187
w = max([len(f) for f in values] + [5])
189188
b_filetype = ttk.Combobox(self, textvariable=self.filetype,
@@ -197,10 +196,8 @@ def __init__(self, parent, initialdir="", initialfile="", mode="openfile",
197196
self.filetype.trace_add('write', lambda *args: self._change_filetype())
198197
except AttributeError:
199198
self.filetype.trace('w', lambda *args: self._change_filetype())
200-
# b_filetype.bind('<<ComboboxSelected>>',
201-
# lambda e: self._change_filetype())
202199
else:
203-
self.filetypes[""] = [""]
200+
self.filetypes[""] = ".*"
204201

205202
# --- recent files
206203
self._recent_files = RecentFiles(cst.RECENT_FILES, 30)
@@ -720,8 +717,7 @@ def _display_recents(self):
720717
f = "/"
721718
if islink(p):
722719
if isfile(p):
723-
ext = splitext(f)[-1]
724-
if extension == [""] or ext in extension:
720+
if search(extension, f):
725721
tags.append("file_link")
726722
stats = stat(p)
727723
vals = (p, display_size(stats.st_size),
@@ -730,8 +726,7 @@ def _display_recents(self):
730726
tags.append("folder_link")
731727
vals = (p, "", get_modification_date(p))
732728
elif isfile(p):
733-
ext = splitext(f)[-1]
734-
if extension == [""] or ext in extension:
729+
if search(extension, f):
735730
tags.append("file")
736731
stats = stat(p)
737732
vals = (p, display_size(stats.st_size),
@@ -774,11 +769,16 @@ def _change_filetype(self):
774769
else:
775770
self._display_recents()
776771
if self.mode == 'save':
777-
name, ext = splitext(self.entry.get())
778-
new_ext = self.filetypes[self.filetype.get()][0]
779-
if new_ext and ext not in self.filetypes[self.filetype.get()]:
780-
self.entry.delete(len(name), 'end')
781-
self.entry.insert('end', new_ext)
772+
filename = self.entry.get()
773+
new_ext = self.filetypes[self.filetype.get()]
774+
if filename and not search(new_ext, filename):
775+
old_ext = search(r'\..+$', filename).group()
776+
exts = [e[2:].replace('\.', '.') for e in new_ext[:-1].split('|')]
777+
exts = [e for e in exts if search(r'\.[^\*]+$', e)]
778+
if exts:
779+
filename = filename.replace(old_ext, exts[0])
780+
self.entry.delete(0, 'end')
781+
self.entry.insert(0, filename)
782782

783783
# --- path completion in entries: key bindings
784784
def _down(self, event):
@@ -835,12 +835,11 @@ def _completion(self, action, modif, pos, prev_txt):
835835
if self.mode is not "opendir":
836836
files.sort(key=lambda n: n.lower())
837837
extension = self.filetypes[self.filetype.get()]
838-
if extension == [""]:
838+
if extension == ".*":
839839
l2.extend([i.replace(" ", "\ ") for i in files if i[:len(f)] == f])
840840
else:
841841
for i in files:
842-
ext = splitext(i)[-1]
843-
if ext in extension and i[:len(f)] == f:
842+
if search(extension, i) and i[:len(f)] == f:
844843
l2.append(i.replace(" ", "\ "))
845844
l2.extend([i.replace(" ", "\ ") + "/" for i in dirs if i[:len(f)] == f])
846845

@@ -997,7 +996,7 @@ def _display_folder_walk(self, folder, reset=True, update_bar=True):
997996
# display files
998997
files.sort(key=lambda n: n.lower())
999998
extension = self.filetypes[self.filetype.get()]
1000-
if extension == [""]:
999+
if extension == ".*":
10011000
for f in files:
10021001
p = join(root, f)
10031002
if islink(p):
@@ -1027,8 +1026,7 @@ def _display_folder_walk(self, folder, reset=True, update_bar=True):
10271026
display_modification_date(stats.st_mtime)))
10281027
else:
10291028
for f in files:
1030-
ext = splitext(f)[-1]
1031-
if ext in extension:
1029+
if search(extension, f):
10321030
p = join(root, f)
10331031
if islink(p):
10341032
tags = ("file_link",)
@@ -1126,7 +1124,7 @@ def _display_folder_scandir(self, folder, reset=True, update_bar=True):
11261124
i += 1
11271125
stats = f.stat()
11281126
if b_file:
1129-
if (extension == [""] or splitext(name)[-1] in extension):
1127+
if search(extension, name):
11301128
self.right_tree.insert("", "end", f.path, text=name, tags=tags,
11311129
values=("",
11321130
display_size(stats.st_size),

0 commit comments

Comments
 (0)