1919
2020Main class
2121"""
22- # TODO: fix filetype display for extensions like .tar.xz
23- # TODO: improve extension change
2422
2523
2624import psutil
25+ from re import search
2726from subprocess import check_output
2827from os import walk , mkdir , stat , access , W_OK
2928from 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