resolve: #2 treeview drap/drop

This commit is contained in:
xiangyu 2022-05-11 21:39:28 +08:00
parent 326101ed36
commit b6d8acc2de
3 changed files with 48 additions and 64 deletions

View File

@ -105,6 +105,7 @@
) {
return;
}
window._e = e;
const fromTreeView = getTreeView();
const toTreeView = getTreeView();
@ -121,6 +122,18 @@
return;
}
window.parent.postMessage(
{
type: "moveNode",
fromID: parseInt(fromNode.itemData.id),
toID: toNode
? parseInt(toNode.itemData.id)
: toItems[toItems.length - 1].itemData.id,
moveType: e.dropInsideItem ? "child" : "before",
},
"*"
);
const fromTopVisibleNode = getTopVisibleNode(fromTreeView);
const toTopVisibleNode = getTopVisibleNode(toTreeView);
@ -191,18 +204,6 @@
? toItems.length
: findIndex(toItems, toNode.itemData.id);
window.parent.postMessage(
{
type: "moveNode",
fromID: parseInt(fromNode.itemData.id),
toID: toNode
? parseInt(toNode.itemData.id)
: toItems[toItems.length - 1].itemData.id,
type: toNode ? "before" : "after",
},
"*"
);
toItems.splice(toIndex, 0, fromNode.itemData);
moveChildren(fromNode, fromItems, toItems);

View File

@ -420,7 +420,7 @@ class AddonEvents extends AddonBase {
/*
message.content = {
params: {
fromID, toID, type: "before" | "after"
fromID, toID, moveType: "before" | "child"
}
}
*/
@ -437,11 +437,12 @@ class AddonEvents extends AddonBase {
);
Zotero.debug(fromNode.model);
Zotero.debug(toNode.model);
Zotero.debug(message.content.params.moveType);
this._Addon.knowledge.moveHeaderLineInNote(
undefined,
fromNode,
toNode,
message.content.params.type
message.content.params.moveType
);
this._Addon.views.buildOutline();
} else if (message.type === "closePreview") {

View File

@ -415,51 +415,54 @@ class Knowledge extends AddonBase {
return undefined;
}
let currentLineRange = this.getNodeLineRangeInNoteTree(note, currentNode);
let targetLineRange = this.getNodeLineRangeInNoteTree(note, targetNode);
let targetIndex = 0;
let targetRank = 1;
let lines = this.getLinesInNote(note);
if (as === "child") {
targetIndex = targetLineRange[1];
targetIndex = targetNode.model.endIndex;
targetRank = targetNode.model.rank === 6 ? 6 : targetNode.model.rank + 1;
} else if (as === "before") {
targetIndex = targetLineRange[0];
targetRank = targetNode.model.rank;
targetIndex = targetNode.model.lineIndex;
targetRank =
targetNode.model.rank === 7
? targetNode.parent.model.rank === 6
? 6
: targetNode.parent.model.rank + 1
: targetNode.model.rank;
} else if (as === "after") {
targetIndex = targetLineRange[1];
targetRank = targetNode.model.rank;
}
if (targetIndex > currentLineRange[1]) {
targetIndex -= currentLineRange[1] - currentLineRange[0];
targetIndex = targetNode.model.endIndex;
targetRank =
targetNode.model.rank === 7
? targetNode.parent.model.rank === 6
? 6
: targetNode.parent.model.rank + 1
: targetNode.model.rank;
}
let rankChange = targetRank - currentNode.model.rank;
Zotero.debug(`move to ${targetIndex}`);
let movedLines = lines.splice(
currentLineRange[0],
currentLineRange[1] - currentLineRange[0]
currentNode.model.lineIndex,
currentNode.model.endIndex - currentNode.model.lineIndex
);
let headerStartReg = new RegExp("<h[1-6]>");
let headerStopReg = new RegExp("</h[1-6]>");
for (let i = 0; i < movedLines.length; i++) {
let headerStart = movedLines[i].search(headerStartReg);
if (headerStart === -1) {
continue;
}
let lineRank = parseInt(movedLines[i][headerStart + 2]) + rankChange;
if (lineRank > 6) {
lineRank = 6;
} else if (lineRank < 1) {
lineRank = 1;
}
movedLines[i] = movedLines[i]
.replace(headerStartReg, `<h${lineRank}>`)
.replace(headerStopReg, `</h${lineRank}>`);
let headerReg = /<\/?h[1-6]>/g;
for (const i in movedLines) {
movedLines[i] = movedLines[i].replace(headerReg, (e) => {
let rank = parseInt(e.slice(-2, -1));
rank += rankChange;
if (rank > 6) {
rank = 6;
}
if (rank < 1) {
rank = 1;
}
return `${e.slice(0, -2)}${rank}>`;
});
}
let newLines = lines
.slice(0, targetIndex)
@ -585,27 +588,6 @@ class Knowledge extends AddonBase {
});
}
getNodeLineRangeInNoteTree(
note: ZoteroItem,
node: TreeModel.Node<object>
): number[] {
note = note || this.getWorkspaceNote();
if (!note) {
return;
}
let nodes = this.getNoteTreeAsList(note);
let endIndex = node.model.endIndex;
for (let i = 0; i < nodes.length; i++) {
if (
nodes[i].model.lineIndex >= node.model.lineIndex &&
nodes[i].model.rank > node.model.rank
) {
endIndex = nodes[i].model.endIndex;
}
}
return [node.model.lineIndex, endIndex];
}
async exportNoteToFile(
note: ZoteroItem,
convertNoteLinks: boolean = true,