Skip to content

Commit e630abe

Browse files
committed
Merge branch 'select_all'
Add select all on Ctrl+A if multiple selection is enabled
2 parents 7fb7de5 + 9583085 commit e630abe

5 files changed

Lines changed: 103 additions & 13 deletions

File tree

README.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ Documentation
115115
Changelog
116116
---------
117117

118-
- tkfilebrowser 2.1.2
118+
- tkfilebrowser 2.2.0
119119
* Use babel instead of locale in order not to change the locale globally
120-
* Speed up (a little) folder content display
120+
* Speed up (a little) folder content display (only python >= 3.5)
121+
* Improve example: add comparison with default dialogs
122+
* Add select all on Ctrl+A if multiple selection is enabled
121123

122124
- tkfilebrowser 2.1.1
123125
* Fix error if LOCAL_PATH does not exists or is not writtable

changelog

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1+
12
tkfilebrowser - Alternative to filedialog for Tkinter
23
=====================================================
34
Copyright 2017 Juliette Monsel <j_4321@protonmail.com>
45

56
Changelog
67
---------
78

8-
- tkfilebrowser 2.1.2
9+
- tkfilebrowser 2.2.0
910
* Use babel instead of locale in order not to change the locale globally
1011
* Speed up (a little) folder content display
11-
12+
* Improve example: add comparison with default dialogs
13+
* Add select all on Ctrl+A if multiple selection is enabled
14+
1215
- tkfilebrowser 2.1.1
1316
* Fix error if LOCAL_PATH does not exists or is not writtable
1417

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
long_description = f.read()
1313

