svn merge -r 21041:21301 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / blender / editors / space_info / info_ops.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <string.h>
30 #include <stdio.h>
31
32 #include "DNA_packedFile_types.h"
33 #include "DNA_space_types.h"
34 #include "DNA_scene_types.h"
35 #include "DNA_screen_types.h"
36 #include "DNA_userdef_types.h"
37 #include "DNA_windowmanager_types.h"
38
39 #include "MEM_guardedalloc.h"
40
41 #include "BLI_blenlib.h"
42 #include "BLI_bpath.h"
43
44 #include "BKE_context.h"
45 #include "BKE_global.h"
46 #include "BKE_image.h"
47 #include "BKE_main.h"
48 #include "BKE_packedFile.h"
49 #include "BKE_report.h"
50 #include "BKE_screen.h"
51
52 #include "ED_screen.h"
53 #include "ED_types.h"
54 #include "ED_util.h"
55
56 #include "WM_api.h"
57 #include "WM_types.h"
58
59 #include "BIF_gl.h"
60 #include "BIF_glutil.h"
61
62 #include "UI_interface.h"
63 #include "UI_resources.h"
64
65 #include "IMB_imbuf_types.h"
66
67 #include "RNA_access.h"
68 #include "RNA_define.h"
69
70 #include "WM_types.h"
71
72 #include "info_intern.h"
73
74 /********************* pack all operator *********************/
75
76 static int pack_all_exec(bContext *C, wmOperator *op)
77 {
78         Main *bmain= CTX_data_main(C);
79
80         packAll(bmain, op->reports);
81         G.fileflags |= G_AUTOPACK;
82
83         return OPERATOR_FINISHED;
84 }
85
86 static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
87 {
88         Main *bmain= CTX_data_main(C);
89         Image *ima;
90         ImBuf *ibuf;
91
92         // first check for dirty images
93         for(ima=bmain->image.first; ima; ima=ima->id.next) {
94                 if(ima->ibufs.first) { /* XXX FIX */
95                         ibuf= BKE_image_get_ibuf(ima, NULL);
96                         
97                         if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
98                                 break;
99                 }
100         }
101
102         if(ima) {
103                 uiPupMenuOkee(C, "FILE_OT_pack_all", "Some images are painted on. These changes will be lost. Continue?");
104                 return OPERATOR_CANCELLED;
105         }
106
107         return pack_all_exec(C, op);
108 }
109
110 void FILE_OT_pack_all(wmOperatorType *ot)
111 {
112         /* identifiers */
113         ot->name= "Pack All";
114         ot->idname= "FILE_OT_pack_all";
115         
116         /* api callbacks */
117         ot->exec= pack_all_exec;
118         ot->invoke= pack_all_invoke;
119
120         /* flags */
121         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
122 }
123
124 /********************* unpack all operator *********************/
125
126 static const EnumPropertyItem unpack_all_method_items[] = {
127         {PF_USE_LOCAL, "USE_LOCAL", 0, "Use files in current directory (create when necessary)", ""},
128         {PF_WRITE_LOCAL, "WRITE_LOCAL", 0, "Write files to current directory (overwrite existing files)", ""},
129         {PF_USE_ORIGINAL, "USE_ORIGINAL", 0, "Use files in original location (create when necessary)", ""},
130         {PF_WRITE_ORIGINAL, "WRITE_ORIGINAL", 0, "Write files to original location (overwrite existing files)", ""},
131         {PF_KEEP, "KEEP", 0, "Disable AutoPack, keep all packed files", ""},
132         {PF_ASK, "ASK", 0, "Ask for each file", ""},
133         {0, NULL, 0, NULL, NULL}};
134
135 static int unpack_all_exec(bContext *C, wmOperator *op)
136 {
137         Main *bmain= CTX_data_main(C);
138         int method= RNA_enum_get(op->ptr, "method");
139
140         if(method != PF_KEEP) unpackAll(bmain, op->reports, method); /* XXX PF_ASK can't work here */
141         G.fileflags &= ~G_AUTOPACK;
142
143         return OPERATOR_FINISHED;
144 }
145
146 static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
147 {
148         Main *bmain= CTX_data_main(C);
149         uiPopupMenu *pup;
150         uiLayout *layout;
151         char title[128];
152         int count = 0;
153         
154         count = countPackedFiles(bmain);
155         
156         if(!count) {
157                 BKE_report(op->reports, RPT_WARNING, "No packed files. Autopack disabled.");
158                 G.fileflags &= ~G_AUTOPACK;
159                 return OPERATOR_CANCELLED;
160         }
161
162         if(count == 1)
163                 sprintf(title, "Unpack 1 file");
164         else
165                 sprintf(title, "Unpack %d files", count);
166         
167         pup= uiPupMenuBegin(C, title, 0);
168         layout= uiPupMenuLayout(pup);
169
170         uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
171         uiItemsEnumO(layout, "FILE_OT_unpack_all", "method");
172
173         uiPupMenuEnd(C, pup);
174
175         return OPERATOR_CANCELLED;
176 }
177
178 void FILE_OT_unpack_all(wmOperatorType *ot)
179 {
180         /* identifiers */
181         ot->name= "Unpack All";
182         ot->idname= "FILE_OT_unpack_all";
183         
184         /* api callbacks */
185         ot->exec= unpack_all_exec;
186         ot->invoke= unpack_all_invoke;
187
188         /* flags */
189         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
190
191         /* properties */
192         RNA_def_enum(ot->srna, "method", unpack_all_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
193 }
194
195 /********************* make paths relative operator *********************/
196
197 static int make_paths_relative_exec(bContext *C, wmOperator *op)
198 {
199         char txtname[24]; /* text block name */
200         int tot, changed, failed, linked;
201
202         if(!G.relbase_valid) {
203                 BKE_report(op->reports, RPT_WARNING, "Can't set relative paths with an unsaved blend file.");
204                 return OPERATOR_CANCELLED;
205         }
206
207         txtname[0] = '\0';
208         makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
209
210         if(failed)
211                 BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); 
212         else
213                 BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
214
215         return OPERATOR_FINISHED;
216 }
217
218 void FILE_OT_make_paths_relative(wmOperatorType *ot)
219 {
220         /* identifiers */
221         ot->name= "Make All Paths Relative";
222         ot->idname= "FILE_OT_make_paths_relative";
223         
224         /* api callbacks */
225         ot->exec= make_paths_relative_exec;
226
227         /* flags */
228         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
229 }
230
231 /********************* make paths absolute operator *********************/
232
233 static int make_paths_absolute_exec(bContext *C, wmOperator *op)
234 {
235         char txtname[24]; /* text block name */
236         int tot, changed, failed, linked;
237
238         if(!G.relbase_valid) {
239                 BKE_report(op->reports, RPT_WARNING, "Can't set absolute paths with an unsaved blend file.");
240                 return OPERATOR_CANCELLED;
241         }
242
243         txtname[0] = '\0';
244         makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
245
246         if(failed)
247                 BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); 
248         else
249                 BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
250
251         return OPERATOR_FINISHED;
252 }
253
254 void FILE_OT_make_paths_absolute(wmOperatorType *ot)
255 {
256         /* identifiers */
257         ot->name= "Make All Paths Absolute";
258         ot->idname= "FILE_OT_make_paths_absolute";
259         
260         /* api callbacks */
261         ot->exec= make_paths_absolute_exec;
262
263         /* flags */
264         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
265 }
266
267 /********************* report missing files operator *********************/
268
269 static int report_missing_files_exec(bContext *C, wmOperator *op)
270 {
271         char txtname[24]; /* text block name */
272
273         txtname[0] = '\0';
274         
275         /* run the missing file check */
276         checkMissingFiles(txtname);
277         
278         if(txtname[0] == '\0')
279                 BKE_report(op->reports, RPT_INFO, "No external files missing.");
280         else
281                 BKE_reportf(op->reports, RPT_ERROR, "Missing files listed in Text \"%s\"", txtname);
282         
283         return OPERATOR_FINISHED;
284 }
285
286 void FILE_OT_report_missing_files(wmOperatorType *ot)
287 {
288         /* identifiers */
289         ot->name= "Report Missing Files...";
290         ot->idname= "FILE_OT_report_missing_files";
291         
292         /* api callbacks */
293         ot->exec= report_missing_files_exec;
294
295         /* flags */
296         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
297 }
298
299 /********************* find missing files operator *********************/
300
301 static int find_missing_files_exec(bContext *C, wmOperator *op)
302 {
303         char *filename;
304         
305         filename= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
306         findMissingFiles(filename);
307         MEM_freeN(filename);
308
309         return OPERATOR_FINISHED;
310 }
311
312 static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *event)
313 {
314         /* XXX file open button text "Find Missing Files" */
315         WM_event_add_fileselect(C, op); 
316         return OPERATOR_RUNNING_MODAL;
317 }
318
319 void FILE_OT_find_missing_files(wmOperatorType *ot)
320 {
321         /* identifiers */
322         ot->name= "Find Missing Files...";
323         ot->idname= "FILE_OT_find_missing_files";
324         
325         /* api callbacks */
326         ot->exec= find_missing_files_exec;
327         ot->invoke= find_missing_files_invoke;
328
329         /* flags */
330         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
331
332         /* properties */
333         RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open.");
334 }
335
336 #if 0
337 static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
338 {
339         
340         uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
341         uiItemO(layout, NULL, 0, "WM_OT_read_homefile"); 
342         uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
343         uiItemO(layout, NULL, 0, "WM_OT_open_mainfile"); 
344 //      uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
345 //      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
346         
347         uiItemS(layout);
348         
349         uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
350         uiItemO(layout, NULL, 0, "WM_OT_save_mainfile"); 
351         uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
352         uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile"); 
353
354 #if 0
355         if(U.flag & USER_FILECOMPRESS) {
356                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
357         } else {
358                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
359         }
360         
361         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
362         
363         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
364         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
365         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
366 #if GAMEBLENDER == 1
367         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
368 #endif
369         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
370         
371         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
372         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
373         
374         
375         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
376         
377         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
378         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
379 //      uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
380 //      uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
381         
382         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
383         
384         uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
385         
386         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
387         
388         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
389         uiBlockSetDirection(block, UI_DOWN);
390         uiTextBoundsBlock(block, 80);
391         
392         uiEndBlock(C, block);
393         return block;
394 #endif
395 }
396 #endif
397