Vanessa 2024-05-12 23:37:31 +08:00
parent 84819beaf7
commit fbc86d6a90
6 changed files with 39 additions and 6 deletions

View file

@ -52,8 +52,6 @@ Mobile #menu & .side-panel: 7
#windowControls: 999998 #windowControls: 999998
.b3-snackbar: 999999
.b3-tooltips: 1000000 .b3-tooltips: 1000000
*/ */

View file

@ -12,7 +12,7 @@
position: fixed; position: fixed;
right: 12px; right: 12px;
top: 22px; top: 22px;
z-index: 999999; // 不能设置死否则右键菜单会被遮盖 z-index: 999999;
max-height: calc(100vh - 32px); max-height: calc(100vh - 32px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View file

@ -46,7 +46,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
const messageVersion = message + (type === "error" ? " v" + Constants.SIYUAN_VERSION : ""); const messageVersion = message + (type === "error" ? " v" + Constants.SIYUAN_VERSION : "");
if (existElement) { if (existElement) {
window.clearTimeout(parseInt(existElement.getAttribute("data-timeoutid"))); window.clearTimeout(parseInt(existElement.getAttribute("data-timeoutid")));
existElement.innerHTML = `<div class="b3-snackbar__content${timeout === 0 ? " b3-snackbar__content--close" : ""}">${messageVersion}</div>${timeout === 0 ? '<svg class="b3-snackbar__close"><use xlink:href="#iconCloseRound"></use></svg>' : ""}`; existElement.innerHTML = `<div data-type="textMenu" class="b3-snackbar__content${timeout === 0 ? " b3-snackbar__content--close" : ""}">${messageVersion}</div>${timeout === 0 ? '<svg class="b3-snackbar__close"><use xlink:href="#iconCloseRound"></use></svg>' : ""}`;
if (type === "error") { if (type === "error") {
existElement.classList.add("b3-snackbar--error"); existElement.classList.add("b3-snackbar--error");
} else { } else {
@ -60,7 +60,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
} }
return; return;
} }
let messageHTML = `<div data-id="${id}" class="b3-snackbar--hide b3-snackbar${type === "error" ? " b3-snackbar--error" : ""}"><div class="b3-snackbar__content${timeout === 0 ? " b3-snackbar__content--close" : ""}">${messageVersion}</div>`; let messageHTML = `<div data-id="${id}" class="b3-snackbar--hide b3-snackbar${type === "error" ? " b3-snackbar--error" : ""}"><div data-type="textMenu" class="b3-snackbar__content${timeout === 0 ? " b3-snackbar__content--close" : ""}">${messageVersion}</div>`;
if (timeout === 0) { if (timeout === 0) {
messageHTML += '<svg class="b3-snackbar__close"><use xlink:href="#iconCloseRound"></use></svg>'; messageHTML += '<svg class="b3-snackbar__close"><use xlink:href="#iconCloseRound"></use></svg>';
} else if (timeout !== -1) { // -1 时需等待请求完成后手动关闭 } else if (timeout !== -1) { // -1 时需等待请求完成后手动关闭
@ -70,6 +70,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
messageHTML = messageHTML.replace("<div data-id", `<div data-timeoutid="${timeoutId}" data-id`); messageHTML = messageHTML.replace("<div data-id", `<div data-timeoutid="${timeoutId}" data-id`);
} }
messagesElement.parentElement.classList.add("b3-snackbars--show"); messagesElement.parentElement.classList.add("b3-snackbars--show");
messagesElement.parentElement.style.zIndex = (++window.siyuan.zIndex).toString();
messagesElement.insertAdjacentHTML("afterbegin", messageHTML + "</div>"); messagesElement.insertAdjacentHTML("afterbegin", messageHTML + "</div>");
setTimeout(() => { setTimeout(() => {
messagesElement.querySelectorAll(".b3-snackbar--hide").forEach(item => { messagesElement.querySelectorAll(".b3-snackbar--hide").forEach(item => {

View file

@ -13,6 +13,7 @@ import {Menu} from "./Menu";
import {hasClosestByClassName, hasTopClosestByTag} from "../protyle/util/hasClosest"; import {hasClosestByClassName, hasTopClosestByTag} from "../protyle/util/hasClosest";
import {App} from "../index"; import {App} from "../index";
import {Constants} from "../constants"; import {Constants} from "../constants";
import {textMenu} from "./text";
export class Menus { export class Menus {
@ -89,7 +90,15 @@ export class Menus {
initDockMenu(target).popup({x: event.clientX, y: event.clientY}); initDockMenu(target).popup({x: event.clientX, y: event.clientY});
event.stopPropagation(); event.stopPropagation();
break; break;
} else if (dataType === "textMenu") {
/// #if !BROWSER
textMenu(target).open({x: event.clientX, y: event.clientY});
event.stopPropagation();
event.preventDefault();
break;
/// #endif
} }
target = target.parentElement; target = target.parentElement;
} }
}, false); }, false);

26
app/src/menus/text.ts Normal file
View file

@ -0,0 +1,26 @@
import {Menu} from "../plugin/Menu";
export const textMenu = (target: Element) => {
const menu = new Menu();
if (menu.isOpen) {
return;
}
menu.addItem({
label: window.siyuan.languages.copy,
icon: "iconCopy",
click() {
document.execCommand("copy");
}
})
menu.addItem({
label: window.siyuan.languages.selectAll,
icon: "iconSelect",
click() {
if (getSelection().rangeCount === 0) {
return;
}
getSelection().getRangeAt(0).selectNode(target)
}
})
return menu
}

View file

@ -31,7 +31,6 @@ export const exportAsset = (src: string) => {
/// #endif /// #endif
}; };
export const openEditorTab = (app: App, ids: string[], notebookId?: string, pathString?: string) => { export const openEditorTab = (app: App, ids: string[], notebookId?: string, pathString?: string) => {
/// #if !MOBILE /// #if !MOBILE
const openSubmenus: IMenu[] = [{ const openSubmenus: IMenu[] = [{