2016-04-24 22:42:41 +10:00
|
|
|
/*
|
|
|
|
* ***** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** \file blender/blenkernel/intern/blender_undo.c
|
|
|
|
* \ingroup bke
|
|
|
|
*
|
|
|
|
* Blend file undo (known as 'Global Undo').
|
|
|
|
* DNA level diffing for undo.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
# include <unistd.h> // for read close
|
|
|
|
#else
|
|
|
|
# include <io.h> // for open close read
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <fcntl.h> /* for open */
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
|
|
|
#include "BLI_path_util.h"
|
|
|
|
#include "BLI_string.h"
|
|
|
|
#include "BLI_utildefines.h"
|
|
|
|
|
|
|
|
#include "BKE_blender_undo.h" /* own include */
|
|
|
|
#include "BKE_blendfile.h"
|
|
|
|
#include "BKE_appdir.h"
|
|
|
|
#include "BKE_context.h"
|
|
|
|
#include "BKE_global.h"
|
|
|
|
#include "BKE_main.h"
|
|
|
|
|
|
|
|
#include "BLO_undofile.h"
|
|
|
|
#include "BLO_writefile.h"
|
|
|
|
|
2017-04-06 16:11:50 +02:00
|
|
|
#include "DEG_depsgraph.h"
|
|
|
|
|
2016-04-24 22:42:41 +10:00
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/** \name Global Undo
|
|
|
|
* \{ */
|
|
|
|
|
|
|
|
#define UNDO_DISK 0
|
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
bool BKE_memfile_undo_decode(MemFileUndoData *mfu, bContext *C)
|
2016-04-24 22:42:41 +10:00
|
|
|
{
|
2018-06-05 15:10:33 +02:00
|
|
|
Main *bmain = CTX_data_main(C);
|
|
|
|
char mainstr[sizeof(bmain->name)];
|
2016-04-24 22:42:41 +10:00
|
|
|
int success = 0, fileflags;
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
BLI_strncpy(mainstr, BKE_main_blendfile_path(bmain), sizeof(mainstr)); /* temporal store */
|
2016-04-24 22:42:41 +10:00
|
|
|
|
|
|
|
fileflags = G.fileflags;
|
|
|
|
G.fileflags |= G_FILE_NO_UI;
|
|
|
|
|
2018-03-27 14:44:17 +02:00
|
|
|
if (UNDO_DISK) {
|
2018-03-19 14:17:59 +01:00
|
|
|
success = (BKE_blendfile_read(C, mfu->filename, NULL, 0) != BKE_BLENDFILE_READ_FAIL);
|
2018-03-27 14:44:17 +02:00
|
|
|
}
|
|
|
|
else {
|
2018-03-19 14:17:59 +01:00
|
|
|
success = BKE_blendfile_read_from_memfile(C, &mfu->memfile, NULL, 0);
|
2018-03-27 14:44:17 +02:00
|
|
|
}
|
2016-04-24 22:42:41 +10:00
|
|
|
|
2018-06-06 09:36:50 +02:00
|
|
|
/* Restore, bmain has been re-allocated. */
|
|
|
|
bmain = CTX_data_main(C);
|
|
|
|
BLI_strncpy(bmain->name, mainstr, sizeof(bmain->name));
|
2016-04-24 22:42:41 +10:00
|
|
|
G.fileflags = fileflags;
|
|
|
|
|
|
|
|
if (success) {
|
|
|
|
/* important not to update time here, else non keyed tranforms are lost */
|
2018-06-06 09:39:35 +02:00
|
|
|
DEG_on_visible_update(bmain, false);
|
2016-04-24 22:42:41 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
MemFileUndoData *BKE_memfile_undo_encode(Main *bmain, MemFileUndoData *mfu_prev)
|
2016-04-24 22:42:41 +10:00
|
|
|
{
|
2018-03-19 14:17:59 +01:00
|
|
|
MemFileUndoData *mfu = MEM_callocN(sizeof(MemFileUndoData), __func__);
|
2016-04-24 22:42:41 +10:00
|
|
|
|
|
|
|
/* disk save version */
|
|
|
|
if (UNDO_DISK) {
|
|
|
|
static int counter = 0;
|
2018-03-27 14:44:17 +02:00
|
|
|
char filename[FILE_MAX];
|
2016-04-24 22:42:41 +10:00
|
|
|
char numstr[32];
|
|
|
|
int fileflags = G.fileflags & ~(G_FILE_HISTORY); /* don't do file history on undo */
|
|
|
|
|
2018-03-27 14:44:17 +02:00
|
|
|
/* Calculate current filename. */
|
2016-04-24 22:42:41 +10:00
|
|
|
counter++;
|
|
|
|
counter = counter % U.undosteps;
|
|
|
|
|
|
|
|
BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter);
|
2018-03-27 14:44:17 +02:00
|
|
|
BLI_make_file_string("/", filename, BKE_tempdir_session(), numstr);
|
2016-04-24 22:42:41 +10:00
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
/* success = */ /* UNUSED */ BLO_write_file(bmain, filename, fileflags, NULL, NULL);
|
2016-04-24 22:42:41 +10:00
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
BLI_strncpy(mfu->filename, filename, sizeof(mfu->filename));
|
2016-04-24 22:42:41 +10:00
|
|
|
}
|
|
|
|
else {
|
2018-03-19 14:17:59 +01:00
|
|
|
MemFile *prevfile = (mfu_prev) ? &(mfu_prev->memfile) : NULL;
|
|
|
|
/* success = */ /* UNUSED */ BLO_write_file_mem(bmain, prevfile, &mfu->memfile, G.fileflags);
|
|
|
|
mfu->undo_size = mfu->memfile.size;
|
2016-04-24 22:42:41 +10:00
|
|
|
}
|
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
bmain->is_memfile_undo_written = true;
|
2016-04-24 22:42:41 +10:00
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
return mfu;
|
2016-04-24 22:42:41 +10:00
|
|
|
}
|
|
|
|
|
2018-03-19 14:17:59 +01:00
|
|
|
void BKE_memfile_undo_free(MemFileUndoData *mfu)
|
Implement grouped undo option for operators
This option makes an operator to not push a task to the undo stack if the previous stored elemen is the same operator or part of the same undo group.
The main usage is for animation, so you can change frames to inspect the
poses, and revert the previous pose without having to roll back tons of
"change frame" operator, or even see the undo stack full.
This complements rB13ee9b8e
Design with help by Sergey Sharybin.
Reviewers: sergey, mont29
Reviewed By: mont29, sergey
Subscribers: pyc0d3r, hjalti, Severin, lowercase, brecht, monio, aligorith, hadrien, jbakker
Differential Revision: https://developer.blender.org/D2330
2016-11-15 11:50:11 +01:00
|
|
|
{
|
2018-03-19 14:17:59 +01:00
|
|
|
BLO_memfile_free(&mfu->memfile);
|
|
|
|
MEM_freeN(mfu);
|
2016-04-24 22:42:41 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/** \} */
|