mjakeman / text-engine

A lightweight rich text framework for GTK
Other
21 stars 1 forks source link

Widget should have 'display-only' mode #14

Open mjakeman opened 2 years ago

mjakeman commented 2 years ago

Add a distinction between editable and non-editable text widgets

When used in display-only mode, see if we can disable or remove the editor logic to improve performance somewhat.

We'll need this for porting Extension Manager to 0.2.

ferdnyc commented 3 weeks ago

:+1:

One of the ways I think this widget would be most useful, in terms of the greater Gtk4 ecosystem, is if it worked a simple-to-use, bare-bones display widget for rich-text rendered from various formats — say, as a starting point (and because it's the simplest of the markup formats), MarkDown.

Since Qt 5.14 their basic QTextEdit (as well as QTextBrowser and QTextDocument) has supported rendering of MarkDown source right in the widget, in addition to the (bare-bones Qt subset of) HTML source it already supported.

The interface is as easy as can be:

MarkdownDialog::MarkdownDialog(QWidget *parent)
    : QDialog(parent)
{
    std::string mdContent{R"md(
# Markdown display demo

QTextEdit can display editable or read-only rich text from MarkDown source
with simple API calls to render MarkDown *into* the widget, or to retrieve
MarkDown *out* of the widget.

It supports GitHub Flavored MarkDown by default (except that, for some
reason, it parses underscores as _underline_ markup), including:

|Feature           |Notes              |
|------------------|-------------------|
|Tables            | (as seen here)    |
|Ordered Lists     | [See below](#OL)  |
|Unordered lists   | [See below](#UL)  |
|Checklists        | [See below](#CL)  |
|And much more     |                   |

## OL

1. First item
1. Second item
   1. Nested

## UL

* Bullet 1
* Bullet 2
  * Nested

## CL

- [ ] Checkbox 1
- [ ] Checkbox 2
- [x] Checked box

)md"};
    auto* mdText = new QTextEdit(this);
    this->layout()->addWidget(mdText);
    mdText->setMarkdown(QString::fromStdString(mdContent));
    mdText->setReadOnly(true);
    mdText->setWordWrapMode(QTextOption::WordWrap);
    mdText->show();
}

Write a barebones main.cpp that just creates the dialog and ->show()s it, compile and run, and...

image

Similarly, there's a QTextEdit::setHTML() for taking advantage of that barebones HTML subset I mentioned.

And that's in a standard QtWidgets component, built right into the framework — the equivalent of GtkTextView. It's insane that, even in 2024, Gtk4 doesn't provide rich-text functionality that's even close to that seamless.