[Bf-blender-cvs] [cc0caba] gooseberry: Allow the cache bake operator to overwrite existing files, using a confirm dialog.
Lukas Tönne
noreply at git.blender.org
Mon Mar 23 13:02:26 CET 2015
Commit: cc0cabaa9541930c6581f98f3ab2c58327e4f55e
Author: Lukas Tönne
Date: Tue Mar 3 18:45:32 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBcc0cabaa9541930c6581f98f3ab2c58327e4f55e
Allow the cache bake operator to overwrite existing files, using a
confirm dialog.
===================================================================
M source/blender/editors/io/io_cache_library.c
===================================================================
diff --git a/source/blender/editors/io/io_cache_library.c b/source/blender/editors/io/io_cache_library.c
index c1b5da6..6981fba 100644
--- a/source/blender/editors/io/io_cache_library.c
+++ b/source/blender/editors/io/io_cache_library.c
@@ -34,7 +34,9 @@
#include "BLF_translation.h"
#include "BLI_blenlib.h"
+#include "BLI_fileops.h"
#include "BLI_listbase.h"
+#include "BLI_path_util.h"
#include "BLI_utildefines.h"
#include "DNA_cache_library_types.h"
@@ -46,6 +48,7 @@
#include "BKE_cache_library.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
@@ -303,6 +306,60 @@ static void cache_library_bake_endjob(void *customdata)
BKE_scene_update_for_newframe(&data->eval_ctx, data->bmain, scene, scene->lay);
}
+/* Modified version of WM_operator_confirm_message_ex
+ * to allow storing context pointers in the popup layout
+ */
+static int operator_confirm_message(bContext *C, wmOperator *op, const char *title,
+ const int icon, const char *message,
+ PointerRNA *cachelib_ptr)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ IDProperty *properties = op->ptr->data;
+
+ if (properties && properties->len)
+ properties = IDP_CopyProperty(op->ptr->data);
+ else
+ properties = NULL;
+
+ pup = UI_popup_menu_begin(C, title, icon);
+ layout = UI_popup_menu_layout(pup);
+
+ uiLayoutSetContextPointer(layout, "cache_library", cachelib_ptr);
+ uiItemFullO_ptr(layout, op->type, message, ICON_NONE, properties, WM_OP_EXEC_REGION_WIN, 0);
+
+ UI_popup_menu_end(C, pup);
+
+ return OPERATOR_INTERFACE;
+}
+
+/* Warning! Deletes existing files if possible, operator should show confirm dialog! */
+static bool cache_library_bake_ensure_file_target(CacheLibrary *cachelib)
+{
+ char filename[FILE_MAX];
+
+ BKE_cache_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib, filename, sizeof(filename));
+
+ if (BLI_exists(filename)) {
+ if (BLI_is_dir(filename)) {
+ return false;
+ }
+ else if (BLI_is_file(filename)) {
+ if (BLI_file_is_writable(filename)) {
+ /* returns 0 on success */
+ return (BLI_delete(filename, false, false) == 0);
+ }
+ else {
+ return false;
+ }
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+}
+
static int cache_library_bake_exec(bContext *C, wmOperator *UNUSED(op))
{
CacheLibrary *cachelib = CTX_data_pointer_get_type(C, "cache_library", &RNA_CacheLibrary).data;
@@ -311,6 +368,9 @@ static int cache_library_bake_exec(bContext *C, wmOperator *UNUSED(op))
CacheLibraryBakeJob *data;
wmJob *wm_job;
+ /* make sure we can write */
+ cache_library_bake_ensure_file_target(cachelib);
+
/* XXX annoying hack: needed to prevent data corruption when changing
* scene frame in separate threads
*/
@@ -339,6 +399,46 @@ static int cache_library_bake_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
+static int cache_library_bake_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+ PointerRNA cachelib_ptr = CTX_data_pointer_get_type(C, "cache_library", &RNA_CacheLibrary);
+ CacheLibrary *cachelib = cachelib_ptr.data;
+
+ char filename[FILE_MAX];
+
+ if (!cachelib)
+ return OPERATOR_CANCELLED;
+ if (!BKE_cache_archive_path_test(cachelib->filepath, (ID *)cachelib, cachelib->id.lib)) {
+ BKE_reportf(op->reports, RPT_ERROR, "Cannot create file path for cache library %200s", cachelib->id.name+2);
+ return OPERATOR_CANCELLED;
+ }
+
+ BKE_cache_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib, filename, sizeof(filename));
+
+ if (BLI_exists(filename)) {
+ if (BLI_is_dir(filename)) {
+ BKE_reportf(op->reports, RPT_ERROR, "Cache Library target is a directory: %200s", filename);
+ return OPERATOR_CANCELLED;
+ }
+ else if (BLI_is_file(filename)) {
+ if (BLI_file_is_writable(filename)) {
+ return operator_confirm_message(C, op, IFACE_("Overwrite?"), ICON_QUESTION, filename, &cachelib_ptr);
+ }
+ else {
+ BKE_reportf(op->reports, RPT_ERROR, "Cannot overwrite Cache Library target: %200s", filename);
+ return OPERATOR_CANCELLED;
+ }
+
+ }
+ else {
+ BKE_reportf(op->reports, RPT_ERROR, "Invalid Cache Library target: %200s", filename);
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else
+ return cache_library_bake_exec(C, op);
+}
+
void CACHELIBRARY_OT_bake(wmOperatorType *ot)
{
/* identifiers */
@@ -347,6 +447,7 @@ void CACHELIBRARY_OT_bake(wmOperatorType *ot)
ot->idname = "CACHELIBRARY_OT_bake";
/* api callbacks */
+ ot->invoke = cache_library_bake_invoke;
ot->exec = cache_library_bake_exec;
ot->poll = cache_library_bake_poll;
More information about the Bf-blender-cvs
mailing list