2.5
[blender-staging.git] / source / blender / editors / space_info / info_header.c
index 4b750600583c81c4f6e3032a3e19b550f04eac3e..32c01b53a9e041b9d0d4e18e6dbba4f187e8563b 100644 (file)
 #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 "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
 
 static void do_viewmenu(bContext *C, void *arg, int event)
 {
@@ -93,6 +105,219 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
        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, UI_HELV);
+       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, uiMenuItem *head, void *arg_unused)
+{
+       
+       uiMenuContext(head, WM_OP_EXEC_AREA);
+       uiMenuItemO(head, 0, "WM_OT_read_homefile"); 
+       uiMenuContext(head, WM_OP_INVOKE_AREA);
+       uiMenuItemO(head, 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, "");
+       
+       uiMenuSeparator(head);
+       
+       uiMenuContext(head, WM_OP_EXEC_AREA);
+       uiMenuItemO(head, 0, "WM_OT_save_mainfile"); 
+       uiMenuContext(head, WM_OP_INVOKE_AREA);
+       uiMenuItemO(head, 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)
 {
@@ -100,6 +325,9 @@ static void do_info_buttons(bContext *C, void *arg, int event)
                case B_STOPRENDER:
                        G.afbreek= 1;
                        break;
+               case B_STOPCAST:
+                       WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
+                       break;
        }
 }
 
@@ -179,7 +407,7 @@ void info_header_buttons(const bContext *C, ARegion *ar)
                uiBlockSetEmboss(block, UI_EMBOSSP);
                
                xmax= GetButStringLength("File");
-               uiDefPulldownBut(block, dummy_viewmenu, sa, "File",     xco, yco, xmax-3, 22, "");
+               uiDefMenuBut(block, info_filemenu, NULL, "File", xco, yco-2, xmax-3, 24, "");
                xco+= xmax;
                
                xmax= GetButStringLength("Add");
@@ -218,6 +446,11 @@ void info_header_buttons(const bContext *C, ARegion *ar)
 
        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;
        }
        
        /* always as last  */