aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp')
-rw-r--r--src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp684
1 files changed, 684 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp
new file mode 100644
index 0000000000..af04bb676a
--- /dev/null
+++ b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp
@@ -0,0 +1,684 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "richtexteditor.h"
+#include "ui_richtexteditor.h"
+#include "hyperlinkdialog.h"
+
+#include <functional>
+
+#include <QToolButton>
+#include <QAction>
+#include <QStyle>
+#include <QStyleFactory>
+#include <QColorDialog>
+#include <QWidgetAction>
+#include <QTextTable>
+#include <QScopeGuard>
+#include <QPointer>
+
+#include <utils/stylehelper.h>
+
+namespace QmlDesigner {
+
+template <class T>
+class FontWidgetActions : public QWidgetAction {
+public:
+ FontWidgetActions(QObject *parent = nullptr)
+ : QWidgetAction(parent) {}
+
+ ~FontWidgetActions () override {}
+
+ void setInitializer(std::function<void(T*)> func)
+ {
+ m_initializer = func;
+ }
+
+ QList<QWidget *> createdWidgets()
+ {
+ return QWidgetAction::createdWidgets();
+ }
+
+protected:
+ QWidget *createWidget(QWidget *parent) override
+ {
+ T *w = new T(parent);
+ if (m_initializer)
+ m_initializer(w);
+ return w;
+ }
+
+ void deleteWidget(QWidget *widget) override
+ {
+ widget->deleteLater();
+ }
+
+private:
+ std::function<void(T*)> m_initializer;
+};
+
+static void cursorEditBlock(QTextCursor& cursor, std::function<void()> f) {
+ cursor.beginEditBlock();
+ f();
+ cursor.endEditBlock();
+}
+
+RichTextEditor::RichTextEditor(QWidget *parent)
+ : QWidget(parent)
+ , ui(new Ui::RichTextEditor)
+ , m_linkDialog(new HyperlinkDialog(this))
+{
+ ui->setupUi(this);
+ ui->textEdit->setTextInteractionFlags(Qt::TextEditorInteraction | Qt::LinksAccessibleByMouse);
+ ui->tableBar->setVisible(false);
+
+ setupEditActions();
+ setupTextActions();
+ setupHyperlinkActions();
+ setupAlignActions();
+ setupListActions();
+ setupFontActions();
+ setupTableActions();
+
+ connect(ui->textEdit, &QTextEdit::currentCharFormatChanged,
+ this, &RichTextEditor::currentCharFormatChanged);
+ connect(ui->textEdit, &QTextEdit::cursorPositionChanged,
+ this, &RichTextEditor::cursorPositionChanged);
+ connect(m_linkDialog, &QDialog::accepted, [this]() {
+ QTextCharFormat oldFormat = ui->textEdit->textCursor().charFormat();
+
+ QTextCursor tcursor = ui->textEdit->textCursor();
+ QTextCharFormat charFormat = tcursor.charFormat();
+
+ charFormat.setForeground(QApplication::palette().color(QPalette::Link));
+ charFormat.setFontUnderline(true);
+
+ QString link = m_linkDialog->getLink();
+ QString anchor = m_linkDialog->getAnchor();
+
+ if (anchor.isEmpty())
+ anchor = link;
+
+ charFormat.setAnchor(true);
+ charFormat.setAnchorHref(link);
+ charFormat.setAnchorNames(QStringList(anchor));
+
+ tcursor.insertText(anchor, charFormat);
+
+ tcursor.insertText(" ", oldFormat);
+
+ m_linkDialog->hide();
+ });
+
+ ui->textEdit->setFocus();
+ m_linkDialog->hide();
+}
+
+RichTextEditor::~RichTextEditor()
+{
+}
+
+void RichTextEditor::setPlainText(const QString &text)
+{
+ ui->textEdit->setPlainText(text);
+}
+
+QString RichTextEditor::plainText() const
+{
+ return ui->textEdit->toPlainText();
+}
+
+void RichTextEditor::setRichText(const QString &text)
+{
+ ui->textEdit->setHtml(text);
+}
+
+void RichTextEditor::setTabChangesFocus(bool change)
+{
+ ui->textEdit->setTabChangesFocus(change);
+}
+
+QIcon RichTextEditor::getIcon(Theme::Icon icon)
+{
+ const QString fontName = "qtds_propertyIconFont.ttf";
+
+ return Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(icon), 20, 20);
+}
+
+QString RichTextEditor::richText() const
+{
+ return ui->textEdit->toHtml();
+}
+
+void RichTextEditor::currentCharFormatChanged(const QTextCharFormat &format)
+{
+ fontChanged(format.font());
+ colorChanged(format.foreground().color());
+}
+
+void RichTextEditor::cursorPositionChanged()
+{
+ alignmentChanged(ui->textEdit->alignment());
+ styleChanged(ui->textEdit->textCursor());
+ tableChanged(ui->textEdit->textCursor());
+}
+
+void RichTextEditor::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
+{
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (!cursor.hasSelection())
+ cursor.select(QTextCursor::WordUnderCursor);
+ cursor.mergeCharFormat(format);
+ ui->textEdit->mergeCurrentCharFormat(format);
+}
+
+void RichTextEditor::fontChanged(const QFont &f)
+{
+ for (QWidget* w: m_fontNameAction->createdWidgets() ) {
+ QFontComboBox* box = qobject_cast<QFontComboBox*>(w);
+ if (box)
+ box->setCurrentFont(f);
+ }
+ for (QWidget* w: m_fontSizeAction->createdWidgets() ) {
+ QComboBox* box = qobject_cast<QComboBox*>(w);
+ if (box)
+ box->setCurrentText(QString::number(f.pointSize()));
+ }
+
+ m_actionTextBold->setChecked(f.bold());
+ m_actionTextItalic->setChecked(f.italic());
+ m_actionTextUnderline->setChecked(f.underline());
+}
+
+void RichTextEditor::colorChanged(const QColor &c)
+{
+ QPixmap colorBox(ui->tableBar->iconSize());
+ colorBox.fill(c);
+ m_actionTextColor->setIcon(colorBox);
+}
+
+void RichTextEditor::alignmentChanged(Qt::Alignment a)
+{
+ if (a & Qt::AlignLeft)
+ m_actionAlignLeft->setChecked(true);
+ else if (a & Qt::AlignHCenter)
+ m_actionAlignCenter->setChecked(true);
+ else if (a & Qt::AlignRight)
+ m_actionAlignRight->setChecked(true);
+ else if (a & Qt::AlignJustify)
+ m_actionAlignJustify->setChecked(true);
+}
+
+void RichTextEditor::styleChanged(const QTextCursor &cursor)
+{
+ if (!m_actionBulletList || !m_actionNumberedList) return;
+
+ QTextList *currentList = cursor.currentList();
+
+ if (currentList) {
+ if (currentList->format().style() == QTextListFormat::ListDisc) {
+ m_actionBulletList->setChecked(true);
+ m_actionNumberedList->setChecked(false);
+ }
+ else if (currentList->format().style() == QTextListFormat::ListDecimal) {
+ m_actionBulletList->setChecked(false);
+ m_actionNumberedList->setChecked(true);
+ }
+ else {
+ m_actionBulletList->setChecked(false);
+ m_actionNumberedList->setChecked(false);
+ }
+ }
+ else {
+ m_actionBulletList->setChecked(false);
+ m_actionNumberedList->setChecked(false);
+ }
+}
+
+void RichTextEditor::tableChanged(const QTextCursor &cursor)
+{
+ if (!m_actionTableSettings) return;
+
+ QTextTable *currentTable = cursor.currentTable();
+
+ if (currentTable) {
+ m_actionTableSettings->setChecked(true);
+ ui->tableBar->setVisible(true);
+
+ setTableActionsActive(true);
+ }
+ else {
+ setTableActionsActive(false);
+ }
+}
+
+void RichTextEditor::setupEditActions()
+{
+ const QIcon undoIcon(getIcon(Theme::Icon::undo));
+ QAction *actionUndo = ui->toolBar->addAction(undoIcon, tr("&Undo"), ui->textEdit, &QTextEdit::undo);
+ actionUndo->setShortcut(QKeySequence::Undo);
+ connect(ui->textEdit->document(), &QTextDocument::undoAvailable,
+ actionUndo, &QAction::setEnabled);
+
+ const QIcon redoIcon(getIcon(Theme::Icon::redo));
+ QAction *actionRedo = ui->toolBar->addAction(redoIcon, tr("&Redo"), ui->textEdit, &QTextEdit::redo);
+ actionRedo->setShortcut(QKeySequence::Redo);
+ connect(ui->textEdit->document(), &QTextDocument::redoAvailable,
+ actionRedo, &QAction::setEnabled);
+
+ actionUndo->setEnabled(ui->textEdit->document()->isUndoAvailable());
+ actionRedo->setEnabled(ui->textEdit->document()->isRedoAvailable());
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupTextActions()
+{
+ const QIcon boldIcon(getIcon(Theme::Icon::fontStyleBold));
+ m_actionTextBold = ui->toolBar->addAction(boldIcon, tr("&Bold"),
+ [this](bool checked) {
+ QTextCharFormat fmt;
+ fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal);
+ mergeFormatOnWordOrSelection(fmt);
+ });
+ m_actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B);
+ QFont bold;
+ bold.setBold(true);
+ m_actionTextBold->setFont(bold);
+ m_actionTextBold->setCheckable(true);
+
+ const QIcon italicIcon(getIcon(Theme::Icon::fontStyleItalic));
+ m_actionTextItalic = ui->toolBar->addAction(italicIcon, tr("&Italic"),
+ [this](bool checked) {
+ QTextCharFormat fmt;
+ fmt.setFontItalic(checked);
+ mergeFormatOnWordOrSelection(fmt);
+ });
+ m_actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I);
+ QFont italic;
+ italic.setItalic(true);
+ m_actionTextItalic->setFont(italic);
+ m_actionTextItalic->setCheckable(true);
+
+ const QIcon underlineIcon(getIcon(Theme::Icon::fontStyleUnderline));
+ m_actionTextUnderline = ui->toolBar->addAction(underlineIcon, tr("&Underline"),
+ [this](bool checked) {
+ QTextCharFormat fmt;
+ fmt.setFontUnderline(checked);
+ mergeFormatOnWordOrSelection(fmt);
+ });
+ m_actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U);
+ QFont underline;
+ underline.setUnderline(true);
+ m_actionTextUnderline->setFont(underline);
+ m_actionTextUnderline->setCheckable(true);
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupHyperlinkActions()
+{
+ const QIcon bulletIcon(getIcon(Theme::Icon::actionIconBinding));
+ m_actionHyperlink = ui->toolBar->addAction(bulletIcon, tr("Hyperlink Settings"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ QTextCharFormat linkFormat = cursor.charFormat();
+ if (linkFormat.isAnchor()) {
+ m_linkDialog->setLink(linkFormat.anchorHref());
+ m_linkDialog->setAnchor(linkFormat.anchorName());
+ }
+ else {
+ m_linkDialog->setLink("http://");
+ m_linkDialog->setAnchor("");
+ }
+
+ m_linkDialog->show();
+ });
+ m_actionHyperlink->setCheckable(false);
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupAlignActions()
+{
+ const QIcon leftIcon(getIcon(Theme::Icon::textAlignLeft));
+ m_actionAlignLeft = ui->toolBar->addAction(leftIcon, tr("&Left"), [this]() { ui->textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute); });
+ m_actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L);
+ m_actionAlignLeft->setCheckable(true);
+ m_actionAlignLeft->setPriority(QAction::LowPriority);
+
+ const QIcon centerIcon(getIcon(Theme::Icon::textAlignCenter));
+ m_actionAlignCenter = ui->toolBar->addAction(centerIcon, tr("C&enter"), [this]() { ui->textEdit->setAlignment(Qt::AlignHCenter); });
+ m_actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E);
+ m_actionAlignCenter->setCheckable(true);
+ m_actionAlignCenter->setPriority(QAction::LowPriority);
+
+ const QIcon rightIcon(getIcon(Theme::Icon::textAlignRight));
+ m_actionAlignRight = ui->toolBar->addAction(rightIcon, tr("&Right"), [this]() { ui->textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute); });
+ m_actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R);
+ m_actionAlignRight->setCheckable(true);
+ m_actionAlignRight->setPriority(QAction::LowPriority);
+
+ const QIcon fillIcon(getIcon(Theme::Icon::textFullJustification));
+ m_actionAlignJustify = ui->toolBar->addAction(fillIcon, tr("&Justify"), [this]() { ui->textEdit->setAlignment(Qt::AlignJustify); });
+ m_actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J);
+ m_actionAlignJustify->setCheckable(true);
+ m_actionAlignJustify->setPriority(QAction::LowPriority);
+
+ // Make sure the alignLeft is always left of the alignRight
+ QActionGroup *alignGroup = new QActionGroup(ui->toolBar);
+
+ if (QApplication::isLeftToRight()) {
+ alignGroup->addAction(m_actionAlignLeft);
+ alignGroup->addAction(m_actionAlignCenter);
+ alignGroup->addAction(m_actionAlignRight);
+ } else {
+ alignGroup->addAction(m_actionAlignRight);
+ alignGroup->addAction(m_actionAlignCenter);
+ alignGroup->addAction(m_actionAlignLeft);
+ }
+ alignGroup->addAction(m_actionAlignJustify);
+
+ ui->toolBar->addActions(alignGroup->actions());
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupListActions()
+{
+ const QIcon bulletIcon(getIcon(Theme::Icon::textBulletList));
+ m_actionBulletList = ui->toolBar->addAction(bulletIcon, tr("Bullet List"), [this](bool checked) {
+ if (checked) {
+ m_actionNumberedList->setChecked(false);
+ textStyle(QTextListFormat::ListDisc);
+ }
+ else if (!m_actionNumberedList->isChecked()) {
+ textStyle(QTextListFormat::ListStyleUndefined);
+ }
+ });
+ m_actionBulletList->setCheckable(true);
+
+ const QIcon numberedIcon(getIcon(Theme::Icon::textNumberedList));
+ m_actionNumberedList = ui->toolBar->addAction(numberedIcon, tr("Numbered List"), [this](bool checked) {
+ if (checked) {
+ m_actionBulletList->setChecked(false);
+ textStyle(QTextListFormat::ListDecimal);
+ }
+ else if (!m_actionBulletList->isChecked()) {
+ textStyle(QTextListFormat::ListStyleUndefined);
+ }
+ });
+ m_actionNumberedList->setCheckable(true);
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupFontActions()
+{
+ QPixmap colorBox(ui->tableBar->iconSize());
+ colorBox.fill(ui->textEdit->textColor());
+
+ m_actionTextColor = ui->toolBar->addAction(colorBox, tr("&Color..."), [this]() {
+ QColor col = QColorDialog::getColor(ui->textEdit->textColor(), this);
+ if (!col.isValid())
+ return;
+ QTextCharFormat fmt;
+ fmt.setForeground(col);
+ mergeFormatOnWordOrSelection(fmt);
+ colorChanged(col);
+ });
+
+ m_fontNameAction = new FontWidgetActions<QFontComboBox>(this);
+ m_fontNameAction->setInitializer([this](QFontComboBox *w) {
+ if (!w) return;
+
+ w->setCurrentIndex(w->findText(ui->textEdit->currentCharFormat().font().family()));
+ connect(w, QOverload<const QString &>::of(&QComboBox::activated), [this](const QString &f) {
+ QTextCharFormat fmt;
+ fmt.setFontFamily(f);
+ mergeFormatOnWordOrSelection(fmt);
+ });
+ });
+
+ m_fontNameAction->setDefaultWidget(new QFontComboBox);
+ ui->toolBar->addAction(m_fontNameAction);
+
+ m_fontSizeAction = new FontWidgetActions<QComboBox>(this);
+ m_fontSizeAction->setInitializer([this](QComboBox *w) {
+ if (!w) return;
+
+ w->setEditable(true);
+
+ const QList<int> standardSizes = QFontDatabase::standardSizes();
+ foreach (int size, standardSizes)
+ w->addItem(QString::number(size));
+ w->setCurrentText(QString::number(ui->textEdit->currentCharFormat().font().pointSize()));
+ connect(w, QOverload<const QString &>::of(&QComboBox::activated), [this](const QString &p) {
+ qreal pointSize = p.toDouble();
+ if (pointSize > 0.0) {
+ QTextCharFormat fmt;
+ fmt.setFontPointSize(pointSize);
+ mergeFormatOnWordOrSelection(fmt);
+ }
+ });
+ });
+
+ m_fontSizeAction->setDefaultWidget(new QComboBox);
+ ui->toolBar->addAction(m_fontSizeAction);
+
+
+ ui->toolBar->addSeparator();
+}
+
+void RichTextEditor::setupTableActions()
+{
+ const QIcon tableIcon(getIcon(Theme::Icon::addTable));
+ m_actionTableSettings = ui->toolBar->addAction(tableIcon, tr("&Table Settings"), [this](bool checked) {
+ ui->tableBar->setVisible(checked);
+ });
+ m_actionTableSettings->setShortcut(Qt::CTRL + Qt::Key_T);
+ m_actionTableSettings->setCheckable(true);
+ m_actionTableSettings->setPriority(QAction::LowPriority);
+
+//table bar:
+
+ const QIcon createTableIcon(getIcon(Theme::Icon::addTable));
+ m_actionCreateTable = ui->tableBar->addAction(createTableIcon, tr("Create Table"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ cursorEditBlock(cursor, [&] () {
+ cursor.insertTable(1,1);
+ });
+ });
+ m_actionCreateTable->setCheckable(false);
+
+ const QIcon removeTableIcon(getIcon(Theme::Icon::deleteTable));
+ m_actionRemoveTable = ui->tableBar->addAction(removeTableIcon, tr("Remove Table"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = ui->textEdit->textCursor().currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->removeRows(0, currentTable->rows());
+ });
+ }
+ });
+ m_actionRemoveTable->setCheckable(false);
+
+ ui->tableBar->addSeparator();
+
+ const QIcon addRowIcon(getIcon(Theme::Icon::addRowAfter)); //addRowAfter
+ m_actionAddRow = ui->tableBar->addAction(addRowIcon, tr("Add Row"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = ui->textEdit->textCursor().currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->insertRows(currentTable->cellAt(cursor).row()+1, 1);
+ });
+ }
+ });
+ m_actionAddRow->setCheckable(false);
+
+ const QIcon addColumnIcon(getIcon(Theme::Icon::addColumnAfter)); //addColumnAfter
+ m_actionAddColumn = ui->tableBar->addAction(addColumnIcon, tr("Add Column"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = ui->textEdit->textCursor().currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->insertColumns(currentTable->cellAt(cursor).column()+1, 1);
+ });
+ }
+ });
+ m_actionAddColumn->setCheckable(false);
+
+ const QIcon removeRowIcon(getIcon(Theme::Icon::deleteRow));
+ m_actionRemoveRow = ui->tableBar->addAction(removeRowIcon, tr("Remove Row"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = cursor.currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->insertColumns(currentTable->cellAt(cursor).column()+1, 1);
+
+ int firstRow = 0;
+ int numRows = 0;
+ int firstColumn = 0;
+ int numColumns = 0;
+
+ if (cursor.hasSelection())
+ cursor.selectedTableCells(&firstRow, &numRows, &firstColumn, &numColumns);
+
+ if (numRows < 1)
+ currentTable->removeRows(currentTable->cellAt(cursor).row(), 1);
+ else
+ currentTable->removeRows(firstRow, numRows);
+ });
+ }
+ });
+ m_actionRemoveRow->setCheckable(false);
+
+ const QIcon removeColumnIcon(getIcon(Theme::Icon::deleteColumn));
+ m_actionRemoveColumn = ui->tableBar->addAction(removeColumnIcon, tr("Remove Column"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = cursor.currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ int firstRow = 0;
+ int numRows = 0;
+ int firstColumn = 0;
+ int numColumns = 0;
+
+ if (cursor.hasSelection())
+ cursor.selectedTableCells(&firstRow, &numRows, &firstColumn, &numColumns);
+
+ if (numColumns < 1)
+ currentTable->removeColumns(currentTable->cellAt(cursor).column(), 1);
+ else
+ currentTable->removeColumns(firstColumn, numColumns);
+ });
+ }
+ });
+ m_actionRemoveColumn->setCheckable(false);
+
+ ui->tableBar->addSeparator();
+
+ const QIcon mergeCellsIcon(getIcon(Theme::Icon::mergeCells));
+ m_actionMergeCells = ui->tableBar->addAction(mergeCellsIcon, tr("Merge Cells"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = cursor.currentTable()) {
+ if (cursor.hasSelection()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->mergeCells(cursor);
+ });
+ }
+ }
+ });
+ m_actionMergeCells->setCheckable(false);
+
+ const QIcon splitRowIcon(getIcon(Theme::Icon::splitRows));
+ m_actionSplitRow = ui->tableBar->addAction(splitRowIcon, tr("Split Row"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = cursor.currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->splitCell(currentTable->cellAt(cursor).row(),
+ currentTable->cellAt(cursor).column(),
+ 2, 1);
+ });
+ }
+ });
+ m_actionSplitRow->setCheckable(false);
+
+ const QIcon splitColumnIcon(getIcon(Theme::Icon::splitColumns));
+ m_actionSplitColumn = ui->tableBar->addAction(splitRowIcon, tr("Split Column"), [this]() {
+ QTextCursor cursor = ui->textEdit->textCursor();
+ if (QTextTable *currentTable = cursor.currentTable()) {
+ cursorEditBlock(cursor, [&] () {
+ currentTable->splitCell(currentTable->cellAt(cursor).row(),
+ currentTable->cellAt(cursor).column(),
+ 1, 2);
+ });
+ }
+ });
+ m_actionSplitColumn->setCheckable(false);
+}
+
+void RichTextEditor::textStyle(QTextListFormat::Style style)
+{
+ QTextCursor cursor = ui->textEdit->textCursor();
+ cursorEditBlock(cursor, [&] () {
+ if (style != QTextListFormat::ListStyleUndefined) {
+ QTextBlockFormat blockFmt = cursor.blockFormat();
+ QTextListFormat listFmt;
+
+ if (cursor.currentList()) {
+ listFmt = cursor.currentList()->format();
+ } else {
+ listFmt.setIndent(blockFmt.indent() + 1);
+ blockFmt.setIndent(0);
+ cursor.setBlockFormat(blockFmt);
+ }
+
+ listFmt.setStyle(style);
+
+ cursor.createList(listFmt);
+ } else {
+ QTextList* currentList = cursor.currentList();
+ QTextBlock currentBlock = cursor.block();
+ currentList->remove(currentBlock);
+
+ QTextBlockFormat blockFormat = cursor.blockFormat();
+ blockFormat.setIndent(0);
+ cursor.setBlockFormat(blockFormat);
+ }
+ });
+}
+
+void RichTextEditor::setTableActionsActive(bool active)
+{
+ m_actionCreateTable->setEnabled(!active);
+ m_actionRemoveTable->setEnabled(active);
+
+ m_actionAddRow->setEnabled(active);
+ m_actionAddColumn->setEnabled(active);
+ m_actionRemoveRow->setEnabled(active);
+ m_actionRemoveColumn->setEnabled(active);
+
+ m_actionMergeCells->setEnabled(active);
+ m_actionSplitRow->setEnabled(active);
+ m_actionSplitColumn->setEnabled(active);
+}
+
+}