1#!/usr/local/bin/python3.8
2""" Allows you to open a Gtk file dialog from and get the selected file in return
3
4Used by a couple of Cinnamon spices via Javascript
5
6Usage:
7    cinnamon-file-dialog {0|1|2} -{p|n|d|f} [path] ...
8"""
9
10import sys
11from setproctitle import setproctitle
12setproctitle("cinnamon-file-dialog")
13
14import gi
15gi.require_version('Gtk', '3.0')
16from gi.repository import Gtk
17
18cancelButton = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
19typeArg = int(sys.argv[1])
20fdType = typeArg % 3
21if fdType == 0:
22    msg = "Open"
23    action = Gtk.FileChooserAction.OPEN
24    okButton = (Gtk.STOCK_OPEN, Gtk.ResponseType.OK)
25elif fdType == 1:
26    msg = "Select Folder"
27    action = Gtk.FileChooserAction.SELECT_FOLDER
28    okButton = (Gtk.STOCK_OPEN, Gtk.ResponseType.OK)
29elif fdType == 2:
30    msg = "Save"
31    action = Gtk.FileChooserAction.SAVE
32    okButton = (Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
33
34buttons = cancelButton + okButton
35filechooserdialog = Gtk.FileChooserDialog(title=msg, action=action, buttons=buttons)
36
37for i in range(2, len(sys.argv)):
38    if sys.argv[i] == "-p":
39        filechooserdialog.set_filename(sys.argv[i + 1])
40    elif sys.argv[i] == "-n":
41        filechooserdialog.set_current_name(sys.argv[i + 1])
42    elif sys.argv[i] == "-d":
43        filechooserdialog.set_current_folder(sys.argv[i + 1])
44    elif sys.argv[i] == "-f":
45        filterList = sys.argv[i + 1].split(",")
46        for filterInfo in filterList:
47            [name, filters] = filterInfo.split(";")
48            filterObj = Gtk.FileFilter()
49            filterObj.set_name(name)
50            rules = filters.split(":")
51            for rule in rules:
52                [ftype, value] = rule.split("=")
53                if ftype == "m":
54                    filterObj.add_mime_type(value)
55                elif ftype == "p":
56                    filterObj.add_pattern(value)
57            filechooserdialog.add_filter(filterObj)
58
59if fdType == 2:
60    filechooserdialog.set_do_overwrite_confirmation(True)
61
62if typeArg > 2:
63    filechooserdialog.set_select_multiple(True)
64
65response = filechooserdialog.run()
66if response == Gtk.ResponseType.OK:
67    if typeArg > 2:
68        print(filechooserdialog.get_filenames())
69    else:
70        print(filechooserdialog.get_filename())
71
72filechooserdialog.destroy()
73