use BLI_strncpy and BLI_snprintf when the size of the string is known.
[blender-staging.git] / source / blender / editors / util / ed_util.c
index ae1e932bb81d9ae6a2bc810659bac7fda1f429e4..73322a8292d16ade68171d731853ee6aef70a7e4 100644 (file)
@@ -1,6 +1,4 @@
-/**
- * $Id:
- *
+/*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -15,7 +13,7 @@
  *
  * 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.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2008 Blender Foundation.
  * All rights reserved.
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/editors/util/ed_util.c
+ *  \ingroup edutil
+ */
+
+
 #include <stdlib.h>
+#include <string.h>
 #include <math.h>
 
 #include "MEM_guardedalloc.h"
 
-#include "DNA_curve_types.h"
-#include "DNA_mesh_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
-#include "DNA_userdef_types.h"
+#include "DNA_packedFile_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
+#include "BKE_utildefines.h"
+#include "BKE_packedFile.h"
 
 #include "ED_armature.h"
 #include "ED_mesh.h"
+#include "ED_object.h"
 #include "ED_sculpt.h"
 #include "ED_util.h"
 
 #include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "WM_types.h"
+#include "RNA_access.h"
+
+
 
 /* ********* general editor util funcs, not BKE stuff please! ********* */
 
+void ED_editors_init(bContext *C)
+{
+       Main *bmain= CTX_data_main(C);
+       Scene *sce= CTX_data_scene(C);
+       Object *ob, *obact= (sce && sce->basact)? sce->basact->object: NULL;
+       ID *data;
+
+       /* toggle on modes for objects that were saved with these enabled. for
+          e.g. linked objects we have to ensure that they are actually the
+          active object in this scene. */
+       for(ob=bmain->object.first; ob; ob=ob->id.next) {
+               int mode= ob->mode;
+
+               if(mode && (mode != OB_MODE_POSE)) {
+                       ob->mode= 0;
+                       data= ob->data;
+
+                       if(ob == obact && !ob->id.lib && !(data && data->lib))
+                               ED_object_toggle_modes(C, mode);
+               }
+       }
+}
+
 /* frees all editmode stuff */
 void ED_editors_exit(bContext *C)
 {
+       Main *bmain= CTX_data_main(C);
        Scene *sce;
+
+       if(!bmain)
+               return;
        
        /* frees all editmode undos */
        undo_editmode_clear();
-       undo_imagepaint_clear();
+       ED_undo_paint_free();
        
-       for(sce=G.main->scene.first; sce; sce= sce->id.next) {
+       for(sce=bmain->scene.first; sce; sce= sce->id.next) {
                if(sce->obedit) {
                        Object *ob= sce->obedit;
                
-                       /* global in meshtools... */
-                       mesh_octree_table(ob, NULL, NULL, 'e');
-                       
                        if(ob) {
                                if(ob->type==OB_MESH) {
                                        Mesh *me= ob->data;
@@ -81,17 +116,13 @@ void ED_editors_exit(bContext *C)
                                else if(ob->type==OB_ARMATURE) {
                                        ED_armature_edit_free(ob);
                                }
-                               else if(ob->type==OB_FONT) {
-                                       //                      free_editText();
-                               }
-                               //              else if(ob->type==OB_MBALL) 
-                               //                      BLI_freelistN(&editelems);
-                               //      free_editLatt();
-                               //      free_posebuf();
                        }
                }
        }
-       
+
+       /* global in meshtools... */
+       mesh_octree_table(NULL, NULL, NULL, 'e');
+       mesh_mirrtopo_table(NULL, 'e');
 }
 
 
@@ -107,18 +138,18 @@ void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, fl
                ctrl= !ctrl;
        
        if(ctrl && shift) {
-               if(fac3!= 0.0) *val= fac3*floor(*val/fac3 +.5);
+               if(fac3 != 0.0f) *val= fac3*floorf(*val/fac3 +0.5f);
        }
        else if(ctrl) {
-               if(fac2!= 0.0) *val= fac2*floor(*val/fac2 +.5);
+               if(fac2 != 0.0f) *val= fac2*floorf(*val/fac2 +0.5f);
        }
        else {
-               if(fac1!= 0.0) *val= fac1*floor(*val/fac1 +.5);
+               if(fac1 != 0.0f) *val= fac1*floorf(*val/fac1 +0.5f);
        }
 }
 
 
-int GetButStringLength(char *str) 
+int GetButStringLength(const char *str) 
 {
        int rt;
        
@@ -127,3 +158,91 @@ int GetButStringLength(char *str)
        return rt + 15;
 }
 
+
+void unpack_menu(bContext *C, const char *opname, const char *id_name, const char *abs_name, const char *folder, struct PackedFile *pf)
+{
+       PointerRNA props_ptr;
+       uiPopupMenu *pup;
+       uiLayout *layout;
+       char line[FILE_MAX + 100];
+
+       pup= uiPupMenuBegin(C, "Unpack file", ICON_NONE);
+       layout= uiPupMenuLayout(pup);
+
+       strcpy(line, "Remove Pack");
+       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       RNA_enum_set(&props_ptr, "method", PF_REMOVE);
+       RNA_string_set(&props_ptr, "id", id_name);
+
+       if(G.relbase_valid) {
+               char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
+
+               BLI_strncpy(local_name, abs_name, sizeof(local_name));
+               BLI_splitdirstring(local_name, fi);
+               BLI_snprintf(local_name, sizeof(local_name), "//%s/%s", folder, fi);
+               if(strcmp(abs_name, local_name)!=0) {
+                       switch(checkPackedFile(local_name, pf)) {
+                               case PF_NOFILE:
+                                       BLI_snprintf(line, sizeof(line), "Create %s", local_name);
+                                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                                       RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+                                       RNA_string_set(&props_ptr, "id", id_name);
+
+                                       break;
+                               case PF_EQUAL:
+                                       BLI_snprintf(line, sizeof(line), "Use %s (identical)", local_name);
+                                       //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+                                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                                       RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+                                       RNA_string_set(&props_ptr, "id", id_name);
+
+                                       break;
+                               case PF_DIFFERS:
+                                       BLI_snprintf(line, sizeof(line), "Use %s (differs)", local_name);
+                                       //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+                                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                                       RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+                                       RNA_string_set(&props_ptr, "id", id_name);
+
+                                       BLI_snprintf(line, sizeof(line), "Overwrite %s", local_name);
+                                       //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
+                                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                                       RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+                                       RNA_string_set(&props_ptr, "id", id_name);
+                                       break;
+                       }
+               }
+       }
+
+       switch(checkPackedFile(abs_name, pf)) {
+               case PF_NOFILE:
+                       BLI_snprintf(line, sizeof(line), "Create %s", abs_name);
+                       //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                       RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+                       RNA_string_set(&props_ptr, "id", id_name);
+                       break;
+               case PF_EQUAL:
+                       BLI_snprintf(line, sizeof(line), "Use %s (identical)", abs_name);
+                       //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                       RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+                       RNA_string_set(&props_ptr, "id", id_name);
+                       break;
+               case PF_DIFFERS:
+                       BLI_snprintf(line, sizeof(line), "Use %s (differs)", abs_name);
+                       //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                       RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+                       RNA_string_set(&props_ptr, "id", id_name);
+
+                       BLI_snprintf(line, sizeof(line), "Overwrite %s", abs_name);
+                       //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+                       props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+                       RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+                       RNA_string_set(&props_ptr, "id", id_name);
+                       break;
+       }
+
+       uiPupMenuEnd(C, pup);
+}