2.5
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 30 Jun 2009 19:20:45 +0000 (19:20 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 30 Jun 2009 19:20:45 +0000 (19:20 +0000)
Image Window
* Unpack operator now works.
* Some small layout code tweaks.

Info Window Header
* Moved to python UI code.
* template_running_jobs, template_operator_search added.
* Ported external data operators: pack/unpack all, make
  paths relative/absolute, find/report missing files.

Also
* Report RPT_INFO too, not only warnings and errors.
* Run UI handle functions after RNA and Operators.
* Rename particle system add/remove operators, to not
  include "slot", that's only there for materials because
  that's what they are called now in RNA.

29 files changed:
release/ui/buttons_particle.py
release/ui/space_buttons.py
release/ui/space_filebrowser.py
release/ui/space_image.py
release/ui/space_info.py [new file with mode: 0644]
source/blender/blenkernel/BKE_packedFile.h
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/BKE_report.h
source/blender/blenkernel/intern/font.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/packedFile.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/report.c
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/space_buttons/buttons_intern.h
source/blender/editors/space_buttons/buttons_ops.c
source/blender/editors/space_buttons/space_buttons.c
source/blender/editors/space_image/image_buttons.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_info/info_header.c [deleted file]
source/blender/editors/space_info/info_intern.h
source/blender/editors/space_info/info_ops.c [new file with mode: 0644]
source/blender/editors/space_info/space_info.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/python/intern/bpy_operator_wrap.c
source/blender/windowmanager/intern/wm_files.c

index e51df6ef7fd1777d4b992c83ea62e9a8d8b7c931..85580c9be69f1fcb43da5fcbcd9f9814618b200d 100644 (file)
@@ -36,8 +36,8 @@ class PARTICLE_PT_particles(ParticleButtonsPanel):
                        row.template_list(ob, "particle_systems", "active_particle_system_index")
 
                        col = row.column(align=True)
-                       col.itemO("OBJECT_OT_particle_system_slot_add", icon="ICON_ZOOMIN", text="")
-                       col.itemO("OBJECT_OT_particle_system_slot_remove", icon="ICON_ZOOMOUT", text="")
+                       col.itemO("OBJECT_OT_particle_system_add", icon="ICON_ZOOMIN", text="")
+                       col.itemO("OBJECT_OT_particle_system_remove", icon="ICON_ZOOMOUT", text="")
 
                if psys:
                        split = layout.split(percentage=0.65)
index a669690b8bc18060beb831b9d517b33f97ccc4af..cae9a813433886931270788388ded2a8a750019c 100644 (file)
@@ -11,7 +11,7 @@ class Buttons_HT_header(bpy.types.Header):
                so = context.space_data
                scene = context.scene
 
-               layout.template_header(context)
+               layout.template_header()
 
                if context.area.show_menus:
                        row = layout.row(align=True)
index d23cc0f276c2cb812bc46ceeeb48d122acfed179..820134d3e8714daab1757ed3614c489fdb58e64b 100644 (file)
@@ -11,7 +11,7 @@ class FILEBROWSER_HT_header(bpy.types.Header):
                layout = self.layout
                
                params = st.params 
-               layout.template_header(context)
+               layout.template_header()
 
                if context.area.show_menus:
                        row = layout.row()
@@ -38,11 +38,8 @@ class FILEBROWSER_HT_header(bpy.types.Header):
                row.itemR(params, "filter_sound", text="");
                row.itemR(params, "filter_text", text="");
 
-               if params.do_filter:
-                       row.active = True
-               else: 
-                       row.active = False
-                       
+               row.active = params.do_filter
+
 class FILEBROWSER_MT_directory(bpy.types.Menu):
        __space_type__ = "FILE_BROWSER"
        __label__ = "Directory"
index 63ca316efe755ba04bd3ad160ce30bcc8f65b071..49ef18705c449229ae57c6dcf8fc74d19e41a630 100644 (file)
@@ -96,9 +96,9 @@ class IMAGE_MT_image(bpy.types.Menu):
                                else:
                                        layout.itemO("IMAGE_OT_pack")
 
-                               # only for dirty && specific image types : XXX poll?
-                               #if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
-                               if False:
+                               # only for dirty && specific image types, perhaps
+                               # this could be done in operator poll too
+                               if ima.dirty:
                                        if ima.source in ("FILE", "GENERATED") and ima.type != "MULTILAYER":
                                                layout.item_booleanO("IMAGE_OT_pack", "as_png", True, text="Pack As PNG")
 
@@ -215,8 +215,10 @@ class IMAGE_HT_header(bpy.types.Header):
                        if show_uvedit:
                                row.itemM("IMAGE_MT_select")
 
-                       # XXX menuname= (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))? "Image*": "Image";
-                       row.itemM("IMAGE_MT_image")
+                       if ima and ima.dirty:
+                               row.itemM("IMAGE_MT_image", text="Image*")
+                       else:
+                               row.itemM("IMAGE_MT_image", text="Image")
 
                        if show_uvedit:
                                row.itemM("IMAGE_MT_uvs")
@@ -344,6 +346,10 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
        __region_type__ = "UI"
        __label__ = "View Properties"
 
+       def poll(self, context):
+               sima = context.space_data
+               return (sima and (sima.image or sima.show_uvedit))
+
        def draw(self, context):
                sima = context.space_data
                layout = self.layout
@@ -358,10 +364,12 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
                if ima:
                        col.itemR(ima, "display_aspect")
 
-               col = split.column()
-               col.itemR(sima, "draw_repeated", text="Repeat")
-               if show_uvedit:
-                       col.itemR(uvedit, "normalized_coordinates")
+                       col = split.column()
+                       col.itemR(sima, "draw_repeated", text="Repeat")
+                       if show_uvedit:
+                               col.itemR(uvedit, "normalized_coordinates", text="Normalized")
+               elif show_uvedit:
+                       col.itemR(uvedit, "normalized_coordinates", text="Normalized")
 
                if show_uvedit:
                        col = layout.column()
@@ -377,21 +385,6 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
                        #col.itemR(uvedit, "draw_edges")
                        #col.itemR(uvedit, "draw_faces")
 
-class IMAGE_PT_curves(bpy.types.Panel):
-       __space_type__ = "IMAGE_EDITOR"
-       __region_type__ = "UI"
-       __label__ = "Curves"
-
-       def poll(self, context):
-               sima = context.space_data
-               return (sima and sima.image)
-
-       def draw(self, context):
-               sima = context.space_data
-               layout = self.layout
-
-               layout.template_curve_mapping(sima.curves)
-
 bpy.types.register(IMAGE_MT_view)
 bpy.types.register(IMAGE_MT_select)
 bpy.types.register(IMAGE_MT_image)
@@ -403,5 +396,4 @@ bpy.types.register(IMAGE_MT_uvs)
 bpy.types.register(IMAGE_HT_header)
 bpy.types.register(IMAGE_PT_game_properties)
 bpy.types.register(IMAGE_PT_view_properties)
-#bpy.types.register(IMAGE_PT_curves)
 
diff --git a/release/ui/space_info.py b/release/ui/space_info.py
new file mode 100644 (file)
index 0000000..de33467
--- /dev/null
@@ -0,0 +1,119 @@
+
+import bpy
+
+class INFO_HT_header(bpy.types.Header):
+       __space_type__ = "USER_PREFERENCES"
+       __idname__ = "INFO_HT_header"
+
+       def draw(self, context):
+               st = context.space_data
+               layout = self.layout
+               
+               layout.template_header()
+
+               if context.area.show_menus:
+                       row = layout.row()
+                       row.itemM("INFO_MT_file")
+                       row.itemM("INFO_MT_add")
+                       row.itemM("INFO_MT_timeline")
+                       row.itemM("INFO_MT_game")
+                       row.itemM("INFO_MT_render")
+                       row.itemM("INFO_MT_help")
+
+               layout.template_ID(context.window, "screen") #, new="SCREEN_OT_new", open="SCREEN_OT_unlink")
+               layout.template_ID(context.screen, "scene") #, new="SCENE_OT_new", unlink="SCENE_OT_unlink")
+
+               layout.itemS()
+
+               layout.template_operator_search()
+               layout.template_running_jobs()
+                       
+class INFO_MT_file(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "File"
+
+       def draw(self, context):
+               layout = self.layout
+
+               layout.operator_context = "EXEC_AREA"
+               layout.itemO("WM_OT_read_homefile")
+               layout.operator_context = "INVOKE_AREA"
+               layout.itemO("WM_OT_open_mainfile")
+
+               layout.itemS()
+
+               layout.operator_context = "EXEC_AREA"
+               layout.itemO("WM_OT_save_mainfile")
+               layout.operator_context = "INVOKE_AREA"
+               layout.itemO("WM_OT_save_as_mainfile")
+
+               layout.itemS()
+
+               layout.itemM("INFO_MT_file_external_data")
+
+class INFO_MT_file_external_data(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "External Data"
+
+       def draw(self, context):
+               layout = self.layout
+
+               layout.itemO("FILE_OT_pack_all", text="Pack into .blend file")
+               layout.itemO("FILE_OT_unpack_all", text="Unpack into Files...")
+
+               layout.itemS()
+
+               layout.itemO("FILE_OT_make_paths_relative")
+               layout.itemO("FILE_OT_make_paths_absolute")
+               layout.itemO("FILE_OT_report_missing_files")
+               layout.itemO("FILE_OT_find_missing_files")
+
+class INFO_MT_add(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "Add"
+
+       def draw(self, context):
+               layout = self.layout
+               layout.itemL(text="Nothing yet")
+
+class INFO_MT_timeline(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "Timeline"
+
+       def draw(self, context):
+               layout = self.layout
+               layout.itemL(text="Nothing yet")
+
+class INFO_MT_game(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "Game"
+
+       def draw(self, context):
+               layout = self.layout
+               layout.itemL(text="Nothing yet")
+
+class INFO_MT_render(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "Render"
+
+       def draw(self, context):
+               layout = self.layout
+               layout.itemL(text="Nothing yet")
+
+class INFO_MT_help(bpy.types.Menu):
+       __space_type__ = "USER_PREFERENCES"
+       __label__ = "Help"
+
+       def draw(self, context):
+               layout = self.layout
+               layout.itemL(text="Nothing yet")
+
+bpy.types.register(INFO_HT_header)
+bpy.types.register(INFO_MT_file)
+bpy.types.register(INFO_MT_file_external_data)
+bpy.types.register(INFO_MT_add)
+bpy.types.register(INFO_MT_timeline)
+bpy.types.register(INFO_MT_game)
+bpy.types.register(INFO_MT_render)
+bpy.types.register(INFO_MT_help)
+
index 2d5acc51b7bf7d4fc5efc9b3863ae401572c8653..efd930d375a9b432f1a70cabe56698b1a410881b 100644 (file)
 #ifndef BKE_PACKEDFILE_H
 #define BKE_PACKEDFILE_H
 
-#define RET_OK 0
-#define RET_ERROR 1
+#define RET_OK         0
+#define RET_ERROR      1
 
-struct PackedFile;
-struct VFont;
 struct bSample;
 struct bSound;
 struct Image;
+struct Main;
+struct PackedFile;
+struct ReportList;
+struct VFont;
+
+/* pack */
+struct PackedFile *newPackedFile(struct ReportList *reports, char *filename);
+struct PackedFile *newPackedFileMemory(void *mem, int memlen);
+
+void packAll(struct Main *bmain, struct ReportList *reports);
+
+/* unpack */
+char *unpackFile(struct ReportList *reports, char *abs_name, char *local_name, struct PackedFile *pf, int how);
+int unpackVFont(struct ReportList *reports, struct VFont *vfont, int how);
+int unpackSample(struct ReportList *reports, struct bSample *sample, int how);
+int unpackImage(struct ReportList *reports, struct Image *ima, int how);
+void unpackAll(struct Main *bmain, struct ReportList *reports, int how);
+
+int writePackedFile(struct ReportList *reports, char *filename, struct PackedFile *pf, int guimode);
+
+/* free */
+void freePackedFile(struct PackedFile *pf);
+
+/* info */
+int countPackedFiles(struct Main *bmain);
+int checkPackedFile(char *filename, struct PackedFile *pf);
+
+/* read */
+int seekPackedFile(struct PackedFile *pf, int offset, int whence);
+void rewindPackedFile(struct PackedFile *pf);
+int readPackedFile(struct PackedFile *pf, void *data, int size);
 
-struct PackedFile * newPackedFile(char * filename);
-struct PackedFile * newPackedFileMemory(void *mem, int memlen);
-
-int seekPackedFile(struct PackedFile * pf, int offset, int whence);
-void rewindPackedFile(struct PackedFile * pf);
-int readPackedFile(struct PackedFile * pf, void * data, int size);
-int countPackedFiles(void);
-void freePackedFile(struct PackedFile * pf);
-void packAll(void);
-int writePackedFile(char * filename, struct PackedFile *pf, int guimode);
-int checkPackedFile(char * filename, struct PackedFile * pf);
-char * unpackFile(char * abs_name, char * local_name, struct PackedFile * pf, int how);
-int unpackVFont(struct VFont * vfont, int how);
-int unpackSample(struct bSample *sample, int how);
-int unpackImage(struct Image * ima, int how);
-void unpackAll(int how);
-       
 #endif
 
index 4d9916b955767830761239ea6823ab690326f7c7..73f0195d1d87a16f5c2212d9cc1615c8cc87e990 100644 (file)
@@ -251,8 +251,8 @@ void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int tim
 void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
 struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
 
-void object_add_particle_system_slot(struct Scene *scene, struct Object *ob);
-void object_remove_particle_system_slot(struct Scene *scene, struct Object *ob);
+void object_add_particle_system(struct Scene *scene, struct Object *ob);
+void object_remove_particle_system(struct Scene *scene, struct Object *ob);
 struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
 struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
 void psys_flush_particle_settings(struct Scene *scene, struct ParticleSettings *part, int recalc);
index 21221026b8b3bcfccf4997139d61bc0f0cc59d8b..1bb7152fbf305367d4e12cac643cf7ff3559022b 100644 (file)
@@ -34,7 +34,10 @@ extern "C" {
 
 #include "DNA_listBase.h"
 
-/* Reporting Information and Errors */
+/* Reporting Information and Errors
+ *
+ * These functions also accept NULL in case no error reporting
+ * is needed. */
 
 typedef enum ReportType {
        RPT_DEBUG                                       = 0,
index 60a7ffc28d9923ac14f2f9e84c0b088aff8d3855..70901778585be7372d20dd17f8ba8285bee85d7f 100644 (file)
@@ -333,11 +333,11 @@ static VFontData *vfont_get_data(VFont *vfont)
                                        BLI_addtail(&ttfdata, tmpfnt);
                                }
                        } else {
-                               pf= newPackedFile(vfont->name);
+                               pf= newPackedFile(NULL, vfont->name);
                                
                                if(!tmpfnt)
                                {
-                                       tpf= newPackedFile(vfont->name);
+                                       tpf= newPackedFile(NULL, vfont->name);
                                        
                                        // Add temporary packed file to globals
                                        tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
@@ -385,8 +385,8 @@ VFont *load_vfont(char *name)
                strcpy(dir, name);
                BLI_splitdirstring(dir, filename);
 
-               pf= newPackedFile(name);
-               tpf= newPackedFile(name);               
+               pf= newPackedFile(NULL, name);
+               tpf= newPackedFile(NULL, name);         
                
                is_builtin= 0;
        }
index 6b231cfc702e7dc22afbbd9a2ba5cb08ac7725d7..ef0984bf93dbb3242eff27ee5bfa6c7248e7657c 100644 (file)
@@ -1431,7 +1431,7 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
                /* try to repack file */
                if(ima->packedfile) {
                        PackedFile *pf;
-                       pf = newPackedFile(ima->name);
+                       pf = newPackedFile(NULL, ima->name);
                        if (pf) {
                                freePackedFile(ima->packedfile);
                                ima->packedfile = pf;
@@ -1750,7 +1750,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
                        
                        /* make packed file for autopack */
                        if ((ima->packedfile == NULL) && (G.fileflags & G_AUTOPACK))
-                               ima->packedfile = newPackedFile(str);
+                               ima->packedfile = newPackedFile(NULL, str);
                }
                
                if(ima->flag & IMA_DO_PREMUL)
index 22e4e8a8309e71b0234298820e555affd72a9327..4d88556d8bf33c9faa315a3e4e9c443fb44141c9 100644 (file)
@@ -61,8 +61,9 @@
 #include "BKE_image.h"
 #include "BKE_font.h"
 #include "BKE_packedFile.h"
+#include "BKE_report.h"
 
-int seekPackedFile(PackedFile * pf, int offset, int whence)
+int seekPackedFile(PackedFile *pf, int offset, int whence)
 {
        int oldseek = -1, seek = 0;
 
@@ -92,12 +93,12 @@ int seekPackedFile(PackedFile * pf, int offset, int whence)
        return(oldseek);
 }
        
-void rewindPackedFile(PackedFile * pf)
+void rewindPackedFile(PackedFile *pf)
 {
        seekPackedFile(pf, 0, SEEK_SET);
 }
 
-int readPackedFile(PackedFile * pf, void * data, int size)
+int readPackedFile(PackedFile *pf, void *data, int size)
 { 
        if ((pf != NULL) && (size >= 0) && (data != NULL)) {
                if (size + pf->seek > pf->size) {
@@ -118,66 +119,55 @@ int readPackedFile(PackedFile * pf, void * data, int size)
        return(size);
 }
 
-int countPackedFiles()
+int countPackedFiles(Main *bmain)
 {
-       int count = 0;
        Image *ima;
        VFont *vf;
        bSample *sample;
+       int count = 0;
        
        // let's check if there are packed files...
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile) {
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile)
                        count++;
-               }
-               ima= ima->id.next;
-       }
 
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile) {
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile)
                        count++;
-               }
-               vf = vf->id.next;
-       }
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile) {
-                       count++;
-               }
-               sample = sample->id.next;
-       }
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile)
+                               count++;
 
-       return(count);
+       return count;
 }
 
-void freePackedFile(PackedFile * pf)
+void freePackedFile(PackedFile *pf)
 {
-       if (pf) {
+       if(pf) {
                MEM_freeN(pf->data);
                MEM_freeN(pf);
-       } else {
-               printf("freePackedFile: Trying to free a NULL pointer\n");
        }
+       else
+               printf("freePackedFile: Trying to free a NULL pointer\n");
 }
        
-PackedFile * newPackedFileMemory(void *mem, int memlen)
+PackedFile *newPackedFileMemory(void *mem, int memlen)
 {
-       PackedFile * pf = MEM_callocN(sizeof(*pf), "PackedFile");
+       PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
        pf->data = mem;
        pf->size = memlen;
        
        return pf;
 }
 
-PackedFile * newPackedFile(char * filename)
+PackedFile *newPackedFile(ReportList *reports, char *filename)
 {
-       PackedFile * pf = NULL;
+       PackedFile *pf = NULL;
        int file, filelen;
        char name[FILE_MAXDIR+FILE_MAXFILE];
-       void * data;
+       void *data;
        
        //XXX waitcursor(1);
        
@@ -191,7 +181,7 @@ PackedFile * newPackedFile(char * filename)
 
        file= open(name, O_BINARY|O_RDONLY);
        if (file <= 0) {
-               // error("Can't open file: %s", name);
+               BKE_reportf(reports, RPT_ERROR, "Can't open file: %s", name);
        } else {
                filelen = BLI_filesize(file);
 
@@ -214,36 +204,24 @@ PackedFile * newPackedFile(char * filename)
        return (pf);
 }
 
-void packAll()
+void packAll(Main *bmain, ReportList *reports)
 {
        Image *ima;
        VFont *vf;
        bSample *sample;
        
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile == NULL) {
-                       ima->packedfile = newPackedFile(ima->name);
-               }
-               ima= ima->id.next;
-       }
-       
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile == NULL) {
-                       vf->packedfile = newPackedFile(vf->name);
-               }
-               vf = vf->id.next;
-       }
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile == NULL)
+                       ima->packedfile = newPackedFile(reports, ima->name);
 
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile == NULL)
+                       vf->packedfile = newPackedFile(reports, vf->name);
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile == NULL) {
-                       sound_set_packedfile(sample, newPackedFile(sample->name));
-               }
-               sample = sample->id.next;
-       }
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile == NULL)
+                               sound_set_packedfile(sample, newPackedFile(reports, sample->name));
 }
 
 
