diff options
Diffstat (limited to 'examples/demos/documentviewer/plugins/txtviewer')
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" ] } |