// ==UserScript==
// @name Fragments
// @namespace KrzysztofKruk-FlyWire
// @version 0.1.1.2
// @description Keeps history of removed fragments
// @author Krzysztof Kruk
// @match https://ngl.flywire.ai/*
// @match https://edit.flywire.ai/*
// @grant none
// @updateURL https://raw.githubusercontent.com/ChrisRaven/FlyWire-Fragments/main/Fragments.user.js
// @downloadURL https://raw.githubusercontent.com/ChrisRaven/FlyWire-Fragments/main/Fragments.user.js
// @homepageURL https://github.com/ChrisRaven/FlyWire-Fragments
// ==/UserScript==
if (!document.getElementById('dock-script')) {
let script = document.createElement('script')
script.id = 'dock-script'
script.src = typeof DEV !== 'undefined' ? 'http://127.0.0.1:5501/FlyWire-Dock/Dock.js' : 'https://chrisraven.github.io/FlyWire-Dock/Dock.js'
document.head.appendChild(script)
}
let wait = setInterval(() => {
if (globalThis.dockIsReady) {
clearInterval(wait)
main()
}
}, 100)
let fragments = []
const MAX_NO_OF_FRAGMENTS = 10
function main() {
let dock = new Dock()
let lsData = Dock.ls.get('fragments', true)
if (lsData) {
fragments = lsData
}
dock.addAddon({
name: 'Fragments',
id: 'kk-fragments',
html: '
' + generateBoxesHtml() + '
',
css: generateCss(),
events: {
'#kk-fragments': {
click: e => fragmentClicked(e)
}
}
})
let graphLayer = Dock.layers.getByType('segmentation_with_graph', false)
if (!graphLayer || !graphLayer[0]) return
graphLayer[0].layer.displayState.rootSegments.changed.add((id, added) =>rootSegmentsChangedHandler(id, added))
}
function fragmentClicked(e) {
if (!e.target.classList.contains('fragment')) return
if (e.target.classList.contains('empty-fragment')) return
let id = Dock.stringToUint64(e.target.dataset.id)
let graphLayer = Dock.layers.getByType('segmentation_with_graph', false)
if (!graphLayer) return
graphLayer[0].layer.displayState.rootSegments.add(id)
}
function rootSegmentsChangedHandler(id, added) {
if (added || !id) return
id = id.toJSON()
if (fragments.includes(id)) {
let index = fragments.indexOf(id)
fragments.splice(index, 1)
}
if (fragments.length === MAX_NO_OF_FRAGMENTS) {
fragments.shift()
}
fragments.push(id)
Dock.ls.set('fragments', fragments, true)
rebuildBoxes()
}
function generateBoxesHtml() {
let diff = MAX_NO_OF_FRAGMENTS - fragments.length
let html = ''
if (diff) {
for (let i = 0; i < diff; i++) {
html += ''
}
}
for (let i = diff; i < MAX_NO_OF_FRAGMENTS; i++) {
let fragId = fragments[i - diff]
html += ``
}
return html
}
function rebuildBoxes() {
document.getElementById('kk-fragments-container').innerHTML = generateBoxesHtml()
}
function generateCss() {
return /*css*/`
#kk-fragments .fragment {
display: inline-block;
width: 15px;
height: 15px;
background-color: yellow;
border: 1px solid black;
cursor: pointer;
}
#kk-fragments .empty-fragment {
background-color: gray;
cursor: default;
}
`
}
// TODO:
/*
userscript.html?name=Fragments.user.js&id=6c48fa62-bf05-4817-8503-544f7781a319:59 Uncaught TypeError: Cannot read properties of undefined (reading 'layer')
at main (userscript.html?name=Fragments.user.js&id=6c48fa62-bf05-4817-8503-544f7781a319:59:17)
at userscript.html?name=Fragments.user.js&id=6c48fa62-bf05-4817-8503-544f7781a319:26:5
*/