1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-06 05:25:41 -05:00

keyboard navi improvements

This commit is contained in:
bbedward
2025-08-16 15:05:53 -04:00
parent 63ac17e676
commit c560d2d964
2 changed files with 76 additions and 20 deletions

View File

@@ -38,6 +38,16 @@ DankModal {
} }
} }
clipboardHistoryModal.totalCount = filteredClipboardModel.count; clipboardHistoryModal.totalCount = filteredClipboardModel.count;
// Clamp selectedIndex to valid range
if (filteredClipboardModel.count === 0) {
keyboardNavigationActive = false;
selectedIndex = 0;
} else if (selectedIndex >= filteredClipboardModel.count) {
selectedIndex = filteredClipboardModel.count - 1;
}
} }
function toggle() { function toggle() {
@@ -49,6 +59,10 @@ DankModal {
function show() { function show() {
clipboardHistoryModal.visible = true; clipboardHistoryModal.visible = true;
clipboardHistoryModal.searchText = "";
if (typeof searchField !== 'undefined' && searchField) {
searchField.text = "";
}
initializeThumbnailSystem(); initializeThumbnailSystem();
refreshClipboard(); refreshClipboard();
keyboardController.reset(); keyboardController.reset();
@@ -57,6 +71,10 @@ DankModal {
function hide() { function hide() {
clipboardHistoryModal.visible = false; clipboardHistoryModal.visible = false;
clipboardHistoryModal.searchText = ""; clipboardHistoryModal.searchText = "";
if (typeof searchField !== 'undefined' && searchField) {
searchField.text = "";
}
updateFilteredModel();
keyboardController.reset(); keyboardController.reset();
cleanupTempFiles(); cleanupTempFiles();
} }
@@ -83,6 +101,7 @@ DankModal {
} }
function deleteEntry(entry) { function deleteEntry(entry) {
deleteProcess.deletedEntry = entry;
deleteProcess.command = ["sh", "-c", `echo '${entry.replace( deleteProcess.command = ["sh", "-c", `echo '${entry.replace(
/'/g, "'\\''")}' | cliphist delete`]; /'/g, "'\\''")}' | cliphist delete`];
deleteProcess.running = true; deleteProcess.running = true;
@@ -180,13 +199,8 @@ DankModal {
var selectedEntry = filteredClipboardModel.get(selectedIndex).entry; var selectedEntry = filteredClipboardModel.get(selectedIndex).entry;
deleteEntry(selectedEntry); deleteEntry(selectedEntry);
if (selectedIndex >= filteredClipboardModel.count && filteredClipboardModel.count > 0)
selectedIndex = filteredClipboardModel.count - 1;
} }
function ensureVisible() {
}
function handleKey(event) { function handleKey(event) {
if (event.key === Qt.Key_Escape) { if (event.key === Qt.Key_Escape) {
@@ -230,18 +244,17 @@ DankModal {
selectPrevious(); selectPrevious();
event.accepted = true; event.accepted = true;
} }
} else if (event.key === Qt.Key_Delete && (event.modifiers & Qt.ShiftModifier)) {
clearAll();
hide();
event.accepted = true;
} else if (keyboardNavigationActive) { } else if (keyboardNavigationActive) {
if (event.key === Qt.Key_C && (event.modifiers & Qt.ControlModifier)) { if ((event.key === Qt.Key_C && (event.modifiers & Qt.ControlModifier)) || event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
copySelected(); copySelected();
event.accepted = true; event.accepted = true;
} else if (event.key === Qt.Key_Delete) { } else if (event.key === Qt.Key_Delete) {
if (event.modifiers & Qt.ShiftModifier) { deleteSelected();
showClearConfirmation = true; event.accepted = true;
event.accepted = true;
} else {
deleteSelected();
event.accepted = true;
}
} }
} }
if (event.key === Qt.Key_F10) { if (event.key === Qt.Key_F10) {
@@ -392,12 +405,35 @@ DankModal {
Process { Process {
id: deleteProcess id: deleteProcess
property string deletedEntry: ""
running: false running: false
onExited: (exitCode) => { onExited: (exitCode) => {
if (exitCode === 0) if (exitCode === 0) {
refreshClipboard(); // Just remove the item from models instead of re-fetching everything
else for (var i = 0; i < clipboardModel.count; i++) {
if (clipboardModel.get(i).entry === deleteProcess.deletedEntry) {
clipboardModel.remove(i);
break;
}
}
for (var j = 0; j < filteredClipboardModel.count; j++) {
if (filteredClipboardModel.get(j).entry === deleteProcess.deletedEntry) {
filteredClipboardModel.remove(j);
break;
}
}
clipboardHistoryModal.totalCount = filteredClipboardModel.count;
// Clamp selectedIndex to valid range
if (filteredClipboardModel.count === 0) {
keyboardNavigationActive = false;
selectedIndex = 0;
} else if (selectedIndex >= filteredClipboardModel.count) {
selectedIndex = filteredClipboardModel.count - 1;
}
} else {
console.warn("Failed to delete clipboard entry"); console.warn("Failed to delete clipboard entry");
}
} }
} }
@@ -559,6 +595,26 @@ DankModal {
pressDelay: 0 pressDelay: 0
flickableDirection: Flickable.VerticalFlick flickableDirection: Flickable.VerticalFlick
function ensureVisible(index) {
if (index < 0 || index >= count)
return;
var itemHeight = 72 + spacing;
var itemY = index * itemHeight;
var itemBottom = itemY + itemHeight;
if (itemY < contentY)
contentY = itemY;
else if (itemBottom > contentY + height)
contentY = itemBottom - height;
}
onCurrentIndexChanged: {
if (keyboardNavigationActive && currentIndex >= 0) {
ensureVisible(currentIndex);
}
}
StyledText { StyledText {
text: "No clipboard entries found" text: "No clipboard entries found"
@@ -584,7 +640,7 @@ DankModal {
property alias thumbnailImageSource: thumbnailImageSource property alias thumbnailImageSource: thumbnailImageSource
width: clipboardListView.width width: clipboardListView.width
height: Math.max(entryType === "image" ? 72 : 60, contentText.contentHeight + Theme.spacingL) height: 72
radius: Theme.cornerRadius radius: Theme.cornerRadius
color: { color: {
if (keyboardNavigationActive && index === selectedIndex) if (keyboardNavigationActive && index === selectedIndex)
@@ -815,7 +871,7 @@ DankModal {
spacing: 2 spacing: 2
StyledText { StyledText {
text: "↑/↓: Navigate • Ctrl+C: Copy • Del: Delete • F10: Help" text: "↑/↓: Navigate • Enter/Ctrl+C: Copy • Del: Delete • F10: Help"
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText color: Theme.surfaceText
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter

View File

@@ -105,7 +105,7 @@ Item {
filteredModel.count - 1) filteredModel.count - 1)
selectedIndex = newIndex selectedIndex = newIndex
} else { } else {
selectedIndex = (selectedIndex + 1) % filteredModel.count selectedIndex = Math.min(selectedIndex + 1, filteredModel.count - 1)
} }
} }
} }
@@ -117,7 +117,7 @@ Item {
var newIndex = Math.max(selectedIndex - gridColumns, 0) var newIndex = Math.max(selectedIndex - gridColumns, 0)
selectedIndex = newIndex selectedIndex = newIndex
} else { } else {
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : filteredModel.count - 1 selectedIndex = Math.max(selectedIndex - 1, 0)
} }
} }
} }