summaryrefslogtreecommitdiff
path: root/examples/demos/documentviewer/plugins/txtviewer
diff options
context:
space:
mode:
Diffstat (limited to 'examples/demos/documentviewer/plugins/txtviewer')
-rw-r--r--examples/demos/documentviewer/plugins/txtviewer/CMakeLists.txt35
-rw-r--r--examples/demos/documentviewer/plugins/txtviewer/txtviewer.cpp175
-rw-r--r--examples/demos/documentviewer/plugins/txtviewer/txtviewer.h48
-rw-r--r--examples/demos/documentviewer/plugins/txtviewer/txtviewer.json1
4 files changed, 259 insertions, 0 deletions
diff --git a/examples/demos/documentviewer/plugins/txtviewer/CMakeLists.txt b/examples/demos/documentviewer/plugins/txtviewer/CMakeLists.txt
new file mode 100644
index 00000000..7e0730a1
--- /dev/null
+++ b/examples/demos/documentviewer/plugins/txtviewer/CMakeLists.txt
@@ -0,0 +1,35 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets
+ OPTIONAL_COMPONENTS PrintSupport)
+
+qt_add_plugin(txtviewer
+ CLASS_NAME TxtViewer
+ txtviewer.cpp txtviewer.h
+ ../../app/abstractviewer.h ../../app/abstractviewer.cpp
+)
+
+set_target_properties(txtviewer PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/app"
+)
+
+target_include_directories(txtviewer PRIVATE
+ ../../app
+)
+
+target_link_libraries(txtviewer PRIVATE
+ Qt6::Core
+ Qt6::Gui
+ Qt6::Widgets
+)
+
+if(TARGET Qt6::PrintSupport)
+ target_link_libraries(txtviewer PRIVATE Qt6::PrintSupport)
+endif()
+
+install(TARGETS jsonviewer
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}/plugins"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}/plugins"
+)
+
diff --git a/examples/demos/documentviewer/plugins/txtviewer/txtviewer.cpp b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.cpp
new file mode 100644
index 00000000..cfe8d809
--- /dev/null
+++ b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.cpp
@@ -0,0 +1,175 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "txtviewer.h"
+
+#include <QGuiApplication>
+#include <QPlainTextEdit>
+#include <QTextDocument>
+#include <QMenu>
+#include <QMenuBar>
+#include <QToolBar>
+#include <QFileDialog>
+#include <QMetaObject>
+#include <QScrollBar>
+#include <QPainter>
+#ifdef QT_DOCUMENTVIEWER_PRINTSUPPORT
+#include <QPrinter>
+#include <QPrintDialog>
+#endif
+
+void TxtViewer::init(QFile *file, QWidget *parent, QMainWindow *mainWindow)
+{
+ AbstractViewer::init(file, new QPlainTextEdit(parent), mainWindow);
+ m_textEdit = qobject_cast<QPlainTextEdit *>(widget());
+ connect(this, &AbstractViewer::uiInitialized, this, &TxtViewer::setupTxtUi);
+}
+
+TxtViewer::~TxtViewer()
+{
+}
+
+QStringList TxtViewer::supportedMimeTypes() const
+{
+ return {"text/plain"};
+}
+
+void TxtViewer::setupTxtUi()
+{
+ QMenu *editMenu = addMenu(tr("&Edit"));
+ QToolBar *editToolBar = addToolBar(tr("Edit"));
+#ifndef QT_NO_CLIPBOARD
+ const QIcon cutIcon = QIcon::fromTheme("edit-cut", QIcon(":/demos/documentviewer/images/cut.png"));
+ QAction *cutAct = new QAction(cutIcon, tr("Cu&t"), this);
+ cutAct->setShortcuts(QKeySequence::Cut);
+ cutAct->setStatusTip(tr("Cut the current selection's contents to the "
+ "clipboard"));
+ connect(cutAct, &QAction::triggered, m_textEdit, &QPlainTextEdit::cut);
+ editMenu->addAction(cutAct);
+ editToolBar->addAction(cutAct);
+
+ const QIcon copyIcon = QIcon::fromTheme("edit-copy", QIcon(":/demos/documentviewer/images/copy.png"));
+ QAction *copyAct = new QAction(copyIcon, tr("&Copy"), this);
+ copyAct->setShortcuts(QKeySequence::Copy);
+ copyAct->setStatusTip(tr("Copy the current selection's contents to the "
+ "clipboard"));
+ connect(copyAct, &QAction::triggered, m_textEdit, &QPlainTextEdit::copy);
+ editMenu->addAction(copyAct);
+ editToolBar->addAction(copyAct);
+
+ const QIcon pasteIcon = QIcon::fromTheme("edit-paste", QIcon(":/demos/documentviewer/images/paste.png"));
+ QAction *pasteAct = new QAction(pasteIcon, tr("&Paste"), this);
+ pasteAct->setShortcuts(QKeySequence::Paste);
+ pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "
+ "selection"));
+ connect(pasteAct, &QAction::triggered, m_textEdit, &QPlainTextEdit::paste);
+ editMenu->addAction(pasteAct);
+ editToolBar->addAction(pasteAct);
+
+ menuBar()->addSeparator();
+
+ cutAct->setEnabled(false);
+ copyAct->setEnabled(false);
+ connect(m_textEdit, &QPlainTextEdit::copyAvailable, cutAct, &QAction::setEnabled);
+ connect(m_textEdit, &QPlainTextEdit::copyAvailable, copyAct, &QAction::setEnabled);
+#endif // !QT_NO_CLIPBOARD
+
+ openFile();
+
+ connect(m_textEdit, &QPlainTextEdit::textChanged, this, [&](){
+ maybeSetPrintingEnabled(hasContent());
+ });
+
+ connect(m_uiAssets.back, &QAction::triggered, m_textEdit, [&](){
+ auto *bar = m_textEdit->verticalScrollBar();
+ if (bar->value() > bar->minimum())
+ bar->setValue(bar->value() - 1);
+ });
+
+ connect(m_uiAssets.forward, &QAction::triggered, m_textEdit, [&](){
+ auto *bar = m_textEdit->verticalScrollBar();
+ if (bar->value() < bar->maximum())
+ bar->setValue(bar->value() + 1);
+ });
+}
+
+void TxtViewer::openFile()
+{
+ const QString type = tr("open");
+ if (!m_file->open(QFile::ReadOnly | QFile::Text)) {
+ statusMessage(tr("Cannot read file %1:\n%2.").arg(m_file->fileName(),
+ m_file->errorString()), type);
+ return;
+ }
+
+ QTextStream in(m_file.get());
+#ifndef QT_NO_CURSOR
+ QGuiApplication::setOverrideCursor(Qt::WaitCursor);
+#endif
+ if (!m_textEdit->toPlainText().isEmpty()) {
+ m_textEdit->clear();
+ disablePrinting();
+ }
+ m_textEdit->setPlainText(in.readAll());
+#ifndef QT_NO_CURSOR
+ QGuiApplication::restoreOverrideCursor();
+#endif
+
+ statusMessage(tr("File %1 loaded.").arg(m_file->fileName()), type);
+ maybeEnablePrinting();
+}
+
+bool TxtViewer::hasContent() const
+{
+ return (!m_textEdit->toPlainText().isEmpty());
+}
+
+#ifdef QT_DOCUMENTVIEWER_PRINTSUPPORT
+void TxtViewer::printDocument(QPrinter *printer) const
+{
+ if (!hasContent())
+ return;
+
+ m_textEdit->print(printer);
+}
+#endif // QT_DOCUMENTVIEWER_PRINTSUPPORT
+
+bool TxtViewer::saveFile(QFile *file)
+{
+ QString errorMessage;
+
+ QGuiApplication::setOverrideCursor(Qt::WaitCursor);
+ if (file->open(QFile::WriteOnly | QFile::Text)) {
+ QTextStream out(file);
+ out << m_textEdit->toPlainText();
+ } else {
+ errorMessage = tr("Cannot open file %1 for writing:\n%2.")
+ .arg(file->fileName()), file->errorString();
+ }
+ QGuiApplication::restoreOverrideCursor();
+
+ if (!errorMessage.isEmpty()) {
+ statusMessage(errorMessage);
+ return false;
+ }
+
+ statusMessage(tr("File %1 saved").arg(file->fileName()));
+ return true;
+}
+
+bool TxtViewer::saveDocumentAs()
+{
+ QFileDialog dialog(mainWindow());
+ dialog.setWindowModality(Qt::WindowModal);
+ dialog.setAcceptMode(QFileDialog::AcceptSave);
+ if (dialog.exec() != QDialog::Accepted)
+ return false;
+
+ const QStringList &files = dialog.selectedFiles();
+ if (files.isEmpty())
+ return false;
+
+ //newFile();
+ m_file->setFileName(files.first());
+ return saveDocument();
+}
diff --git a/examples/demos/documentviewer/plugins/txtviewer/txtviewer.h b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.h
new file mode 100644
index 00000000..7206d451
--- /dev/null
+++ b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.h
@@ -0,0 +1,48 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef TXTVIEWER_H
+#define TXTVIEWER_H
+
+#include "viewerinterfaces.h"
+#include "abstractviewer.h"
+#include <QPointer>
+
+class QMainWindow;
+class QPlainTextEdit;
+class QLabel;
+class TxtViewer : public ViewerInterface
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.DocumentViewer.ViewerInterface" FILE "txtviewer.json")
+ Q_INTERFACES(ViewerInterface)
+public:
+ ~TxtViewer() override;
+ void init(QFile *file, QWidget *parent, QMainWindow *mainWindow) override;
+ QString viewerName() const override { return staticMetaObject.className(); };
+ QStringList supportedMimeTypes() const override;
+ bool saveDocument() override { return saveFile(m_file.get()); };
+ bool saveDocumentAs() override;
+ bool hasContent() const override;
+ QByteArray saveState() const override { return QByteArray(); }
+ bool restoreState(QByteArray &) override { return true; }
+ bool supportsOverview() const override { return false; }
+
+#ifdef QT_DOCUMENTVIEWER_PRINTSUPPORT
+protected:
+ void printDocument(QPrinter *printer) const override;
+#endif // QT_DOCUMENTVIEWER_PRINTSUPPORT
+
+private slots:
+ void setupTxtUi();
+ void documentWasModified();
+
+private:
+ void openFile();
+ bool saveFile (QFile *file);
+
+ int m_classId;
+ QPlainTextEdit *m_textEdit;
+};
+
+#endif //TXTVIEWER_H
diff --git a/examples/demos/documentviewer/plugins/txtviewer/txtviewer.json b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.json
new file mode 100644
index 00000000..ac7b3674
--- /dev/null
+++ b/examples/demos/documentviewer/plugins/txtviewer/txtviewer.json
@@ -0,0 +1 @@
+{ "Keys": [ "txtviewer" ] }