Compare commits
	
		
			2 Commits
		
	
	
		
			b8061b665d
			...
			414859d309
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 414859d309 | |||
| 5a7f2d16df | 
| @ -53,8 +53,31 @@ body { | |||||||
| 	bottom: -1px; | 	bottom: -1px; | ||||||
| 	background: #ccc; | 	background: #ccc; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | .toolbar { | ||||||
|  | 	display: flex; | ||||||
|  | 	align-items: baseline; | ||||||
|  | 	gap: .3em; | ||||||
|  | } | ||||||
| button { | button { | ||||||
| 	font: inherit; | 	font: inherit; | ||||||
|  | 	background: transparent; | ||||||
|  | 	border: 1px solid transparent; | ||||||
|  | } | ||||||
|  | button:focus { | ||||||
|  | 	border: 1px dashed #000; | ||||||
|  | } | ||||||
|  | button:hover { | ||||||
|  | 	border-left: 1px solid #fff; | ||||||
|  | 	border-top: 1px solid #fff; | ||||||
|  | 	border-right: 1px solid #888; | ||||||
|  | 	border-bottom: 1px solid #888; | ||||||
|  | } | ||||||
|  | button:hover:active { | ||||||
|  | 	border-left: 1px solid #888; | ||||||
|  | 	border-top: 1px solid #888; | ||||||
|  | 	border-right: 1px solid #fff; | ||||||
|  | 	border-bottom: 1px solid #fff; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .middle { | .middle { | ||||||
|  | |||||||
| @ -199,6 +199,7 @@ function bufferToggleUnimportant(name) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function bufferToggleLog() { | function bufferToggleLog() { | ||||||
|  | 	// TODO: Try to restore the previous scroll offset.
 | ||||||
| 	if (bufferLog) { | 	if (bufferLog) { | ||||||
| 		setTimeout(() => | 		setTimeout(() => | ||||||
| 			document.getElementById('input')?.focus()) | 			document.getElementById('input')?.focus()) | ||||||
| @ -347,6 +348,7 @@ rpcEventHandlers.set(Relay.Event.BufferLine, e => { | |||||||
| 
 | 
 | ||||||
| 	let visible = document.visibilityState !== 'hidden' && | 	let visible = document.visibilityState !== 'hidden' && | ||||||
| 		bufferLog === undefined && | 		bufferLog === undefined && | ||||||
|  | 		bufferAutoscroll && | ||||||
| 		(e.bufferName == bufferCurrent || e.leakToActive) | 		(e.bufferName == bufferCurrent || e.leakToActive) | ||||||
| 	b.lines.push({...line}) | 	b.lines.push({...line}) | ||||||
| 	if (!(visible || e.leakToActive) || | 	if (!(visible || e.leakToActive) || | ||||||
| @ -427,21 +429,6 @@ let linkRE = [ | |||||||
| 	/[^\[\](){}<>"'\s,.:]/, | 	/[^\[\](){}<>"'\s,.:]/, | ||||||
| ].map(r => r.source).join('') | ].map(r => r.source).join('') | ||||||
| 
 | 
 | ||||||
| let Toolbar = { |  | ||||||
| 	toggleAutoscroll: () => { |  | ||||||
| 		bufferAutoscroll = !bufferAutoscroll |  | ||||||
| 	}, |  | ||||||
| 
 |  | ||||||
| 	view: vnode => { |  | ||||||
| 		return m('.toolbar', {}, [ |  | ||||||
| 			m('button', {onclick: Toolbar.toggleAutoscroll}, |  | ||||||
| 				bufferAutoscroll ? 'Scroll lock' : 'Scroll unlock'), |  | ||||||
| 			m('button', {onclick: event => bufferToggleLog()}, |  | ||||||
| 				bufferLog === undefined ? 'Show log' : 'Hide log'), |  | ||||||
| 		]) |  | ||||||
| 	}, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| let BufferList = { | let BufferList = { | ||||||
| 	view: vnode => { | 	view: vnode => { | ||||||
| 		let highlighted = false | 		let highlighted = false | ||||||
| @ -478,7 +465,7 @@ let Content = { | |||||||
| 			style.color = palette[fg] | 			style.color = palette[fg] | ||||||
| 		if (bg >= 0) | 		if (bg >= 0) | ||||||
| 			style.backgroundColor = palette[bg] | 			style.backgroundColor = palette[bg] | ||||||
| 		if (style) | 		for (const _ in style) | ||||||
| 			return style | 			return style | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| @ -624,7 +611,11 @@ let Buffer = { | |||||||
| 		let dateMark = new Date().toLocaleDateString() | 		let dateMark = new Date().toLocaleDateString() | ||||||
| 		if (dateMark !== lastDateMark && lastDateMark !== undefined) | 		if (dateMark !== lastDateMark && lastDateMark !== undefined) | ||||||
| 			lines.push(m('.date', {}, dateMark)) | 			lines.push(m('.date', {}, dateMark)) | ||||||
| 		return m('.buffer', {}, lines) | 		return m('.buffer', {onscroll: event => { | ||||||
|  | 			const dom = event.target | ||||||
|  | 			bufferAutoscroll = | ||||||
|  | 				dom.scrollTop + dom.clientHeight + 0.5 >= dom.scrollHeight | ||||||
|  | 		}}, lines) | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -678,6 +669,16 @@ let BufferContainer = { | |||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | let Toolbar = { | ||||||
|  | 	view: vnode => { | ||||||
|  | 		return m('.toolbar', {}, [ | ||||||
|  | 			bufferLog === undefined && !bufferAutoscroll ? '⇩' : undefined, | ||||||
|  | 			m('button', {onclick: event => bufferToggleLog()}, | ||||||
|  | 				bufferLog === undefined ? 'Log' : 'Hide log'), | ||||||
|  | 		]) | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| let Status = { | let Status = { | ||||||
| 	view: vnode => { | 	view: vnode => { | ||||||
| 		let b = buffers.get(bufferCurrent) | 		let b = buffers.get(bufferCurrent) | ||||||
| @ -687,7 +688,7 @@ let Status = { | |||||||
| 		let status = `${bufferCurrent}` | 		let status = `${bufferCurrent}` | ||||||
| 		if (b.hideUnimportant) | 		if (b.hideUnimportant) | ||||||
| 			status += `<H>` | 			status += `<H>` | ||||||
| 		return m('.status', {}, status) | 		return m('.status', {}, [status, m(Toolbar)]) | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -944,7 +945,7 @@ let Main = { | |||||||
| 
 | 
 | ||||||
| 		return m('.xP', {}, [ | 		return m('.xP', {}, [ | ||||||
| 			overlay, | 			overlay, | ||||||
| 			m('.title', {}, [`xP`, m(Toolbar)]), | 			m('.title', {}, `xP`), | ||||||
| 			m('.middle', {}, [m(BufferList), m(BufferContainer)]), | 			m('.middle', {}, [m(BufferList), m(BufferContainer)]), | ||||||
| 			m(Status), | 			m(Status), | ||||||
| 			m('.input', {}, [m(Prompt), m(Input)]), | 			m('.input', {}, [m(Prompt), m(Input)]), | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user