From 70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 Mon Sep 17 00:00:00 2001 From: AlexanderCurl Date: Sat, 18 Apr 2026 17:46:06 +0100 Subject: Replaced file structures for themes in the correct format --- .../quickshell/Modules/Notepad/Notepad.qml | 531 +++++++++++++++++++++ 1 file changed, 531 insertions(+) create mode 100644 raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml') diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml new file mode 100644 index 0000000..e294695 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml @@ -0,0 +1,531 @@ +pragma ComponentBehavior: Bound +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Common +import qs.Modals.Common +import qs.Modals.FileBrowser +import qs.Services +import qs.Widgets + +Item { + id: root + + property bool fileDialogOpen: false + property string currentFileName: "" + property url currentFileUrl + property bool confirmationDialogOpen: false + property string pendingAction: "" + property url pendingFileUrl + property string lastSavedFileContent: "" + property var currentTab: NotepadStorageService.tabs.length > NotepadStorageService.currentTabIndex ? NotepadStorageService.tabs[NotepadStorageService.currentTabIndex] : null + property bool showSettingsMenu: false + property string pendingSaveContent: "" + property var slideout: null + + signal hideRequested + signal previewRequested(string content) + + Ref { + service: NotepadStorageService + } + + Connections { + target: slideout + enabled: slideout !== null + function onAboutToHide() { + textEditor.autoSaveToSession() + } + } + + function hasUnsavedChanges() { + return textEditor.hasUnsavedChanges(); + } + + function hasUnsavedTemporaryContent() { + return hasUnsavedChanges(); + } + + function createNewTab() { + performCreateNewTab(); + } + + function performCreateNewTab() { + NotepadStorageService.createNewTab(); + textEditor.text = ""; + textEditor.lastSavedContent = ""; + textEditor.contentLoaded = true; + textEditor.textArea.forceActiveFocus(); + } + + function closeTab(tabIndex) { + if (tabIndex === NotepadStorageService.currentTabIndex && hasUnsavedChanges()) { + root.pendingAction = "close_tab_" + tabIndex; + root.confirmationDialogOpen = true; + confirmationDialogLoader.active = true; + if (confirmationDialogLoader.item) + confirmationDialogLoader.item.open(); + } else { + performCloseTab(tabIndex); + } + } + + function performCloseTab(tabIndex) { + NotepadStorageService.closeTab(tabIndex); + Qt.callLater(() => { + textEditor.loadCurrentTabContent(); + }); + } + + function switchToTab(tabIndex) { + if (tabIndex < 0 || tabIndex >= NotepadStorageService.tabs.length) + return; + if (textEditor.contentLoaded) { + textEditor.autoSaveToSession(); + } + + NotepadStorageService.switchToTab(tabIndex); + Qt.callLater(() => { + textEditor.loadCurrentTabContent(); + if (currentTab) { + root.currentFileName = currentTab.fileName || ""; + root.currentFileUrl = currentTab.fileUrl || ""; + } + }); + } + + function saveToFile(fileUrl) { + if (!currentTab) + return; + var content = textEditor.text; + var filePath = fileUrl.toString().replace(/^file:\/\//, ''); + + saveFileView.path = ""; + pendingSaveContent = content; + saveFileView.path = filePath; + + Qt.callLater(() => { + saveFileView.setText(pendingSaveContent); + }); + } + + function loadFromFile(fileUrl) { + if (hasUnsavedTemporaryContent()) { + root.pendingFileUrl = fileUrl; + root.pendingAction = "load_file"; + root.confirmationDialogOpen = true; + confirmationDialogLoader.active = true; + if (confirmationDialogLoader.item) + confirmationDialogLoader.item.open(); + } else { + performLoadFromFile(fileUrl); + } + } + + function performLoadFromFile(fileUrl) { + const filePath = fileUrl.toString().replace(/^file:\/\//, ''); + const fileName = filePath.split('/').pop(); + + loadFileView.path = ""; + loadFileView.path = filePath; + + if (loadFileView.waitForJob()) { + Qt.callLater(() => { + var content = loadFileView.text(); + if (currentTab && content !== undefined && content !== null) { + textEditor.text = content; + textEditor.lastSavedContent = content; + textEditor.contentLoaded = true; + root.lastSavedFileContent = content; + + NotepadStorageService.updateTabMetadata(NotepadStorageService.currentTabIndex, { + title: fileName, + filePath: filePath, + isTemporary: false + }); + + root.currentFileName = fileName; + root.currentFileUrl = fileUrl; + textEditor.saveCurrentTabContent(); + } + }); + } + } + + Column { + anchors.fill: parent + spacing: Theme.spacingM + + NotepadTabs { + id: tabBar + width: parent.width + contentLoaded: textEditor.contentLoaded + + onTabSwitched: tabIndex => { + switchToTab(tabIndex); + } + + onTabClosed: tabIndex => { + closeTab(tabIndex); + } + + onNewTabRequested: { + createNewTab(); + } + } + + NotepadTextEditor { + id: textEditor + width: parent.width + height: parent.height - tabBar.height - Theme.spacingM * 2 + + onSaveRequested: { + if (currentTab && !currentTab.isTemporary && currentTab.filePath) { + var fileUrl = "file://" + currentTab.filePath; + saveToFile(fileUrl); + } else { + root.fileDialogOpen = true; + saveBrowserLoader.active = true; + if (saveBrowserLoader.item) + saveBrowserLoader.item.open(); + } + } + + onOpenRequested: { + textEditor.autoSaveToSession(); + if (textEditor.text.length > 0) { + createNewTab(); + } + + root.fileDialogOpen = true; + loadBrowserLoader.active = true; + if (loadBrowserLoader.item) + loadBrowserLoader.item.open(); + } + + onNewRequested: { + textEditor.autoSaveToSession(); + createNewTab(); + } + + onPreviewRequested: { + textEditor.togglePreview(); + } + + onEscapePressed: { + textEditor.autoSaveToSession() + root.hideRequested() + } + + onSettingsRequested: { + showSettingsMenu = !showSettingsMenu; + } + } + } + + NotepadSettings { + id: notepadSettings + anchors.fill: parent + isVisible: showSettingsMenu + onSettingsRequested: showSettingsMenu = !showSettingsMenu + onFindRequested: { + showSettingsMenu = false; + textEditor.showSearch(); + } + } + + FileView { + id: saveFileView + blockWrites: true + preload: false + atomicWrites: true + printErrors: true + + onSaved: { + if (currentTab && saveFileView.path && pendingSaveContent) { + NotepadStorageService.updateTabMetadata(NotepadStorageService.currentTabIndex, { + hasUnsavedChanges: false, + lastSavedContent: pendingSaveContent + }); + root.lastSavedFileContent = pendingSaveContent; + pendingSaveContent = ""; + } + } + + onSaveFailed: error => { + pendingSaveContent = ""; + } + } + + FileView { + id: loadFileView + blockLoading: true + preload: true + atomicWrites: true + printErrors: true + + onLoadFailed: error => {} + } + + LazyLoader { + id: saveBrowserLoader + active: false + + FileBrowserSurfaceModal { + id: saveBrowser + + browserTitle: I18n.tr("Save Notepad File") + browserIcon: "save" + browserType: "notepad_save" + fileExtensions: ["*.txt", "*.md", "*.*"] + allowStacking: true + saveMode: true + defaultFileName: { + if (currentTab && currentTab.title && currentTab.title !== "Untitled") { + return currentTab.title; + } else if (currentTab && !currentTab.isTemporary && currentTab.filePath) { + return currentTab.filePath.split('/').pop(); + } else { + return "note.txt"; + } + } + + onFileSelected: path => { + root.fileDialogOpen = false; + const cleanPath = decodeURI(path.toString().replace(/^file:\/\//, '')); + const fileName = cleanPath.split('/').pop(); + const fileUrl = "file://" + cleanPath; + + root.currentFileName = fileName; + root.currentFileUrl = fileUrl; + + if (currentTab) { + NotepadStorageService.saveTabAs(NotepadStorageService.currentTabIndex, cleanPath); + } + + saveToFile(fileUrl); + + if (root.pendingAction === "new") { + Qt.callLater(() => { + createNewTab(); + }); + } else if (root.pendingAction === "open") { + Qt.callLater(() => { + root.fileDialogOpen = true; + loadBrowserLoader.active = true; + if (loadBrowserLoader.item) + loadBrowserLoader.item.open(); + }); + } else if (root.pendingAction.startsWith("close_tab_")) { + Qt.callLater(() => { + var tabIndex = parseInt(root.pendingAction.split("_")[2]); + performCloseTab(tabIndex); + }); + } + root.pendingAction = ""; + + close(); + } + + onDialogClosed: { + root.fileDialogOpen = false; + } + } + } + + LazyLoader { + id: loadBrowserLoader + active: false + + FileBrowserSurfaceModal { + id: loadBrowser + + browserTitle: I18n.tr("Open Notepad File") + browserIcon: "folder_open" + browserType: "notepad_load" + fileExtensions: ["*.txt", "*.md", "*.*"] + allowStacking: true + + onFileSelected: path => { + root.fileDialogOpen = false; + const cleanPath = path.toString().replace(/^file:\/\//, ''); + const fileName = cleanPath.split('/').pop(); + const fileUrl = "file://" + cleanPath; + + root.currentFileName = fileName; + root.currentFileUrl = fileUrl; + + loadFromFile(fileUrl); + close(); + } + + onDialogClosed: { + root.fileDialogOpen = false; + } + } + } + + LazyLoader { + id: confirmationDialogLoader + active: false + + DankModal { + id: confirmationDialog + + modalWidth: 400 + modalHeight: contentLoader.item ? contentLoader.item.implicitHeight + Theme.spacingM * 2 : 180 + shouldBeVisible: false + allowStacking: true + + onBackgroundClicked: { + close(); + root.confirmationDialogOpen = false; + } + + content: Component { + FocusScope { + anchors.fill: parent + focus: true + implicitHeight: contentColumn.implicitHeight + + Keys.onEscapePressed: event => { + confirmationDialog.close(); + root.confirmationDialogOpen = false; + event.accepted = true; + } + + Column { + id: contentColumn + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: Theme.spacingM + spacing: Theme.spacingM + + StyledText { + text: I18n.tr("Unsaved Changes") + font.pixelSize: Theme.fontSizeLarge + color: Theme.surfaceText + font.weight: Font.Medium + } + + StyledText { + text: root.pendingAction === "new" ? I18n.tr("You have unsaved changes. Save before creating a new file?") : root.pendingAction.startsWith("close_tab_") ? I18n.tr("You have unsaved changes. Save before closing this tab?") : root.pendingAction === "load_file" || root.pendingAction === "open" ? I18n.tr("You have unsaved changes. Save before opening a file?") : I18n.tr("You have unsaved changes. Save before continuing?") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceTextMedium + width: parent.width + wrapMode: Text.Wrap + } + + Item { + width: parent.width + height: 36 + + Row { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + Rectangle { + width: Math.max(80, discardText.contentWidth + Theme.spacingM * 2) + height: 36 + radius: Theme.cornerRadius + color: discardArea.containsMouse ? Theme.surfaceTextHover : "transparent" + border.color: Theme.surfaceVariantAlpha + border.width: 1 + + StyledText { + id: discardText + anchors.centerIn: parent + text: I18n.tr("Don't Save") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium + } + + MouseArea { + id: discardArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + confirmationDialog.close(); + root.confirmationDialogOpen = false; + if (root.pendingAction === "new") { + createNewTab(); + } else if (root.pendingAction === "open") { + root.fileDialogOpen = true; + loadBrowserLoader.active = true; + if (loadBrowserLoader.item) + loadBrowserLoader.item.open(); + } else if (root.pendingAction === "load_file") { + performLoadFromFile(root.pendingFileUrl); + } else if (root.pendingAction.startsWith("close_tab_")) { + var tabIndex = parseInt(root.pendingAction.split("_")[2]); + performCloseTab(tabIndex); + } + root.pendingAction = ""; + root.pendingFileUrl = ""; + } + } + } + + Rectangle { + width: Math.max(70, saveAsText.contentWidth + Theme.spacingM * 2) + height: 36 + radius: Theme.cornerRadius + color: saveAsArea.containsMouse ? Qt.darker(Theme.primary, 1.1) : Theme.primary + + StyledText { + id: saveAsText + anchors.centerIn: parent + text: I18n.tr("Save") + font.pixelSize: Theme.fontSizeMedium + color: Theme.background + font.weight: Font.Medium + } + + MouseArea { + id: saveAsArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + confirmationDialog.close(); + root.confirmationDialogOpen = false; + root.fileDialogOpen = true; + saveBrowserLoader.active = true; + if (saveBrowserLoader.item) + saveBrowserLoader.item.open(); + } + } + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } + } + } + } + + DankActionButton { + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: Theme.spacingM + anchors.rightMargin: Theme.spacingM + iconName: "close" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + onClicked: { + confirmationDialog.close(); + root.confirmationDialogOpen = false; + } + } + } + } + } + } +} -- cgit v1.3