@@ -252,10 +230,10 @@ void packAll()
 // attempt to create a function that generates an unique filename
 // this will work when all funtions in fileops.c understand relative filenames...
 
-char * find_new_name(char * name)
+char *find_new_name(char *name)
 {
        char tempname[FILE_MAXDIR + FILE_MAXFILE];
-       char * newname;
+       char *newname;
        
        if (fop_exists(name)) {
                for (number = 1; number <= 999; number++) {
@@ -274,13 +252,13 @@ char * find_new_name(char * name)
        
 */
 
-int writePackedFile(char * filename, PackedFile *pf, int guimode)
+int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int guimode)
 {
        int file, number, remove_tmp = FALSE;
        int ret_value = RET_OK;
        char name[FILE_MAXDIR + FILE_MAXFILE];
        char tempname[FILE_MAXDIR + FILE_MAXFILE];
-/*     void * data; */
+/*     void *data; */
        
        if (guimode); //XXX  waitcursor(1);
        
@@ -305,23 +283,23 @@ int writePackedFile(char * filename, PackedFile *pf, int guimode)
        file = open(name, O_BINARY + O_WRONLY + O_CREAT + O_TRUNC, 0666);
        if (file >= 0) {
                if (write(file, pf->data, pf->size) != pf->size) {
-                       if(guimode) ; //XXX error("Error writing file: %s", name);
+                       BKE_reportf(reports, RPT_ERROR, "Error writing file: %s", name);
                        ret_value = RET_ERROR;
                }
                close(file);
        } else {
-               if(guimode); //XXX error("Error creating file: %s", name);
+               BKE_reportf(reports, RPT_ERROR, "Error creating file: %s", name);
                ret_value = RET_ERROR;
        }
        
        if (remove_tmp) {
                if (ret_value == RET_ERROR) {
                        if (BLI_rename(tempname, name) != 0) {
-                               if(guimode); //XXX error("Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
+                               BKE_reportf(reports, RPT_ERROR, "Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
                        }
                } else {
                        if (BLI_delete(tempname, 0, 0) != 0) {
-                               if(guimode); //XXX error("Error deleting '%s' (ignored)");
+                               BKE_reportf(reports, RPT_ERROR, "Error deleting '%s' (ignored)", tempname);
                        }
                }
        }
@@ -342,7 +320,7 @@ PF_NOFILE           - the original file doens't exist
 
 */
 
-int checkPackedFile(char * filename, PackedFile * pf)
+int checkPackedFile(char *filename, PackedFile *pf)
 {
        struct stat st;
        int ret_val, i, len, file;
@@ -390,68 +368,23 @@ int checkPackedFile(char * filename, PackedFile * pf)
 
 /*
 
-unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
-If how == PF_ASK it offers the user a couple of options what to do with the packed file.
+   unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
 
-It returns a char * to the existing file name / new file name or NULL when
+It returns a char *to the existing file name / new file name or NULL when
 there was an error or when the user desides to cancel the operation.
 
 */
 
-char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
+char *unpackFile(ReportList *reports, char *abs_name, char *local_name, PackedFile *pf, int how)
 {
-       char menu[6 * (FILE_MAXDIR + FILE_MAXFILE + 100)];
+       char menu[6 *(FILE_MAXDIR + FILE_MAXFILE + 100)];
        char line[FILE_MAXDIR + FILE_MAXFILE + 100];
-       char * newname = NULL, * temp = NULL;
+       char *newname = NULL, *temp = NULL;
        
        // char newabs[FILE_MAXDIR + FILE_MAXFILE];
        // char newlocal[FILE_MAXDIR + FILE_MAXFILE];
        
        if (pf != NULL) {
-               if (how == PF_ASK) {
-                       sprintf(menu, "UnPack file%%t|Remove Pack %%x%d", PF_REMOVE);
-                       
-                       if (strcmp(abs_name, local_name)) {
-                               switch (checkPackedFile(local_name, pf)) {
-                                       case PF_NOFILE:
-                                               sprintf(line, "|Create %s%%x%d", local_name, PF_WRITE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                                       case PF_EQUAL:
-                                               sprintf(line, "|Use %s (identical)%%x%d", local_name, PF_USE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                                       case PF_DIFFERS:
-                                               sprintf(line, "|Use %s (differs)%%x%d", local_name, PF_USE_LOCAL);
-                                               strcat(menu, line);
-                                               sprintf(line, "|Overwrite %s%%x%d", local_name, PF_WRITE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                               }
-                               // sprintf(line, "|%%x%d", PF_INVALID);
-                               // strcat(menu, line);
-                       }
-                       
-                       switch (checkPackedFile(abs_name, pf)) {
-                               case PF_NOFILE:
-                                       sprintf(line, "|Create %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                               case PF_EQUAL:
-                                       sprintf(line, "|Use %s (identical)%%x%d", abs_name, PF_USE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                               case PF_DIFFERS:
-                                       sprintf(line, "|Use %s (differs)%%x%d", abs_name, PF_USE_ORIGINAL);
-                                       strcat(menu, line);
-                                       sprintf(line, "|Overwrite %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                       }
-                       
-                       //XXX how = pupmenu(menu);
-               }
-               
                switch (how) {
                        case -1:
                        case PF_KEEP:
@@ -467,7 +400,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
                                }
                                // else fall through and create it
                        case PF_WRITE_LOCAL:
-                               if (writePackedFile(local_name, pf, 1) == RET_OK) {
+                               if (writePackedFile(reports, local_name, pf, 1) == RET_OK) {
                                        temp = local_name;
                                }
                                break;
@@ -479,7 +412,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
                                }
                                // else fall through and create it
                        case PF_WRITE_ORIGINAL:
-                               if (writePackedFile(abs_name, pf, 1) == RET_OK) {
+                               if (writePackedFile(reports, abs_name, pf, 1) == RET_OK) {
                                        temp = abs_name;
                                }
                                break;
@@ -498,10 +431,10 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
 }
 
 
-int unpackVFont(VFont * vfont, int how)
+int unpackVFont(ReportList *reports, VFont *vfont, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAXFILE], fi[FILE_MAXFILE];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        
        if (vfont != NULL) {
@@ -510,7 +443,7 @@ int unpackVFont(VFont * vfont, int how)
                
                sprintf(localname, "//fonts/%s", fi);
                
-               newname = unpackFile(vfont->name, localname, vfont->packedfile, how);
+               newname = unpackFile(reports, vfont->name, localname, vfont->packedfile, how);
                if (newname != NULL) {
                        ret_value = RET_OK;
                        freePackedFile(vfont->packedfile);
@@ -523,10 +456,10 @@ int unpackVFont(VFont * vfont, int how)
        return (ret_value);
 }
 
-int unpackSample(bSample *sample, int how)
+int unpackSample(ReportList *reports, bSample *sample, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        PackedFile *pf;
        
@@ -535,7 +468,7 @@ int unpackSample(bSample *sample, int how)
                BLI_splitdirstring(localname, fi);
                sprintf(localname, "//samples/%s", fi);
                
-               newname = unpackFile(sample->name, localname, sample->packedfile, how);
+               newname = unpackFile(reports, sample->name, localname, sample->packedfile, how);
                if (newname != NULL) {
                        strcpy(sample->name, newname);
                        MEM_freeN(newname);
@@ -553,10 +486,10 @@ int unpackSample(bSample *sample, int how)
        return(ret_value);
 }
 
-int unpackImage(Image * ima, int how)
+int unpackImage(ReportList *reports, Image *ima, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        
        if (ima != NULL) {
@@ -564,7 +497,7 @@ int unpackImage(Image * ima, int how)
                BLI_splitdirstring(localname, fi);
                sprintf(localname, "//textures/%s", fi);
                        
-               newname = unpackFile(ima->name, localname, ima->packedfile, how);
+               newname = unpackFile(reports, ima->name, localname, ima->packedfile, how);
                if (newname != NULL) {
                        ret_value = RET_OK;
                        freePackedFile(ima->packedfile);
@@ -578,33 +511,23 @@ int unpackImage(Image * ima, int how)
        return(ret_value);
 }
 
-void unpackAll(int how)
+void unpackAll(Main *bmain, ReportList *reports, int how)
 {
        Image *ima;
        VFont *vf;
        bSample *sample;
-               
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile) {
-                       unpackImage(ima, how);
-               }
-               ima= ima->id.next;
-       }
-       
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile) {
-                       unpackVFont(vf, how);
-               }
-               vf = vf->id.next;
-       }
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile) {
-                       unpackSample(sample, how);
-               }
-               sample = sample->id.next;
-       }
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile)
+                       unpackImage(reports, ima, how);
+
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile)
+                       unpackVFont(reports, vf, how);
+
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile)
+                               unpackSample(reports, sample, how);
 }
+
index 2474053298d81a1148b2715dbf6af847842b923d..31e60e985d5df021b32111ecfe8216f200d25264 100644 (file)
@@ -2929,7 +2929,7 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
 /************************************************/
 /*                     ParticleSettings handling                       */
 /************************************************/
-void object_add_particle_system_slot(Scene *scene, Object *ob)
+void object_add_particle_system(Scene *scene, Object *ob)
 {
        ParticleSystem *psys;
        ModifierData *md;
@@ -2961,7 +2961,7 @@ void object_add_particle_system_slot(Scene *scene, Object *ob)
        DAG_scene_sort(scene);
        DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
 }
-void object_remove_particle_system_slot(Scene *scene, Object *ob)
+void object_remove_particle_system(Scene *scene, Object *ob)
 {
        ParticleSystem *psys = psys_get_current(ob);
        ParticleSystemModifierData *psmd;
index 116fd06994861b64ccc5160ed337e942d915c324..8de8cf8d0f4986fff8c08653209c6e612cc4562a 100644 (file)
@@ -65,8 +65,8 @@ void BKE_reports_init(ReportList *reports, int flag)
 
        memset(reports, 0, sizeof(ReportList));
 
-       reports->storelevel= RPT_WARNING;
-       reports->printlevel= RPT_WARNING;
+       reports->storelevel= RPT_INFO;
+       reports->printlevel= RPT_INFO;
        reports->flag= flag;
 }
 
index 333536137cc8a50093e70d8ace8c03401efed8d2..5000dca37431e28009618be87f91e0577decd337 100644 (file)
@@ -618,6 +618,8 @@ void uiTemplateCurveMapping(uiLayout *layout, struct CurveMapping *cumap, int ty
 void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname);
 void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
 ListBase uiTemplateList(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *activeprop, int rows, int columns, int compact);
+void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
+void uiTemplateOperatorSearch(uiLayout *layout);
 
 /* items */
 void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
index 92c888ac7725ca9d2e32fd5bdf3f797387143b70..7ad422ef3b5e6e29177d395a7dbf2a96f6102863 100644 (file)
@@ -287,16 +287,6 @@ static void ui_apply_but_funcs_after(bContext *C)
                if(after.context)
                        CTX_store_set(C, after.context);
 
-               if(after.func)
-                       after.func(C, after.func_arg1, after.func_arg2);
-               if(after.funcN)
-                       after.funcN(C, after.func_argN, after.func_arg2);
-               
-               if(after.handle_func)
-                       after.handle_func(C, after.handle_func_arg, after.retval);
-               if(after.butm_func)
-                       after.butm_func(C, after.butm_func_arg, after.a2);
-
                if(after.optype)
                        WM_operator_name_call(C, after.optype->idname, after.opcontext, after.opptr);
                if(after.opptr) {
@@ -311,6 +301,16 @@ static void ui_apply_but_funcs_after(bContext *C)
                        CTX_store_set(C, NULL);
                        CTX_store_free(after.context);
                }
+
+               if(after.func)
+                       after.func(C, after.func_arg1, after.func_arg2);
+               if(after.funcN)
+                       after.funcN(C, after.func_argN, after.func_arg2);
+               
+               if(after.handle_func)
+                       after.handle_func(C, after.handle_func_arg, after.retval);
+               if(after.butm_func)
+                       after.butm_func(C, after.butm_func_arg, after.a2);
        }
 }
 
index 49e3abf4d0c0a6ce9257e5dc88e884be64f81464..27fb0731d67c509246570f1ab6f1c9e7e8643826 100644 (file)
@@ -2762,6 +2762,8 @@ void uiPupMenuReports(bContext *C, ReportList *reports)
                        BLI_dynstr_appendf(ds, "Error %%i%d%%t|%s", ICON_ERROR, report->message);
                else if(report->type >= RPT_WARNING)
                        BLI_dynstr_appendf(ds, "Warning %%i%d%%t|%s", ICON_ERROR, report->message);
+               else if(report->type >= RPT_INFO)
+                       BLI_dynstr_appendf(ds, "Info %%t|%s", report->message);
        }
 
        str= BLI_dynstr_get_cstring(ds);
index b128da7b97fce75d90b4d4f57b6041850bd985eb..8b3f2bf4100aae508ba4e08fd4f159001c26e89e 100644 (file)
@@ -161,9 +161,15 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
        switch(event) {
                case UI_ID_BROWSE:
                case UI_ID_PIN:
+                       printf("warning, id event %d shouldnt come here\n", event);
+                       break;
                case UI_ID_OPEN:
                case UI_ID_ADD_NEW:
-                       printf("warning, id event %d shouldnt come here\n", event);
+                       if(template->idlb->last) {
+                               RNA_id_pointer_create(template->idlb->last, &idptr);
+                               RNA_property_pointer_set(&template->ptr, template->prop, idptr);
+                               RNA_property_update(C, &template->ptr, template->prop);
+                       }
                        break;
                case UI_ID_DELETE:
                        memset(&idptr, 0, sizeof(idptr));
@@ -201,12 +207,13 @@ static void template_ID(bContext *C, uiBlock *block, TemplateID *template, Struc
        idptr= RNA_property_pointer_get(&template->ptr, template->prop);
        lb= template->idlb;
 
+       uiBlockBeginAlign(block);
+
        if(idptr.type)
                type= idptr.type;
        if(type)
                uiDefIconBut(block, LABEL, 0, RNA_struct_ui_icon(type), 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
 
-       uiBlockBeginAlign(block);
        if(flag & UI_ID_BROWSE)
                uiDefBlockButN(block, search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X, UI_UNIT_Y, "Browse ID data");
 
@@ -225,6 +232,7 @@ static void template_ID(bContext *C, uiBlock *block, TemplateID *template, Struc
                
                if(newop) {
                        but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_REGION_WIN, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL);
+                       uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
                }
                else {
                        but= uiDefIconTextBut(block, BUT, 0, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
@@ -1680,3 +1688,94 @@ ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, char
        return lb;
 }
 
+/************************* Operator Search Template **************************/
+
+static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
+{
+       wmOperatorType *ot= arg2;
+       
+       if(ot)
+               WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
+}
+
+static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+{
+       wmOperatorType *ot = WM_operatortype_first();
+       
+       for(; ot; ot= ot->next) {
+               
+               if(BLI_strcasestr(ot->name, str)) {
+                       if(ot->poll==NULL || ot->poll((bContext *)C)) {
+                               char name[256];
+                               int len= strlen(ot->name);
+                               
+                               /* display name for menu, can hold hotkey */
+                               BLI_strncpy(name, ot->name, 256);
+                               
+                               /* check for hotkey */
+                               if(len < 256-6) {
+                                       if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, &name[len+1], 256-len-1))
+                                               name[len]= '|';
+                               }
+                               
+                               if(0==uiSearchItemAdd(items, name, ot, 0))
+                                       break;
+                       }
+               }
+       }
+}
+
+void uiTemplateOperatorSearch(uiLayout *layout)
+{
+       uiBlock *block;
+       uiBut *but;
+       static char search[256]= "";
+               
+       block= uiLayoutGetBlock(layout);
+       uiBlockSetCurLayout(block, layout);
+
+       but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X*6, UI_UNIT_Y, "");
+       uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb, NULL);
+}
+
+/************************* Running Jobs Template **************************/
+
+#define B_STOPRENDER   1
+#define B_STOPCAST             2
+#define B_STOPANIM             3
+
+static void do_running_jobs(bContext *C, void *arg, int event)
+{
+       switch(event) {
+               case B_STOPRENDER:
+                       G.afbreek= 1;
+                       break;
+               case B_STOPCAST:
+                       WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
+                       break;
+               case B_STOPANIM:
+                       ED_screen_animation_timer(C, 0, 0);
+                       break;
+       }
+}
+
+void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
+{
+       bScreen *screen= CTX_wm_screen(C);
+       Scene *scene= CTX_data_scene(C);
+       wmWindowManager *wm= CTX_wm_manager(C);
+       uiBlock *block;
+
+       block= uiLayoutGetBlock(layout);
+       uiBlockSetCurLayout(block, layout);
+
+       uiBlockSetHandleFunc(block, do_running_jobs, NULL);
+
+       if(WM_jobs_test(wm, scene))
+               uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_REC, "Render", 0,0,75,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering");
+       if(WM_jobs_test(wm, screen))
+               uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_REC, "Capture", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast");
+       if(screen->animtimer)
+               uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_REC, "Anim Player", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback");
+}
+
index 13ea778fb007ff59fad8a5a3fda68859e45f7044..65c2976d57cb53e98a611aaacf1b37dae6ee3a2e 100644 (file)
@@ -71,8 +71,8 @@ void MATERIAL_OT_new(struct wmOperatorType *ot);
 void TEXTURE_OT_new(struct wmOperatorType *ot);
 void WORLD_OT_new(struct wmOperatorType *ot);
 
-void OBJECT_OT_particle_system_slot_add(struct wmOperatorType *ot);
-void OBJECT_OT_particle_system_slot_remove(struct wmOperatorType *ot);
+void OBJECT_OT_particle_system_add(struct wmOperatorType *ot);
+void OBJECT_OT_particle_system_remove(struct wmOperatorType *ot);
 
 void PARTICLE_OT_new(struct wmOperatorType *ot);
 
index 6ca92674c6edaef3ee191f5c441ceeae60fdff45..df3e8c62d37087bb96faa2036599bb8adbd28d69 100644 (file)
@@ -412,7 +412,7 @@ void WORLD_OT_new(wmOperatorType *ot)
 
 /********************** particle system slot operators *********************/
 
-static int particle_system_slot_add_exec(bContext *C, wmOperator *op)
+static int particle_system_add_exec(bContext *C, wmOperator *op)
 {
        Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
        Scene *scene = CTX_data_scene(C);
@@ -420,26 +420,26 @@ static int particle_system_slot_add_exec(bContext *C, wmOperator *op)
        if(!scene || !ob)
                return OPERATOR_CANCELLED;
 
-       object_add_particle_system_slot(scene, ob);
+       object_add_particle_system(scene, ob);
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
        
        return OPERATOR_FINISHED;
 }
 
-void OBJECT_OT_particle_system_slot_add(wmOperatorType *ot)
+void OBJECT_OT_particle_system_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Particle System Slot";
-       ot->idname= "OBJECT_OT_particle_system_slot_add";
+       ot->idname= "OBJECT_OT_particle_system_add";
        
        /* api callbacks */
-       ot->exec= particle_system_slot_add_exec;
+       ot->exec= particle_system_add_exec;
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int particle_system_slot_remove_exec(bContext *C, wmOperator *op)
+static int particle_system_remove_exec(bContext *C, wmOperator *op)
 {
        Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
        Scene *scene = CTX_data_scene(C);
@@ -447,20 +447,20 @@ static int particle_system_slot_remove_exec(bContext *C, wmOperator *op)
        if(!scene || !ob)
                return OPERATOR_CANCELLED;
 
-       object_remove_particle_system_slot(scene, ob);
+       object_remove_particle_system(scene, ob);
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
        
        return OPERATOR_FINISHED;
 }
 
-void OBJECT_OT_particle_system_slot_remove(wmOperatorType *ot)
+void OBJECT_OT_particle_system_remove(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Remove Particle System Slot";
-       ot->idname= "OBJECT_OT_particle_system_slot_remove";
+       ot->idname= "OBJECT_OT_particle_system_remove";
        
        /* api callbacks */
-       ot->exec= particle_system_slot_remove_exec;
+       ot->exec= particle_system_remove_exec;
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
index 7954d5254cc0a37c6d248e921bd64058b2824df7..f9732551545aff28dea156bc643a44bcea8a0071 100644 (file)
@@ -220,8 +220,8 @@ void buttons_operatortypes(void)
        WM_operatortype_append(TEXTURE_OT_new);
        WM_operatortype_append(WORLD_OT_new);
 
-       WM_operatortype_append(OBJECT_OT_particle_system_slot_add);
-       WM_operatortype_append(OBJECT_OT_particle_system_slot_remove);
+       WM_operatortype_append(OBJECT_OT_particle_system_add);
+       WM_operatortype_append(OBJECT_OT_particle_system_remove);
 
        WM_operatortype_append(PARTICLE_OT_new);
 }
index a08a23c1263ad8eb7c9f808920c4b3b8b4f6b728..edf9bcbd896975b8bd0d8a4c248e6cf77fc8d0dc 100644 (file)
@@ -1088,7 +1088,7 @@ static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
                                }
                                
                                if ((G.fileflags & G_AUTOPACK) == 0) {
-                                       unpackImage(ima, PF_ASK);
+                                       unpackImage(NULL, ima, PF_ASK); /* XXX report errors */
                                        ED_undo_push(C, "Unpack image");
                                }
                        } 
@@ -1097,7 +1097,7 @@ static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
                                if (ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) {
                                        // XXX error("Can't pack painted image. Save image or use Repack as PNG.");
                                } else {
-                                       ima->packedfile = newPackedFile(ima->name);
+                                       ima->packedfile = newPackedFile(NULL, ima->name); /* XXX report errors */
                                        ED_undo_push(C, "Pack image");
                                }
                        }
index 8f9bb0d05fe8c3d5c5ea61097645f8a6d9d6387a..24781cc115e9a145b57c7ac8d68fe4a9b3b16626 100644 (file)
@@ -1114,7 +1114,7 @@ static int pack_exec(bContext *C, wmOperator *op)
        if(as_png)
                BKE_image_memorypack(ima);
        else
-               ima->packedfile= newPackedFile(ima->name);
+               ima->packedfile= newPackedFile(op->reports, ima->name);
 
        return OPERATOR_FINISHED;
 }
@@ -1162,13 +1162,96 @@ void IMAGE_OT_pack(wmOperatorType *ot)
 
 /********************* unpack operator *********************/
 
+/* XXX move this to some place where it can be reused */
+
+const EnumPropertyItem unpack_method_items[] = {
+       {PF_USE_LOCAL, "USE_LOCAL", 0, "Use Local File", ""},
+       {PF_WRITE_LOCAL, "WRITE_LOCAL", 0, "Write Local File (overwrite existing)", ""},
+       {PF_USE_ORIGINAL, "USE_ORIGINAL", 0, "Use Original File", ""},
+       {PF_WRITE_ORIGINAL, "WRITE_ORIGINAL", 0, "Write Original File (overwrite existing)", ""},
+       {0, NULL, 0, NULL, NULL}};
+
+void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, PackedFile *pf)
+{
+       uiPopupMenu *pup;
+       uiLayout *layout;
+       char line[FILE_MAXDIR + FILE_MAXFILE + 100];
+       char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
+       
+       strcpy(local_name, abs_name);
+       BLI_splitdirstring(local_name, fi);
+       sprintf(local_name, "//%s/%s", folder, fi);
+
+       pup= uiPupMenuBegin(C, "Unpack file", 0);
+       layout= uiPupMenuLayout(pup);
+
+       uiItemEnumO(layout, "Remove Pack", 0, opname, "method", PF_REMOVE);
+
+       if(strcmp(abs_name, local_name)) {
+               switch(checkPackedFile(local_name, pf)) {
+                       case PF_NOFILE:
+                               sprintf(line, "Create %s", local_name);
+                               uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL);
+                               break;
+                       case PF_EQUAL:
+                               sprintf(line, "Use %s (identical)", local_name);
+                               uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+                               break;
+                       case PF_DIFFERS:
+                               sprintf(line, "Use %s (differs)", local_name);
+                               uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+                               sprintf(line, "Overwrite %s", local_name);
+                               uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL);
+                               break;
+               }
+       }
+       
+       switch(checkPackedFile(abs_name, pf)) {
+               case PF_NOFILE:
+                       sprintf(line, "Create %s", abs_name);
+                       uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+                       break;
+               case PF_EQUAL:
+                       sprintf(line, "Use %s (identical)", abs_name);
+                       uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+                       break;
+               case PF_DIFFERS:
+                       sprintf(line, "Use %s (differs)", local_name);
+                       uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+                       sprintf(line, "Overwrite %s", local_name);
+                       uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+                       break;
+       }
+
+       uiPupMenuEnd(C, pup);
+}
+
 static int unpack_exec(bContext *C, wmOperator *op)
 {
        Image *ima= CTX_data_edit_image(C);
+       int method= RNA_enum_get(op->ptr, "method");
 
-       if(!ima)
+       if(!ima || !ima->packedfile)
+               return OPERATOR_CANCELLED;
+
+       if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) {
+               BKE_report(op->reports, RPT_ERROR, "Can't unpack movie or image sequence.");
                return OPERATOR_CANCELLED;
-       if(!ima->packedfile)
+       }
+
+       if(G.fileflags & G_AUTOPACK)
+               BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
+       
+       unpackImage(op->reports, ima, method);
+
+       return OPERATOR_FINISHED;
+}
+
+static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       Image *ima= CTX_data_edit_image(C);
+
+       if(!ima || !ima->packedfile)
                return OPERATOR_CANCELLED;
 
        if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) {
@@ -1179,7 +1262,7 @@ static int unpack_exec(bContext *C, wmOperator *op)
        if(G.fileflags & G_AUTOPACK)
                BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
        
-       unpackImage(ima, PF_ASK);
+       unpack_menu(C, "IMAGE_OT_unpack", ima->name, "textures", ima->packedfile);
 
        return OPERATOR_FINISHED;
 }
