Evolve Nautilus extension to work on multiple files.
Chris Pressey
22 days ago
28 | 28 | pass |
29 | 29 | |
30 | 30 | def get_file_items(self, window, files): |
31 | ||
32 | # For now, only add these menu items if one file is selected. | |
33 | if not files or len(files) > 1: | |
31 | if not files: | |
34 | 32 | return |
35 | 33 | |
36 | file = files[0] | |
37 | filename = unquote(file.get_uri()[7:]) | |
34 | filenames = [unquote(file.get_uri()[7:]) for file in files] | |
38 | 35 | |
39 | print("tagfarm extension. Filename:", filename) | |
36 | print("tagfarm extension. Filenames:", filenames) | |
40 | 37 | |
41 | tags, available_tags = self._get_tags(filename) | |
38 | # TODO make this more efficient. tagfarm showtags --json. | |
39 | # indeed, importing the tagfarm.utils module! ... but paths. | |
40 | all_tags = set() | |
41 | all_available_tags = set() | |
42 | for filename in filenames: | |
43 | tags, available_tags = self._get_tags(filename) | |
44 | all_tags |= tags | |
45 | all_available_tags |= available_tags | |
42 | 46 | |
43 | 47 | menu_items = [] |
44 | 48 | if available_tags: |
45 | menu_items.append(self._create_add_tag_submenu(filename, available_tags)) | |
49 | menu_items.append(self._create_add_tag_submenu(filenames, available_tags)) | |
46 | 50 | if tags: |
47 | menu_items.append(self._create_remove_tag_submenu(filename, tags)) | |
51 | menu_items.append(self._create_remove_tag_submenu(filenames, tags)) | |
48 | 52 | |
49 | 53 | return menu_items |
50 | 54 | |
51 | def _create_remove_tag_submenu(self, filename, tags): | |
55 | def _create_remove_tag_submenu(self, filenames, tags): | |
52 | 56 | # For "Remove Tag" submenu: create parent menu item, containing |
53 | # a submenu, with one submenu item per tag on the file. | |
57 | # a submenu, with one submenu item per tag on at least one file. | |
54 | 58 | menu_item = Nautilus.MenuItem( |
55 | 59 | name="NautilusPython::tagfarm_remove_tags", |
56 | 60 | label="Remove Tag", |
57 | tip="Remove tag from selected file" | |
61 | tip="Remove tag from selected files" | |
58 | 62 | ) |
59 | 63 | |
60 | 64 | submenu = Nautilus.Menu() |
64 | 68 | tag_item = Nautilus.MenuItem( |
65 | 69 | name=f"NautilusPython::tagfarm_remove_tag_{i}", |
66 | 70 | label=tag, |
67 | tip=f"Remove tag '{tag}' from file" | |
71 | tip=f"Remove tag '{tag}' from files" | |
68 | 72 | ) |
69 | tag_item.connect('activate', self._remove_tag, tag, filename) | |
73 | tag_item.connect('activate', self._remove_tag, tag, filenames) | |
70 | 74 | submenu.append_item(tag_item) |
71 | 75 | |
72 | 76 | return menu_item |
73 | 77 | |
74 | def _create_add_tag_submenu(self, filename, tags): | |
78 | def _create_add_tag_submenu(self, filenames, tags): | |
75 | 79 | # For "Add Tag" submenu: create parent menu item, containing |
76 | # a submenu, with one submenu item per tag *not* on the file. | |
80 | # a submenu, with one submenu item per tag *not* on at least one file. | |
77 | 81 | menu_item = Nautilus.MenuItem( |
78 | 82 | name="NautilusPython::tagfarm_add_tags", |
79 | 83 | label="Add Tag", |
80 | tip="Add tag to selected file" | |
84 | tip="Add tag to selected files" | |
81 | 85 | ) |
82 | 86 | |
83 | 87 | submenu = Nautilus.Menu() |
87 | 91 | tag_item = Nautilus.MenuItem( |
88 | 92 | name=f"NautilusPython::tagfarm_add_tag_{i}", |
89 | 93 | label=tag, |
90 | tip=f"Add tag '{tag}' to file" | |
94 | tip=f"Add tag '{tag}' to files" | |
91 | 95 | ) |
92 | tag_item.connect('activate', self._add_tag, tag, filename) | |
96 | tag_item.connect('activate', self._add_tag, tag, filenames) | |
93 | 97 | submenu.append_item(tag_item) |
94 | 98 | |
95 | 99 | return menu_item |
119 | 123 | else: |
120 | 124 | return ([], []) |
121 | 125 | |
122 | def _add_tag(self, menu, tag, filename): | |
123 | working_dir = os.path.dirname(filename) | |
124 | filename = os.path.basename(filename) | |
126 | def _add_tag(self, menu, tag, filenames): | |
127 | working_dir = os.path.dirname(filenames[0]) | |
128 | base_filenames = [os.path.basename(filename) for filename in filenames] | |
125 | 129 | |
126 | subprocess.run(["tagfarm", "tag", tag, filename], cwd=working_dir) | |
130 | subprocess.run(["tagfarm", "tag", tag] + base_filenames, cwd=working_dir) | |
127 | 131 | |
128 | def _remove_tag(self, menu, tag, filename): | |
129 | working_dir = os.path.dirname(filename) | |
130 | filename = os.path.basename(filename) | |
132 | def _remove_tag(self, menu, tag, filenames): | |
133 | working_dir = os.path.dirname(filenames[0]) | |
134 | base_filenames = [os.path.basename(filename) for filename in filenames] | |
131 | 135 | |
132 | subprocess.run(["tagfarm", "untag", tag, filename], cwd=working_dir) | |
136 | subprocess.run(["tagfarm", "untag", tag] + base_filenames, cwd=working_dir) |