wallpaper selector: paste directory/file to navigate

This commit is contained in:
end-4 2025-08-30 16:39:13 +02:00
parent 3e368141c7
commit 513d140ea2
4 changed files with 39 additions and 6 deletions

View file

@ -217,4 +217,8 @@ Singleton {
return str; return str;
return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;'); return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
} }
function cleanCliphistEntry(str: string): string {
return str.replace(/^\d+\t/, "");
}
} }

View file

@ -296,7 +296,7 @@ Item { // Wrapper
return Cliphist.fuzzyQuery(searchString).map(entry => { return Cliphist.fuzzyQuery(searchString).map(entry => {
return { return {
cliphistRawString: entry, cliphistRawString: entry,
name: entry.replace(/^\s*\S+\s+/, ""), name: StringUtils.cleanCliphistEntry(entry),
clickActionName: "", clickActionName: "",
type: `#${entry.match(/^\s*(\S+)/)?.[1] || ""}`, type: `#${entry.match(/^\s*(\S+)/)?.[1] || ""}`,
execute: () => { execute: () => {

View file

@ -29,10 +29,23 @@ Item {
} }
} }
function handleFilePasting(event) {
const currentClipboardEntry = Cliphist.entries[0]
if (/^\d+\tfile:\/\/\S+/.test(currentClipboardEntry)) {
const url = StringUtils.cleanCliphistEntry(currentClipboardEntry);
Wallpapers.setDirectory(FileUtils.trimFileProtocol(decodeURIComponent(url)));
event.accepted = true;
} else {
event.accepted = false; // No image, let text pasting proceed
}
}
Keys.onPressed: event => { Keys.onPressed: event => {
if (event.key === Qt.Key_Escape) { if (event.key === Qt.Key_Escape) {
GlobalStates.wallpaperSelectorOpen = false; GlobalStates.wallpaperSelectorOpen = false;
event.accepted = true; event.accepted = true;
} else if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_V) { // Intercept Ctrl+V to handle "paste to go to" in pickers
root.handleFilePasting(event);
} else if (event.modifiers & Qt.AltModifier && event.key === Qt.Key_Up) { } else if (event.modifiers & Qt.AltModifier && event.key === Qt.Key_Up) {
Wallpapers.setDirectory(FileUtils.parentDirectory(Wallpapers.directory)); Wallpapers.setDirectory(FileUtils.parentDirectory(Wallpapers.directory));
event.accepted = true; event.accepted = true;
@ -316,15 +329,21 @@ Item {
} }
Keys.onPressed: event => { Keys.onPressed: event => {
if (text.length !== 0) { if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_V) { // Intercept Ctrl+V to handle "paste to go to" in pickers
root.handleFilePasting(event);
return;
}
else if (text.length !== 0) {
// No filtering, just navigate grid // No filtering, just navigate grid
if (event.key === Qt.Key_Down) { if (event.key === Qt.Key_Down) {
grid.moveSelection(grid.columns); grid.moveSelection(grid.columns);
event.accepted = true; event.accepted = true;
return;
} }
if (event.key === Qt.Key_Up) { if (event.key === Qt.Key_Up) {
grid.moveSelection(-grid.columns); grid.moveSelection(-grid.columns);
event.accepted = true; event.accepted = true;
return;
} }
} }
event.accepted = false; event.accepted = false;

View file

@ -76,11 +76,21 @@ Singleton {
function setDirectoryIfValid(path) { function setDirectoryIfValid(path) {
validateDirProc.nicePath = FileUtils.trimFileProtocol(path).replace(/\/+$/, "") validateDirProc.nicePath = FileUtils.trimFileProtocol(path).replace(/\/+$/, "")
if (/^\/*$/.test(validateDirProc.nicePath)) validateDirProc.nicePath = "/"; if (/^\/*$/.test(validateDirProc.nicePath)) validateDirProc.nicePath = "/";
validateDirProc.exec(["test", "-d", nicePath]) validateDirProc.exec([
"bash", "-c",
`if [ -d "${validateDirProc.nicePath}" ]; then echo dir; elif [ -f "${validateDirProc.nicePath}" ]; then echo file; else echo invalid; fi`
])
} }
onExited: (exitCode, exitStatus) => { stdout: StdioCollector {
if (exitCode === 0) { onStreamFinished: {
root.directory = validateDirProc.nicePath const result = text.trim()
if (result === "dir") {
root.directory = validateDirProc.nicePath
} else if (result === "file") {
root.directory = FileUtils.parentDirectory(validateDirProc.nicePath)
} else {
// Ignore
}
} }
} }
} }