aboutsummaryrefslogtreecommitdiffstats
path: root/examples/webenginewidgets/markdowneditor/mainwindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/webenginewidgets/markdowneditor/mainwindow.py')
-rw-r--r--examples/webenginewidgets/markdowneditor/mainwindow.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/examples/webenginewidgets/markdowneditor/mainwindow.py b/examples/webenginewidgets/markdowneditor/mainwindow.py
new file mode 100644
index 000000000..6f74cf93d
--- /dev/null
+++ b/examples/webenginewidgets/markdowneditor/mainwindow.py
@@ -0,0 +1,137 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+from PySide6.QtCore import QDir, QFile, QIODevice, QUrl, Qt, Slot
+from PySide6.QtGui import QFontDatabase
+from PySide6.QtWebChannel import QWebChannel
+from PySide6.QtWidgets import QDialog, QFileDialog, QMainWindow, QMessageBox
+
+from ui_mainwindow import Ui_MainWindow
+from document import Document
+from previewpage import PreviewPage
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_file_path = ''
+ self.m_content = Document()
+ self._ui = Ui_MainWindow()
+ self._ui.setupUi(self)
+ font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
+ self._ui.editor.setFont(font)
+ self._ui.preview.setContextMenuPolicy(Qt.NoContextMenu)
+ self._page = PreviewPage(self)
+ self._ui.preview.setPage(self._page)
+
+ self._ui.editor.textChanged.connect(self.plainTextEditChanged)
+
+ self._channel = QWebChannel(self)
+ self._channel.registerObject("content", self.m_content)
+ self._page.setWebChannel(self._channel)
+
+ self._ui.preview.setUrl(QUrl("qrc:/index.html"))
+
+ self._ui.actionNew.triggered.connect(self.onFileNew)
+ self._ui.actionOpen.triggered.connect(self.onFileOpen)
+ self._ui.actionSave.triggered.connect(self.onFileSave)
+ self._ui.actionSaveAs.triggered.connect(self.onFileSaveAs)
+ self._ui.actionExit.triggered.connect(self.close)
+
+ self._ui.editor.document().modificationChanged.connect(self._ui.actionSave.setEnabled)
+
+ defaultTextFile = QFile(":/default.md")
+ defaultTextFile.open(QIODevice.ReadOnly)
+ data = defaultTextFile.readAll()
+ self._ui.editor.setPlainText(data.data().decode('utf8'))
+
+ @Slot()
+ def plainTextEditChanged(self):
+ self.m_content.setText(self._ui.editor.toPlainText())
+
+ @Slot(str)
+ def openFile(self, path):
+ f = QFile(path)
+ name = QDir.toNativeSeparators(path)
+ if not f.open(QIODevice.ReadOnly):
+ error = f.errorString()
+ QMessageBox.warning(self, self.windowTitle(),
+ f"Could not open file {name}: {error}")
+ return
+ self.m_file_path = path
+ data = f.readAll()
+ self._ui.editor.setPlainText(data.data().decode('utf8'))
+ self.statusBar().showMessage(f"Opened {name}")
+
+ def isModified(self):
+ return self._ui.editor.document().isModified()
+
+ @Slot()
+ def onFileNew(self):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to create a new document anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ return
+
+ self.m_file_path = ''
+ self._ui.editor.setPlainText("## New document")
+ self._ui.editor.document().setModified(False)
+
+ @Slot()
+ def onFileOpen(self):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to open a new document anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ return
+ dialog = QFileDialog(self)
+ dialog.setWindowTitle("Open MarkDown File")
+ dialog.setMimeTypeFilters(["text/markdown"])
+ dialog.setAcceptMode(QFileDialog.AcceptOpen)
+ if dialog.exec() == QDialog.Accepted:
+ self.openFile(dialog.selectedFiles()[0])
+
+ @Slot()
+ def onFileSave(self):
+ if not self.m_file_path:
+ self.onFileSaveAs()
+ if not self.m_file_path:
+ return
+
+ f = QFile(self.m_file_path)
+ name = QDir.toNativeSeparators(self.m_file_path)
+ if not f.open(QIODevice.WriteOnly | QIODevice.Text):
+ error = f.errorString()
+ QMessageBox.warning(self, self.windowTitle(),
+ f"Could not write to file {name}: {error}")
+ return
+ text = self._ui.editor.toPlainText()
+ f.write(bytes(text, encoding='utf8'))
+ f.close()
+ self._ui.editor.document().setModified(False)
+ self.statusBar().showMessage(f"Wrote {name}")
+
+ @Slot()
+ def onFileSaveAs(self):
+ dialog = QFileDialog(self)
+ dialog.setWindowTitle("Save MarkDown File")
+ dialog.setMimeTypeFilters(["text/markdown"])
+ dialog.setAcceptMode(QFileDialog.AcceptSave)
+ dialog.setDefaultSuffix("md")
+ if dialog.exec() != QDialog.Accepted:
+ return
+ path = dialog.selectedFiles()[0]
+ self.m_file_path = path
+ self.onFileSave()
+
+ def closeEvent(self, event):
+ if self.isModified():
+ m = "You have unsaved changes. Do you want to exit anyway?"
+ button = QMessageBox.question(self, self.windowTitle(), m)
+ if button != QMessageBox.Yes:
+ event.ignore()
+ else:
+ event.accept()