git @ Cat's Eye Technologies tagfarm / 03b248e
Evolve Nautilus extension to work on multiple files. Chris Pressey 22 days ago
1 changed file(s) with 31 addition(s) and 27 deletion(s). Raw diff Collapse all Expand all
2828 pass
2929
3030 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:
3432 return
3533
36 file = files[0]
37 filename = unquote(file.get_uri()[7:])
34 filenames = [unquote(file.get_uri()[7:]) for file in files]
3835
39 print("tagfarm extension. Filename:", filename)
36 print("tagfarm extension. Filenames:", filenames)
4037
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
4246
4347 menu_items = []
4448 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))
4650 if tags:
47 menu_items.append(self._create_remove_tag_submenu(filename, tags))
51 menu_items.append(self._create_remove_tag_submenu(filenames, tags))
4852
4953 return menu_items
5054
51 def _create_remove_tag_submenu(self, filename, tags):
55 def _create_remove_tag_submenu(self, filenames, tags):
5256 # 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.
5458 menu_item = Nautilus.MenuItem(
5559 name="NautilusPython::tagfarm_remove_tags",
5660 label="Remove Tag",
57 tip="Remove tag from selected file"
61 tip="Remove tag from selected files"
5862 )
5963
6064 submenu = Nautilus.Menu()
6468 tag_item = Nautilus.MenuItem(
6569 name=f"NautilusPython::tagfarm_remove_tag_{i}",
6670 label=tag,
67 tip=f"Remove tag '{tag}' from file"
71 tip=f"Remove tag '{tag}' from files"
6872 )
69 tag_item.connect('activate', self._remove_tag, tag, filename)
73 tag_item.connect('activate', self._remove_tag, tag, filenames)
7074 submenu.append_item(tag_item)
7175
7276 return menu_item
7377
74 def _create_add_tag_submenu(self, filename, tags):
78 def _create_add_tag_submenu(self, filenames, tags):
7579 # 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.
7781 menu_item = Nautilus.MenuItem(
7882 name="NautilusPython::tagfarm_add_tags",
7983 label="Add Tag",
80 tip="Add tag to selected file"
84 tip="Add tag to selected files"
8185 )
8286
8387 submenu = Nautilus.Menu()
8791 tag_item = Nautilus.MenuItem(
8892 name=f"NautilusPython::tagfarm_add_tag_{i}",
8993 label=tag,
90 tip=f"Add tag '{tag}' to file"
94 tip=f"Add tag '{tag}' to files"
9195 )
92 tag_item.connect('activate', self._add_tag, tag, filename)
96 tag_item.connect('activate', self._add_tag, tag, filenames)
9397 submenu.append_item(tag_item)
9498
9599 return menu_item
119123 else:
120124 return ([], [])
121125
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]
125129
126 subprocess.run(["tagfarm", "tag", tag, filename], cwd=working_dir)
130 subprocess.run(["tagfarm", "tag", tag] + base_filenames, cwd=working_dir)
127131
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]
131135
132 subprocess.run(["tagfarm", "untag", tag, filename], cwd=working_dir)
136 subprocess.run(["tagfarm", "untag", tag] + base_filenames, cwd=working_dir)