summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml
diff options
context:
space:
mode:
authorAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
committerAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
commit70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch)
treeab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml
parent5d94c0a7d44a2255b81815a52a7056a94a39842d (diff)
downloadRaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz
RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Notepad/Notepad.qml531
1 files changed, 531 insertions, 0 deletions
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;
+ }
+ }
+ }
+ }
+ }
+ }
+}