summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js254
1 files changed, 254 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js
new file mode 100644
index 0000000..1e78b11
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modals/DankLauncherV2/NavigationHelpers.js
@@ -0,0 +1,254 @@
+.pragma library
+
+function getFirstItemIndex(flatModel) {
+ for (var i = 0; i < flatModel.length; i++) {
+ if (!flatModel[i].isHeader)
+ return i;
+ }
+ return 0;
+}
+
+function findNextNonHeaderIndex(flatModel, startIndex) {
+ for (var i = startIndex; i < flatModel.length; i++) {
+ if (!flatModel[i].isHeader)
+ return i;
+ }
+ return -1;
+}
+
+function findPrevNonHeaderIndex(flatModel, startIndex) {
+ for (var i = startIndex; i >= 0; i--) {
+ if (!flatModel[i].isHeader)
+ return i;
+ }
+ return -1;
+}
+
+function getSectionBounds(flatModel, sectionId) {
+ if (flatModel._sectionBounds && flatModel._sectionBounds[sectionId])
+ return flatModel._sectionBounds[sectionId];
+
+ var start = -1, end = -1;
+ for (var i = 0; i < flatModel.length; i++) {
+ if (flatModel[i].isHeader && flatModel[i].section?.id === sectionId) {
+ start = i + 1;
+ } else if (start >= 0 && !flatModel[i].isHeader && flatModel[i].sectionId === sectionId) {
+ end = i;
+ } else if (start >= 0 && end >= 0 && flatModel[i].sectionId !== sectionId) {
+ break;
+ }
+ }
+ return {
+ start: start,
+ end: end,
+ count: end >= start ? end - start + 1 : 0
+ };
+}
+
+function getGridColumns(viewMode, gridColumns) {
+ switch (viewMode) {
+ case "tile":
+ return 3;
+ case "grid":
+ return gridColumns;
+ default:
+ return 1;
+ }
+}
+
+function calculateNextIndex(flatModel, selectedFlatIndex, sectionId, viewMode, gridColumns, getSectionViewModeFn) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var entry = flatModel[selectedFlatIndex];
+ if (!entry || entry.isHeader) {
+ var next = findNextNonHeaderIndex(flatModel, selectedFlatIndex + 1);
+ return next !== -1 ? next : selectedFlatIndex;
+ }
+
+ var actualViewMode = viewMode || getSectionViewModeFn(entry.sectionId);
+ if (actualViewMode === "list") {
+ var next = findNextNonHeaderIndex(flatModel, selectedFlatIndex + 1);
+ return next !== -1 ? next : selectedFlatIndex;
+ }
+
+ var bounds = getSectionBounds(flatModel, entry.sectionId);
+ var cols = getGridColumns(actualViewMode, gridColumns);
+ var posInSection = selectedFlatIndex - bounds.start;
+ var newPosInSection = posInSection + cols;
+
+ if (newPosInSection < bounds.count) {
+ return bounds.start + newPosInSection;
+ }
+
+ var currentRow = Math.floor(posInSection / cols);
+ var lastRow = Math.floor((bounds.count - 1) / cols);
+ if (currentRow < lastRow) {
+ return bounds.start + bounds.count - 1;
+ }
+
+ var nextSection = findNextNonHeaderIndex(flatModel, bounds.end + 1);
+ return nextSection !== -1 ? nextSection : selectedFlatIndex;
+}
+
+function calculatePrevIndex(flatModel, selectedFlatIndex, sectionId, viewMode, gridColumns, getSectionViewModeFn) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var entry = flatModel[selectedFlatIndex];
+ if (!entry || entry.isHeader) {
+ var prev = findPrevNonHeaderIndex(flatModel, selectedFlatIndex - 1);
+ return prev !== -1 ? prev : selectedFlatIndex;
+ }
+
+ var actualViewMode = viewMode || getSectionViewModeFn(entry.sectionId);
+ if (actualViewMode === "list") {
+ var prev = findPrevNonHeaderIndex(flatModel, selectedFlatIndex - 1);
+ return prev !== -1 ? prev : selectedFlatIndex;
+ }
+
+ var bounds = getSectionBounds(flatModel, entry.sectionId);
+ var cols = getGridColumns(actualViewMode, gridColumns);
+ var posInSection = selectedFlatIndex - bounds.start;
+ var newPosInSection = posInSection - cols;
+
+ if (newPosInSection >= 0) {
+ return bounds.start + newPosInSection;
+ }
+
+ var prevItem = findPrevNonHeaderIndex(flatModel, bounds.start - 1);
+ return prevItem !== -1 ? prevItem : selectedFlatIndex;
+}
+
+function calculateRightIndex(flatModel, selectedFlatIndex, getSectionViewModeFn) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var entry = flatModel[selectedFlatIndex];
+ if (!entry || entry.isHeader) {
+ var next = findNextNonHeaderIndex(flatModel, selectedFlatIndex + 1);
+ return next !== -1 ? next : selectedFlatIndex;
+ }
+
+ var viewMode = getSectionViewModeFn(entry.sectionId);
+ if (viewMode === "list") {
+ var next = findNextNonHeaderIndex(flatModel, selectedFlatIndex + 1);
+ return next !== -1 ? next : selectedFlatIndex;
+ }
+
+ var bounds = getSectionBounds(flatModel, entry.sectionId);
+ var posInSection = selectedFlatIndex - bounds.start;
+ if (posInSection + 1 < bounds.count) {
+ return bounds.start + posInSection + 1;
+ }
+ return selectedFlatIndex;
+}
+
+function calculateLeftIndex(flatModel, selectedFlatIndex, getSectionViewModeFn) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var entry = flatModel[selectedFlatIndex];
+ if (!entry || entry.isHeader) {
+ var prev = findPrevNonHeaderIndex(flatModel, selectedFlatIndex - 1);
+ return prev !== -1 ? prev : selectedFlatIndex;
+ }
+
+ var viewMode = getSectionViewModeFn(entry.sectionId);
+ if (viewMode === "list") {
+ var prev = findPrevNonHeaderIndex(flatModel, selectedFlatIndex - 1);
+ return prev !== -1 ? prev : selectedFlatIndex;
+ }
+
+ var bounds = getSectionBounds(flatModel, entry.sectionId);
+ var posInSection = selectedFlatIndex - bounds.start;
+ if (posInSection > 0) {
+ return bounds.start + posInSection - 1;
+ }
+ return selectedFlatIndex;
+}
+
+function calculateNextSectionIndex(flatModel, selectedFlatIndex) {
+ var currentSection = null;
+ if (selectedFlatIndex >= 0 && selectedFlatIndex < flatModel.length) {
+ currentSection = flatModel[selectedFlatIndex].sectionId;
+ }
+
+ var foundCurrent = false;
+ for (var i = 0; i < flatModel.length; i++) {
+ if (flatModel[i].isHeader) {
+ if (foundCurrent) {
+ for (var j = i + 1; j < flatModel.length; j++) {
+ if (!flatModel[j].isHeader)
+ return j;
+ }
+ }
+ if (flatModel[i].section.id === currentSection) {
+ foundCurrent = true;
+ }
+ }
+ }
+ return selectedFlatIndex;
+}
+
+function calculatePrevSectionIndex(flatModel, selectedFlatIndex) {
+ var currentSection = null;
+ if (selectedFlatIndex >= 0 && selectedFlatIndex < flatModel.length) {
+ currentSection = flatModel[selectedFlatIndex].sectionId;
+ }
+
+ var lastSectionStart = -1;
+ var prevSectionStart = -1;
+
+ for (var i = 0; i < flatModel.length; i++) {
+ if (flatModel[i].isHeader) {
+ if (flatModel[i].section.id === currentSection) {
+ break;
+ }
+ prevSectionStart = lastSectionStart;
+ lastSectionStart = i;
+ }
+ }
+
+ if (prevSectionStart >= 0) {
+ for (var j = prevSectionStart + 1; j < flatModel.length; j++) {
+ if (!flatModel[j].isHeader)
+ return j;
+ }
+ }
+ return selectedFlatIndex;
+}
+
+function calculatePageDownIndex(flatModel, selectedFlatIndex, visibleItems) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var itemsToSkip = visibleItems || 8;
+ var newIndex = selectedFlatIndex;
+
+ for (var i = 0; i < itemsToSkip; i++) {
+ var next = findNextNonHeaderIndex(flatModel, newIndex + 1);
+ if (next === -1)
+ break;
+ newIndex = next;
+ }
+
+ return newIndex;
+}
+
+function calculatePageUpIndex(flatModel, selectedFlatIndex, visibleItems) {
+ if (flatModel.length === 0)
+ return selectedFlatIndex;
+
+ var itemsToSkip = visibleItems || 8;
+ var newIndex = selectedFlatIndex;
+
+ for (var i = 0; i < itemsToSkip; i++) {
+ var prev = findPrevNonHeaderIndex(flatModel, newIndex - 1);
+ if (prev === -1)
+ break;
+ newIndex = prev;
+ }
+
+ return newIndex;
+}