crop seems to work ok...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2023-10-25 04:27:13 +03:00
parent b292a7ff23
commit a3e5e4e326

View File

@ -617,7 +617,7 @@ var JSONOutline = {
// format: // format:
// Map([ // Map([
// [<node>, <path>], // [<node>, <parent>],
// ... // ...
// ]) // ])
__nodes: undefined, __nodes: undefined,
@ -1151,48 +1151,63 @@ var Outline = {
crop: function(node='focused'){ crop: function(node='focused'){
var that = this var that = this
// XXX make this relative to this.__crop_root var stack = this.__crop_stack =
var stack = this.__crop_stack ?? []
this.__crop_stack = [ var state = stack[0] = stack[0] ?? this.json()
...this.__crop_stack ?? [], var path = stack[1] = stack[1] ?
[ [...stack[1], ...this.path().slice(1)]
this.json(), : this.path(...arguments)
this.path(), stack[2] = [
this.path('text').slice(0, -1), ...(stack[2] ?? []),
], ...this.path('text').slice(0, -1),
] ]
// clear focused -- prevent focus from shifting on uncrop...
var e = state
for(var i of path.slice(0, -1)){
e = e[i].children }
delete e[path.at(-1)].focused
this.load(this.data()) this.load(this.data(...arguments))
// XXX make this linkable... // XXX make this linkable...
this.header.innerHTML = '/ ' this.header.innerHTML = '/ ' + stack[2].join(' / ')
+ stack
.map(function([s,p,t]){
return t})
.flat()
.join(' / ')
this.dom.classList.add('crop') this.dom.classList.add('crop')
return this }, return this },
// XXX use JSON API... // XXX use JSON API...
// XXX add depth argument + 'all' uncrop: function(mode=undefined){
uncrop: function(mode=1){
if(this.__crop_stack == null){ if(this.__crop_stack == null){
return this} return this }
// XXX is this a good way do go???
if(mode == 'all'){
while(this.__crop_stack != null){
this.uncrop() }
return this }
// XXX replace relevant node in this.__crop_root with state... // merge changes into the state above...
// XXX should this be done on the way down or on the way up??? var stack = this.__crop_stack
/* XXX var [state, path, text] = stack
var state = this.json() var s = state
while(this.__crop_stack.length > 0){ for(var i of path.slice(0, -1)){
} s = s[i].children }
//*/ s.splice(path.at(-1), 1, ...this.json())
this.load(this.__crop_stack[0][0]) if(path.length > 1){
this.header.innerHTML = '' path.pop()
text.pop()
s = state
for(var i of path.slice(0, -1)){
s = s[i].children }
s = s[path.at(-1)]
this.load(s)
this.header.innerHTML =
'/ ' + stack[2].join(' / ')
this.__crop_stack = undefined } else {
this.dom.classList.remove('crop') this.load(state)
this.dom.classList.remove('crop')
this.__crop_stack = undefined
this.header.innerHTML = '' }
return this }, return this },