@@ -1192,10 +1275,14 @@ void IMAGE_OT_unpack(wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= unpack_exec;
+       ot->invoke= unpack_invoke;
        ot->poll= space_image_poll;
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       /* properties */
+       RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
 }
 
 /******************** sample image operator ********************/
diff --git a/source/blender/editors/space_info/info_header.c b/source/blender/editors/space_info/info_header.c
deleted file mode 100644 (file)
index 7d6e2ca..0000000
+++ /dev/null
@@ -1,507 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. 
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- * 
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <stdio.h>
-
-#include "DNA_packedFile_types.h"
-#include "DNA_space_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_windowmanager_types.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_bpath.h"
-
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_main.h"
-#include "BKE_packedFile.h"
-#include "BKE_screen.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "IMB_imbuf_types.h"
-
-#include "info_intern.h"
-
-static int pupmenu() {return 0;}
-static int okee() {return 0;}
-static int error() {return 0;}
-
-/* ************************ header area region *********************** */
-
-#define B_STOPRENDER   1
-#define B_STOPCAST             2
-#define B_STOPANIM             3
-
-static void do_viewmenu(bContext *C, void *arg, int event)
-{
-}
-
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
-       ScrArea *curarea= CTX_wm_area(C);
-       uiBlock *block;
-       short yco= 0, menuwidth=120;
-       
-       block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
-       uiBlockSetButmFunc(block, do_viewmenu, NULL);
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20, 
-                                        menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-       
-       if(curarea->headertype==HEADERTOP) {
-               uiBlockSetDirection(block, UI_DOWN);
-       }
-       else {
-               uiBlockSetDirection(block, UI_TOP);
-               uiBlockFlipOrder(block);
-       }
-       
-       uiTextBoundsBlock(block, 50);
-       uiEndBlock(C, block);
-       
-       return block;
-}
-
-static int buttons_do_unpack()
-{
-       int how;
-       char menu[2048];
-       char *line = menu;
-       int ret_value = 1, count = 0;
-       
-       count = countPackedFiles();
-       
-       if(!count) {
-               pupmenu("No packed files. Autopack disabled");
-               return ret_value;
-       }
-       if (count == 1)
-               line += sprintf(line, "Unpack 1 file%%t");
-       else
-               line += sprintf(line, "Unpack %d files%%t", count);
-       
-       line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
-       line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
-       line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
-       line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
-       line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
-       line += sprintf(line, "|Ask for each file %%x%d", PF_ASK);
-       
-       how = pupmenu(menu);
-       
-       if(how == -1)
-               ret_value = 0;
-       else {
-               if (how != PF_KEEP) unpackAll(how);
-               G.fileflags &= ~G_AUTOPACK;
-       }
-       
-       return ret_value;
-}
-
-static void check_packAll()
-{
-       // first check for dirty images
-       Image *ima;
-       
-       for(ima = G.main->image.first; ima; ima= ima->id.next) {
-               if (ima->ibufs.first) { /* XXX FIX */
-                       ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
-                       
-                       if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY))
-                               break;
-               }
-       }
-
-       if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) {
-               packAll();
-               G.fileflags |= G_AUTOPACK;
-       }
-}
-
-static void do_info_externalfiles(bContext *C, void *arg, int event)
-{
-       switch (event) {
-               
-               case 1: /* pack data */
-                       check_packAll();
-                       break;
-               case 3: /* unpack data */
-                       if (buttons_do_unpack() != 0) {
-                               /* Clear autopack bit only if user selected one of the unpack options */
-                               G.fileflags &= ~G_AUTOPACK;
-                       }
-                       break;
-               case 10: /* make all paths relative */
-                       if (G.relbase_valid) {
-                               int tot,changed,failed,linked;
-                               char str[512];
-                               char txtname[24]; /* text block name */
-                               txtname[0] = '\0';
-                               makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
-                               if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
-                               else            sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
-                               pupmenu(str);
-                       } else {
-                               pupmenu("Can't set relative paths with an unsaved blend file");
-                       }
-                       break;
-               case 11: /* make all paths absolute */
-               {
-                       int tot,changed,failed,linked;
-                       char str[512];
-                       char txtname[24]; /* text block name */
-                       txtname[0] = '\0';
-                       makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
-                       sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
-                       if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
-                       else            sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
-                       
-                       pupmenu(str);
-               }
-                       break;
-               case 12: /* check images exist */
-               {
-                       char txtname[24]; /* text block name */
-                       txtname[0] = '\0';
-                       
-                       /* run the missing file check */
-                       checkMissingFiles( txtname );
-                       
-                       if (txtname[0] == '\0') {
-                               okee("No external files missing");
-                       } else {
-                               char str[128];
-                               sprintf(str, "Missing files listed in Text \"%s\"", txtname );
-                               error(str);
-                       }
-               }
-                       break;
-               case 13: /* search for referenced files that are not available  */
-// XXX                 if(curarea->spacetype==SPACE_INFO) {
-//                             ScrArea *sa;
-//                             sa= closest_bigger_area();
-//                             areawinset(sa->win);
-//                     }
-//                     activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
-                       break;
-       }
-       
-}
-
-
-uiBlock *info_externalfiles(bContext *C, ARegion *ar, void *arg_unused)
-{
-       uiBlock *block;
-       short yco = 20, menuwidth = 120;
-       
-       block= uiBeginBlock(C, ar, "info_externalfiles", UI_EMBOSSP);
-       uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into .blend file",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...",                           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
-       
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative",                                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute",                                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files...",                                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files...",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
-       
-       uiBlockSetDirection(block, UI_RIGHT);
-       uiTextBoundsBlock(block, 60);
-       return block;
-}
-
-
-
-static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
-       
-       uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
-       uiItemO(layout, NULL, 0, "WM_OT_read_homefile"); 
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
-       uiItemO(layout, NULL, 0, "WM_OT_open_mainfile"); 
-//     uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
-//     uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
-       
-       uiItemS(layout);
-       
-       uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
-       uiItemO(layout, NULL, 0, "WM_OT_save_mainfile"); 
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
-       uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile"); 
-
-#if 0
-       if(U.flag & USER_FILECOMPRESS) {
-               uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
-       } else {
-               uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
-       }
-       
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
-#if GAMEBLENDER == 1
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
-#endif
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
-       
-       
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-       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, "");
-//     uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
-//     uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
-       
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
-       
-       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-       
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
-       uiBlockSetDirection(block, UI_DOWN);
-       uiTextBoundsBlock(block, 80);
-       
-       uiEndBlock(C, block);
-       return block;
-#endif
-}
-
-
-static void do_info_buttons(bContext *C, void *arg, int event)
-{
-       switch(event) {
-               case B_STOPRENDER:
-                       G.afbreek= 1;
-                       break;
-               case B_STOPCAST:
-                       WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
-                       break;
-               case B_STOPANIM:
-                       ED_screen_animation_timer(C, 0, 0);
-                       break;
-       }
-}
-
-static void screen_idpoin_handle(bContext *C, ID *id, int event)
-{
-       switch(event) {
-               case UI_ID_BROWSE:
-                       /* exception: can't set screens inside of area/region handers */
-                       WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, id);
-                       break;
-               case UI_ID_DELETE:
-                       ED_undo_push(C, "");
-                       break;
-               case UI_ID_RENAME:
-                       break;
-               case UI_ID_ADD_NEW:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_OPEN:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_ALONE:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_PIN:
-                       break;
-       }
-}
-
-static void scene_idpoin_handle(bContext *C, ID *id, int event)
-{
-       switch(event) {
-               case UI_ID_BROWSE:
-                       /* exception: can't set screens inside of area/region handers */
-                       WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, id);
-                       break;
-               case UI_ID_DELETE:
-                       ED_undo_push(C, "");
-                       break;
-               case UI_ID_RENAME:
-                       break;
-               case UI_ID_ADD_NEW:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_OPEN:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_ALONE:
-                       /* XXX not implemented */
-                       break;
-               case UI_ID_PIN:
-                       break;
-       }
-}
-
-static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
-{
-       wmOperatorType *ot= arg2;
-       
-       if(ot)
-               WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
-}
-
-static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
-{
-       wmOperatorType *ot = WM_operatortype_first();
-       
-       for(; ot; ot= ot->next) {
-               
-               if(BLI_strcasestr(ot->name, str)) {
-                       if(ot->poll==NULL || ot->poll((bContext *)C)) {
-                               char name[256];
-                               int len= strlen(ot->name);
-                               
-                               /* display name for menu, can hold hotkey */
-                               BLI_strncpy(name, ot->name, 256);
-                               
-                               /* check for hotkey */
-                               if(len < 256-6) {
-                                       if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, &name[len+1], 256-len-1))
-                                               name[len]= '|';
-                               }
-                               
-                               if(0==uiSearchItemAdd(items, name, ot, 0))
-                                       break;
-                       }
-               }
-       }
-}
-
-void info_header_buttons(const bContext *C, ARegion *ar)
-{
-       wmWindow *win= CTX_wm_window(C);
-       bScreen *screen= CTX_wm_screen(C);
-       ScrArea *sa= CTX_wm_area(C);
-       uiBlock *block;
-       int xco, yco= 3;
-       
-       block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
-       uiBlockSetHandleFunc(block, do_info_buttons, NULL);
-       
-       xco= ED_area_header_standardbuttons(C, block, yco);
-       
-       if((sa->flag & HEADER_NO_PULLDOWN)==0) {
-               int xmax;
-               
-               xmax= GetButStringLength("File");
-               uiDefMenuBut(block, info_filemenu, NULL, "File", xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-               
-               xmax= GetButStringLength("Add");
-               uiDefPulldownBut(block, dummy_viewmenu, sa, "Add",      xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-               
-               xmax= GetButStringLength("Timeline");
-               uiDefPulldownBut(block, dummy_viewmenu, sa, "Timeline", xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-               
-               xmax= GetButStringLength("Game");
-               uiDefPulldownBut(block, dummy_viewmenu, sa, "Game",     xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-               
-               xmax= GetButStringLength("Render");
-               uiDefPulldownBut(block, dummy_viewmenu, sa, "Render",   xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-               
-               xmax= GetButStringLength("Help");
-               uiDefPulldownBut(block, dummy_viewmenu, NULL, "Help",   xco, yco, xmax-3, 20, "");
-               xco+= xmax;
-       }
-       
-       uiBlockSetEmboss(block, UI_EMBOSS);
-       
-       if(screen->full==0) {
-               xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)win->screen, ID_SCR, NULL, xco, yco,
-                                                screen_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
-               xco += 8;
-               xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)screen->scene, ID_SCE, NULL, xco, yco,
-                                                        scene_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
-               xco += 8;
-       }       
-
-       if(WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
-               uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_REC, "Render", xco+5,yco,75,19, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering");
-               xco+= 80;
-       }
-       if(WM_jobs_test(CTX_wm_manager(C), CTX_wm_screen(C))) {
-               uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_REC, "Capture", xco+5,yco,85,19, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast");
-               xco+= 90;
-       }
-       if(screen->animtimer) {
-               uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_REC, "Anim Player", xco+5,yco,85,19, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback");
-               xco+= 90;
-       }
-       
-       {
-               static char search[256]= "";
-               uiBut *but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, xco+5, yco, 120, 19, "");
-               
-               uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb, NULL);
-
-               xco+= 125;
-       }
-
-       
-       /* always as last  */
-       UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-       
-       uiEndBlock(C, block);
-       uiDrawBlock(C, block);
-}
-
-
index 213c0688f20b7e1084828431df8a6c6babdd33d4..519364b58d965f281fb696a1dc304f00f74a064d 100644 (file)
 
 /* internal exports only */
 
+struct wmOperatorType;
 
 /* info_header.c */
 void info_header_buttons(const bContext *C, ARegion *ar);
 
+void FILE_OT_pack_all(struct wmOperatorType *ot);
+void FILE_OT_unpack_all(struct wmOperatorType *ot);
+void FILE_OT_make_paths_relative(struct wmOperatorType *ot);
+void FILE_OT_make_paths_absolute(struct wmOperatorType *ot);
+void FILE_OT_report_missing_files(struct wmOperatorType *ot);
+void FILE_OT_find_missing_files(struct wmOperatorType *ot);
 
 #endif /* ED_INFO_INTERN_H */
 
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
new file mode 100644 (file)
index 0000000..56f925a
--- /dev/null
@@ -0,0 +1,397 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_packedFile_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_main.h"
+#include "BKE_packedFile.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
+
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "IMB_imbuf_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_types.h"
+
+#include "info_intern.h"
+
+/********************* pack all operator *********************/
+
+static int pack_all_exec(bContext *C, wmOperator *op)
+{
+       Main *bmain= CTX_data_main(C);
+
+       packAll(bmain, op->reports);
+       G.fileflags |= G_AUTOPACK;
+
+       return OPERATOR_FINISHED;
+}
+
+static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       Main *bmain= CTX_data_main(C);
+       Image *ima;
+       ImBuf *ibuf;
+
+       // first check for dirty images
+       for(ima=bmain->image.first; ima; ima=ima->id.next) {
+               if(ima->ibufs.first) { /* XXX FIX */
+                       ibuf= BKE_image_get_ibuf(ima, NULL);
+                       
+                       if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
+                               break;
+               }
+       }
+
+       if(ima) {
+               uiPupMenuOkee(C, "FILE_OT_pack_all", "Some images are painted on. These changes will be lost. Continue?");
+               return OPERATOR_CANCELLED;
+       }
+
+       return pack_all_exec(C, op);
+}
+
+void FILE_OT_pack_all(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Pack All";
+       ot->idname= "FILE_OT_pack_all";
+       
+       /* api callbacks */
+       ot->exec= pack_all_exec;
+       ot->invoke= pack_all_invoke;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* unpack all operator *********************/
+
+static const EnumPropertyItem unpack_all_method_items[] = {
+       {PF_USE_LOCAL, "USE_LOCAL", 0, "Use files in current directory (create when necessary)", ""},
+       {PF_WRITE_LOCAL, "WRITE_LOCAL", 0, "Write files to current directory (overwrite existing files)", ""},
+       {PF_USE_ORIGINAL, "USE_ORIGINAL", 0, "Use files in original location (create when necessary)", ""},
+       {PF_WRITE_ORIGINAL, "WRITE_ORIGINAL", 0, "Write files to original location (overwrite existing files)", ""},
+       {PF_KEEP, "KEEP", 0, "Disable AutoPack, keep all packed files", ""},
+       {PF_ASK, "ASK", 0, "Ask for each file", ""},
+       {0, NULL, 0, NULL, NULL}};
+
+static int unpack_all_exec(bContext *C, wmOperator *op)
+{
+       Main *bmain= CTX_data_main(C);
+       int method= RNA_enum_get(op->ptr, "method");
+
+       if(method != PF_KEEP) unpackAll(bmain, op->reports, method); /* XXX PF_ASK can't work here */
+       G.fileflags &= ~G_AUTOPACK;
+
+       return OPERATOR_FINISHED;
+}
+
+static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       Main *bmain= CTX_data_main(C);
+       uiPopupMenu *pup;
+       uiLayout *layout;
+       char title[128];
+       int count = 0;
+       
+       count = countPackedFiles(bmain);
+       
+       if(!count) {
+               BKE_report(op->reports, RPT_WARNING, "No packed files. Autopack disabled.");
+               G.fileflags &= ~G_AUTOPACK;
+               return OPERATOR_CANCELLED;
+       }
+
+       if(count == 1)
+               sprintf(title, "Unpack 1 file");
+       else
+               sprintf(title, "Unpack %d files", count);
+       
+       pup= uiPupMenuBegin(C, title, 0);
+       layout= uiPupMenuLayout(pup);
+
+       uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+       uiItemsEnumO(layout, "FILE_OT_unpack_all", "method");
+
+       uiPupMenuEnd(C, pup);
+
+       return OPERATOR_CANCELLED;
+}
+
+void FILE_OT_unpack_all(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Unpack All";
+       ot->idname= "FILE_OT_unpack_all";
+       
+       /* api callbacks */
+       ot->exec= unpack_all_exec;
+       ot->invoke= unpack_all_invoke;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       /* properties */
+       RNA_def_enum(ot->srna, "method", unpack_all_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
+}
+
+/********************* make paths relative operator *********************/
+
+static int make_paths_relative_exec(bContext *C, wmOperator *op)
+{
+       char txtname[24]; /* text block name */
+       int tot, changed, failed, linked;
+
+       if(!G.relbase_valid) {
+               BKE_report(op->reports, RPT_WARNING, "Can't set relative paths with an unsaved blend file.");
+               return OPERATOR_CANCELLED;
+       }
+
+       txtname[0] = '\0';
+       makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
+
+       if(failed)
+               BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); 
+       else
+               BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+
+       return OPERATOR_FINISHED;
+}
+
+void FILE_OT_make_paths_relative(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Make All Paths Relative";
+       ot->idname= "FILE_OT_make_paths_relative";
+       
+       /* api callbacks */
+       ot->exec= make_paths_relative_exec;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* make paths absolute operator *********************/
+
+static int make_paths_absolute_exec(bContext *C, wmOperator *op)
+{
+       char txtname[24]; /* text block name */
+       int tot, changed, failed, linked;
+
+       if(!G.relbase_valid) {
+               BKE_report(op->reports, RPT_WARNING, "Can't set absolute paths with an unsaved blend file.");
+               return OPERATOR_CANCELLED;
+       }
+
+       txtname[0] = '\0';
+       makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
+
+       if(failed)
+               BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); 
+       else
+               BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+
+       return OPERATOR_FINISHED;
+}
+
+void FILE_OT_make_paths_absolute(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Make All Paths Absolute";
+       ot->idname= "FILE_OT_make_paths_absolute";
+       
+       /* api callbacks */
+       ot->exec= make_paths_absolute_exec;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* report missing files operator *********************/
+
+static int report_missing_files_exec(bContext *C, wmOperator *op)
+{
+       char txtname[24]; /* text block name */
+
+       txtname[0] = '\0';
+       
+       /* run the missing file check */
+       checkMissingFiles(txtname);
+       
+       if(txtname[0] == '\0')
+               BKE_report(op->reports, RPT_INFO, "No external files missing.");
+       else
+               BKE_reportf(op->reports, RPT_ERROR, "Missing files listed in Text \"%s\"", txtname);
+       
+       return OPERATOR_FINISHED;
+}
+
+void FILE_OT_report_missing_files(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Report Missing Files...";
+       ot->idname= "FILE_OT_report_missing_files";
+       
+       /* api callbacks */
+       ot->exec= report_missing_files_exec;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* find missing files operator *********************/
+
+static int find_missing_files_exec(bContext *C, wmOperator *op)
+{
+       char *filename;
+       
+       filename= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
+       findMissingFiles(filename);
+       MEM_freeN(filename);
+
+       return OPERATOR_FINISHED;
+}
+
+static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       /* XXX file open button text "Find Missing Files" */
+       WM_event_add_fileselect(C, op); 
+       return OPERATOR_RUNNING_MODAL;
+}
+
+void FILE_OT_find_missing_files(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Find Missing Files...";
+       ot->idname= "FILE_OT_find_missing_files";
+       
+       /* api callbacks */
+       ot->exec= find_missing_files_exec;
+       ot->invoke= find_missing_files_invoke;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       /* properties */
+       RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open.");
+}
+
+#if 0
+static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+       
+       uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
+       uiItemO(layout, NULL, 0, "WM_OT_read_homefile"); 
+       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
+       uiItemO(layout, NULL, 0, "WM_OT_open_mainfile"); 
+//     uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
+//     uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
+       
+       uiItemS(layout);
+       
+       uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
+       uiItemO(layout, NULL, 0, "WM_OT_save_mainfile"); 
+       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
+       uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile"); 
+
+#if 0
+       if(U.flag & USER_FILECOMPRESS) {
+               uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
+       } else {
+               uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
+       }
+       
+       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
+#if GAMEBLENDER == 1
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
+#endif
+       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
+       
+       
+       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+       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, "");
+//     uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
+//     uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
+       
+       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       
+       uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
+       
+       uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+       uiBlockSetDirection(block, UI_DOWN);
+       uiTextBoundsBlock(block, 80);
+       
+       uiEndBlock(C, block);
+       return block;
+#endif
+}
+#endif
+
index d72ecd60da912b187a97a66f327f1052658a4b1e..7b24e8f4e07f4ac7e60f5ceabbcc9ff5cfc1ffdb 100644 (file)
@@ -151,7 +151,12 @@ static void info_main_area_draw(const bContext *C, ARegion *ar)
 
 void info_operatortypes(void)
 {
-       
+       WM_operatortype_append(FILE_OT_pack_all);
+       WM_operatortype_append(FILE_OT_unpack_all);
+       WM_operatortype_append(FILE_OT_make_paths_relative);
+       WM_operatortype_append(FILE_OT_make_paths_absolute);
+       WM_operatortype_append(FILE_OT_report_missing_files);
+       WM_operatortype_append(FILE_OT_find_missing_files);
 }
 
 void info_keymap(struct wmWindowManager *wm)
@@ -162,29 +167,12 @@ void info_keymap(struct wmWindowManager *wm)
 /* add handlers, stuff you only do once or on area/region changes */
 static void info_header_area_init(wmWindowManager *wm, ARegion *ar)
 {
-       UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+       ED_region_header_init(ar);
 }
 
 static void info_header_area_draw(const bContext *C, ARegion *ar)
 {
-       float col[3];
-       
-       /* clear */
-       if(ED_screen_area_active(C))
-               UI_GetThemeColor3fv(TH_HEADER, col);
-       else
-               UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-       
-       glClearColor(col[0], col[1], col[2], 0.0);
-       glClear(GL_COLOR_BUFFER_BIT);
-       
-       /* set view2d view matrix for scrolling (without scrollers) */
-       UI_view2d_view_ortho(C, &ar->v2d);
-       
-       info_header_buttons(C, ar);
-       
-       /* restore view matrix? */
-       UI_view2d_view_restore(C);
+       ED_region_header(C, ar);
 }
 
 static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
index a4aa60775f2c658ccd72c65ad3d612ae06195079..b70112eebed36b7f2b18cf99a6d5c775e17156e8 100644 (file)
@@ -266,6 +266,11 @@ void RNA_api_ui_layout(StructRNA *srna)
        parm= RNA_def_boolean(func, "compact", 0, "", "Use compact, single row list template.");
        parm= RNA_def_collection(func, "items", 0, "", "Items visible in the list.");
        RNA_def_function_return(func, parm);
+
+       func= RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+       func= RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
 }
 
 #endif
index b7e3c86dd91bef8394fd9ee11f43e465d27e3f33..60a9afda0c4c5f77bd9939a8b2032f965ecef5df 100644 (file)
@@ -353,7 +353,8 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
        
        /* remove if it already exists */
        if ((ot=WM_operatortype_find(idname))) {
-               Py_XDECREF((PyObject*)ot->pyop_data);
+               if(ot->pyop_data)
+                       Py_XDECREF((PyObject*)ot->pyop_data);
                WM_operatortype_remove(idname);
        }
        
index 861080f30ba82a0aaaf1690ec2459d9a7a729407..29ec58befd9d815721ec6e0902e903185c9fcd7a 100644 (file)
@@ -575,7 +575,7 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
 //     }
        
        if (G.fileflags & G_AUTOPACK) {
-               packAll();
+               packAll(G.main, reports);
        }
        
        ED_object_exit_editmode(C, 0);