问题标签 [undo-redo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
927 浏览

cocoa - 如何确保撤消和重做菜单项添加了操作字符串?

我在我的应用程序中有撤消/重做工作。

我将撤消和重做菜单操作的目标设置为我的应用程序委托,以使用 undoAction: 和 redoAction: 方法实现这些操作。菜单项的启用绑定绑定到我的撤消管理器的 canUndo 和 canRedo 属性,并且这些属性按预期工作。当我推送到撤消堆栈时,我设置了一个操作名称,但从未在菜单中看到它。

为什么我的菜单总是显示 Undo 或 Redo,而不是 Undo Move to Trash 和 Redo Move to Trash ?菜单项通常会被我绕过的一些魔法更新吗?我没有使用响应者链,因为我的应用程序委托不在响应者链中,因此永远看不到操作。

撤消管理器是在我的应用程序委托中创建的。

更新:更改为使用窗口的撤消管理器没有区别。

0 投票
3 回答
3732 浏览

mysql - 如何设计带有 undo-redo 的 SQL 数据库?

我试图弄清楚如何设计我的数据库表以允许撤消重做。

假设您有一个具有以下结构的任务表:

现在假设在几天内多次登录并进行了多次编辑;但用户想回到其中一个版本。

  1. 您是否有一个单独的表来跟踪更改 - 或者 - 您是否会尝试将更改保留在任务表中(“幽灵”行,因为没有更好的术语)?
  2. 您会跟踪所有列还是只跟踪每次更改的列?

如果重要的话,我正在使用 MySQL。另外,如果重要的话,我希望能够显示历史记录(ala Photoshop)并允许用户切换到任何版本。

额外问题:您会在更改时保存整个memo单元格还是尝试仅保存增量?我问的原因是因为memo单元格可能很大,每次修订只能更改一个单词或字符。诚然,保存增量需要解析,但如果不经常期望撤消,那么节省空间而不是处理时间不是更好吗?

感谢您的帮助。

0 投票
2 回答
2305 浏览

vim - VIM:: 撤消指定文本上或周围的更改

在 VIM 中是否可以撤消特定文本块上或周围的更改?假设我在上面进行了更改 A "if yes",然后在文件的其他位置更改了 B、C、D 和 E。是否可以告诉 vim“撤消在 +/- 10 行中完成的更改if yes

我遇到了另一个问题,表明这是不可能的,或者至少在香草 vim 中是不可能的。有没有人知道任何允许这种行为的插件?

0 投票
4 回答
2283 浏览

javascript - Apply Undo Redo on elements that can dragable (drag and drop)

I want to implement functionality on the svgElements that can be dragged with javascript how could I do this...

I have implemented this with mouse up

When mouse up occurs, I save the x and y position, object id, object type (circle, rect, etc.)

Can any one tell...is this good way to implement?

0 投票
2 回答
2017 浏览

objective-c - 清除 NSUndoManager 的重做堆栈

在我的应用程序中,我想以编程方式撤消一些操作,而不给用户单击“重做”的选项。有没有办法清除重做堆栈NSUndoManager?如果没有,并且我要进行子类NSUndoManager化,有没有办法访问重做堆栈以清除它?我没有从文档中看到任何方法。

或者,有没有办法在不填充重做堆栈的情况下恢复当前嵌套撤消组的更改?我已经在构建一个嵌套的撤消组。

0 投票
5 回答
38666 浏览

vim - 使用 Vim 的持久撤销?

Vim 7.3 的新特性之一是“持久撤消”,它允许撤消树在退出缓冲区时保存到文件中。

不幸的是,我还不能正确启用它,或者我一定是用错了。这是我到目前为止所尝试的:

我将以下内容添加到 ~/.vimrc

在此之后,我应该能够打开任何文件,编辑它,然后保存关闭它,当我再次打开它时,我应该能够撤消/重做,就好像我从未离开过一样。不幸的是,情况似乎并非如此,因为没有写入任何撤消文件。

笔记:

  1. 我在 Win 7 上使用来自 Vim without cream 项目的 Vim 7.3。持久撤消是内置的。

  2. $HOME/.vim/undo 存在于我的文件系统中

0 投票
1 回答
1306 浏览

c# - WPF 中的 Visual Studio 样式撤消/重做按钮

我想制作一个功能区撤消/重做按钮,其外观和功能类似于 Visual Studio 的撤消/重做按钮。我一直在尝试使用 RibbonSplitButton 来模仿这种行为,但事实证明它只接受其 Items 属性中的菜单项。有人知道如何去做吗?提前致谢。

ps 最坏的情况是编写一个自定义控件来覆盖现有的拆分按钮,但有人知道要覆盖什么吗?

0 投票
1 回答
1937 浏览

wpf - WPF RibbonControlsLibrary RibbonSplitButton 项目问题

我正在使用 RibbonSplitButton 在其下拉菜单中使用菜单项来模仿 Visual Studio 的撤消重做按钮。我们有撤消重做堆栈,我有一个依赖属性更改事件处理程序,它将根据堆栈更新 UI。问题是,splitbutton 的 items 属性正在使用 Collection,即使它的项目集合的顺序正确,它也不会显示它们,因为它们是按索引排序的。

我将在下面提供一些示例来更好地解释这一点:

代码:

XAML:

实际撤消菜单项

撤消代码中的菜单项

PS即使我将0处的插入更改为添加,所以它会添加到集合的最后而不是第一个,它似乎没有什么区别......如果有人可以给我一些关于发生了什么的信息以及如何解决这个问题,将不胜感激。提前致谢。

0 投票
6 回答
5274 浏览

c# - 实施撤消/重做的好集合?

我正在阅读有关撤消/重做技术的信息,我了解应该如何实现它(我发现它很直观)。

但是我在考虑应该作为历史的收藏,

很多人使用堆栈,但 C# 堆栈是作为数组实现的,这是一个问题:如果我使用“有限”历史记录(例如,对于 2000 条命令),当达到限制时我没有从堆栈末尾删除项目的方法,如果我找到了一种方法,我必须移动数组的所有元素(每次命令完成时都会移动)。

LinkedList 看起来不错,但会浪费大量内存。

我的最后一个选择是一个链表的自定义实现,一个 SingleLinkedList。该列表的一个节点由 Value 属性和 NextNode 指针属性组成,因此我为每个项目使用双内存(但仅此而已,除非我使用的东西小于“sizeof(void*)”)。

我还存储了指向集合中第一个元素的指针和指向最后一个元素的指针。

我可以轻松地将命令添加到历史记录并以这种方式将它们移动到重做历史记录,但是我无法创建“有限”历史记录,因为不允许 RemoveLast (我必须遍历整个集合才能删除最后一项)。

所以我的问题是:我应该使用 LinkedList 还是我的自定义 SingleLinkedList?

更新1:

感谢您目前的回答,在我的情况下,我没有记忆问题,好吧,我不知道我的目标是谁,我正在创建一个实用程序,并且按照我自己的“实用程序”理念,他们应该尽可能少地浪费 cpu/内存(显然不要告诉我“用 c++ 编写它”,因为有很大的不同)。

在我看来,单链表效果很好,我真的不喜欢限制历史,我正在考虑你的历史是“无限”的 Photoshop。

我只担心撤消历史变得非常大时会发生什么,比如使用 8 小时。这就是为什么我正在考虑通过 LinkedList 来限制它。

然而,正如其他人所说,如果我将链表限制为较大的大小,大约 60000 个命令(我认为它们应该足够了),与单链表相比,我只会浪费少量内存(4 字节 * 60000)。

就是说,我想我会使用 LinkedList,但是可以肯定的是,如果我无限制地使用历史记录会好吗?

更新 2:

@Akash Kava好吧,你说的很重要,但你误解了我为什么要使用 LinkedList 以及为什么我不想使用堆栈。Stack 的主要问题是有必要限制它的大小,并且当达到这个限制时,没有一种快速的方法来删除旧命令(它是一个数组,每次它不是我们想要的东西时都会加倍它的维度)。

单个链表(想想它是如何构建的)和堆栈一样快(所有堆栈操作都是 O(1))并且没有限制。但是在这种情况下,它不需要有限制,否则我们会遇到与堆栈相同的问题,我们没有快速的方法来删除单链表的最后一个元素(其行为类似于堆栈),因为我们不知道来自最后一个节点的上一个节点元素。

在这种情况下,很容易考虑一个 LinkedList,其中有 Previous 指针。但是,我们为“堆栈”的每个元素使用了 2 个额外的指针(这次是通过链表构建的),这就像使用存储命令所需的内存的 3 倍(使用数组,我们有正常的内存)使用,singlelinkedlist 的内存使用量是 2 倍,linkedlist 的内存使用量是 3 倍)。

所以我基本上要问的是哪个是实现撤销重做模式堆栈的“最佳”集合。

你的回答让我觉得即使我在 1 个程序中创建 60000 个命令,它在一个程序中也有大约 5MB 的内存,这不是那么多。

基本上,如果你想限制你的撤销/重做历史,你需要一个 LinkedList,否则 SingleLinkedList 更好。

0 投票
3 回答
685 浏览

c# - C#撤消/重做代码不做任何事情

对于我的图块编辑器,我有 2 叠 TileMaps,撤消和重做。每次用户进行更改时,地图的状态都会添加到堆栈中,而不是进行更改。这是我的撤消代码:

然而地图并没有改变。为什么?