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:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user