PyAPI: add imports arg to BPY_execute_string
[blender.git] / source / blender / editors / space_script / script_edit.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2008 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/editors/space_script/script_edit.c
28  *  \ingroup spscript
29  */
30
31
32 #include <string.h>
33 #include <stdio.h>
34
35 #include "BLI_utildefines.h"
36
37 #include "BKE_context.h"
38 #include "BKE_report.h"
39 #include "BKE_global.h"
40
41 #include "WM_api.h"
42 #include "WM_types.h"
43 #include "wm_event_system.h"
44
45 #include "RNA_access.h"
46 #include "RNA_define.h"
47
48 #include "ED_screen.h"
49
50
51 #include "script_intern.h"  // own include
52
53 #ifdef WITH_PYTHON
54 #include "BPY_extern.h" /* BPY_script_exec */
55 #endif
56
57 static int run_pyfile_exec(bContext *C, wmOperator *op)
58 {
59         char path[512];
60         RNA_string_get(op->ptr, "filepath", path);
61 #ifdef WITH_PYTHON
62         if (BPY_execute_filepath(C, path, op->reports)) {
63                 ARegion *ar = CTX_wm_region(C);
64                 ED_region_tag_redraw(ar);
65                 return OPERATOR_FINISHED;
66         }
67 #else
68         (void)C; /* unused */
69 #endif
70         return OPERATOR_CANCELLED; /* FAIL */
71 }
72
73 void SCRIPT_OT_python_file_run(wmOperatorType *ot)
74 {
75         /* identifiers */
76         ot->name = "Run Python File";
77         ot->description = "Run Python file";
78         ot->idname = "SCRIPT_OT_python_file_run";
79         ot->flag = OPTYPE_UNDO;
80
81         /* api callbacks */
82         ot->exec = run_pyfile_exec;
83         ot->poll = ED_operator_areaactive;
84
85         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
86
87         RNA_def_string_file_path(ot->srna, "filepath", NULL, FILE_MAX, "Path", "");
88 }
89
90 #ifdef WITH_PYTHON
91 static bool script_test_modal_operators(bContext *C)
92 {
93         wmWindowManager *wm;
94         wmWindow *win;
95
96         wm = CTX_wm_manager(C);
97
98         for (win = wm->windows.first; win; win = win->next) {
99                 wmEventHandler *handler;
100
101                 for (handler = win->modalhandlers.first; handler; handler = handler->next) {
102                         if (handler->op) {
103                                 wmOperatorType *ot = handler->op->type;
104                                 if (ot->ext.srna) {
105                                         return true;
106                                 }
107                         }
108                 }
109         }
110
111         return false;
112 }
113 #endif
114
115 static int script_reload_exec(bContext *C, wmOperator *op)
116 {
117 #ifdef WITH_PYTHON
118
119         /* clear running operators */
120         if (script_test_modal_operators(C)) {
121                 BKE_report(op->reports, RPT_ERROR, "Can't reload with running modal operators");
122                 return OPERATOR_CANCELLED;
123         }
124
125         /* TODO, this crashes on netrender and keying sets, need to look into why
126          * disable for now unless running in debug mode */
127         WM_cursor_wait(1);
128         BPY_execute_string(C, (const char *[]){"bpy", NULL}, "bpy.utils.load_scripts(reload_scripts=True)");
129         WM_cursor_wait(0);
130         WM_event_add_notifier(C, NC_WINDOW, NULL);
131         return OPERATOR_FINISHED;
132 #else
133         UNUSED_VARS(C, op);
134         return OPERATOR_CANCELLED;
135 #endif
136 }
137
138 void SCRIPT_OT_reload(wmOperatorType *ot)
139 {
140         /* identifiers */
141         ot->name = "Reload Scripts";
142         ot->description = "Reload Scripts";
143         ot->idname = "SCRIPT_OT_reload";
144
145         /* api callbacks */
146         ot->exec = script_reload_exec;
147 }
148
149 static int script_autoexec_warn_clear_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
150 {
151         G.f |= G_SCRIPT_AUTOEXEC_FAIL_QUIET;
152         return OPERATOR_FINISHED;
153 }
154
155 void SCRIPT_OT_autoexec_warn_clear(wmOperatorType *ot)
156 {
157         /* identifiers */
158         ot->name = "Continue Untrusted";
159         ot->description = "Ignore autoexec warning";
160         ot->idname = "SCRIPT_OT_autoexec_warn_clear";
161
162         /* flags */
163         ot->flag = OPTYPE_INTERNAL;
164
165         /* api callbacks */
166         ot->exec = script_autoexec_warn_clear_exec;
167 }