编辑器撤销(undo)与重做(redo)插件的设计与实现
,涉及三个方面:
1. 编辑器状态定义
不仅要包含当前编辑器的内容(body.innerHTML),还要考虑编辑区域用户的选中状态,用户选中每个区域进行高亮等操作,则操作前要把当前选中区域以及内容html都要保存下来:
/**
* 当前编辑区域状态,包括html与选择区域
* @param editor
*/
function Snapshot(editor) {
var contents = editor.getData(),selection = contents && editor.getSelection();
//内容html
this.contents = contents;
//选择区域书签标志
this.bookmarks = selection && selection.createBookmarks2(true);
}
2.编辑状态历史的管理
历史管理器维护着编辑状态的栈数据, 其他插件通过触发编辑器的 save 与 restore 事件来通知历史管理器更新内部的状态。
当 save 操作时,历史管理器将当前状态添加到编辑状态栈即可,并更新内部游标。
restore 操作时,需要利用管理器内部的游标来在状态栈间前(undo)后(redo)游走,用游标处的状态替换当前状态。
注意点在于,当进行了re/undo操作后,再进行save状态保存,需要对状态栈进行清理,将当前游标以后的历史状态删掉,防止出现历史分支:
另一点在于:对于键盘的连续输入,可buffer处理,只有当空闲一定时间后才进行保存,避免细微冗余信息。
/**
* 通过编辑器的save与restore事件,编辑器实例的历史栈管理,与键盘监控
* @param editor
*/
function UndoManager(editor) {
//redo undo history stack
/**
* 编辑器状态历史保存
*/
this.history = [];
this.index = 0;
this.editor = editor;
this.bufferTimer = new BufferTimer(500, this.save, this);
this._init();
}
S.augment(UndoManager, {
/**
* 监控键盘输入,buffer处理
* @param ev
*/
_keyMonitor: function (ev) {
//ctrl+z,撤销
//ctrl+y,重做
//其他可见字符buffer处理
},
_init: function () {
var self = this,
editor = self.editor;
//外部通过editor触发save|restore,管理器捕获事件处理
editor.on("save", function (ev) {
if (ev.buffer)
//键盘操作需要缓存
self.bufferTimer.run();
else {
//其他立即save
self.save();
}
});
//un/re do
editor.on("restore", this.restore, this);
self._keyMonitor();
//先save一下
self.save();
},
/**
* 保存历史
*/
save: function () {
//游标后面的历史抛弃
//超过占最大容量,shift队列出列
//当前状态和栈顶状态不同,入栈
//更新游标
//触发afterSave事件
},
/**
*
* @param ev
* ev.d :1.向前撤销 ,-1.向后重做
*/
restore: function (ev) {
//更新游标,用游标所在状态替换当前状态
}
});
3.工具栏 ui 与功能调用
RestoreUI 封装工具栏撤销与重做的功能与表现,使用 attribute
抽象出三状态按钮(可用并选中,可用,禁用),监听通过2触发的编辑器 afterSave,afterRestore 事件,通过游标位置和历史栈大小的比较,来决定redo ,undo按钮的禁用与可用状态.
/**
* save,restore完,更新工具栏状态
*/
editor.on("afterSave", this._respond, this);
editor.on("afterRestore", this._respond, this);
undo:当游标不在状态栈底部时可用(index>0&&history.length>0)
redo:当游标不在状态栈顶部时可用(index < history.length-1)
当点击工具栏按钮时,触发editor的restore事件,注意参数,redo为向后restore,undo为向前restore。
/**
* 触发重做或撤销动作,都是restore,方向不同
*/
self.el.on("click", function() {
editor.fire("restore", {
d:RedoMap[self.text]
});
});
4.整合
当编辑器实例生成后,全局空间事件通知undo/redo插件,插件对每个编辑器生成对应的历史管理器与工具栏按钮:
KE.on("instanceCreated", function(ev) {
var editor = ev.editor;
/**
* 编辑器历史中央管理
*/
new UndoManager(editor);
/**
* 撤销工具栏按钮
*/
new RestoreUI(editor, "undo");
/**
* 重做工具栏按钮
*/
new RestoreUI(editor, "redo");
});
插件源码
demo
- 大小: 3.6 KB
- 大小: 882 Bytes
- 大小: 10.8 KB
- 大小: 14.1 KB
- 大小: 22.4 KB
分享到:
相关推荐
这两个文件可能包含了自定义编辑视图类的实现,它们可能是文本编辑器的核心组件。在撤销/重做管理中,编辑视图通常负责捕获用户的输入事件,并与撤销管理器交互,以便记录和回滚操作。 2. **UndoManager.cpp**: ...
JavaScript(简称JS)是网页开发中的重要脚本语言,它被广泛用于实现客户端的交互功能,如表单验证、日期控件以及新闻编辑器等。本文将深入探讨这些知识点,帮助开发者更好地理解和应用。 首先,我们来谈谈JS表单...
- **Undo/Redo**:撤销或重做最近的操作,这对于纠正错误非常有用。 - **Cut/Copy/Paste/Duplicate/Delete**:执行基本的剪切、复制、粘贴、复制和删除操作。 - **Frame Selected**:将相机聚焦于选定的对象上,便于...
- **Undo/Redo**:撤销或重做最近的操作。 - **Cut/Copy/Paste/Duplicate/Delete**:基本的剪切、复制、粘贴、复制和删除功能。 - **Frame selected**:将视图中心移动到选中的游戏对象上。 - **Select All/...
- **Undo/Redo**:撤销/重做。用于撤销最近的操作或重做被撤销的操作。 - **Cut/Copy/Paste/Duplicate/Delete**:剪切/复制/粘贴/复制/删除。这些功能允许用户轻松地移动或复制场景中的对象。 - **Frame Selected**...
Cute Editor 4.0 has a new custom undo/redo implementation to make you can now safely undo those actions. <br/><br/> <br/> 多语言支持,通过简单设置XML即可完成 (Demo)<br/><br/>All labels, buttons, ...
- **Undo/Redo**:撤销或重做上一步操作。 - **Cut/Copy/Paste/Duplicate/Delete**:常用的剪切、复制、粘贴、复制并粘贴及删除操作。 - **Frame Selected**:将视图聚焦于当前选中的对象。 - **Find**:搜索...
- **Undo/Redo**:撤销/重做操作,便于修正错误。 - **Cut/Copy/Paste/Duplicate/Delete**:基本的剪切、复制、粘贴、复制和删除功能,用于处理场景中的对象和组件。 - **Frame Selected**:将视图调整到选定对象...
- **Undo/Redo**:撤销或重做最近的操作,便于调整和恢复。 - **Cut/Copy/Paste/Duplicate/Delete**:剪切、复制、粘贴、复制或删除游戏对象或组件。 - **Frame selected**:将摄像机视角调整到选定游戏对象的位置,...
CAD 软件快捷键大全 在 CAD 软件中,快捷键是提高工作效率的重要工具。以下是 CAD 软件快捷键大全,涵盖了基本绘图、编辑、查看、对象捕捉、栅格、极轴、对象追踪、动态输入...* 块编辑器:BEDIT * 属性编辑:ATTEDIT
1. Undo/Redo:撤销/重做,用于撤销或恢复最近的操作。 2. Cut/Copy/Paste:剪切/复制/粘贴,用于在场景中移动和复制对象。 3. Duplicate:复制,创建选定对象的副本。 4. Delete:删除,移除选定的对象。 5. Frame ...
- **Sync VisualStudio Project**:同步Visual Studio工程,保持代码编辑器与Unity的连接。 4. **GameObject(游戏对象)**: - **Create Empty**:创建一个空的游戏对象,作为其他组件的基础。 5. **Component...
`Undo/Redo`用于撤销或重做操作,`Cut/Copy/Paste/Duplicate/Delete`则对应标准的剪切、复制、粘贴、复制和删除功能。`Frame selected`将视角移动到选定物体前方,`Select All`选择所有物体,`Preferences`可以调整...
### U3D中文界面翻译详解 #### Unity3D菜单与参数中文翻译及功能...通过以上对Unity3D菜单与参数的中文翻译及其功能的详细解析,开发者可以更快速地理解和掌握Unity编辑器的使用方法,从而提高游戏开发的效率和质量。
- **Exit**:退出Unity3D编辑器。 2. **Edit(编辑)**: - **Undo/Redo**:撤销/重做操作,便于修正错误。 - **Cut/Copy/Paste/Duplicate/Delete**:基本的剪切、复制、粘贴、复制和删除功能。 - **Frame ...
AutoCAD是由Autodesk公司开发的一款知名的CAD软件,它以矢量图形为基础,提供丰富的绘图、编辑和注释功能,极大地提高了设计师的工作效率。 在CAD考试中,常见的问题涵盖了基本操作、命令理解和高级应用。以下是...
导出包将一组资源打包为可分享的文件Select Dependencies 选择依赖检查并选择资源所依赖的其他文件Export ogg file 导出OGG音频文件将音频资源导出为OGG格式Reimport All 重新导入所有重新导入项目中的所有资源Sync ...
Cut、Copy和Paste命令则类似于常见的文本编辑器功能。Cut会剪切选中的对象,将其从当前位置移除并放入剪贴板;Copy则是复制选中对象,而Paste则能将剪贴板中的内容粘贴到场景中的指定位置。Duplicate命令与Copy类似...
在AutoCAD这款强大的计算机辅助设计软件中,快捷方式是提高工作效率的关键。AutoCAD的快捷键不仅能让用户在绘制和编辑二维及三维图形时快速执行命令,还能减少鼠标操作,提高精度和速度。以下是对AutoCAD快捷方式的...