summaryrefslogtreecommitdiff
path: root/nautilus/nautilus_mat2.py
blob: f29de644685508186129e1b2eb3e5f994dc44075 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3

import gi
gi.require_version('Nautilus', '3.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Nautilus, GObject, Gtk
from urllib.parse import unquote

import os

from libmat2 import parser_factory

class Mat2Wrapper():
    def __init__(self, filepath):
        self.filepath = filepath

class StatusWindow(Gtk.Window):
    def __init__(self, items):
        self.window = Gtk.Window()
        self.window.set_border_width(10)

        self.items = items
        self.confirm_window()

    def confirm_window(self):
        # Header bar
        hb = Gtk.HeaderBar()
        self.window.set_titlebar(hb)
        hb.props.title = "Remove metadata"

        cancel = Gtk.Button("Cancel")
        cancel.connect("clicked", self.cancel_btn)
        hb.pack_start(cancel)

        self.remove = Gtk.Button("Remove")
        self.remove.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
        self.remove.connect("clicked", self.remove_btn)
        hb.pack_end(self.remove)

        self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.window.add(self.main_box)

        # List of files to clean
        listbox = Gtk.ListBox()
        self.main_box.pack_start(listbox, True, True, 0)
        listbox.set_selection_mode(Gtk.SelectionMode.NONE)
        for i in self.items:
            listbox.add(Gtk.Label(os.path.basename(i), xalign=0))
        listbox.show_all()

        # Options
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
        self.main_box.pack_start(hbox, True, True, 0)
        label = Gtk.Label(xalign=0)
        label.set_markup("Lightweight mode (only remove <i>some</i> metadata)")
        hbox.pack_start(label, False, True, 0)
        hbox.pack_start(Gtk.CheckButton(), False, True, 0)

        self.window.show_all()

    def error_window(self, items):
        self.window.remove(self.main_box)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.window.add(box)

        # Disclaimer
        box.pack_start(Gtk.Label("Could not remove metadata from the following items:",
                                 xalign=0), True, True, 0)

        # List of failed files
        listbox = Gtk.ListBox()
        box.pack_start(listbox, True, True, 0)
        listbox.set_selection_mode(Gtk.SelectionMode.NONE)
        for i in items:
            listbox.add(Gtk.Label(os.path.basename(i), xalign=0))
        listbox.show_all()

        self.window.show_all()
        self.remove.hide()

    def cancel_btn(self, button):
        self.window.close()

    def remove_btn(self, button):
        failed = []
        for i in self.items:
            p, mtype = parser_factory.get_parser(i)
            if p is not None and p.remove_all():
                continue
            failed.append(i)

        # Everything went the right way, exit
        if not len(failed):
            self.window.close()

        self.error_window(failed)

class ColumnExtension(GObject.GObject, Nautilus.MenuProvider):
    def __validate(self, file):
        if file.get_uri_scheme() != "file" or file.is_directory():
            return False
        if not file.can_write():
            return False
        return True

    def __validate_set(self, files):
        for f in files:
            if self.__validate(f):
                return True
        return False

    def menu_activate_cb(self, menu, files):
        items = list(map(lambda x: unquote(x.get_uri()[7:]), files))
        StatusWindow(items)

    def get_background_items(self, window, file):
        """ https://bugzilla.gnome.org/show_bug.cgi?id=784278 """
        return None

    def get_file_items(self, window, files):
        # Do not show the menu item if not a single file has a chance to be
        # processed by mat2.
        if not self.__validate_set(files):
            return

        item = Nautilus.MenuItem(
            name="MAT2::Remove_metadata",
            label="Remove metadata",
            tip="Remove metadata"
        )
        item.connect('activate', self.menu_activate_cb, files)

        return [item]