📄 _gm_undo.class
字号:
/* _gm_undo
Class for managing the graphics undo log.
*/
*! version 1.0.0 30jul2002
version 8
class {
class:
sz = 50
instance:
array edits /* undo edits, references to logs
* holding the edits. managed as a
* circular list. */
nxt = 1 /* index of next open edit */
* the undo */
} , inherit(object)
/* -------------------------------------------------------------------------*/
program define new
forvalues i=1/`.sz' {
.edits[`i'] = ._gm_undoedit.new
}
end
/* -------------------------------------------------------------------------*/
/* Add an edit to the list that can be undone. Must specify the name of the
log and number of lines in the log that correspond to the edit
*/
program define add
args logname num_edits
local idx = 0`.`logname'.arrnels'
if `idx'-`num_edits' < 0 {
di as text "`logname' not found or `num_edits' is too large"
exit 198 /* EXIT */
}
.edits[`.nxt'].log = "`logname'"
.edits[`.nxt'].logdex = `idx'
.edits[`.nxt'].n_edits = `num_edits'
._update_nxt
end
/* -------------------------------------------------------------------------*/
/* Undo the most recently logged edit. This removes the edit from the undo
list and from its log. It does not redraw the edited object.
*/
program define undo
forvalues i = `=`.nxt'-1'(-1)1 {
if "`.edits[`i'].log'" != "" {
local edex `i'
continue, break
}
}
if ! 0`edex' {
forvalues i = `.sz'(-1)`=`.nxt'+1' {
if "`.edits[`i'].log'" != "" {
local edex `i'
continue, break
}
}
}
if 0`edex' <= 0 {
di as text "(note: nothing to undo)"
exit /* EXIT */
}
local edit edits[`edex']
local log `.`edit'.log'
local logidx = 0`.`log'.arrnels'
if `logidx' < 0`.`edit'.logdex' {
di as error "undo edit has become invalid, no longer in log"
local rc 198
}
else {
if `logidx'-`.`edit'.n_edits' < 0 {
di as error "undo implies more edits than log contains"
local rc 198
}
}
if ! 0`rc' {
if 0`.`edit'.logdex' == `logidx' {
forvalues i = 1/`.`edit'.n_edits' {
.`log'.Arrpop
}
}
else {
local idx `.`edit'.logdex'
forvalues i = 0/`=`.`edit'.n_edits'-1' {
.`log'[`idx'-`i'].Arrdropel
}
}
.nxt = `edex'
._clear_nxt
}
class exit `"`._topname `log''"'
// exit `rc'
end
/* -------------------------------------------------------------------------*/
/* Clear all edits.
*/
program define clear
forvalues i=1/`.sz' {
._clear_i `i'
}
end
/* -------------------------------------------------------------------------*/
/* Clear all undo edits for a specific log.
*/
program define clear_graph
args grnm
forvalues i = 1/`.sz' {
if "`._topname `.edits[`i'].log''" == "`grnm'" {
._clear_i `i'
}
}
end
/* -------------------------------------------------------------------------*/
program define debug
di ".nxt = `.nxt'"
forvalues i=1/`.sz' {
di "log `.edits[`i'].log' logdex=`.edits[`i'].logdex' " /*
*/ "n_edits=`.edits[`i'].n_edits'
}
end
/* -------------------------------------------------------------------------*/
program define _update_nxt
.nxt = cond(`.nxt'==`.sz', 1, `.nxt'+1)
._clear_nxt
end
program define _clear_nxt
._clear_i `.nxt'
end
program define _clear_i
args i
.edits[`i'].log = ""
.edits[`i'].logdex = exp(.)
.edits[`i'].n_edits = exp(.)
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -