File indexing completed on 2025-02-23 04:35:31

0001 /*
0002     SPDX-FileCopyrightText: 2022 Mladen Milinkovic <max@smoothware.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef RICHDOCUMENTLAYOUT_H
0008 #define RICHDOCUMENTLAYOUT_H
0009 
0010 #include <QAbstractTextDocumentLayout>
0011 #include <QSizeF>
0012 #include <QTextCharFormat>
0013 #include <QVector>
0014 
0015 QT_FORWARD_DECLARE_CLASS(QBasicTimer)
0016 QT_FORWARD_DECLARE_CLASS(QPainter)
0017 
0018 namespace SubtitleComposer {
0019 class RichDocument;
0020 
0021 class RichDocumentLayout : public QAbstractTextDocumentLayout
0022 {
0023     Q_OBJECT
0024 
0025 public:
0026     explicit RichDocumentLayout(RichDocument *doc);
0027 
0028     void draw(QPainter *painter, const PaintContext &context) override;
0029     int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const override;
0030 
0031     int pageCount() const override;
0032     QSizeF documentSize() const override;
0033     QSizeF minimumDocumentSize() const;
0034 
0035     QRectF frameBoundingRect(QTextFrame *frame) const override;
0036     QRectF blockBoundingRect(const QTextBlock &block) const override;
0037 
0038     QTextCharFormat applyCSS(const QTextCharFormat &format) const;
0039     QVector<QTextLayout::FormatRange> applyCSS(const QVector<QTextLayout::FormatRange> &docFormat) const;
0040     static void mergeFormat(QTextCharFormat &fmt, const QTextCharFormat &upper);
0041     QVector<QTextLayout::FormatRange> mergeCSS(const QVector<QTextLayout::FormatRange> &docFormat, const QVector<QTextLayout::FormatRange> &layoutFormat) const;
0042 
0043     void separatorResize(const QSizeF &size);
0044     void separatorDraw(QPainter *painter, const QPointF &offset) const;
0045 
0046 protected:
0047     void documentChanged(int from, int oldLength, int length) override;
0048 
0049 private:
0050     void ensureLayout(int position) const;
0051     void processLayout(int from, int oldLength, int length);
0052 
0053 private:
0054     RichDocument *m_doc;
0055     int m_layoutPosition;
0056     QSizeF m_layoutSize;
0057     QSizeF m_naturalSize;
0058     QSizeF m_separatorSize;
0059     QVector<QPointF> m_separatorPoints;
0060 };
0061 
0062 }
0063 
0064 #endif // RICHDOCUMENTLAYOUT_H