1414
setup(name='tkfilebrowser',
15-
version='2.1.3',
15+
version='2.2.0',
1616
description='File browser for Tkinter, alternative to tkinter.filedialog in linux with GTK bookmarks support.',
1717
long_description=long_description,
1818
url='https://github.com/j4321/tkFileBrowser',

tests/test_filebrowser.py

Lines changed: 82 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,104 @@
44
import ttk
55
except ImportError:
66
from tkinter import ttk
7+
import os
78

89

910
class TestFileBrowser(BaseWidgetTest):
10-
def test_filebrowser(self):
11+
def test_filebrowser_opendir(self):
12+
# --- multiple selection
13+
path = os.path.expanduser('~')
14+
fb = FileBrowser(self.window, initialdir=path, initialfile="test", mode="opendir",
15+
multiple_selection=True, defaultext=".png",
16+
title="Test", filetypes=[],
17+
okbuttontext=None, cancelbuttontext="Cancel",
18+
foldercreation=False)
19+
self.window.update()
20+
fb.right_tree.focus_force()
21+
self.window.update()
22+
fb.event_generate('<Control-a>')
23+
self.window.update()
24+
self.window.update_idletasks()
25+
fb.validate()
26+
walk = os.walk(path)
27+
root, dirs, _ = walk.send(None)
28+
res = list(fb.get_result())
29+
res.sort()
30+
dirs = [os.path.realpath(os.path.join(root, d)) for d in dirs]
31+
dirs.sort()
32+
self.assertEqual(res, dirs)
33+
# --- single selection
1134
fb = FileBrowser(self.window, initialdir=".", initialfile="test", mode="opendir",
35+
multiple_selection=False, defaultext=".png",
36+
title="Test", filetypes=[],
37+
okbuttontext=None, cancelbuttontext="Cancel",
38+
foldercreation=False)
39+
self.window.update()
40+
fb.validate()
41+
self.assertTrue(os.path.isdir(fb.get_result()))
42+
43+
def test_filebrowser_openfile(self):
44+
# --- multiple selection
45+
path = os.path.expanduser('~')
46+
fb = FileBrowser(self.window, initialdir=path, initialfile="test", mode="openfile",
1247
multiple_selection=True, defaultext=".png",
1348
title="Test", filetypes=[],
1449
okbuttontext=None, cancelbuttontext="Cancel",
1550
foldercreation=False)
1651
self.window.update()
17-
fb.destroy()
52+
fb.right_tree.focus_force()
53+
self.window.update()
54+
fb.event_generate('<Control-a>')
55+
self.window.update()
56+
self.window.update_idletasks()
57+
fb.validate()
58+
walk = os.walk(path)
59+
root, _, files = walk.send(None)
60+
res = list(fb.get_result())
61+
res.sort()
62+
files = [os.path.realpath(os.path.join(root, f)) for f in files]
63+
files.sort()
64+
self.assertEqual(res, files)
65+
# --- single selection
1866
fb = FileBrowser(self.window, initialdir=".", initialfile="test", mode="openfile",
19-
multiple_selection=True, defaultext=".png",
67+
multiple_selection=False, defaultext="",
68+
title="Test", filetypes=[("PNG", '*.png'), ('ALL', '*')],
69+
okbuttontext=None, cancelbuttontext="Cancel",
70+
foldercreation=False)
71+
self.window.update()
72+
fb.validate()
73+
self.assertEqual(fb.get_result(), '')
74+
fb = FileBrowser(self.window, initialdir=".", initialfile="test", mode="openfile",
75+
multiple_selection=False, defaultext="",
76+
title="Test", filetypes=[("PNG", '*.png'), ('ALL', '*')],
77+
okbuttontext=None, cancelbuttontext="Cancel",
78+
foldercreation=False)
79+
self.window.update()
80+
fb.validate()
81+
self.assertEqual(fb.get_result(), '')
82+
fb = FileBrowser(self.window, initialdir=".", initialfile="test", mode="openfile",
83+
multiple_selection=False, defaultext="",
2084
title="Test", filetypes=[],
2185
okbuttontext=None, cancelbuttontext="Cancel",
2286
foldercreation=False)
2387
self.window.update()
24-
fb.destroy()
88+
walk = os.walk(os.path.abspath("."))
89+
root, _, files = walk.send(None)
90+
files = fb.right_tree.tag_has('file')
91+
if files:
92+
fb.right_tree.selection_set(files[0])
93+
fb.validate()
94+
self.assertTrue(os.path.isfile(fb.get_result()))
95+
else:
96+
fb.validate()
97+
self.assertEqual(fb.get_result(), '')
98+
99+
def test_filebrowser_save(self):
25100
fb = FileBrowser(self.window, initialdir="/", initialfile="test", mode="save",
26101
multiple_selection=True, defaultext=".png",
27102
title="Test", filetypes=[("PNG", '*.png'), ('ALL', '*')],
28103
okbuttontext=None, cancelbuttontext="Cancel",
29-
foldercreation=False)
104+
foldercreation=True)
30105
self.window.update()
31-
fb.destroy()
32-
33-
106+
fb.validate()
107+
self.assertEqual(fb.get_result(), '/test.png')

tkfilebrowser/filebrowser.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ def __init__(self, parent, initialdir="", initialfile="", mode="openfile",
407407
self.right_tree.bind("<Double-1>", self._select)
408408
self.right_tree.bind("<Return>", self._select)
409409
self.right_tree.bind("<Left>", self._go_left)
410+
if multiple_selection:
411+
self.right_tree.bind("<Control-a>", self._right_tree_select_all)
410412

411413
if mode == "opendir":
412414
self.right_tree.bind("<<TreeviewSelect>>",
@@ -452,6 +454,15 @@ def __init__(self, parent, initialdir="", initialfile="", mode="openfile",
452454
self.update_idletasks()
453455
self.lift()
454456

457+
def _right_tree_select_all(self, event):
458+
if self.mode == 'opendir':
459+
tags = ['folder', 'folder_link']
460+
else:
461+
tags = ['file', 'file_link']
462+
items = self.right_tree.tag_has(tags[0]) + self.right_tree.tag_has(tags[1])
463+
self.right_tree.selection_clear()
464+
self.right_tree.selection_set(items)
465+
455466
def _select_all(self, event):
456467
"""Select all entry content."""
457468
event.widget.selection_range(0, "end")

0 commit comments

Comments
 (0)