Krita Source Code Documentation
Loading...
Searching...
No Matches
plugin_importer_extension.py
Go to the documentation of this file.
1# SPDX-FileCopyrightText: 2019 Rebecca Breu <rebecca@rbreu.de>
2
3# This file is part of Krita.
4
5# SPDX-License-Identifier: GPL-3.0-or-later
6
7import html
8import os
9import tempfile
10
11from krita import Krita, Extension, FileDialog
12
13try:
14 from PyQt6.QtWidgets import QMessageBox, QInputDialog
15except:
16 from PyQt5.QtWidgets import QMessageBox, QInputDialog
17from builtins import i18n, Application
18
19from .plugin_importer import PluginImporter, PluginImportError
20from .plugin_downloader import download_plugin, PluginDownloadError
21
22
23class PluginImporterExtension(Extension):
24
25 def __init__(self, parent):
26 super().__init__(parent)
27 self.parent = parent
28
29 def setup(self):
30 pass
31
32 def createActions(self, window):
33 action = window.createAction(
34 'plugin_importer_file',
35 i18n('Import Python Plugin from File...'),
36 'tools/scripts')
38 action = window.createAction(
39 'plugin_importer_web',
40 i18n('Import Python Plugin from Web...'),
41 'tools/scripts')
42 action.triggered.connect(self.import_plugin_from_webimport_plugin_from_web)
43
44 def confirm_overwrite(self, plugin):
45 reply = QMessageBox.question(
46 self.parent.activeWindow().qwindow(),
47 i18n('Overwrite Plugin'),
48 i18n('The plugin "%s" already exists. Overwrite it?') % (
49 plugin['ui_name']),
50 QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
51 return reply == QMessageBox.StandardButton.Yes
52
53 def confirm_activate(self, plugins):
54 txt = [
55 '<p>',
56 i18n('The following plugins were imported:'),
57 '</p>',
58 '<ul>'
59 ]
60 for plugin in plugins:
61 txt.append('<li>%s</li>' % plugin['ui_name'])
62
63 txt.append('</ul>')
64 txt.append('<p><strong>')
65 txt.append(i18n(
66 'Enable plugins now? (Requires restart)'))
67 txt.append('</strong></p>')
68
69 reply = QMessageBox.question(
70 self.parent.activeWindow().qwindow(),
71 i18n('Activate Plugins?'),
72 ('\n').join(txt),
73 QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
74 return reply == QMessageBox.StandardButton.Yes
75
76 def display_errors(self, error):
77 msg = '<p>%s</p><pre>%s</pre>' % (
78 i18n('Error during import:'),
79 html.escape(str(error)))
80 QMessageBox.warning(
81 self.parent.activeWindow().qwindow(),
82 i18n('Error'),
83 msg)
84
85 def activate_plugins(self, plugins):
86 for plugin in plugins:
87 Application.writeSetting(
88 'python',
89 'enable_%s' % plugin['name'],
90 'true')
91
93 return Krita.instance().getAppDataLocation()
94
96 infotext = i18n(
97 '<p><strong>Enter download URL</strong></p>'
98 '<p>For example:'
99 '<ul>'
100 '<li>Zip download link (http://example.com/plugin.zip)</li>'
101 '<li>Github repository (https://github.com/test/plugin)</li>'
102 )
103 url = QInputDialog.getText(
104 self.parent.activeWindow().qwindow(),
105 i18n('Import Plugin'),
106 infotext)[0]
107 if url:
108 with tempfile.TemporaryDirectory() as tmpdir:
109 try:
110 zipfile = download_plugin(url=url, dest_dir=tmpdir)
111 except PluginDownloadError as e:
112 self.display_errors(e)
113 return
114 self.do_import(zipfile)
115
118 self.parent.activeWindow().qwindow(),
119 i18n('Import Plugin'),
120 os.path.expanduser('~'),
121 '%s (*.zip)' % i18n('Zip Archives')
122 )
123
124 if not zipfile:
125 return
126
127 self.do_import(zipfile)
128
129 def do_import(self, zipfile):
130 try:
131 imported = PluginImporter(
132 zipfile,
133 self.get_resources_dir(),
135 ).import_all()
136 except PluginImportError as e:
137 self.display_errors(e)
138 return
139
140 if imported:
141 activate = self.confirm_activate(imported)
142 if activate:
143 self.activate_plugins(imported)
static QString getOpenFileName(QWidget *parent=nullptr, const QString &caption=QString(), const QString &directory=QString(), const QString &filter=QString(), const QString &selectedFilter=QString(), const QString &dialogName=QString())
Create and show a file dialog and return the name of an existing file selected by the user.
static Krita * instance()
instance retrieve the singleton instance of the Application object.
Definition Krita.cpp:390